找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4364|回复: 2
打印 上一主题 下一主题
收起左侧

利用数码管的动态显示实现时钟Proteus仿真程序(注释很详细)

[复制链接]
跳转到指定楼层
楼主
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit wei=P2^7;
  5. sbit duan=P2^6;
  6. sbit P33=P3^3;
  7. sbit P32=P3^2;
  8. int count=0;
  9. uchar smg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};  //数码管的段码值,0xbf对应”—“
  10. uchar weixuan[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};         //数码管的位选信号
  11. uchar tab[8]={0,0,10,0,0,10,0,0}; //8数码管显示值的8个值,10是对用显示— ;
  12. void zhuanhuan(uchar shi,uchar fen,uchar miao);

  13. void delay_ms(uint i)  //延时
  14. {
  15.   uint j;
  16.   for(;i>0;i--)
  17.   for(j=120;j>0;j--);
  18. }

  19. void main()
  20. { uchar i=0,count=0; //count用来计量1S的时间
  21.   uchar moshi=0;
  22.   uchar shi=23,fen=59,miao=55;         //定义时、分、秒变量
  23.   bit flag=0;        //正常走时,flag=0;调节时分秒时,flag=1;
  24.   while(1)
  25.   {
  26.     zhuanhuan(shi,fen,miao);  //从时分秒中分出十位,个位
  27.     for(i=0;i<8;i++)                   //数码管动态扫描显示
  28.         { P0=weixuan[i];wei=1;wei=0;
  29.           P0=~smg[tab[i]];duan=1;duan=0;delay_ms(1);
  30.         }
  31.         
  32.         //时分秒根据时间变化
  33.         if(flag==0) count++;   //count记录while循环的次数,通过指令可以推断出一次需要多少时间,次数乘以单次时间,以此计算1秒的时间
  34.         if(count==105) {miao++;count=0;} //当count==次时,时间为1秒
  35.         if(miao==60) {fen++;miao=0;}         //60秒1分钟,60分钟1小时,24小时归零。
  36.     if(fen ==60) {shi++;fen=0;}
  37.     if(shi==24)         {shi=0;}
  38.         
  39.         //按键调节时分秒
  40.         if(P32==0)           //10ms延时,消抖处理
  41.         {delay_ms(10);
  42.          if(P32==0) {moshi++;flag=1;}        //模式1对应调时,模式2对应调分,模式3对应调秒
  43.         }
  44.         if(P33==0)          //10ms延时,消抖处理
  45.         {delay_ms(10);
  46.          if((P33==0)&(moshi==1)) shi++;        //模式1对应调时。P33按键只做加法运算
  47.            if((P33==0)&(moshi==2)) fen++;        //模式2对应调分
  48.          if((P33==0)&(moshi==3)) miao++;//模式3对应调秒
  49.         }
  50.         if(moshi==4) {moshi=0;flag=0;}//第四次按下模式键,模式归零
  51.         while((P32==0)|(P33==0)); //等待按键释放
  52. }
  53. }

  54. void zhuanhuan(uchar shi,uchar fen,uchar miao)
  55. {
  56.   tab[0]=shi/10;
  57.   tab[1]=shi%10;
  58.   tab[3]=fen/10;
  59.   tab[4]=fen%10;
  60.   tab[6]=miao/10;
  61.   tab[7]=miao%10;
  62. }
复制代码

所有资料51hei提供下载:
利用数码管的动态显示实现时钟.rar (85.69 KB, 下载次数: 72)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩1
回复

使用道具 举报

沙发
ID:937858 发表于 2021-6-15 22:44 | 只看该作者
互相学习,很好的例子
回复

使用道具 举报

板凳
ID:938891 发表于 2021-6-19 13:25 | 只看该作者
非常棒的例子,值得学习
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表