找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机多功能闹钟仿真加源程序

[复制链接]
跳转到指定楼层
楼主
1.时分秒的正常显示
2.可单独调整时钟的分十秒
3.闹钟功能
4,键功能说明
second--正常显示和闹钟状态时调整秒位
minute--正常显示和闹钟状态时调整分位
hour--正常显示和闹钟状态时调整分位
alarm--开启和关闭闹钟功能(变量alarm_is_ok,1为open,0为close)
stop-set-open-close

显示该单片机多功能闹钟的仿真原理图:



部分源码预览:
  1. #include  "Key.h"
  2. #include  "led.h"

  3. uchar timeSetBuff[8]={'0','0',LED_MODE_COUNT,'0','0',LED_MODE_COUNT,'0','0'};//时钟数据缓冲区
  4. uchar alarmSetBuff[8]={'0','0',LED_MODE_ALARM,'0','0',LED_MODE_ALARM,'0','0'};//闹钟时间数据缓冲区
  5. uchar timeDisMod=0x24;                //00100100
  6. uchar secondTemp,minuteTemp,hourTemp;
  7. uchar secondAlarm,minuteAlarm,hourAlarm;
  8. uchar timer0Temp;
  9. uchar alarmKeyCount;                   //闹钟起停键计数
  10. bit alarm_is_ok;                       //闹钟起停状态
  11. bit time_is_ok;                        //时间是否到
  12. bit interface_mod;                     // 显示界面模式,0为主时间界面,1为设置界面

  13. /********************************************************************************************
  14. * 函数名称:定时器0
  15. * 功    能:定时器0初始化
  16. * 入口参数:无
  17. * 出口参数:无
  18. *********************************************************************************************/          
  19. void initTimer0(void)                      //定时10ms
  20. {
  21.    TMOD |= 0x01;                        //GATE=0,TR=1运行;C/T=1,counter,0,timer;01十六进制  
  22.    TH0 = 0xdc;
  23.    TL0 = 0x00;
  24.    TR0 = 1;                                  //timer0 控制位,为1时启动timer0
  25.    ET0 = 1;                             //timer0 中断使能
  26. }

  27. /********************************************************************************************
  28. * 函数名称:时钟比较
  29. * 功    能:比较时钟和闹钟的时间缓冲区,只比较时和分
  30. * 入口参数:无
  31. * 出口参数:无
  32. *********************************************************************************************/
  33. void timeCompare(void)            
  34. {
  35.   if((minuteTemp == minuteAlarm) && (hourTemp == hourAlarm))
  36.   {
  37.      time_is_ok = 1;
  38.          alarm_is_ok = 0;
  39.          interface_mod = 1;
  40.   }   
  41. }       

  42. /********************************************************************************************
  43. * 函数名称:主函数
  44. * 功    能:调用并执行各个子函数
  45. * 入口参数:无
  46. * 出口参数:无
  47. *********************************************************************************************/
  48. void main()
  49. {
  50. uchar keyRead;
  51. init_led();
  52. init_key();
  53. initTimer0();
  54. timer0Temp = 0x00;
  55. secondTemp = 0x00;
  56. minuteTemp = 0x00;
  57. hourTemp = 0x00;
  58. secondAlarm = 0x00;
  59. minuteAlarm = 0x00;
  60. hourAlarm = 0x00;
  61. alarmKeyCount = 0x02;
  62. alarm_is_ok = 0;     //默认状态停止
  63. time_is_ok = 0;      //默认时间未到
  64. interface_mod = 0;
  65. sei();
  66. while(1)
  67. {
  68.   
  69.    if(interface_mod == 1)
  70.      ledSweepDisplay(alarmSetBuff,timeDisMod);
  71.    else
  72.      ledSweepDisplay(timeSetBuff,timeDisMod);
  73.    if(alarm_is_ok == 1)
  74.      timeCompare();
  75.    
  76.    keyRead = get_key_value();
  77.    if(keyRead == KEY_ALARM)
  78.    {
  79.       if(alarm_is_ok == 1 || time_is_ok == 1)
  80.           {
  81.             alarm_is_ok = 0;
  82.                 time_is_ok = 0;
  83.                 interface_mod = 0;
  84.                 alarmKeyCount = 0x00;
  85.           }
  86.           else
  87.           {
  88.                 if(alarmKeyCount < 0x02)
  89.                 alarmKeyCount++;
  90.                 else
  91.                    alarmKeyCount = 0x00;
  92.                 if(alarmKeyCount == 0x01)
  93.                   interface_mod = 1;
  94.                 if(alarmKeyCount == 0x02)
  95.                  {
  96.                    alarm_is_ok = 1;
  97.                    interface_mod = 0;
  98.                  }          
  99.           }   
  100.     }
  101.    if(keyRead == KEY_SECOND)
  102.    { if(interface_mod == 1)
  103.      {
  104.            if(secondAlarm < 59)
  105.              secondAlarm++;
  106.            else
  107.              secondAlarm = 0x00;
  108.            alarmSetBuff[S_L] = secondAlarm % 10 + '0';
  109.            alarmSetBuff[S_H] = secondAlarm / 10 + '0';
  110.          }
  111.      else
  112.          {
  113.            if(secondTemp < 59)
  114.              secondTemp += 1;
  115.            else
  116.              secondTemp = 0x00;
  117.            timeSetBuff[S_L] = secondTemp % 10 + '0';
  118.        timeSetBuff[S_H] = secondTemp / 10 + '0';
  119.          }   
  120.    }
  121.    if(keyRead == KEY_MINUTE)
  122.    { if(interface_mod == 1)
  123.      {
  124.            if(minuteAlarm < 59)
  125.              minuteAlarm++;
  126.            else
  127.              minuteAlarm=0x00;
  128.            alarmSetBuff[M_L]=minuteAlarm%10+'0';
  129.            alarmSetBuff[M_H]=minuteAlarm/10+'0';
  130.          }
  131.          else
  132.          {
  133.            if(minuteTemp < 59)
  134.              minuteTemp += 1;
  135.            else
  136.              minuteTemp = 0x00;
  137.            timeSetBuff[M_L] = minuteTemp % 10 + '0';
  138.        timeSetBuff[M_H] = minuteTemp / 10 + '0';
  139.          }
  140.       
  141.    }
  142.   if(keyRead == KEY_HOUR)
  143.   {
  144.      if(interface_mod == 1)
  145.          {
  146.            if(hourAlarm < 23)
  147.              hourAlarm++;
  148.            else
  149.              hourAlarm = 0x00;
  150.            alarmSetBuff[H_L] = hourAlarm % 10 + '0';
  151.            alarmSetBuff[H_H] = hourAlarm / 10 + '0';
  152.          }
  153.          else
  154.          {
  155.            if(hourTemp < 23)
  156.              hourTemp += 1;
  157.            else
  158.              hourTemp = 0x00;
  159.            timeSetBuff[H_L] = hourTemp%10+'0';
  160.        timeSetBuff[H_H] = hourTemp/10+'0';
  161.          }
  162.       
  163.   }
  164.    
  165. }
  166. }


  167. /*, */
  168. /********************************************************************************************
  169. * 函数名称:定时器0中断函数
  170. * 功    能:定时器0溢出中断入口处,定时10ms
  171. * 入口参数:无
  172. * 出口参数:无
  173. *********************************************************************************************/
  174. void timer0_overflow(void) interrupt 1
  175. {
  176.    TH0 = 0xdc;
  177.    TL0 = 0x00;
  178.    if(time_is_ok == 1)            //报警
  179.      WARN_TRUMPET = ~WARN_TRUMPET;
  180.    if(timer0Temp < 99)        //判断1s是否到
  181.        timer0Temp++;
  182.    else                            //进中断100次
  183.    {
  184.         timer0Temp = 0x00;           
  185.             if(secondTemp < 59)   //判断1min是否到         
  186.                 {
  187.                   secondTemp++;
  188.                 }
  189.                 else
  190.                 {

  191.                   secondTemp = 0x00;
  192.                   if(minuteTemp < 59)  //判断1hour是否到
  193.                      minuteTemp++;
  194.                  else
  195.                   {
  196.                     minuteTemp = 0x00;
  197.                         if(hourTemp < 23)
  198.                           hourTemp++;
  199.                         else
  200.                           hourTemp = 0x00;
  201.                   }

  202.                 }  
  203.    }
  204.    timeSetBuff[S_L] = secondTemp%10+'0';
  205.    timeSetBuff[S_H] = secondTemp/10+'0';
  206.    timeSetBuff[M_L] = minuteTemp%10+'0';
  207.    timeSetBuff[M_H] = minuteTemp/10+'0';
  208.    timeSetBuff[H_L] = hourTemp%10+'0';
  209.    timeSetBuff[H_H] = hourTemp/10+'0';
  210.    sei();
  211. }
复制代码



所有资料下载:
电子时钟系统.rar (41.32 KB, 下载次数: 87)


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

使用道具 举报

沙发
ID:140183 发表于 2018-5-20 21:10 | 只看该作者
太好啦!谢谢分享!正好来学习。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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