资源描述:
《51单片机流水灯与数码管显示实验设计》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、#include#include#defineuintunsignedint#defineucharunsignedcharsbitdula=P2^6;sbitwela=P2^7;sbitkey1=P3^4;//这个key没用到,具体功能可以完善函数uinttemp,shu=432;ucharaa,bb,cc,bai,shi,ge,flag,flag1,t0,t1,count;ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f
2、,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x76,0x38,0x3f,0};voidinit();voiddisplay(ucharaa,ucharbb,ucharcc,ucharbai,ucharshi,ucharge);voiddelayms(uintz){uintx,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}voidmain(){init();while(1){if(flag!=1)//减数还未到指定值{temp=_crol_(temp,1);//流水灯P1=temp
3、;//赋值给P1口delayms(10);//流水延时10msdisplay(7,6,5,bai,shi,ge);}//if(t0%4==0)t0这个变量是T0溢出时间的倍数值,每次到指定的倍数值都会被清零,所以这个判断语句错误//if(t0==60)t0每次到10都会被清零,所以这个判断语句错误elseif(count!=100)//没有到指定的时间3s,但这里设置的是5s,因为led闪烁的时间是50ms,这样闪烁的次数就多一点,便于看清效果{temp=0xff;P1=temp;delayms(50);//闪烁延时temp=0x00;P
4、1=temp;}else{display(16,14,17,17,18,19);temp=0xff;//关闭ledP1=temp;//这里我们可以看出在位带操作的时候P1是已定义变量,不需要中间变量过度}}}voidinit(){TMOD=0x11;TH0=(65535-5000)/256;TL0=(65535-5000)%256;TH1=(65535-5000)/256;TL1=(65535-5000)%256;EA=1;ET0=1;ET1=1;TR0=1;TR1=1;temp=0xfe;P1=temp;}voidtimer0()int
5、errupt1{TH0=(65535-5000)/256;TL0=(65535-5000)%256;t0++;if(t0==10)t0=0;//闪烁间隔时间10*50msif(flag==1){count++;//计数3sif(count==100){EA=0;//关闭总中断,也可以写TR0=0,因为在数码管停止减数的时候已经关闭了TR1}}}voidtimer1()interrupt3{TH1=(65535-5000)/256;TL1=(65535-5000)%256;t1++;if(t1==2){t1=0;shu--;bai=shu/
6、100;shi=shu%100/10;ge=shu%10;if(shu==398){TR1=0;//关闭定时器1,数码管显示的内容不变TR0=0;//这里也可以不关闭TR0直接清零TH0=(65535-5000)/256;TL0=(65535-5000)%256;TR0=1;//这里的定时器0计数值的清零初始是为了3s的算时(函数里设置了5s)flag=1;}}}voiddisplay(ucharaa,ucharbb,ucharcc,ucharbai,ucharshi,ucharge){dula=1;P0=table[aa];dula=0
7、;wela=1;P0=0xfe;wela=0;delayms(1);dula=1;P0=table[bb];dula=0;wela=1;P0=0xfd;wela=0;delayms(1);dula=1;P0=table[cc];dula=0;wela=1;P0=0xfb;wela=0;delayms(1);dula=1;P0=table[bai];dula=0;wela=1;P0=0xf7;wela=0;delayms(1);dula=1;P0=table[shi];dula=0;wela=1;P0=0xef;wela=0;delayms
8、(1);dula=1;P0=table[ge];dula=0;wela=1;P0=0xdf;wela=0;delayms(1);}