找回密码
 立即注册

QQ登录

只需一步,快速开始

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

C51单片机的可调电子时钟Proteus仿真代码设计

[复制链接]
跳转到指定楼层
楼主
要求:



仿真电路图:


单片机KEIL程序及仿真图:
  1. #include <reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit set=P1^0;
  5. sbit save=P1^5;
  6. sbit rselect=P1^1;
  7. sbit lselect=P1^2;
  8. sbit add=P1^3;
  9. sbit reduce=P1^4;

  10. uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  11. uchar disp_buf[6];
  12. uchar disp_bit=0;
  13. uint hour,min,sec;
  14. uint select_num=0;
  15. uint hour_adj,min_adj,sec_adj;
  16. uchar count;
  17. uchar key_num=0;       
  18. void key_scan()
  19. {                                                  
  20.         if(!set)
  21.         {
  22.                 hour_adj=hour;
  23.                 min_adj=min;
  24.                 sec_adj=sec;
  25.                 key_num++;
  26.         }
  27.         while(!set);
  28.         if(key_num%2==1)               
  29.         {
  30.                 if(rselect==0)
  31.                 {
  32.                         select_num++;
  33.                         if(select_num==4)
  34.                         select_num=1;
  35.                 }
  36.                 while(!rselect);
  37.                 if(lselect==0)
  38.                 {
  39.                         select_num--;
  40.                         if(select_num<=0)
  41.                         select_num=3;
  42.                 }
  43.                 while(!lselect);
  44.         }
  45.         if(!add&&(key_num%2))
  46.         {
  47.                 switch(select_num)
  48.                 {
  49.                         case 1 :
  50.                         {
  51.                                 hour_adj++;
  52.                                 if(hour_adj==24)
  53.                                 hour_adj=0;
  54.                                 break;
  55.                         }
  56.                         case 2 :
  57.                         {
  58.                                 min_adj++;
  59.                                 if(min_adj==60)
  60.                                 min_adj=0;
  61.                                 break;
  62.                         }
  63.                         case 3 :
  64.                         {
  65.                                 sec_adj++;
  66.                                 if(sec_adj==60)
  67.                                 sec_adj=0;
  68.                                 break;
  69.                         }
  70.                         default:break;
  71.                 }
  72.                 while(!add);
  73.         }
  74.         if(!reduce&&(key_num%2))
  75.         {
  76.                 switch(select_num)
  77.                 {
  78.                         case 1 :
  79.                         {
  80.                                 hour_adj--;
  81.                                 if(hour_adj<=0)
  82.                                 hour_adj=23;
  83.                                 break;
  84.                         }
  85.                         case 2 :
  86.                         {
  87.                                 min_adj--;
  88.                                 if(min_adj<=0)
  89.                                 min_adj=59;
  90.                                 break;
  91.                         }
  92.                         case 3 :
  93.                         {
  94.                                 sec_adj--;
  95.                                 if(sec_adj<=0)
  96.                                 sec_adj=59;
  97.                                 break;
  98.                         }
  99.                         default:break;
  100.                 }
  101.                 while(!reduce);
  102.         }
  103.         if(!save&&(key_num%2))
  104.         {
  105.                 select_num=0;
  106.                 hour=hour_adj;
  107.                 min=min_adj;
  108.                 sec=sec_adj;
  109.                 while(!save);
  110.         }          
  111. }               
  112.        
  113. /*主函数*/
  114. void main()
  115. {
  116.         TMOD=0x11;
  117.         TH0=0xf7;
  118.         TL0=0x00;
  119.         TH1=0x4c;
  120.         TH0=0x00;
  121.         ET0=1;
  122.         ET1=1;
  123.         EA=1;
  124.         TR0=1;
  125.         TR1=1;
  126.         PT1=1;
  127.         hour=23;
  128.         min=58;
  129.         sec=49;
  130.         count=0;
  131.         while(1)
  132.         {
  133.                 key_scan();
  134.                 if(key_num%2)
  135.                 {
  136.                 switch(select_num)
  137.                 {
  138.                         case 1 :
  139.                         {
  140.                                  if(count<=10)
  141.                                 {
  142.                                         disp_buf[0]=hour_adj/10;
  143.                                         disp_buf[1]=hour_adj%10;
  144.                                 }
  145.                                 else
  146.                                 {
  147.                                         disp_buf[0]=0x40;
  148.                                         disp_buf[1]=0x40;
  149.                                 }
  150.                                 disp_buf[2]=min_adj/10;
  151.                                 disp_buf[3]=min_adj%10;
  152.                                 disp_buf[4]=sec_adj/10;
  153.                                 disp_buf[5]=sec_adj%10;
  154.                                 break;
  155.                         }
  156.                         case 2 :
  157.                         {
  158.                                  if(count<=10)
  159.                                 {
  160.                                         disp_buf[2]=min_adj/10;
  161.                                         disp_buf[3]=min_adj%10;
  162.                                 }
  163.                                 else
  164.                                 {
  165.                                         disp_buf[2]=0x40;
  166.                                         disp_buf[3]=0x40;
  167.                                 }
  168.                                 disp_buf[0]=hour_adj/10;
  169.                                 disp_buf[1]=hour_adj%10;
  170.                                 disp_buf[4]=sec_adj/10;
  171.                                 disp_buf[5]=sec_adj%10;
  172.                                 break;
  173.                         }
  174.                         case 3 :
  175.                         {
  176.                                  if(count<=10)
  177.                                 {
  178.                                         disp_buf[4]=sec_adj/10;
  179.                                         disp_buf[5]=sec_adj%10;
  180.                                 }
  181.                                 else
  182.                                 {
  183.                                         disp_buf[4]=0x40;
  184.                                         disp_buf[5]=0x40;
  185.                                 }
  186.                                 disp_buf[0]=hour_adj/10;
  187.                                 disp_buf[1]=hour_adj%10;
  188.                                 disp_buf[2]=min_adj/10;
  189.                                 disp_buf[3]=min_adj%10;
  190.                                 break;
  191.                         }
  192.                         default :         break;
  193.                 }
  194.                 }
  195.                 if(key_num%2==0)
  196.                 {
  197.                         disp_buf[0]=hour/10;
  198.                         disp_buf[1]=hour%10;
  199.                         disp_buf[2]=min/10;
  200.                         disp_buf[3]=min%10;
  201.                         disp_buf[4]=sec/10;
  202.                         disp_buf[5]=sec%10;       
  203.                                
  204.                 }
  205.         }
  206. }

  207. void timer0() interrupt 1
  208. {
  209.         TH0=0xf7;
  210.         TL0=0x00;
  211.         P2=~(0x01<<disp_bit);
  212.         P0=tab[disp_buf[disp_bit]];
  213.         disp_bit++;
  214.         if(disp_bit==6) disp_bit=0;       
  215. }

  216. void timer1() interrupt 3
  217. {
  218.         TH1=0x4c;
  219.         TL1=0x00;
  220.         if(++count==20)
  221.         {
  222.                 count=0;
  223.                 if(++sec==60)
  224.                 {
  225.                         sec=0;
  226.                         if(++min==60)
  227.                         {
  228.                                 min=0;
  229.                                 if(++hour==24)
  230.                                 {
  231.                                         hour=0;
  232.                                 }
  233.                         }

  234.                 }
  235.         }
  236. }
复制代码


全部资料51hei下载地址:
keshe2.7z (31.66 KB, 下载次数: 93)

评分

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

查看全部评分

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

使用道具 举报

沙发
ID:770620 发表于 2020-6-7 21:58 来自手机 | 只看该作者
想问下怎么在整点的时候蜂鸣器或者扬声器报时?
回复

使用道具 举报

板凳
ID:772967 发表于 2020-6-8 19:25 | 只看该作者
谢谢楼主的分析!超赞的!
回复

使用道具 举报

地板
ID:779507 发表于 2020-6-17 09:06 | 只看该作者
支持楼主的分析!支持支持
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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