单片机教程网

电脑版
提示:原网页已由神马搜索转码, 内容由www.51hei.com提供.
查看:21306|回复:22
打印上一主题下一主题

单片机数码管电子时钟Proteus仿真图+代码注释很详细

 [复制链接]
跳转到指定楼层
楼主
ID:462715发表于 2019-1-5 21:13|只看该作者|只看大图回帖奖励
①开机为走时模式,正常显示时间。
②共设置3个按键,分别为模式键、功能键1、功能键2。按动模式键,模式将在“走时/调时/日期显示及调整/闹钟显示及调整”4个模式下切换。
③走时模式下按动功能键1/功能键2停止闹钟。
④调时模式下,功能键1上调时间,功能键2下调时间。

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include  <reg51.h>
  2. #define uchar unsigned char
  3. uchar code tab[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};
  4. //共阳极数码管显示"0~9","灭"和"-"的字段码
  5. //uchar code tab[]={0x3f,0x06,05b,0x4f,0x66,0x6d,07d,0x07,0x7f,0x6f,0x00,0x40};//共阴数码管
  6. uchar code wetab[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};  //位选
  7. uchar data dis[8]={0x00,0x00,0x0b,0x00,0x00,0x0b,0x00,0x00};
  8. //显示数据缓冲区,时十、个位、分十、个位、秒十、个位初始为0,0x0b为"-"编码
  9. uchar data timedat[3]={0x00,0x00,0x00};  //分别为秒、分和小时的计数值(记录K1和K2次数)
  10. uchar data  ms50=0x00, num=0x00,  n1=0x00,  n2=0x00;
  11. //定义定时次数变量,调整模式变量,按加1键次数变量,按减1键次数变量
  12. sbit  key0=P1^0 ;  //调整键--模式
  13. sbit  key1=P1^1 ;  //加1键
  14. sbit  key2=P1^2 ;  //减1键
  15. //---------------------------------------
  16. void  delay1ms( unsigned  int  z )  //定义延时1ms函数
  17. { unsigned  int  x, y ;
  18. for  ( x=z;  x>0;  x-- )
  19.            for  ( y=120; y>0 ;  y-- )       ;
  20. }
  21. //---------------------------------------
  22. //按键处理函数。如果没有按键则时钟正常走时。当按K0键1次→暂停走时进入调小时状态;再按K0键1次→进入调分钟状态;再按K0键1次→回到正常走时状态。对于K1和K2键,如果正常走时下→按K1K2键不起作用;如果进入调时或者调分状态→按K1键可对时或分加1操作,小时加到24则回0,分钟加到60则回0。按K2键可对时或分减1操作,小时减到负则回23,分钟减到负则回59。
  23. void keyscan(  void )
  24. {       EA=0;  //关中断
  25.        if(timedat[0]==0&timedat[1]==0&timedat[2]==7)  {P1=0xff;}
  26. if (key0==0)       { delay1ms(10);       while (key0==0);
  27.                  num++; TR0=0; ET0=0;  // 调整键K0每按1次--模式变量num加1
  28.                  if (num>=3)       {num=0;  ET0=1;  TR0=1;  }  // 启动T0校时
  29.        }
  30.            if (num!=0)       //模式变量不等于0
  31. {       if (key1==0)       // K1键确实按下
  32.        {       delay1ms(10);       while (key1==0);         timedat[num]++;  //记录按键K1按下次数
  33.                        if (num==2) n1=24;  else n1=60;           //模式变量等于小时2--则回迟到一天或60分钟
  34. if (timedat[num]>=n1)       { timedat[num]=0; }       }
  35.            }
  36.            if (num!=0)
  37.              {       if (key2==0)      
  38. {       delay1ms(10);       while (key2==0);             timedat[num]--;  //记录按键K2按下次数
  39.                        if (num==2) n2=23;else n2=59;                
  40.                        if (timedat[num]<=0)             {timedat[num]=n2; }       }
  41.            }
  42.              EA=1;
  43.        }
  44. //---------------------------------------
  45. //数码管显示函数。时间显示先秒个位计算显示→秒十位计算显示→再分个位计算显示→分十位显示→再时个位计算显示→时十位显示。
  46.        void  display( void )
  47.        {       uchar k;
  48.            if(timedat[0]==0&timedat[1]==0&timedat[2]==7)  {P1=0xff;}
  49.              dis[0]=timedat[0]%10;  dis[1]=timedat[0]/10;   //秒
  50. dis[3]=timedat[1]%10;  dis[4]=timedat[1]/10;  //分
  51. dis[6]=timedat[2]%10;  dis[7]=timedat[2]/10;  //时
  52. for ( k=0;  k<8;  k++ )
  53.                  {       P0=tab[ dis[k] ];  P2=wetab[k];   delay1ms(1);     P2=0x00;       }
  54.        }      
  55. //---------------------------------------
  56. //主函数,时间显示先秒个位计算显示,然后是秒十位计算显示;再就是分个位计算显示,然后是分十位显示;再就是时个位计算显示,然后是时十位显示。定时器中断先检测1秒是否到→1秒如果到则秒单元加1;1秒如果没到就检测1分钟是否到→1分钟如果到则分单元加1;如果没到就检测1小时是否到→1小时如果到则时单元加1;如果没到→则显示时间。
  57.        void main( void )
  58.        {   TMOD=0x01;   //T0定时50ms,方式1
  59.            EA=1;  ET0=1;  TR0=1;  //开中断,允许T0中断,启动T0
  60.            TH0=0x3c;  TL0=0xb0;
  61.            while (1)
  62.                  {       display( ) ;
  63.                        keyscan( ) ;
  64.                  }
  65. }
  66. //定时器/计数器T0中断服务函数。定时器中断先检测1秒是否到→1秒如果到则秒单元加1;1秒如果没到就检测1分钟是否到→1分钟如果到则分单元加1;如果没到就检测1小时是否到→1小时如果到则时单元加1;如果没到→则显示时间。
  67.   void  timer0(void)  interrupt  1
  68. { ET0=0; TR0=0;   //不许T0中断也不启动
  69. TH0=0x3c;  TL0=0xb0;  
  70. TR0=1;  //启动T0
  71. ms50++;
  72. P1=0xf7;
  73.        if(timedat[0]==0&timedat[1]==0&timedat[2]==7)  {P1=0xff;}
  74. if (ms50==20)       {       ms50=0x00;  timedat[0]++;  //变量m回0,且秒加1
  75.            if (timedat[0]==60)       {       timedat[0]=0;timedat[1]++;  //秒到60后回0,且分加1
  76.                  if (timedat[1]==60)       {       timedat[1]=0;timedat[2]++;  //分到60后回0,且时加1
  77.                        if (timedat[2]==24)       {       timedat[2]=0;       }       }       }  //时到24后回0
  78.                       
  79.        }
  80.        ET0=1;   //允许T0中断
  81. }
