找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机数字时钟pcb及原理图Proteus仿真及C51源代码下载

  [复制链接]
跳转到指定楼层
楼主
ID:95411 发表于 2015-11-11 16:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
51单片机做的数字时钟pcb及原理图: 数字时钟.7z (45.39 KB, 下载次数: 323)


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

下面是源代码:
  1. #include <reg51.h>

  2. unsigned char led[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00};  //用一维数组定义0-9、横杠、全灭

  3. unsigned char num[10]={2,0,0,8,0,1,1,6,6,8} ;
  4. unsigned char a[8];           
  5. unsigned char second=0,minute=0,hour=0;
  6. unsigned char minute1=0,hour1=0;
  7. unsigned char b[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};        //扫描
  8. unsigned char k=0;
  9. unsigned int temp;          // 记录1000毫秒为1秒的变量
  10. unsigned char M,S_flag;        //M是模式,更新时间的4种模式加上正常模式        S_flag闪烁标志
  11. sbit K1=P3^0;
  12. sbit K2=P3^1;
  13. sbit K3=P3^2;
  14. sbit BEEP=P3^3;



  15. void delay(unsigned n)              //0.2毫秒
  16. {
  17.   int x,y;
  18.   for(x=0;x<n;x++)
  19.   for(y=0;y<24;y++);
  20. }
  21.   


  22. void init()
  23. {
  24.   M=0;
  25.   S_flag=0;     //闪烁标志位
  26.   TMOD=0x10;   //定时器1以方式1定时
  27.    TH1=0xfc;
  28.    TL1=0x18;
  29.    EA=1;     //打开总中断
  30.    ET1=1;         //允许定时器1中断
  31.    TR1=1;         //开启定时器1 (开始定时计数)

  32. }


  33. void display_led()
  34. {
  35.         int x;
  36.         char l,a,m;
  37.         for(a=0;a<26;a++)
  38.         {
  39.                 x=a-8;
  40.                 for(l=0;l<50;l++)
  41.                 {
  42.                         for(m=0;m<8;m++)
  43.                         {
  44.                                 P2=b[m];
  45.                                 if(x>=0&&x<10) P1=led[num[x]];
  46.                                 else P1=led[11];
  47.                                 
  48.                                 delay(10);
  49.                                 x++;
  50.                         }
  51.                         x-=8;
  52.                 }
  53.         }
  54. }

  55. void time1() interrupt 3                 //定时器1中断函数
  56. {
  57.    TH1=0xfc;                          //定时1ms        
  58.    TL1=0x18;
  59.    temp++;

  60.    if(temp==1000)                 //配合定时器定时1s
  61.    {   temp=0;
  62.                    second++;        
  63.    }

  64.         if(second==59)                                
  65.      {    second=0;
  66.              if(minute<59)
  67.                       minute++;
  68.                  else  {   minute=0;
  69.                                    hour++;
  70.                                    hour%=24;   
  71.                        }
  72.         }
  73.    if(hour1==hour&&minute1==minute&&second<10)                  //闹钟时间到
  74.    {
  75.    BEEP=!BEEP;
  76.    
  77.    }  
  78.    if(temp%250==0)            //每250ms
  79.        S_flag=!S_flag;              //闪烁标志位取反

  80.         
  81.             
  82.          
  83.     if(k==8)  k=0;
  84.          P1=a[k];               
  85.          P2=b[k++];   
  86.          delay(1);         
  87.          P2=0xff;               

  88. }            


  89. void display()
  90. {

  91.         switch(M)
  92.         {
  93.         case 0:
  94.                 {
  95.                         a[0]=led[hour/10];
  96.                         a[1]=led[hour%10];
  97.                         a[2]=led[10];
  98.                         a[3]=led[minute/10];
  99.                         a[4]=led[minute%10];
  100.                         a[5]=led[10];
  101.                         a[6]=led[second/10];
  102.                         a[7]=led[second%10];
  103.                 }break;
  104.         case 1:
  105.                 {
  106.                         if(S_flag==1)
  107.                         {
  108.                                 a[0]=led[hour/10];
  109.                                 a[1]=led[hour%10];
  110.                         }
  111.                         else
  112.                         {
  113.                                 a[0]=led[11];
  114.                                 a[1]=led[11];
  115.                         }
  116.                         a[2]=led[10];
  117.                         a[3]=led[minute/10];
  118.                         a[4]=led[minute%10];
  119.                         a[5]=led[10];
  120.                         a[6]=led[second/10];
  121.                         a[7]=led[second%10];
  122.                 }break;
  123.         case 2:
  124.                 {
  125.                         a[0]=led[hour/10];
  126.                         a[1]=led[hour%10];
  127.                         a[2]=led[10];
  128.                         if(S_flag==1)
  129.                         {
  130.                                 a[3]=led[minute/10];
  131.                                 a[4]=led[minute%10];
  132.                         }
  133.                         else
  134.                         {
  135.                                 a[3]=led[11];
  136.                                 a[4]=led[11];
  137.                         }
  138.                         a[5]=led[10];
  139.                         a[6]=led[second/10];
  140.                         a[7]=led[second%10];
  141.                 }break;
  142.         case 3:
  143.                 {
  144.                         if(S_flag==1)
  145.                         {
  146.                                 a[0]=led[hour1/10];
  147.                                 a[1]=led[hour1%10];
  148.                         }
  149.                         else
  150.                         {
  151.                                 a[0]=led[11];
  152.                                 a[1]=led[11];
  153.                         }
  154.                         a[2]=led[10];
  155.                         a[3]=led[minute1/10];
  156.                         a[4]=led[minute1%10];
  157.                         a[5]=led[10];
  158.                         a[6]=led[11];
  159.                         a[7]=led[11];
  160.                 }break;
  161.         case 4:
  162.                 {
  163.                         a[0]=led[hour1/10];
  164.                         a[1]=led[hour1%10];
  165.                         a[2]=led[10];
  166.                         if(S_flag==1)
  167.                         {
  168.                                 a[3]=led[minute1/10];
  169.                                 a[4]=led[minute1%10];
  170.                         }
  171.                         else
  172.                         {
  173.                                 a[3]=led[11];
  174.                                 a[4]=led[11];
  175.                         }
  176.                         a[5]=led[10];
  177.                         a[6]=led[11];
  178.                         a[7]=led[11];
  179.                 }

  180.         }
  181. }           


  182. void key_prc()
  183. {
  184.   
  185.            if(K1==0)
  186.                  {
  187.                         delay(10);                //延时去抖                          
  188.                         if(K1==0)           //按K1进行模式切换  
  189.                         {   M++;
  190.                                 if(M==5)
  191.                  M=0;
  192.                         }
  193.                         while(!K1);//等待按键释放
  194.                  }                                                         

  195.   
  196.        if(M!=0)
  197.        {
  198.          switch(M)
  199.          {
  200.               case 1:                   //模式1——调时
  201.               {
  202.                                 if(K2==0)
  203.                                 {
  204.                                         delay(10);                //延时去抖         
  205.                                     if(K2==0)       //加键按下
  206.                                         {           
  207.                                                 if(hour<23) hour++;
  208.                                                 else hour=0;
  209.                                         }
  210.                                         while(!K2);           //等待按键释放
  211.                                 }
  212.                                           
  213.                                 if(K3==0)
  214.                                 {
  215.                                         delay(10);                                         
  216.                                     if(K3==0)        
  217.                                           {
  218.                                                 if(hour> 0) hour--;
  219.                                                 else hour=23;
  220.                                     }
  221.                                         while(!K3);         
  222.                                 }
  223.                       } break;
  224.                                              
  225.                           case 2:                  //模式2——调分
  226.                           {                                 
  227.                                 if(K2==0)
  228.                                 {
  229.                                         delay(10);               
  230.                                         if(K2==0)      
  231.                                         {                                
  232.                                                 if(minute<59) minute++;
  233.                                                 else minute=0;
  234.                                         }
  235.                                         while(!K2);
  236.                                 }
  237.                                           
  238.                                 if(K3==0)
  239.                                 {
  240.                                         delay(10);                                
  241.                                         if(K3==0)         
  242.                                           {
  243.                                                 if(minute>0) minute--;
  244.                                                 else minute=59;
  245.                                     }
  246.                                         while(!K3);
  247.                             }
  248.                         } break;
  249.                                     
  250.                                  case 3:                  //模式3——闹钟调时
  251.                                   {                                          
  252.                                         if(K2==0)
  253.                                                 {
  254.                                                         delay(10);                        
  255.                                                 if(K2==0)      
  256.                                                                 {           
  257.                                                                    if(hour1<23)
  258.                                                            hour1++;
  259.                                                                    else hour1=0;
  260.                                                                 }
  261.                                                         while(!K2);         
  262.                                             }
  263.                                           
  264.                                          if(K3==0)
  265.                                                 {
  266.                                                         delay(10);                        
  267.                                                         if(K3==0)         
  268.                                                       { if(hour1>0)
  269.                                                      hour1--;
  270.                                                                   else hour1=23;
  271.                                                 }
  272.                                                         while(!K3);
  273.                                                  }
  274.                                   }         break;
  275.                                          
  276.                                   case 4:                  //模式4——闹钟调分  
  277.                                    {         
  278.                                          if(K2==0)
  279.                                                 {
  280.                                                         delay(10);                                         
  281.                                                 if(K2==0)      
  282.                                                             {           
  283.                                                                   if(minute1<59)
  284.                                                           minute1++;
  285.                                                                   else minute1=0;
  286.                                                                 }
  287.                                                 while(!K2);
  288.                                                 }
  289.                                 
  290.                                         if(K3==0)
  291.                                                 {
  292.                                                         delay(10);                //延时去抖                        
  293.                                                     if(K3==0)          //减键按下
  294.                                                       { if(minute1>0)
  295.                                                      minute1--;
  296.                                                                   else minute1=59;
  297.                                                 }
  298.                                                 while(!K3);                 
  299.                                         }
  300.                                         }  break;
  301.                 }
  302.         }                                 
  303. }         


  304. void main()
  305. {
  306.         display_led();
  307.           init();
  308.     while(1)
  309.     {
  310.      key_prc();
  311.          display();
  312.         }        
  313. }   
