开始时,第一个灯闪烁,时间间隔为1s。当按下按键后,八个灯闪烁,时间间隔为 2s;若在时间间隔为4s时按下按键,则进入呼吸灯模式,八个灯从亮到暗,再由暗到亮如此循环;再次按下按键,则恢复最初状态(第一个灯闪烁,间隔1s)。要求是这样子的,仿真图在最后,感谢各位
单片机源程序如下:
- #include <REGX51.H>
- unsigned char a[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
- int count0=0,count1=0,count=0,num0=0,num1=0;
- int temp=1,temp1=1,temp2=1,n=0,flag=0;
- void delay()
- {
- unsigned char i,j;
- for(i=0;i<20;i++){
- for(j=0;j<120;j++);
- }
- }
- void inittimer0()
- {
- TMOD=0x01;
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- TR0=1;
- EA=1;
- ET0=1;
- }
- void display(){
- int i;
- for(i=0;i<8;i++){
- delay();
- delay();
- delay();
- delay();
- delay();
- P2=~a[i];
- }
- for(i=7;i>1;i--){
- delay();
- delay();
- delay();
- delay();
- delay();
- P2=~a[i];
- }
- }
- void button_scan(){
- delay();
- if(P1_0!=1&&n>3) {temp=temp?0:1;}
- else if(P1_0!=1){flag=1;temp2=0;}
- while(P1_0==0);
- }
- void main(){
- inittimer0();
- while(1){
- button_scan();
- if(temp==1){
- P2=0xff; //±£3ÖLEDè«°μ
- P2_0=num0;
- }
- else if(temp1!=temp ){
- display();
- }
- else if(flag){
- P2=num1;
- }
- }
- }
- void timer0_isr() interrupt 1
- {
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- count0++;
- count1++;
- count++;
- if(count>=20) {
- n++;
- count=0;
- if(n>=4) {n=0;}
- }
- if(count0>=20&&!temp2){
- num0=num0?0:1;
- count0=0;
- }
- else if(count1>=40){
- num1=~num1;
- count1=0;
- }
- }
复制代码 |