仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include<reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit wei=P2^7;
- sbit duan=P2^6;
- sbit P33=P3^3;
- sbit P32=P3^2;
- int count=0;
- uchar smg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf}; //数码管的段码值,0xbf对应”—“
- uchar weixuan[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //数码管的位选信号
- uchar tab[8]={0,0,10,0,0,10,0,0}; //8数码管显示值的8个值,10是对用显示— ;
- void zhuanhuan(uchar shi,uchar fen,uchar miao);
- void delay_ms(uint i) //延时
- {
- uint j;
- for(;i>0;i--)
- for(j=120;j>0;j--);
- }
- void main()
- { uchar i=0,count=0; //count用来计量1S的时间
- uchar moshi=0;
- uchar shi=23,fen=59,miao=55; //定义时、分、秒变量
- bit flag=0; //正常走时,flag=0;调节时分秒时,flag=1;
- while(1)
- {
- zhuanhuan(shi,fen,miao); //从时分秒中分出十位,个位
- for(i=0;i<8;i++) //数码管动态扫描显示
- { P0=weixuan[i];wei=1;wei=0;
- P0=~smg[tab[i]];duan=1;duan=0;delay_ms(1);
- }
-
- //时分秒根据时间变化
- if(flag==0) count++; //count记录while循环的次数,通过指令可以推断出一次需要多少时间,次数乘以单次时间,以此计算1秒的时间
- if(count==105) {miao++;count=0;} //当count==次时,时间为1秒
- if(miao==60) {fen++;miao=0;} //60秒1分钟,60分钟1小时,24小时归零。
- if(fen ==60) {shi++;fen=0;}
- if(shi==24) {shi=0;}
-
- //按键调节时分秒
- if(P32==0) //10ms延时,消抖处理
- {delay_ms(10);
- if(P32==0) {moshi++;flag=1;} //模式1对应调时,模式2对应调分,模式3对应调秒
- }
- if(P33==0) //10ms延时,消抖处理
- {delay_ms(10);
- if((P33==0)&(moshi==1)) shi++; //模式1对应调时。P33按键只做加法运算
- if((P33==0)&(moshi==2)) fen++; //模式2对应调分
- if((P33==0)&(moshi==3)) miao++;//模式3对应调秒
- }
- if(moshi==4) {moshi=0;flag=0;}//第四次按下模式键,模式归零
- while((P32==0)|(P33==0)); //等待按键释放
- }
- }
- void zhuanhuan(uchar shi,uchar fen,uchar miao)
- {
- tab[0]=shi/10;
- tab[1]=shi%10;
- tab[3]=fen/10;
- tab[4]=fen%10;
- tab[6]=miao/10;
- tab[7]=miao%10;
- }
复制代码
所有资料51hei提供下载:
利用数码管的动态显示实现时钟.rar
(85.69 KB, 下载次数: 76)
|