非常经典的例程,几乎每一本C51编程的书里都有,感谢楼主给大家增加黑币的机会。 |
谢谢分享,刚好用到! |
感谢楼主分享 |
楼主怎么让数码管显示某一个数字时,用按键暂停显示,同时要求发光二极管闪烁?? |
感谢楼主分享,真心不错 |
把位选改下就行了 |
原理图Kian起来好乱啊 |
动态扫描 |
while(1)//循环部分 { nuim++;//计数 sum[0]=num/100;//分离百位 sum[1]=num%100/10;;//分离出十位 sum[0]=nuim%10;//分离出个位 应该改成sum[2]=nuim%10; for(i=0;i<3;i++) { //设置位选 //输出sum } } |
咆哮的阿杰 发表于 2016-11-27 22:36 明明我数码管显示先写消影再写位选之后写了段选最后写个延时就是为了使数码管动态显示 |
|
增加硬件和程序 |
单纯用这种循环的方法解决不好,建议学习一下定时器中断,那样你就不知是0~99 0~999啦甚至可以更大 |
参考(郭天祥)那本书 |
可以用定时器中断写 |
多个数码管并联,并且需要改程序 |
除 和求 余 |
根据经侦,中断计算一显示时间,然后根据时间,终断,进行编程 |
看楼主的程序,你需要了解动态扫描。需要加入位选。 位选的作用就是选择单片机上的数码管的某一个数码管。 位选有单片机的专门i/o口,楼主查下 |
两种方法,一种是从0-99,然后这个数字对10取整,将这个数字显示在十位数的数码管,对10取余,将这个数字显示在十位数的数码管,持续刷新,多少次后,数字加1,对100进行取余,保证数字只有0-100。 一种是0-9显示,每次对10取余,取余结果在个位上显示,当取余结果为0时,十位数的数字加1,十位数对10取余,取余结果在十位上显示。 |
十位对变量求模,个位对变量求余 |
以实测,满足000-999 #include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit dula=P1^7; sbit wela=P1^6; uchar num,count; uint bai=0,shi=0,ge=0; void display(uint bai,uint shi,uint ge); uchar code table[]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,}; void delay1ms(void) //误差 -0.651041666667us { unsigned char a,b; for(b=102;b>0;b--) for(a=3;a>0;a--); } void main() { TMOD=0x00; TH0=(8192-8000)/32; TL0=(8192-8000)%32; EA=1; ET0=1; TR0=1; while(1) { display(bai,shi,ge); } } void display(uint bai,uint shi,uint ge) { bai=num/100; shi=(num - (bai*100))/10; ge=num%10; dula=1; P0=0X00; dula=0; wela=1; P0=0x7f; wela=0; dula=1; P0=table[ge]; delay1ms(); dula=1; P0=0X00; dula=0; wela=1; P0=0xbf; wela=0; dula=1; P0=table[shi]; delay1ms(); dula=1; P0=0X00; dula=0; wela=1; P0=0xdf; wela=0; dula=1; P0=table[bai]; delay1ms(); } void timer0()interrupt 1 { TH0=(8192-8000)/32; TL0=(8192-8000)%32; count++; if(count ==125) { count = 0; num++; if(num==999) num = 0; } } |
已解决000-999 #include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit dula=P1^7; sbit wela=P1^6; uchar num,count; uint bai=0,shi=0,ge=0; void display(uint bai,uint shi,uint ge); uchar code table[]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,}; void delay1ms(void) //误差 -0.651041666667us { unsigned char a,b; for(b=102;b>0;b--) for(a=3;a>0;a--); } void main() { TMOD=0x00; TH0=(8192-8000)/32; TL0=(8192-8000)%32; EA=1; ET0=1; TR0=1; while(1) { display(bai,shi,ge); } } void display(uint bai,uint shi,uint ge) { bai=num/100; shi=(num - (bai*100))/10; ge=num%10; dula=1; P0=0X00; dula=0; wela=1; P0=0x7f; wela=0; dula=1; P0=table[ge]; delay1ms(); dula=1; P0=0X00; dula=0; wela=1; P0=0xbf; wela=0; dula=1; P0=table[shi]; delay1ms(); dula=1; P0=0X00; dula=0; wela=1; P0=0xdf; wela=0; dula=1; P0=table[bai]; delay1ms(); } void timer0()interrupt 1 { TH0=(8192-8000)/32; TL0=(8192-8000)%32; count++; if(count ==125) { count = 0; num++; if(num==999) num = 0; } } |
分离出个位十位百位等,当各位加到10时候十位进一,个位清零 |
用for语句最好 |
继续计数。 |
添加循环嵌套 |
while(1) { for(i = 0; i < 10; i++) //循环10次 { WEI = 1; P0 = 0x7f; WEI = 0; DU = 1; P0 = DISP_smg; delayms(400); WEI = 1; P0 = 0xbf; WEI = 0; DU = 1; P0 = DISP_smg[C0]; 删掉试试看 0-9 |
从个十百依次自加,逢九清零前位加一 |
如果真理解了0~9显示,那么就一定会0~999显示。不会0~999显示,就一定没有真理解了0~9显示。 |
好的那就等你看见 |