找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4030|回复: 0
收起左侧

51单片机8位7段数码管时钟Proteus仿真程序

[复制链接]
ID:249826 发表于 2020-3-29 22:15 | 显示全部楼层 |阅读模式
51单片机8位7段数码管时钟
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
51hei截图_20200329221408.png

单片机源程序如下:
  1. #include<reg52.h>
  2. #include"intrins.h"
  3. #define uint unsigned int
  4. #define uchar unsigned char  

  5. sbit fmq=P3^0; //蜂鸣器控制

  6. char  table[]={        0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,  0xff,  0xc6,  0xc7,  0x88,};                //共阳极数码管编码 “0-9”
  7. //                0    1   2     3   4     5    6   7    8   9     不显示   C       L      A
  8. uchar val[8]={0,0,0,0,0,0,11,12};          //数码管显示缓冲区

  9. uint count=0;   //                                                           
  10. char shi=0,fen=0,miao=0;   //时分秒变量
  11. char nzshi=0,nzfen=0,nzmiao=0;        //闹钟时分秒变量  
  12. uchar wei=0x01,duan=0;       // 控制数码管段 和位显示的变量

  13. void led() //数码管扫描函数
  14. {            
  15.             P0=0Xff;
  16.                   P2=wei;               
  17.       if((duan==1)||(duan==3))  //这里是加小数点用的
  18.                         {
  19.          P0=(table[val[duan]]&0x7f);        
  20.       }                               
  21.                    else
  22.                         {
  23.        P0=table[val[duan]];
  24.       }       
  25.                        
  26.             duan++;
  27.             if(duan>7)
  28.                         duan=0;
  29.                   wei=_crol_(wei,1);
  30. }                                       

  31. void time0init()  //定时器0初始化
  32. {
  33.   TMOD=0X01;
  34.   TH0=(65536-2000)/256;
  35.   TL0=(65536-2000)%256;
  36.   ET0=1;
  37.   TR0=1;
  38.   EA=1;
  39. }

  40. uchar keytime=0;  //按键
  41. uint bjtime=0;  //报警计时变量
  42. bit  sjbs=0;  //按键A 控制时间走停的变量
  43. void time0() interrupt 1  // 定时器0中断服务函数
  44. {
  45. TH0=(65536-2000)/256;
  46. TL0=(65536-2000)%256;
  47. if(sjbs)
  48. {
  49.   count++;
  50. }
  51.   bjtime++;
  52. keytime++;
  53. led();                //2ms扫描一次数码管显示
  54. }       


  55. uchar key()          //按键扫描程序
  56. {                          
  57.                 static  uchar kzt=0;
  58.                 uchar sb=25;       
  59.                 switch(kzt)
  60.                 {
  61.                  case 0:
  62.                  P1=0xff;
  63.                  if(P1!=0xff)
  64.                         {
  65.                          kzt=1;
  66.                          return 25;                       
  67.                         }
  68.                  break;
  69.                 case 1:
  70.                 P1=0xff;
  71.                         if(P1!=0xff)
  72.                          {
  73.                                 switch(P1)
  74.                                 {
  75.                                  case 0xfe:
  76.                                  sb=1;
  77.                                  break;
  78.                                  case 0xfd:
  79.                                  sb=2;
  80.                                  break;
  81.                                  case 0xfb:
  82.                                  sb=3;
  83.                                 break;                                 
  84.                                 case 0xf7:
  85.                                  sb=4;
  86.                                  break;       
  87.         case 0xef:
  88.                                  sb=5;
  89.                                  break;
  90.                                  case 0xdf:
  91.                                  sb=6;
  92.                                  break;
  93.                                  case 0xbf:
  94.                                  sb=7;
  95.                                 break;                                 
  96.                                 case 0x7f:
  97.                                  sb=8;
  98.                                  break;                                                               
  99.                                 }
  100.                          kzt=2;
  101.                         return sb;
  102.                         }
  103.                          else
  104.                         {
  105.                         kzt=0;
  106.                         return 25;                               
  107.                         }
  108.                         break;

  109.                         case 2:
  110.                         P1=0xff;
  111.                         if(P1==0xff)
  112.                         {
  113.                          kzt=0;
  114.                          return 25;
  115.                         }                         
  116.                         break;
  117.                         }                       
  118.                 return 25;       
  119. }
  120.        

  121. void sj()         //时分秒时间更新
  122. {
  123.          if(count>499)
  124.          {
  125.            count=0;
  126.                  miao++;
  127.                   if(miao>59)
  128.                         {
  129.                  miao=0;
  130.                                 fen++;
  131.                                  if(fen>59)
  132.                                  {
  133.                       fen=0;
  134.                                           shi++;
  135.                                           if(shi>23)
  136.                                                 {
  137.                     shi=0;
  138.                                           }  
  139.                                   }                                                
  140.              }                 
  141.                          
  142.          }

  143. }



  144. void  main()
  145. {
  146.    uchar keycode=25,zt=1;
  147.    bit bjbs=0;       
  148.         fmq=1;
  149.   time0init();         //初始化定时器0   
  150.   while(1)
  151.   {
  152.    if(keytime>9) //20ms 扫描一次按键
  153.          {
  154.     keytime=0;
  155.                 keycode=key();
  156.    }
  157.    
  158.          if(((fen==0)&&(miao==0))||((shi==nzshi)&&(fen==nzfen)&&(miao==nzmiao)))
  159.          { //  判断整点                判断是否到闹钟时间
  160.      bjbs=1;
  161.                  fmq=0;
  162.                  bjtime=0;
  163.    }

  164.          

  165.          
  166.          if(bjbs)   //报警处理
  167.          {
  168.      if(bjtime>30000)
  169.            {
  170.       fmq=1;
  171.                         bjbs=0;
  172.      }
  173.                  if((keycode>1)&&(keycode<5)) //只要在鸣叫时调节就停止鸣叫
  174.                  {
  175.        bjbs=0;
  176.                          fmq=1;
  177.      }
  178.    }
  179.        
  180.                  
  181.          
  182.    switch(zt)
  183.    {
  184.     case 1:   // 时钟显示
  185.                        
  186.          val[0]=shi/10;  //显示数据更新
  187.          val[1]=shi%10;
  188.          
  189.          val[2]=fen/10;
  190.          val[3]=fen%10;
  191.          
  192.          val[4]=miao/10;
  193.          val[5]=miao%10;
  194.                          
  195.          val[6]=11;
  196.          val[7]=12;
  197.                
  198.                 if(keycode==1)  //A   时间运行与暂停
  199.          {
  200.     sjbs=!sjbs;
  201.                  keycode=25;
  202.    }       
  203.          sj();
  204.          
  205.                  if(keycode==2)  //B 秒加1
  206.          {
  207.      miao++;
  208.                  if(miao>59)
  209.                  {
  210.       miao=0;
  211.      }
  212.                  keycode=25;
  213.    }
  214.          
  215.                  if(keycode==3)//C分 加1
  216.          {
  217.     fen++;
  218.                  if(fen>59)
  219.                  {
  220.       fen=0;
  221.      }
  222.                  keycode=25;
  223.    }
  224.          
  225.                  if(keycode==4)//D 时加1
  226.          {
  227.     shi++;
  228.                  if(shi>23)
  229.                  {
  230.       shi=0;
  231.      }
  232.                  keycode=25;
  233.    }
  234.          
  235.                   if(keycode==5) //E 进入闹钟设置状态
  236.          {
  237.       zt=2;
  238.                  keycode=25;
  239.    }
  240.          
  241.                 break;
  242.                        
  243.                
  244.                 case 2: //闹钟显示与调节
  245.                        
  246.                 sj();        //时间更新
  247.          val[0]=nzshi/10; //显示数据更新
  248.          val[1]=nzshi%10;
  249.          
  250.          val[2]=nzfen/10;
  251.          val[3]=nzfen%10;
  252.          
  253.          val[4]=nzmiao/10;
  254.          val[5]=nzmiao%10;
  255.                          
  256.          val[6]=13;
  257.          val[7]=12;       

  258.             if(keycode==2) //B 闹钟秒加1
  259.          {
  260.      nzmiao++;
  261.                  if(nzmiao>59)
  262.                  {
  263.       nzmiao=0;
  264.      }
  265.                  keycode=25;
  266.    }
  267.          
  268.                  if(keycode==3) //C  闹钟分加1
  269.          {
  270.     nzfen++;
  271.                  if(nzfen>59)
  272.                  {
  273.       nzfen=0;
  274.      }
  275.                  keycode=25;
  276.    }
  277.          
  278.                  if(keycode==4) //D 闹钟时加1
  279.          {
  280.     nzshi++;
  281.                  if(nzshi>23)
  282.                  {
  283.       nzshi=0;
  284.      }
  285.                  keycode=25;
  286.    }
  287.          
  288.                   if(keycode==5) //E 进入时钟显示状态
  289.          {
  290.       zt=1;
  291.                  keycode=25;
  292.    }               
  293.                 break;
  294.                

  295.   }         


  296.   }

  297. }
复制代码

所有资料51hei提供下载:
时钟.rar (87.8 KB, 下载次数: 44)

评分

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

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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