找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机 整点报时 定时小闹钟程序

  [复制链接]
跳转到指定楼层
楼主
ID:102668 发表于 2016-1-16 05:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  功能描述:十、分可调      整点报时      定时小闹钟
1.共有4个按键 3个指示灯  ,其中D1亮表示正常运行状态 灭表示闹钟设置状态,D2表示按键有效提示(即按下任意一个按键 D2 都会亮一次)另外一个事供电指示灯,没有什么大作用。
2.十、分、闹钟开关、闹钟设置 分别接在P1.0、P1.1、P3.2、P3.3口。
按下INT1是进入闹钟设置模式,显示屏左数第二位显示“8”,调整P1.0 P1.1设置闹钟时间,再按下INT1确认,同时推出闹钟设置模式进入运行状态。
INT0是闹钟开关,开启时最左显示“C"否则不显示。
正常运行下,直接按 P1.0、P1.1对时间进行校正。
当然,按键都会有闪灯,和不同声音提示。



51单片机程序源代码:
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #include<stdio.h>
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. uchar code segtbl[]= {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff,0xc6};
  7.                      // 0  1    2   3   4    5    6   7   8   9    -        c   
  8. uchar data dis_b; //位段码
  9. uchar data dis_r; //位偏移量
  10. uchar data dis[8];      //定义8个连续的存储器

  11. uchar data c_min;
  12. uchar data c_hou;
  13. uchar data second;
  14. uchar data minite;
  15. uchar data hour;
  16. uchar data CNTA;
  17. uchar data speaker_num;   //蜂鸣次数
  18. bit beep;          //整点报时标志
  19. bit run;         //运行标志
  20. bit flash;         //灭灯标志
  21. bit clarm_switch;     //闹钟开关标志
  22. bit baoshi;     //报时开关标志
  23. sbit  speaker=P1^3;
  24. sbit minitek=P1^1;
  25. sbit hourk=P1^0;
  26. sbit enter=P1^4;
  27. sbit led1=P1^6;      //  按键标识
  28. sbit led2=P1^7;      // 运行标志
  29. uint n,k;

  30. void delay_10us(uchar n)    //10微秒级延时
  31. { do
  32.   { _nop_();
  33.     _nop_();
  34.     _nop_();
  35.     _nop_();
  36.     _nop_();
  37.   }while(--n);
  38. }
  39. void delay_ms(uint n)     //毫秒级延时
  40. { do delay_10us(131);
  41.   while(--n);
  42. }
  43. clk_to_dis()
  44. {
  45.     dis[0]=minite%10;
  46. dis[1]=minite/10;
  47.      if(flash)dis[2]=10;
  48.         else dis[2]=11;
  49. dis[3]=hour%10;
  50. dis[4]=hour/10;
  51. dis[5]=10;
  52. dis[6]=11;
  53. }
  54. clarm_to_dis()
  55. {
  56.     dis[0]=c_min%10;
  57. dis[1]=c_min/10;
  58. if(flash)dis[2]=10;//亮灯
  59.         else dis[2]=11;    //灭灯
  60. dis[3]=c_hou%10;
  61. dis[4]=c_hou/10;
  62. dis[5]=10;
  63. dis[6]=8;
  64. }
  65. void main()
  66. {
  67. P2=0xff;
  68. P1=0XFF;
  69. P0=0xff;
  70. run=1;
  71. led1=0;
  72. flash=0x00;
  73. dis[2]=10;      //第三位显示“-”
  74. dis_r=0;        //为偏移量初始为“0”
  75. dis_b=0x80; //选通P2.7
  76. second=0x00;
  77. minite=0x00;
  78. hour=0x00;
  79. CNTA=0x00;
  80. TMOD=0x11;
  81. TH0=19500/256;
  82. TL0=19500%256;
  83. TH1=0xfc;
  84. TL1=0x18;
  85. EA=1;    //开中断;
  86. TR0=1;
  87. TR1=1;
  88. ET1=1;
  89. EX0=1;
  90. EX1=1;
  91. ET0=1;

  92. while(1)
  93.   {

  94.    while(run==1)
  95.    {
  96.   while(!minitek)
  97.   {
  98.   for(n=0;n<1000;n++);
  99.   if(!minitek==0)break;    //延时防抖
  100.   minite++;
  101.   second=0x00;
  102.   led1=0;
  103.       for(n=0;n<20;n++)
  104.         {
  105.          speaker=!speaker;
  106.            delay_10us(50);             //蜂鸣器响
  107.          }
  108.    
  109.   if(minite==60)minite=0x00;
  110.   while(!minitek);  //等待键松开
  111.    led1=1;    //显示灯   
  112.   }

  113.       while(!hourk)
  114.   {
  115.   for(n=0;n<1000;n++);
  116.   if(!hourk==0)break;
  117.   hour++;
  118.   second=0x00;
  119.   led1=0;
  120.    for(n=0;n<30;n++)
  121.    {
  122.    speaker=!speaker;
  123.    delay_10us(30);             //蜂鸣器响
  124.    }

  125.   if(hour==24) hour=0x00;
  126.   while(!hourk);
  127.   led1=1;
  128.   }
  129.   
  130.   if(clarm_switch)
  131.   {
  132.   if(c_min==minite&&c_hou==hour)
  133.   
  134.    {speaker_num=60;
  135.    beep=1;
  136.    while(beep&& clarm_switch)
  137.    {
  138.    led1=!led1;
  139.    delay_ms(100);
  140.    }
  141.    led1=1;
  142.    beep=0;
  143.    }
  144.          }

  145.   while(run==0)
  146.   {
  147.      while(!minitek)
  148. {
  149. for(n=0;n<1000;n++);
  150. if(!minitek==0)break;    //延时防抖
  151. c_min++;
  152. led1=0;
  153. for(n=0;n<25;n++)
  154. {
  155. speaker=!speaker;
  156. delay_10us(40);             //蜂鸣器响
  157. }
  158. if(c_min==60)c_min=0x00;
  159. while(!minitek);        //等待键松开
  160. led1=1;
  161. }

  162.   while(!hourk)
  163. {for(n=0;n<1000;n++);
  164. if(!hourk==0)break;
  165. c_hou++;
  166. led1=0;
  167. for(n=0;n<40;n++)
  168. {
  169. speaker=!speaker;
  170. delay_10us(20);             //蜂鸣器响
  171. }
  172. if(c_hou==24) c_hou=0x00;
  173. while(!hourk);
  174. led1=1;
  175. }

  176.   

  177. }
  178.     }
  179. }

  180. }
  181. timer0() interrupt 1 using 2//定时器0中断号为1号 使用第2组寄存器
  182. {
  183. TH0=19534/256;
  184. TL0=19534%256;
  185. CNTA++;
  186. if(beep)
  187. {
  188. if(speaker_num%2)speaker=!speaker;
  189. if(!speaker_num) beep=0;

  190. }
  191. if(CNTA==20)
  192. {       if(speaker_num)speaker_num--;
  193. flash=!flash;
  194. CNTA=0;
  195.          second++;//秒加
  196.    if(second==60)
  197.    {second=0;
  198.     minite++;
  199.   if(minite==60)
  200.   {
  201.   minite=0;
  202.   hour++;
  203.   if(hour>7){speaker_num=2*hour;    //整点到 蜂鸣标志  置1
  204.      beep=1;}
  205.    if(hour==24)

  206.    {
  207.    hour=0;
  208.    }
  209.   }
  210.     }
  211. }

  212. }
  213. timer1() interrupt 3 using 3
  214.   {
  215.       
  216. uchar ttt=0;                   //ttt存储段码
  217. if(run==0) clarm_to_dis();
  218. else clk_to_dis();
  219. ttt = segtbl[dis[dis_r]];        //段码赋值

  220. P2= dis_b;                       //位码送P2
  221. P0=ttt;                          //段码送P0

  222. if(++dis_r==8)dis_r=0x00;
  223. dis_b=_cror_(dis_b,1);          //位码右移
  224. TH1=0xfc;
  225.         TL1=0x18;

  226.   }

  227. int_0() interrupt 0    //闹钟开关
  228. {
  229. clarm_switch=!clarm_switch;
  230. if(clarm_switch)dis[7]=12;   //开启显示   C
  231. else dis[7]=11;      //关闭 不显示   
  232.   for(k=0;k<40;k++)
  233. {speaker=!speaker;
  234. led1=!led1;
  235. delay_ms(5);
  236. }
  237. led1=1;
  238. }

  239. int_1() interrupt 2     //闹钟时间设置/运行 转换开关
  240. {
  241. run=!run;
  242. if(run)led2=0;
  243. else led2=1;
  244. for(k=0;k<90;k++)      // 蜂鸣器响
  245. {speaker=!speaker;      //指示灯闪烁
  246. led1=!led1;
  247. delay_10us(100);
  248. }
  249. led1=1;
  250. }
