原代码
按键1 控制亮灭,按下时灯灭,再按下继续流水
按键2 控制暂停,按下时暂停,保持该LED灯亮,再按下继续
单片机源程序如下:
- #include<reg52.h>
- sbit KEY=P3^2; //按键1
- sbit KEY1=P3^3; //按键2
- unsigned char code d[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,
- 0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff,0x00,0xff}; //灯的效果(常量)
- void time();
- void timer();//调用中断
- bit flag; //标志位1
- bit flag1; //标志位2
- void main()
- {
- time();
- while(1)
- {
- if(!KEY)
- {
-
- if(!KEY)
- {
- while(!KEY); //控制灯停止的按键
- {flag=~flag;}
- }
- }
- if(!KEY1)
- {
-
- if(!KEY1)
- {
- while(!KEY1); //控制灯熄灭的按键
- {flag1=~flag1;}
- }
- }
- }
- }
- void time()
- {
- TMOD|=0x01;
- //设置定时器工作模式TMOD(定时器工作方式寄存器);
- //GATE(定时器/计数器的开关控制选项)设置为0;即定时器/计数器的开关控制仅由TCON寄存器中的TRx(x = 0,1)控制
- //C/T位(定时器模式和计数器模式选择位)设置为0使其工作在定时器模式下;将该位置1则为定时器模式。
- //M1M0设置为01,使用16位计数
- TH0 = 0xD8; //65536-10000
- TL0 = 0xF0; //55536
- EA =1; //开启总中断
- EX0=1; //开启0号外部中断
- IT0=1; //设置外部中断0触发方式,1 - 负跳变触发
- TR0=1; //定时器0运行控制位,将该位置1时启动定时器0
- ET0=1; //定时器/计数器0中断允许位
- }
- void timer() interrupt 0
- {
- P2=0xff;
- }
- void timeer() interrupt 1
- {
- static unsigned int k=0;
- static unsigned char i=0;
- TH0=(65536-2000)/256;
- TL0=(65536-2000)%256; //实现延时
- if((!flag)&&(!flag1))
- {
- k++;
- if(k<150) //当两个按键都没有被按下时,灯进行流水效果
- {P2=d[i];}
- if(k==300)
- {
- k=0;
- i++;
- if(i==18)
- i=0;
- }
- }
- }
复制代码
全部资料51hei下载地址:
Proteus 8.7模拟.zip
(52.52 KB, 下载次数: 18)
|