复制代码

所有资料51hei提供下载:
电子时钟.7z(45.58 KB, 下载次数: 652)




评分

黑币 +50
收起理由
+ 50
共享资料的黑币奖励!

查看全部评分

沙发
ID:482149发表于 2019-3-23 09:19|只看该作者
日期和闹钟怎么显示啊
板凳
ID:565105发表于 2019-6-17 22:19|只看该作者
请问这个单片机怎么用呢
地板
ID:571632发表于 2019-6-25 13:06|只看该作者
希望你能以后多多上传资料
5#
ID:412002发表于 2020-6-8 12:11|只看该作者
请问用什么仿真软件?
6#
ID:785922发表于 2020-6-21 20:08|只看该作者
这个使用共阴极数码管做的吗?我看代码里面既有共阳也有共阴
7#
ID:515926发表于 2020-7-3 15:21|只看该作者
这个代码编写的行数少,收下学习。
8#
ID:462715发表于 2020-11-22 14:32|只看该作者
jhlaox 发表于 2020-6-8 12:11
请问用什么仿真软件?

Proteus
9#
ID:846768发表于 2020-11-22 22:10|只看该作者
timedat[0]==0&timedat[1]==0&timedat[2]==7后面这个为啥等于7?
10#
ID:848043发表于 2020-11-24 20:35|只看该作者
里面没有protures 的文件啊
11#
ID:529972发表于 2020-12-2 20:49|只看该作者
654654141 发表于 2020-11-22 22:10
timedat[0]==0&timedat[1]==0&timedat[2]==7后面这个为啥等于7?

7:00闹钟亮
12#
ID:858511发表于 2020-12-11 09:34|只看该作者
jhlaox 发表于 2020-6-8 12:11
请问用什么仿真软件?

Proteus
13#
ID:858511发表于 2020-12-11 09:35|只看该作者
内容详细,对初学者非常有帮助
14#
ID:859848发表于 2020-12-14 01:39来自手机|只看该作者
jhlaox 发表于 2020-6-8 12:11
请问用什么仿真软件?

protues软件仿真,keil软件编程
15#
ID:857685发表于 2020-12-28 19:26|只看该作者
这个可以啊,很强
16#
ID:925453发表于 2021-5-24 12:26|只看该作者
大神,protus可以用吗
17#
ID:245820发表于 2021-11-12 22:22|只看该作者

应该是开机显示7:00
18#
ID:999989发表于 2022-1-5 14:23|只看该作者
文件里的仿真图为啥打不开呢
19#
ID:262发表于 2022-1-5 16:32|只看该作者
LBJ236 发表于 2022-1-5 14:23
文件里的仿真图为啥打不开呢

右键dsn文件  打开方式选择Proteus8即可打开 如图

或者安装Proteus7.5可以直接打开老版本的dsn文件

51hei.gif(75.33 KB, 下载次数: 123)

51hei.gif
20#
ID:1043621发表于 2022-9-2 14:06|只看该作者
大佬,整点报时怎么能做到
21#
ID:232619发表于 2022-9-24 22:43|只看该作者
这个代码编写的行数少,收下学习。
22#
ID:1003452发表于 2022-12-23 10:43|只看该作者
jhlaox 发表于 2020-6-8 12:11
请问用什么仿真软件?

Proteus
23#
ID:1118204发表于 2024-4-24 23:20|只看该作者
这个有没有文档?

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

Powered by 单片机教程网