找回密码
 立即注册

QQ登录

只需一步,快速开始

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

一个计数闹铃单片机时钟程序与Proteus仿真

[复制链接]
ID:155811 发表于 2021-11-20 14:52 | 显示全部楼层 |阅读模式
1.使用定时器T0,动态显示数码管数字,
   T0 到达则显示一个数字

2.对秒信号计数方式来计时,而且不使用外部中断。

3.对外引脚脉冲计数,也不使用外部中断

这样可以避免按键时阻塞进程,使动态显示分时不均

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
51hei.gif cntTime.jpg

单片机源程序如下:
  1. #include "reg52.h"  //包含stc15w401单片机的头文件
  2. #include "defType.h"

  3. #define MOD_NORMAL 0
  4. #define MOD_COUNT 1
  5. #define MOD_SETALARM 2


  6. //the set BUTTON
  7. #define P_LED  P1
  8. #define P_WEI  P3

  9. sbit P_MINUTE_UP   =P3^0;  
  10. sbit P_HOUR_UP     =P3^1;  
  11. sbit P_SEC         =P3^2;
  12. sbit P_CNT         =P3^3;

  13. sbit P_MOD         =P2^0;
  14. sbit P_ALARM  =P2^1;

  15. //p3.0- p3.7 to link to LED‘s a to h,0-9
  16. u8 code segCode[17]={0xC0,0xF9,0xA4,0xB0,0x99,
  17.                0x92,0x82,0xF8,0x80,0x90,0xff,//
  18.                0xa7,0xab,0x87,//cnt, counter mode
  19.                                                          0x88,0xc7,0x88};//ala,set alarm mode
  20.                                                          

  21. #define SET_M_BUF(m) dspBuf[0]= m%10; \
  22.                   dspBuf[1]= m/10

  23. #define SET_H_BUF(h) if(h<10) \
  24.                      { dspBuf[2]= h;dspBuf[3]= 10;} \
  25.                      else \
  26.                      { dspBuf[2]= h%10;dspBuf[3]= h/10;}

  27. #define UP_MINUTE(m) m++; \
  28.           if(m>59) m= 0; \
  29.                                   SET_M_BUF(m)

  30. #define UP_HOUR(h)  h++;  \
  31.          if(h>23) h=0;         \
  32.                                  SET_H_BUF(h)


  33. #define ZERO_BUF dspBuf[0]= 0; \
  34.                  dspBuf[1]= 0; \
  35.                                                                  dspBuf[2]= 0; \
  36.                                                                  dspBuf[3]= 0

  37. //current time and alarm time
  38. u8 minute= 3, hour=2;
  39. u8 a_minute=0, a_hour=0;

  40. ///////////////////////////////
  41. u8 dspBuf[4];

  42. u8 i= 0, mode= MOD_NORMAL;
  43. u16 sec=0, count=0;
  44. u8  oldSec=0, oldCnt=0;
  45. u8  sec5=0; //when setting alarm, if no key down for 5 sec,alarm is seted  
  46. bool alarmSeted = 0;

  47. void flashDot()
  48. {
  49.          if(P_SEC)
  50.                  P_LED&= 0x7f;
  51. }

  52. void modeDisplay()
  53. {
  54.         if(mode== MOD_NORMAL)
  55.         {
  56.                 SET_M_BUF(minute);
  57.                 SET_H_BUF(hour);
  58.         }
  59.         else
  60.         {
  61.          dspBuf[0]= 10; //no display
  62.          dspBuf[1]= 10+3*mode; // '-'
  63.          dspBuf[2]= 9+3*mode;
  64.          dspBuf[3]= 8+3*mode; //  '-'
  65.         }
  66. }

  67. void counting()
  68. {
  69.         if(oldCnt== P_CNT)
  70.                  return;
  71.         count++; \
  72.   if(count>9999) count= 0;
  73.         SET_M_BUF(count%100); \
  74.   SET_H_BUF(count/100);
  75.         oldCnt= P_CNT;
  76. }

  77. void timing() //INT0_INTERRUPT using 0
  78. {
  79.          if(oldSec== P_SEC)
  80.                  return;
  81.                 oldSec= P_SEC;
  82.                
  83.                 //seting alarm,
  84.                 //if no button press over 5 second
  85.                 //alarm is seted
  86.                 //else alarm will cancle
  87.                 if( mode == MOD_SETALARM )
  88.                 {
  89.                          sec5++;
  90.                          if(sec5> 10)
  91.                          {
  92.                                  alarmSeted= 1;
  93.                                  mode= MOD_NORMAL;
  94.                                  modeDisplay();
  95.                                  sec5=0;
  96.                          }
  97.                 }
  98.                
  99.                 sec++;
  100.                 if(sec> 119)
  101.                 {
  102.                          sec= 0;
  103.                          minute++;
  104.                         if(minute> 59)
  105.                         {
  106.                                  minute= 0;
  107.                                  hour++;  
  108.          if(hour>23) hour=0;
  109.          if(mode== MOD_NORMAL) //normal mod or is alarm mod
  110.                            {
  111.                               SET_H_BUF(hour);
  112.                            }
  113.                                          
  114.                          }
  115.                         
  116.                                 //check alarm every minute
  117.                                 P_ALARM= 0;
  118.                                 if( alarmSeted && (minute== a_minute ) && (hour==a_hour) )
  119.                                         P_ALARM= 1;
  120.                                 
  121.                                 if(mode== MOD_NORMAL)
  122.                                 {
  123.                                          SET_M_BUF(minute);
  124.                                 }
  125.                                                 
  126.                 }
  127.         
  128. }

  129. void display() T0_INTERRUPT using 0
  130. {     
  131.    T0_Stop;
  132.          
  133.          P3&= 0x0f;
  134.    P_WEI |=(0x10<<i);
  135.          P_LED= segCode[dspBuf[i] ];
  136.          
  137.          if(i==2)
  138.          {
  139.       if(mode== MOD_NORMAL)
  140.                           flashDot();        
  141.       if(mode==MOD_SETALARM)
  142.                                 P_LED&= 0x7f;
  143.                 }
  144.          i++;
  145.          if(i>3)
  146.          {
  147.                  i=0;
  148.                  timing();
  149.                  if(mode== MOD_COUNT)
  150.         counting();                        
  151.          }
  152.          T0_Load(4000);
  153.          T0_Run;         

  154. }

  155. void main(void)
  156. {  
  157. //T0 use to display  
  158.    T0_16bit;
  159.    T0_Load(5000);
  160.          T0_PolityHigh;
  161.    T0_Enable;
  162.    T0_Run; //
  163.          
  164.          //
  165.          EnableAllInt;
  166.          SET_H_BUF(hour);
  167.          SET_M_BUF(minute);
  168.          P_ALARM= 0;

  169.    while(1)
  170.    {  
  171.                  
  172.                   KeyPress(P_MOD,{
  173.                mode++;
  174.                if(mode> MOD_SETALARM)
  175.                                  {
  176.                                          alarmSeted=0;
  177.                                          P_ALARM= 0;
  178.                                          mode= MOD_NORMAL;
  179.                                  }
  180.                modeDisplay();
  181.                         });

  182.       KeyPress(P_MINUTE_UP,
  183.             {
  184.                switch(mode){
  185.                            case MOD_NORMAL:
  186.                                          SET_H_BUF(hour);
  187.                              UP_MINUTE(minute);
  188.            break;
  189.          case MOD_SETALARM:
  190.                                          UP_MINUTE(a_minute);
  191.                                          SET_H_BUF(a_hour);
  192.                                          if(i==2) P_LED&= 0x7f;//disply dot
  193.                                          sec5= 0;
  194.            break;
  195.          case MOD_COUNT:
  196.            count= 0;
  197.                                          ZERO_BUF;
  198.                                          
  199.            break;
  200.           }
  201.                          });
  202.             KeyPress(P_HOUR_UP , {
  203.                                 switch(mode){
  204.                            case MOD_NORMAL:
  205.                                          SET_M_BUF(minute);
  206.                              UP_HOUR(hour);
  207.            break;
  208.          case MOD_SETALARM:
  209.                                          SET_M_BUF(a_minute);
  210.                                          UP_HOUR(a_hour);
  211.                                          
  212.                                          sec5= 0;
  213.            break;
  214.          
  215.           }
  216.                          });
  217.    }
  218. }
复制代码

仿真Keil代码下载,请大家多多指教:
cnttm.rar (30.65 KB, 下载次数: 11)

评分

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

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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