复制代码


评分

参与人数 2黑币 +55 收起 理由
龙腾四海 + 5 很给力!
admin + 50 共享资料的积分奖励!

查看全部评分

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

使用道具 举报

沙发
ID:91888 发表于 2015-11-12 22:17 | 只看该作者
第一个回帖么?
回复

使用道具 举报

板凳
ID:92497 发表于 2015-11-13 08:28 | 只看该作者
先顶再说
回复

使用道具 举报

地板
ID:92497 发表于 2015-11-13 08:35 | 只看该作者
好像定义数组的时候加 code 可以不占内存,如 “unsigned char led[12]={};”可以这样 “unsigned char  code led[12]={};”
回复

使用道具 举报

5#
ID:95438 发表于 2015-11-23 14:35 | 只看该作者
试试看
回复

使用道具 举报

6#
ID:97497 发表于 2015-11-28 21:42 | 只看该作者
不能显示日期,要是加一下日期就好了
回复

使用道具 举报

7#
ID:97771 发表于 2015-12-1 21:18 | 只看该作者
刚好想做一个
回复

使用道具 举报

8#
ID:98731 发表于 2015-12-7 20:42 | 只看该作者
顶一个再说。
回复

使用道具 举报

9#
ID:100091 发表于 2015-12-24 09:00 | 只看该作者
可以可以
回复

