/*----------------------------------------------------------
按键S2、S3为LED灯闪动花样侍册选择键(S2、S3选择顺序相反,可循环),
S4、S5为闪动速度选择键(按S4加速、S5减速),启动后默认按花样
1(单个灯从左到右循环)闪动。闪动间隔有50、100、200、400、
800ms可选。
-----------------------------------------------------------*/
#include <REGX52.H>
#include <intrins.h>
#include <stdlib.h>
#define uchar unsigned char
#define uint unsigned int
sbit s2=P3^4 //定义四个按键
sbit s3=P3^5
sbit s4=P3^6
sbit s5=P3^7
uchar mod,modnum,p1_val,speed,keyflag,num0,num,l_r,state
/*---------------------变量含义----------------------------
mod:闪动花样代码; modnum:共有几种闪动花样;
p1_val:用于赋初值; speed:标记闪动速度衫谈拦;
keyflag:花样按键按下标记; num0:计算延时几个50ms;
num:花样内其他计数用; l_r:标记闪动方向
state:标记花样变化状态 t0num:T0中断次数
----------------------------------------------------------*/
uchar code mod4[]={ //用于花样4
0x7e,0xbd,0xdb,0xe7}
/*-----------------------延时子函数-----------------------*/
void delayxms(uint x)
{
uint i,j
for(i=xi>0i--)
for(j=110j>0j--)
}
/*-----------------------按键子函数-----------------------*/
void keyscan()
{
if(s2==0) //检测按键S2
{
delayxms(10) //防抖延时
if(s2==0)
{
keyflag=1 //花样按键按下时,标记状态为1
mod++ //闪动花样标志+1
if(mod>modnum) //设置花样循环选择
mod=1
num0=0
}
while(!s2) //等待按键释放
}
if(s3==0) //检测按键S3
{
delayxms(10)
if(s3==0)
{
keyflag=1
mod-- //闪动花样标志-1
if(mod<1)
mod=modnum
num0=0
}
while(!s3)
}
if(s4==0) //检测按键S4
{
delayxms(10)
if(s4==0)
{
speed/=2 //提高闪动速度
if(speed<1)
speed=1
}
while(!s4)
}
if(s5==0) /或胡/检测按键S5
{
delayxms(10)
if(s5==0)
{
speed*=2 //降低闪动速度
if(speed>16)
speed=16
}
while(!s5)
}
}
/*-----------------------初始化函数-----------------------*/
void init()
{
modnum=6 //用于修改共有几种闪动花样
mod=1 //启动按花样1闪动
speed=16 //启动按最慢速度闪动
keyflag=1 //启动后默认标志为1
EA=1 //开总中断
ET0=1 //开T0中断
TMOD=0x01 //设置T0为16位定时器
TH0=(65536-50000)/256 //赋初值50ms
TL0=(65536-50000)%256
TR0=1 //启动T0
}
/*-------------------------主函数-------------------------*/
void main()
{
init()
while(1)
{
keyscan() //一直扫描按键
switch(mod) //根据花样标志值选择闪动花样
{
/*-----------------【1】循环左移流水灯--------------------*/
case 1:
if(keyflag) //当花样按键按下时重置P1口、
{ //花样按键标志状态
keyflag=0
P1=0xfe
}
if(num0>=speed) //延时到达选定的时间时,变化LED状态
{
num0=0 //清零延时计数值
P1=_crol_(P1,1) //循环左移
}
break
/*-----------------【2】循环右移流水灯--------------------*/
case 2:
if(keyflag)
{
keyflag=0
P1=0x7f
}
if(num0>=speed)
{
num0=0
P1=_cror_(P1,1) //循环右移
}
break
/*---------------【3】1357和2468交替闪烁------------------*/
case 3:
if(keyflag)
{
keyflag=0
P1=0xaa
}
if(num0>=speed)
{
num0=0
P1=~P1 //交替闪烁
}
break
/*-----------------【4】两边合拢再散开--------------------*/
case 4:
if(keyflag)
{
keyflag=0
num=0
l_r=0 //用于指示灯变化的方向
}
if(num0>=speed&&l_r==0)
{
num0=0
P1=mod4[num]
num++
if(num==3)
l_r=1
}
if(num0>=speed&&l_r==1)
{
num0=0
P1=mod4[num]
num--
if(num==0)
l_r=0
}
break
/*-------【5】逐个点亮,全亮后反向逐个熄灭,左右循环-------*/
case 5:
if(keyflag)
{
keyflag=0
p1_val=0xfe
num=0
l_r=0
}
if(state==0)
{
if(num0>=speed&&l_r==0) //从左到右逐个点亮
{
num0=0
P1=p1_val
p1_val<<=1
if(p1_val==0)
l_r=1
}
if(num0>=speed&&l_r==1) //全亮后从右到左逐个熄灭
{
num0=0
P1=p1_val
num++
switch(num)
{
case 1:
p1_val=0x80
break
case 2:
p1_val=0xc0
break
case 3:
p1_val=0xe0
break
case 4:
p1_val=0xf0
break
case 5:
p1_val=0xf8
break
case 6:
p1_val=0xfc
break
case 7:
p1_val=0xfe
break
case 8:
p1_val=0xff
break
}
if(p1_val==0xff)
{
state=1
l_r=0
p1_val=0x7f
num=0
}
}
}
else
{
if(num0>=speed&&l_r==0) //从右到左逐个点亮
{
num0=0
P1=p1_val
p1_val>>=1
if(p1_val==0)
l_r=1
}
if(num0>=speed&&l_r==1) //全亮后从左到右逐个熄灭
{
num0=0
P1=p1_val
num++
switch(num)
{
case 1:
p1_val=0x01
break
case 2:
p1_val=0x03
break
case 3:
p1_val=0x07
break
case 4:
p1_val=0x0f
break
case 5:
p1_val=0x1f
break
case 6:
p1_val=0x3f
break
case 7:
p1_val=0x7f
break
case 8:
p1_val=0xff
break
}
if(p1_val==0xff)
{
state=0
l_r=0
p1_val=0xfe
num=0
}
}
}
break
/*-----------------------T0中断函数-----------------------*/
void time0() interrupt 1 //延时50ms
{
TH0=(65536-50000)/256
TL0=(65536-50000)%256
num0++ //延时计数值
}
把定时器设置成50ms一次定时中断,作为时间基准,在定时中断里再每次对一个变量计数加加得到想要的0.5秒和2秒时间基准 define uint unsigned int //定义无符号整数 void delay(uint)//声明延时函数 void main(void){ uint iuchar tempwhile(1){ temp=0xFEfor(i=0i<8i++) //8个流水灯依次全部点亮 { P1=tempdelay(500...用定时器实现流水灯从左到右双位循环,跳动频率为1秒。程序怎么编啊... —— 用定时器实现流水灯,跳动频率为1秒。用定时器定时50ms,采用中断皮族没方式,对定时中断计数,计数20次就是1秒。如下仿真图,P1口接8个LED灯。
有关于单片机的一段程序,是用定时器做流水灯的 —— 要用定时器 就得用定时器中断。。至于全亮的原因 是因为 delay1s 没有起到延时1s的作用 二十极其短的延时燃纳 导致流水灯太快 给人感觉是全亮的。。你可以改成 long a while(a<500000)(值大小自己调试)...
如何用定时器中断实现流水灯1秒定时流水? —— 可以中断50ms一次(不一定非要50ms),每次中断计数一次,等计数时间到1s,就执行一次流水动作
求助,用定时器控制流水灯循环 —— 将定时器中断时间设置为一秒一次。声明一个全局的变量temp 在初始化的时候赋初值,在中断服务函数中
用定时器控制16路流水灯循环单片机,且定时时间可调,谢谢! —— interrupt1{uchari//循环变量//重装定时器初值,50ms中断一次p++if(p>=20)//一秒钟改变一次状态{for(i=0i<8i++){P1=temptemp<<=1//左移一位,流水灯}p=0}}呵呵,这就是简单穗陪的后台任务处理思想 ...
51单片机定时器实现流水灯,并用按键外部中断控制改变流水灯的流向,这个... —— EA=1;//开总中断 EX0=1;//开外部中断0 IT0=1;//下降沿触发 while(1){ if(flag==0){ for(i=0i<8i++){ P0=0X01<<idelayms(500)} } if(flag==1){ for(i=0i<8i++){ P0=0X80...
51单片机用定时器,怎么编程流水灯一秒闪烁一次, —— 先写一个延时子函数delay,延时时间1秒。然后写LED=0;delay(1);LED=1;这样就可以做到一亮一灭,再把这段程序加入到循环中就可以,循环函数很简单不用再说了吧,如果还不懂回复我给你程序 ...
plc怎么用计时器做3个流水灯程序 —— 计数器,定时器……用计数器,就数值1点亮一个,2点亮一个,3点亮一个,加完复位,加个循环;定时器,定时一秒,二秒,三秒,每个对应一个灯,加个循环
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)