找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 234|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)數(shù)字鐘程序Proteus仿真電路圖

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
數(shù)字鐘仿真,程序軟·全套,第一次發(fā)帖大家多包涵


單片機(jī)源程序如下:
  1. //********************數(shù)字鐘程序************************
  2. //程序:ex8-1.c
  3. //功能:數(shù)字鐘程序
  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;                        //切換模式(開關(guān)鬧鐘,調(diào)鬧鐘)
  10. sbit K2=P3^2;                        //調(diào)時(shí)
  11. sbit K3=P3^3;                        //調(diào)分
  12. sbit beep=P2^7;                        //蜂鳴器
  13. //********************函數(shù)聲明***************************
  14. void shijian();                         //計(jì)時(shí)時(shí)間顯示
  15. void Timer0Init();       //定時(shí)器中斷初始化函數(shù)
  16. void DigDisplay();       //LED動(dòng)態(tài)顯示掃描函數(shù)
  17. void alarm();            //鬧鈴報(bào)警處理
  18. void tiao_nao();         //鬧鐘時(shí)間設(shè)置
  19. void moshi();            //鬧鐘模式設(shè)置
  20. void delay(u16 i);       //軟件延時(shí)函數(shù)
  21. //********************全局變量定義***************************
  22. bit nao;                        //鬧鐘開關(guān)標(biāo)志,nao=1鬧鐘開;nao=0鬧鐘關(guān)
  23. u8 a=0;                 //記錄K1按下次數(shù),第一次按下修改鬧鐘時(shí)間,第2次按下切換鬧鐘開關(guān)
  24. u8 display[]={0,0,0,0,0,0};           //顯示緩沖區(qū),對(duì)應(yīng)六個(gè)數(shù)碼管
  25. u8 ssec,sec,min,hour,nao_hour=0,nao_min=0;        //10毫秒、秒、分、小時(shí)、鬧鐘小時(shí)、鬧鐘分鐘
  26. //*************************延時(shí)函數(shù)****************************//   
  27. //函數(shù)名:delay
  28. //函數(shù)功能:軟件延時(shí)
  29. //形式參數(shù):無符號(hào)整型變量i,0-65535
  30. //返回值:無
  31. void delay(u16 i)
  32. {
  33.         while(i--);       
  34. }
  35. //*************************定時(shí)器中斷初始化函數(shù)****************************//   
  36. //函數(shù)名:Timer0Init
  37. //函數(shù)功能:定時(shí)器T0定時(shí)中斷,interrupt 1,開放兩個(gè)外部中斷
  38. //形式參數(shù):無
  39. //返回值:無
  40. void Timer0Init()
  41. {
  42.         TMOD|=0X01;//選擇為定時(shí)器0模式,工作方式1,僅用TR0打開啟動(dòng)。
  43.         EX0=1;
  44.         IT0=1;      //外部中斷0采用下降沿觸發(fā)
  45.         PX0=1;
  46.         EX1=1;
  47.         IT1=0;            //外部中斷1采用低電平觸發(fā)
  48.         TH0=0Xd8;        //給定時(shí)器賦初值,定時(shí)10ms,12MHz晶振頻率
  49.         TL0=0Xf0;       
  50.         ET0=1;      //開放定時(shí)器0中斷允許
  51.         EA=1;       //開放總中斷
  52.         TR0=1;      //定時(shí)器開始計(jì)數(shù)                       
  53. }

  54. //**************************6位LED顯示函數(shù)**************************/
  55. //函數(shù)名:DigDisplay
  56. //函數(shù)功能:6位LED動(dòng)態(tài)顯示,將顯示緩沖區(qū)display中的6個(gè)數(shù)依次掃描顯示一遍
  57. //形式參數(shù):無
  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;                               //關(guān)顯示
  68.            j=display[i];
  69.              P1=led[j];                             //P1送段碼
  70.              P0=~temp;                             //P0對(duì)應(yīng)端口低電平選位
  71.        temp<<=1;
  72.        for(m=0;m<100;m++);          //每一位顯示延時(shí)
  73.        }
  74. }
  75. //******************************報(bào)警函數(shù)****************************/
  76. //函數(shù)名:alarm
  77. //函數(shù)功能:鬧鐘時(shí)分和當(dāng)前時(shí)分相同、鬧鐘功能開啟的情況下,蜂鳴器響15秒
  78. //形式參數(shù):無
  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. //***********************鬧鐘時(shí)間調(diào)節(jié)**********************//
  91. //函數(shù)名:tiao_nao
  92. //函數(shù)功能:鬧鐘時(shí)間修改,修改小時(shí)和分鐘,K1按下結(jié)束調(diào)節(jié)
  93. //          設(shè)置完鬧鐘時(shí)間后,自動(dòng)開啟鬧鐘
  94. //形式參數(shù):無
  95. //返回值:無
  96. void tiao_nao()
  97. {       
  98.             IT0=0;                                   //關(guān)溢出進(jìn)1;否則調(diào)鬧時(shí)針后時(shí)加1;
  99.                 EX1=0;                                   //關(guān)中斷系統(tǒng)
  100.                 EX0=0;                                   //關(guān)中斷系統(tǒng)
  101.                 delay(10);       
  102.                 while(K1)                           //當(dāng)K1沒有按下時(shí)進(jìn)行鬧鐘時(shí)間調(diào)節(jié),當(dāng)按下K1時(shí),結(jié)束鬧鐘時(shí)間調(diào)節(jié)
  103.                 {
  104.                 if(K2==0)                           //鬧鐘小時(shí)調(diào)節(jié)
  105.                     {delay(10);if(K2==0)nao_hour++;while(!K2);}
  106.                    if(nao_hour>=24)nao_hour=0;           //24小時(shí)后歸0
  107.                 if(K3==0)                           //鬧鐘分鐘調(diào)節(jié)
  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();           //數(shù)碼管顯示函數(shù)
  117.                 }
  118.                 IT0=1;
  119.                 EX1=1;
  120.                 EX0=1;
  121.                 nao=1;                                //退出鬧鐘調(diào)試,自動(dòng)開啟鬧鐘               
  122. }
  123. //*************************鬧鐘功能設(shè)置***************************//
  124. //函數(shù)名:moshi
  125. //函數(shù)功能:按鍵K1用來控制鬧鐘功能的開啟和關(guān)閉,以及鬧鐘時(shí)間設(shè)置
  126. //          按下進(jìn)入鬧鐘時(shí)間設(shè)置,在該狀態(tài)下再次按下K1結(jié)束鬧鐘時(shí)間設(shè)置并同時(shí)開啟鬧鐘功能
  127. //          在鬧鐘開啟或鬧鈴響期間,按下K1關(guān)閉鬧鐘功能
  128. //形式參數(shù):無
  129. //返回值:無
  130. void moshi()
  131. {       
  132.    if(K1==0)
  133.         {
  134.                 delay(100);
  135.                 if(K1==0)
  136.                 {       
  137.                         a++;      //記錄K1按下次數(shù)
  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. //***********************當(dāng)前時(shí)間顯示**********************//
  149. //函數(shù)名:shijian
  150. //函數(shù)功能:將當(dāng)前計(jì)時(shí)時(shí)間的"小時(shí)"、"分鐘"和"秒"拆分到顯示緩沖區(qū)并調(diào)用LED顯示掃描函數(shù)實(shí)現(xiàn)時(shí)間的顯示。
  151. //形式參數(shù):無
  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顯示掃描函數(shù)
  162. }         
  163. //***********************T0中斷服務(wù)函數(shù)**********************//
  164. //函數(shù)名:Timer0
  165. //函數(shù)功能:每10ms中斷一次,進(jìn)行10ms、秒、分、小時(shí)計(jì)數(shù)
  166. //形式參數(shù):無
  167. //返回值:無
  168. void Timer0() interrupt 1
  169. {
  170.         TH0=0Xd8;        //給定時(shí)器賦初值,定時(shí)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服務(wù)函數(shù)**********************//
  194. //函數(shù)名:int0
  195. //函數(shù)功能:小時(shí)調(diào)節(jié)
  196. //形式參數(shù):無
  197. //返回值:無
  198. void int0() interrupt 0
  199. {               
  200.                 delay(10);            //采用下降沿觸發(fā),延時(shí)去抖       
  201.                 hour++;
  202. ……………………

  203. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei附件下載:
數(shù)字鐘仿真.7z (66.56 KB, 下載次數(shù): 0)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表