|
弄了好几天都达不到想要的效果,所以想在这里向大家取取经。
任务:使用51单片机控制6位数码管实时显示时钟,例如:当前时间位17:30:25,数码管则显示173025。
我设置的初始时间是12:34:56。
但最后初始显示的是5个6,然后是5个7,5个8……我觉得应该是动态显示那一部分写的有问题,但是不知道该如何改,跪求大家指教!
顺便说一下,数码管是共阳极数码管,P1口接的是段码,P2口接的是位选码。(位选码我不知道自己连的对不对)
单片机源程序如下:- #include<reg51.h>
- #include<intrins.h>
- unsigned char count=0;
- unsigned char miao=56,min=34,hour=12;
- void delay(unsigned int i)
- {
- unsigned int k;
- for(k=0;k<i;k++);
- }
- void delay1s()
- {
- unsigned char i;
- for(i=0;i<20;i++)
- {
- TH1=(65536-50000)/256;
- TL1=(65536-50000)%256;
- TR1=1;
- while(!TF1);
- TF1=0;
- }
- }
- void disp(unsigned char x,unsigned char y,unsigned char z)
- {
- unsigned int j;
- unsigned char led[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
- for(j=0;j<6;j++)
- {
- P1=0xff;
- P2=_crol_(0xfe,j);
- switch(j)
- {
- case 0:P1=led[x/10];break;
- case 1:P1=led[x%10];break;
- case 2:P1=led[y/10];break;
- case 3:P1=led[y%10];break;
- case 4:P1=led[z/10];break;
- case 5:P1=led[z%10];break;
- default:break;
- }
- delay(100);
- }
- }
- void main()
- {
- TMOD=0x10;
- TH1=(65536-50000)/256;
- TL1=(65536-50000)%256;
- ET1=1;
- EA=1;
- TR1=1;
- while(1)
- {
- disp(hour,min,miao);
- delay1s();
- miao++;
- if(miao==60)
- {
- miao=0;
- min++;
- if(min==60)
- {
- min=0;
- hour++;
- if(hour==24)
- hour=0;
- }
- }
- }
- }
复制代码
|
|