标题: 单片机数字钟程序Proteus仿真电路图 [打印本页]

作者: yujingpiaomiao    时间: 2025-4-17 08:31
标题: 单片机数字钟程序Proteus仿真电路图
数字钟仿真,程序软·全套,第一次发帖大家多包涵


单片机源程序如下:
  1. //********************数字钟程序************************
  2. //程序:ex8-1.c
  3. //功能:数字钟程序
  4. #include "reg51.h"                         
  5. typedef unsigned int u16;          
  6. typedef unsigned char u8;
  7. //********************位名称定义*************************
  8. sbit naodeng=P2^0;                //闹钟开灯亮;否则灭
  9. sbit K1=P3^0;                        //切换模式(开关闹钟,调闹钟)
  10. sbit K2=P3^2;                        //调时
  11. sbit K3=P3^3;                        //调分
  12. sbit beep=P2^7;                        //蜂鸣器
  13. //********************函数声明***************************
  14. void shijian();                         //计时时间显示
  15. void Timer0Init();       //定时器中断初始化函数
  16. void DigDisplay();       //LED动态显示扫描函数
  17. void alarm();            //闹铃报警处理
  18. void tiao_nao();         //闹钟时间设置
  19. void moshi();            //闹钟模式设置
  20. void delay(u16 i);       //软件延时函数
  21. //********************全局变量定义***************************
  22. bit nao;                        //闹钟开关标志,nao=1闹钟开;nao=0闹钟关
  23. u8 a=0;                 //记录K1按下次数,第一次按下修改闹钟时间,第2次按下切换闹钟开关
  24. u8 display[]={0,0,0,0,0,0};           //显示缓冲区,对应六个数码管
  25. u8 ssec,sec,min,hour,nao_hour=0,nao_min=0;        //10毫秒、秒、分、小时、闹钟小时、闹钟分钟
  26. //*************************延时函数****************************//   
  27. //函数名:delay
  28. //函数功能:软件延时
  29. //形式参数:无符号整型变量i,0-65535
  30. //返回值:无
  31. void delay(u16 i)
  32. {
  33.         while(i--);       
  34. }
  35. //*************************定时器中断初始化函数****************************//   
  36. //函数名:Timer0Init
  37. //函数功能:定时器T0定时中断,interrupt 1,开放两个外部中断
  38. //形式参数:无
  39. //返回值:无
  40. void Timer0Init()
  41. {
  42.         TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
  43.         EX0=1;
  44.         IT0=1;      //外部中断0采用下降沿触发
  45.         PX0=1;
  46.         EX1=1;
  47.         IT1=0;            //外部中断1采用低电平触发
  48.         TH0=0Xd8;        //给定时器赋初值,定时10ms,12MHz晶振频率
  49.         TL0=0Xf0;       
  50.         ET0=1;      //开放定时器0中断允许
  51.         EA=1;       //开放总中断
  52.         TR0=1;      //定时器开始计数                       
  53. }

  54. //**************************6位LED显示函数**************************/
  55. //函数名:DigDisplay
  56. //函数功能:6位LED动态显示,将显示缓冲区display中的6个数依次扫描显示一遍
  57. //形式参数:无
  58. //返回值:无
  59. void DigDisplay()
  60. {
  61.   u8  i,j,m,temp;
  62.   u8  led[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  63.                                                                 //0-9的共阴极显示码
  64.      temp=0x01;
  65.      for(i=0;i<6;i++)
  66.          {
  67.            P1=0x00;                               //关显示
  68.            j=display[i];
  69.              P1=led[j];                             //P1送段码
  70.              P0=~temp;                             //P0对应端口低电平选位
  71.        temp<<=1;
  72.        for(m=0;m<100;m++);          //每一位显示延时
  73.        }
  74. }
  75. //******************************报警函数****************************/
  76. //函数名:alarm
  77. //函数功能:闹钟时分和当前时分相同、闹钟功能开启的情况下,蜂鸣器响15秒
  78. //形式参数:无
  79. //返回值:无
  80. void alarm()
  81. {       
  82.    if(nao_hour==hour&&nao_min==min&&sec>=0&&sec<15&&nao==1)
  83.    {
  84.                 beep=1;
  85.                 delay(5);
  86.                 beep=0;
  87.                 delay(5);
  88.         }
  89. }
  90. //***********************闹钟时间调节**********************//
  91. //函数名:tiao_nao
  92. //函数功能:闹钟时间修改,修改小时和分钟,K1按下结束调节
  93. //          设置完闹钟时间后,自动开启闹钟
  94. //形式参数:无
  95. //返回值:无
  96. void tiao_nao()
  97. {       
  98.             IT0=0;                                   //关溢出进1;否则调闹时针后时加1;
  99.                 EX1=0;                                   //关中断系统
  100.                 EX0=0;                                   //关中断系统
  101.                 delay(10);       
  102.                 while(K1)                           //当K1没有按下时进行闹钟时间调节,当按下K1时,结束闹钟时间调节
  103.                 {
  104.                 if(K2==0)                           //闹钟小时调节
  105.                     {delay(10);if(K2==0)nao_hour++;while(!K2);}
  106.                    if(nao_hour>=24)nao_hour=0;           //24小时后归0
  107.                 if(K3==0)                           //闹钟分钟调节
  108.                   {delay(10);if(K3==0)nao_min++;while(!K3); }
  109.                 if(nao_min>=60)nao_min=0;      //60分钟后归0
  110.                   display[5]=0;                                   //闹钟显示
  111.                 display[4]=0;
  112.                 display[3]=nao_min%10;
  113.                 display[2]=nao_min/10;
  114.                 display[1]=nao_hour%10;
  115.                 display[0]=nao_hour/10;
  116.                 DigDisplay();           //数码管显示函数
  117.                 }
  118.                 IT0=1;
  119.                 EX1=1;
  120.                 EX0=1;
  121.                 nao=1;                                //退出闹钟调试,自动开启闹钟               
  122. }
  123. //*************************闹钟功能设置***************************//
  124. //函数名:moshi
  125. //函数功能:按键K1用来控制闹钟功能的开启和关闭,以及闹钟时间设置
  126. //          按下进入闹钟时间设置,在该状态下再次按下K1结束闹钟时间设置并同时开启闹钟功能
  127. //          在闹钟开启或闹铃响期间,按下K1关闭闹钟功能
  128. //形式参数:无
  129. //返回值:无
  130. void moshi()
  131. {       
  132.    if(K1==0)
  133.         {
  134.                 delay(100);
  135.                 if(K1==0)
  136.                 {       
  137.                         a++;      //记录K1按下次数
  138.                         if(a>=2)a=0;
  139.                         while(!K1);       
  140.                         switch(a)
  141.                         {
  142.                                 case(0):nao=~nao;break;                                 
  143.                                 case(1):tiao_nao();break;                                       
  144.                         }                                       
  145.                 }
  146.         } while(!K1);       
  147. }
  148. //***********************当前时间显示**********************//
  149. //函数名:shijian
  150. //函数功能:将当前计时时间的"小时"、"分钟"和"秒"拆分到显示缓冲区并调用LED显示扫描函数实现时间的显示。
  151. //形式参数:无
  152. //返回值:无
  153. void shijian()
  154. {
  155.                 display[5]=sec%10;
  156.                 display[4]=sec/10;     
  157.                 display[3]=min%10;
  158.                 display[2]=min/10;
  159.                 display[1]=hour%10;
  160.                 display[0]=hour/10;
  161.                 DigDisplay();  //LED显示扫描函数
  162. }         
  163. //***********************T0中断服务函数**********************//
  164. //函数名:Timer0
  165. //函数功能:每10ms中断一次,进行10ms、秒、分、小时计数
  166. //形式参数:无
  167. //返回值:无
  168. void Timer0() interrupt 1
  169. {
  170.         TH0=0Xd8;        //给定时器赋初值,定时10ms
  171.         TL0=0Xf0;
  172.         ssec++;
  173.         if(ssec>=100)  //1s
  174.         {
  175.                 ssec=0;
  176.                 sec++;
  177.                 if(sec>=60)
  178.                 {
  179.                         sec=0;
  180.                         min++;
  181.                         if(min>=60)
  182.                         {
  183.                                 min=0;
  184.                                 hour++;
  185.                                 if(hour>=24)
  186.                                 {hour=0;
  187.                                 }
  188.                         }
  189.                        
  190.                 }       
  191.         }       
  192. }
  193. //***********************外部中断0服务函数**********************//
  194. //函数名:int0
  195. //函数功能:小时调节
  196. //形式参数:无
  197. //返回值:无
  198. void int0() interrupt 0
  199. {               
  200.                 delay(10);            //采用下降沿触发,延时去抖       
  201.                 hour++;
  202. ……………………

  203. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei附件下载:
数字钟仿真.7z (66.56 KB, 下载次数: 0)





欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1