使用道具 举报

10#
ID:100266 发表于 2015-12-24 09:12 | 只看该作者
仿真图打不开啊
回复

使用道具 举报

11#
ID:95809 发表于 2015-12-24 13:40 | 只看该作者
资料不错,挺简洁的,不像一些加了一堆外围电路的设计
回复

使用道具 举报

12#
ID:113764 发表于 2016-4-16 16:13 | 只看该作者
楼主的仿真图没问题,可以打开的
回复

使用道具 举报

13#
ID:115321 发表于 2016-4-21 21:04 | 只看该作者
这个看着很可以啊!感谢
回复

使用道具 举报

14#
ID:99130 发表于 2016-4-23 12:33 | 只看该作者
仿真打不开
回复

使用道具 举报

15#
ID:99130 发表于 2016-4-23 12:34 | 只看该作者
郭263337 发表于 2016-4-16 16:13
楼主的仿真图没问题,可以打开的

怎么打开
回复

使用道具 举报

16#
ID:110624 发表于 2016-4-23 15:35 | 只看该作者
PCB文件用哪款软件能打开?用Altium Designer的话怎么才能打开?
回复

使用道具 举报

17#
ID:85227 发表于 2016-5-8 19:46 | 只看该作者
怎么没看到PCB图啊
回复

使用道具 举报

18#
ID:106900 发表于 2016-5-10 14:31 | 只看该作者
谢谢楼主分享
回复

使用道具 举报

19#
ID:29369 发表于 2016-5-11 15:26 | 只看该作者
求资料啊!
回复

使用道具 举报

20#
ID:127522 发表于 2016-6-21 10:27 | 只看该作者
顶一个
回复

使用道具 举报

21#
ID:128212 发表于 2016-6-26 21:11 | 只看该作者
不错,挺好用
回复

使用道具 举报

22#
ID:128208 发表于 2016-6-26 21:20 | 只看该作者
顶一个
回复

使用道具 举报

23#
ID:128271 发表于 2016-6-28 21:57 | 只看该作者
做一个试试
回复

使用道具 举报

24#
ID:140489 发表于 2016-9-26 13:44 | 只看该作者
看看看先
回复

使用道具 举报

25#
ID:59525 发表于 2016-10-1 16:23 | 只看该作者
看看楼主的好东西
回复

使用道具 举报

26#
ID:192309 发表于 2017-4-22 13:17 | 只看该作者
很给力!!!
回复

使用道具 举报

27#
ID:194844 发表于 2017-5-4 20:26 | 只看该作者

资料不错,挺简洁的
回复

使用道具 举报

28#
ID:191450 发表于 2017-5-5 08:29 | 只看该作者
好像定义数组的时候加 code 可以不占内存
回复

使用道具 举报

29#
ID:250385 发表于 2017-11-17 13:25 | 只看该作者
实用,给力!!!
回复

使用道具 举报

30#
ID:264006 发表于 2018-1-3 10:55 | 只看该作者
pcb图打不开啊
回复

使用道具 举报

31#
ID:355175 发表于 2018-6-21 10:29 | 只看该作者
pcb图打不开啊
回复

使用道具 举报

32#
ID:783064 发表于 2020-6-18 12:09 | 只看该作者
proteus能打开吗
回复

使用道具 举报

33#
ID:783064 发表于 2020-6-18 12:23 | 只看该作者
用proteus能打开吗
回复

使用道具 举报

34#
ID:969833 发表于 2023-5-14 15:00 | 只看该作者

需要用Proteus7.8版本才能打开
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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