复制代码


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

使用道具 举报

沙发
ID:223127 发表于 2017-11-1 16:11 | 只看该作者
好资料,51黑有你更精彩!!!
回复

使用道具 举报

板凳
ID:246166 发表于 2017-11-8 18:34 | 只看该作者
楼主太强了,学习学习
回复

使用道具 举报

地板
ID:271702 发表于 2018-1-4 22:53 | 只看该作者
楼主有hex文件吗
763958866@qq.com
回复

使用道具 举报

5#
ID:272316 发表于 2018-1-6 16:38 | 只看该作者
这个怎么操作,我运行之后不太会操作
回复

使用道具 举报

6#
ID:146834 发表于 2018-1-6 21:06 | 只看该作者
学习来了。谢谢楼主的共享。
回复

使用道具 举报

7#
ID:450918 发表于 2018-12-22 11:45 | 只看该作者
怎么液晶显示没反应呀?
回复

使用道具 举报

8#
ID:455664 发表于 2018-12-26 17:06 | 只看该作者
有hex文件吗?
1823520922@qq.com
回复

使用道具 举报

9#
ID:440558 发表于 2018-12-27 23:09 | 只看该作者

他给你发了exe文件了吗
回复

使用道具 举报

10#
ID:455664 发表于 2018-12-28 14:26 | 只看该作者
mxjymm 发表于 2018-12-27 23:09
他给你发了exe文件了吗

   没有呢
回复

使用道具 举报

11#
ID:821033 发表于 2020-9-29 09:05 | 只看该作者
我用proteus8仿真时程序报171个错误,不知为什么?
回复

使用道具 举报

12#
ID:825230 发表于 2020-10-2 11:51 | 只看该作者
keil检测有两个警告
回复

使用道具 举报

13#
ID:825230 发表于 2020-10-2 11:51 | 只看该作者
xiao123456789 发表于 2018-1-6 16:38
**** 作者被禁止或删除 内容自动屏蔽 ****

用keil写
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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