欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

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

QQ登錄

只需一步,快速開始

搜索
查看: 5219|回復(fù): 0
收起左側(cè)

STC51單片機(jī)制作的電子鐘,在1602上顯示(包含日期及校準(zhǔn)功能)思路與程序

[復(fù)制鏈接]
ID:372902 發(fā)表于 2019-6-2 00:17 | 顯示全部樓層 |閱讀模式
單片機(jī)實(shí)驗(yàn)要求如下
合理使用STC單片機(jī)內(nèi)的定時(shí)器資源,并使用1602實(shí)現(xiàn)數(shù)字鐘的功能,顯示方式xx:xx:xx(時(shí):分:秒)
基本部分:
能在1602上以xx:xx:xx的形式顯示時(shí)間,符合真實(shí)工作情況(40分)
提高部分:
(1)能通過(guò)一個(gè)按鍵將1602切換到顯示年月日,顯示格式xx/xx/xx(年/月/日)(20分),
(2)通過(guò)按鍵可以調(diào)整時(shí)、分、秒(30分)
發(fā)揮部分:
完善電子鐘的功能(10分)
注:
(1)設(shè)計(jì)的電子鐘,使用最少的按鍵,按照電子表,對(duì)多使用3個(gè)按鍵。
(2)時(shí)鐘工作時(shí),其進(jìn)位應(yīng)該與真實(shí)的電子鐘相同。
(3)顯示時(shí)間和顯示年月日之間的進(jìn)位關(guān)系符合實(shí)際。

【思路】
(一)使用定時(shí)器0產(chǎn)生1秒的時(shí)鐘信號(hào),用來(lái)時(shí)鐘走時(shí),并達(dá)到24小時(shí)候進(jìn)位到日期中的日,進(jìn)而是月,年。通過(guò)if條件語(yǔ)句實(shí)現(xiàn)了瑞年的處理,月份天數(shù)不一致的處理。
(二)總共使用了兩個(gè)按鍵。通過(guò)外部中斷0,切換到顯示日期,并且記錄外部中斷0觸發(fā)的次數(shù),通過(guò)次數(shù)進(jìn)入調(diào)整狀態(tài),時(shí)間和日期均可以調(diào)整。通過(guò)外部中斷0進(jìn)入調(diào)整狀態(tài)后,再通過(guò)外部中斷1調(diào)整時(shí)間和日期,日期和時(shí)間的調(diào)整采用了加滿溢出的方式。在日期的調(diào)整過(guò)程中,不會(huì)出現(xiàn)13月 35日等非正常邏輯的顯示結(jié)果。
(三)完善電子鐘的部分,日期也可以調(diào)整,整點(diǎn)報(bào)時(shí)(由于板子上沒有蜂鳴器,采用了兩個(gè)LED表示)。

【運(yùn)行說(shuō)明】
(1)進(jìn)入時(shí)間顯示狀態(tài),默認(rèn)值為00:00:00
(2)通過(guò)外部中斷0進(jìn)入日期顯示狀態(tài),默認(rèn)值為2019/05/26。
(3)再次按下外部中斷0進(jìn)入時(shí)間調(diào)整狀態(tài),修改時(shí)間的小時(shí)的十位,并通過(guò)在第二行的^作為修改位標(biāo)志。
(4)之后類似,此步展示日期修改的年的個(gè)位。
(5)完成所有的調(diào)整后,再次按下外部中斷0,會(huì)再次進(jìn)入時(shí)間的顯示狀態(tài)。
【答題過(guò)程遇到的問(wèn)題說(shuō)明】
(1)調(diào)整的部分,如果代碼放的位置不合適,調(diào)表會(huì)有不合理的現(xiàn)象發(fā)生,并且需要將調(diào)表所用的外部中斷1優(yōu)先級(jí)大于定時(shí)器中斷。
(2)嘗試過(guò)用閃爍和光標(biāo)作為修改位的指示,但是很容易發(fā)生混亂,就采用了在第二行,用合適的字符指示修改的位。
(3)最初的想法,是想調(diào)用矩陣鍵盤的兩個(gè)鍵作為加減,后來(lái)在調(diào)試的過(guò)程中,發(fā)現(xiàn)有干擾,因?yàn)長(zhǎng)CD1602和矩陣鍵盤都用到了P0口,所以當(dāng)矩陣鍵盤被按下的時(shí)候,會(huì)對(duì)1602的顯示造成干擾,所以之后的方案,取消了減,只采用了兩個(gè)外部中斷的按鍵。
(4)為了使時(shí)間和日期的顯示和調(diào)整符合真正的電子鐘,要花費(fèi)一定的精力調(diào)整代碼。
【源代碼及注釋】
注:文檔中的代碼只有主程序main.c,別的頭文件及.c文件在工程文件夾內(nèi)。

單片機(jī)源程序如下:
  1. #include "reg51.h"
  2. #include "led1602.h"

  3. #define uchar unsigned char
  4. #define uint  unsigned int

  5. sfr P4=0xc0;
  6. int year=2019;//初始顯示日期的年
  7. uchar month=05,day=26,sec = 0, min = 0, hou = 0;//初始顯示日期為 2019年05月26日,初始顯示時(shí)間為00:00:00
  8. uchar num = 0;//調(diào)整日期和時(shí)間,以及切換顯示日期和時(shí)間的標(biāo)志位
  9. uchar time = 0;//一秒的時(shí)間信號(hào)
  10. uchar jia=0;//調(diào)整日期和時(shí)間的信號(hào)
  11. sbit P46=P4^6;//鬧鐘(整點(diǎn)報(bào)時(shí))的兩個(gè)燈
  12. sbit P47=P4^7;
  13. void time_rec();//時(shí)鐘走時(shí)函數(shù)
  14. void init();//程序初始化函數(shù),包括LCD的初始化,中斷的設(shè)置,定時(shí)器的TH TL設(shè)置
  15. void write_liangwei(uchar add,uchar date);//兩位字符分離函數(shù)
  16. void write_siwei(uchar add1,int date1);//四位字符分離函數(shù)
  17. void show_time();//時(shí)間顯示函數(shù)
  18. void show_dat();//日期顯示函數(shù)
  19. void main()
  20. {       
  21.         init();
  22.         while(1){
  23.         time_rec();//調(diào)用時(shí)鐘走時(shí)函數(shù)
  24.         if(num == 0)//顯示時(shí)間
  25.         {
  26.                 lcdshowstr(0,1,"                ");
  27.                 show_time();
  28.         }
  29.         if(num==1)//顯示日期
  30.         {
  31.                 lcdshowstr(0,1,"                ");
  32.                 show_dat();
  33.                 jia = 0;
  34.         }
  35.         if(num == 2)//顯示時(shí)間的同時(shí),修改時(shí)間的小時(shí)的十位
  36.         {
  37.                 lcdshowstr(0,1,"^");
  38.                 show_time();
  39.                 jia = 0;
  40.         }
  41.         if(num == 3)//顯示時(shí)間的同時(shí),修改時(shí)間的小時(shí)的個(gè)位,以下類似
  42.         {
  43.         lcdshowstr(0,1," ^");
  44.         show_time();
  45.         jia = 0;
  46.         }
  47.         if(num == 4)
  48.         {
  49.         lcdshowstr(0,1,"   ^");
  50.          show_time();
  51.          jia = 0;
  52.         }
  53.         if(num == 5)
  54.         {
  55.         lcdshowstr(0,1,"    ^");
  56.         show_time();
  57.         jia = 0;
  58.         }
  59.         if(num == 6)
  60.         {
  61.          lcdshowstr(0,1,"      ^");
  62.          show_time();
  63.          jia = 0;
  64.         }
  65.         if(num == 7)
  66.         {
  67.         lcdshowstr(0,1,"       ^");
  68.         show_time();
  69.         jia = 0;
  70.         }
  71.         if(num == 8)
  72.         {
  73.          lcdshowstr(0,1,"^               ");
  74.          show_dat();
  75.          jia = 0;
  76.         }
  77.         if(num == 9)
  78.         {
  79.          lcdshowstr(0,1," ^              ");
  80.          show_dat();
  81.          jia = 0;
  82.         }
  83.         if(num == 10)
  84.         {
  85.          lcdshowstr(0,1,"  ^             ");
  86.         show_dat();
  87.         jia = 0;
  88.         }
  89.         if(num == 11)
  90.         {
  91.         lcdshowstr(0,1,"   ^            ");
  92.         show_dat();
  93.         jia = 0;
  94.         }
  95.         if(num == 12)
  96.         {
  97.         lcdshowstr(0,1,"     ^          ");
  98.         show_dat();
  99.         jia = 0;
  100.         }
  101.         if(num == 13)
  102.         {
  103.         lcdshowstr(0,1,"      ^         ");
  104.         show_dat();
  105.         jia = 0;
  106.         }
  107.         if(num == 14)
  108.         {
  109.         lcdshowstr(0,1,"        ^       ");
  110.         show_dat();
  111.         jia = 0;
  112.         }
  113.         if(num == 15)
  114.         {
  115.         lcdshowstr(0,1,"         ^      ");
  116.         show_dat();
  117.         jia = 0;
  118.         }
  119.         }
  120. }
  121. void zhuangtai() interrupt 0         //外部中斷0 用于校準(zhǔn)時(shí)間在時(shí)、分、秒之間進(jìn)行切換
  122. {        
  123.         num = num + 1;
  124.         if(num == 16)
  125.         {
  126.                 num = 0;
  127.         }
  128. }


  129. void timer0() interrupt 1        //定時(shí)器0的中斷子函數(shù) 用來(lái)產(chǎn)生1秒的時(shí)間,用于時(shí)鐘走時(shí)
  130. {
  131.         TH0 = 0x3C;
  132.         TL0 = 0xB0;
  133.         time++;
  134.         if(time == 20)
  135.         {
  136.                         sec++;
  137.                   time = 0;
  138.         }
  139. }

  140. void jiaozhun() interrupt 2 //外部中斷1用來(lái)調(diào)整時(shí)間、日期
  141. {
  142.         jia = 1;
  143.         if(num == 2)
  144.         {
  145.                 hou = hou + 10;
  146.                 if((hou%10<4)&&hou>24)
  147.                 {
  148.                         hou = hou - 30;
  149.                 }
  150.                 if((hou%10>4)&&hou>24)
  151.                 {
  152.                         hou = hou - 20;
  153.                 }
  154.                 if(hou==24)
  155.                 {
  156.                         hou = hou - 20;
  157.                 }
  158.         }
  159.         if(num==3)
  160.         {
  161.                 hou = hou + 1;
  162.                 if(hou>23)
  163.                 hou = 0;
  164.         }
  165.         if(num==4)
  166.         {
  167.                 min =  min+10 ;
  168.                 if(min > 59)
  169.                 {
  170.                         min = min -60;
  171.                 }
  172.         }
  173.         if(num==5)
  174.         {
  175.                  min=  min+1;
  176.                 if(min>59)
  177.                 {
  178.                         min = 0;
  179.                 }
  180.         }
  181.         if(num==6 )
  182.         {
  183.                  sec=sec + 10;
  184.                  if(sec >59 )
  185.                  {
  186.                          sec = sec - 60;
  187.                  }
  188.         }
  189.         if(num==7)
  190.         {
  191.                  sec= sec+1;
  192.                 if(sec>59)
  193.                 {
  194.                         sec = 0;
  195.                 }
  196.         }
  197.         if(num==8)
  198.         {
  199.                  year= year+1000;
  200.                 if(year>9000)
  201.                 {
  202.                         year = year -10000;
  203.                 }
  204.         }
  205.         if(num==9)
  206.         {
  207.                 year=year+100;
  208.                 if(year%1000/100>9)
  209.                 {
  210.                         year = year - 1000;
  211.                 }
  212.         }
  213.         if(num==10)
  214.         {
  215.                  year=year+10;
  216.                 if(year%100/10>9)
  217.                 {
  218.                         year = year -100;
  219.                 }       
  220.         }
  221.         if(num==11)
  222.         {
  223.                  year=year+1;
  224.                 if(year%10>9)
  225.                 {
  226.                         year = year - 10;
  227.                 }
  228.         }
  229.         if(num==12)
  230.         {
  231.                 month = month +10;
  232.                 if((month%10<2)&&month>12)
  233.                 {
  234.                         month = month - 20;
  235.                 }
  236.                 if((month%10>2)&&month>12)
  237.                 {
  238.                         month = month - 10;
  239.                 }
  240.                 if(month==12)
  241.                 {
  242.                         month = month - 10;
  243.                 }
  244.         }
  245.         if(num==13)
  246.         {
  247.                 month = month +1;
  248.                 if(month%10>9)
  249.                 {
  250.                         month = 0;
  251.                 }
  252.                 if(month==12)
  253.                 {
  254.                         month = 0;
  255.                 }
  256.         }
  257.         if(num==14)
  258.         {
  259.                 day = day +10;
  260.                 if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
  261.                 {
  262.                         if((day%10<1)&&day>31)
  263.                         {
  264.                                 day = day - 40;
  265.                         }
  266.                         if((day%10>1)&&day>31)
  267.                         {
  268.                                 day = day - 30;
  269.                         }
  270.                         if(day==31)
  271.                         {
  272.                                 day = 0;
  273.                         }
  274.                 }
  275.                 if(month==4||month==6||month==9||month==11)
  276.                 {
  277.                         if(day>30)
  278.                         {
  279.                                 day = day - 40;
  280.                         }
  281.                 }
  282.                         if(((year%4==0&&year%100!=0)||(year%400==0))&&month==2)
  283.                         {
  284.                                 if(day>29)
  285.                         {
  286.                                 day = day - 30;
  287.                         }
  288.                         }
  289.                         if(year%4!=0&&month==2)
  290.                         {
  291.                                 if(day>28)
  292.                                 {
  293.                                         day = day -30;
  294.                                 }
  295.                   }
  296.         }
  297.         if(num==15)
  298.         {
  299.                 day = day +1;
  300.                 if((month==1||month==3||month==5||month==7||month==8||month==10||month==12)&&day>31)
  301.                 {
  302.                         day = 0;
  303.                 }
  304.                 if((month==4||month==6||month==9||month==11)&&day>30)
  305.                 {
  306.                         day = 0;
  307.                 }
  308.                 if(((year%4==0&&year%100!=0)||(year%400==0))&&day>29)
  309.                 {
  310.                         day = 0;
  311.                 }
  312.                 if((year%4!=0)&&day>28)
  313.                 {
  314.                         day = 0;
  315.                 }
  316.         }
  317. }

  318. /*
  319. *時(shí)間走時(shí)函數(shù),計(jì)滿24小時(shí)后,日加一
  320. *并且設(shè)置了整點(diǎn)報(bào)時(shí),或者說(shuō)鬧鐘功能
  321. *由于單片機(jī)沒有蜂鳴器,采用兩個(gè)LED作為表示
  322. *LED亮一分鐘后自動(dòng)熄滅
  323. */

  324. void time_rec()
  325. {
  326.         if(sec == 60)
  327.                 {       
  328.                         P46 = 1;
  329.                         P47 = 1;
  330.                         sec = 0;
  331.                         min ++;
  332.                         if(min ==60)
  333.                         {
  334.                                 P46 = 0;
  335.                                 P47 = 0;
  336.                                 min = 0;
  337.                                 hou++;
  338.                                 if(hou==24)
  339.                                 {
  340.                                         hou = 0;
  341.                                         day++;
  342.                                         if((year%4==0&&year%100!=0)||(year%400==0))//判斷是否為閏年的2月
  343.                                          {
  344.              if(day==30)
  345.                  {
  346.                     day=0;
  347.                                                                                 month++;
  348.                                                                                         if(month==13)
  349.                                                                                         {
  350.                                                                                                 month=0;
  351.                                                                                                 year++;
  352.                                                                                         }
  353.                  }
  354.            }
  355.                                          if(year%4!=0&&month==2)
  356.                                          {
  357.                                                  if(day==29)
  358.                                                  {
  359.                                                                 day=0;
  360.                                                          month++;
  361.                                                                                         if(month==13)
  362.                                                                                         {
  363.                                                                                                 month=0;
  364.                                                                                                 year++;
  365.                                                                                         }
  366.                                                  }
  367.                                          }
  368.                                          if(month!=2&&month!=4&&month!=6&&month!=9&&month!=11)
  369.                                          {
  370.                                                         if(day==32)
  371.                                                         {
  372.                                                                 day=0;
  373.                                                                 month++;
  374.                                                                                         if(month==13)
  375.                                                                                         {
  376.                                                                                                 month=0;
  377.                                                                                                 year++;
  378.                                                                                         }
  379.                                                         }
  380.                                          }
  381.                                          if(month==4||month==6||month==9||month==11)
  382.                                          {
  383.                                                  {
  384.                                                          day=0;
  385.                                                          month++;
  386.                                                                                         if(month==13)
  387.                                                                                         {
  388.                                                                                                 month=0;
  389.                                                                                                 year++;
  390.                                                                                         }
  391.                                                  }
  392.                                          }
  393.                                          
  394.                                 }
  395.                         }
  396.                 }
  397. }


  398. /*
  399. *初始化函數(shù),包括LCD1602初始化
  400. *中斷的開啟,優(yōu)先級(jí)的設(shè)置
  401. *定時(shí)器的工作方式,計(jì)算初值等。
  402. */
  403. void init()
  404. {               
  405.         P0M0=0;
  406.         P0M1=0;
  407.   P2M0=0;
  408.         P2M1=0;
  409.         lcdwait();
  410.         lcdinit();
  411.         ET0 = 1;
  412.         EX0 = 1;                //外部中斷0允許
  413.         EX1 = 1;    //外部中斷1允許
  414.         PX1 = 0;                //調(diào)整外部中斷1的優(yōu)先級(jí)
  415.         PT0 = 1;    //調(diào)整定時(shí)器0中斷優(yōu)先級(jí)
  416.         IT1 = 1;
  417.         TMOD = 0x01;     //time0為定時(shí)器,方式1
  418.         TH0 = 0x3C;//(65535 - 50000) / 256;      //預(yù)置計(jì)算初值
  419.         TL0 = 0xB0;//(65535 - 50000) % 256;       
  420.         IT0 = 1;         //低電平有效
  421.         TR0 = 1;         //為1時(shí)啟動(dòng)計(jì)數(shù)       
  422.   EA = 1;       
  423. }


  424. /*
  425. *字符分離函數(shù)
  426. *將兩位的字符分離出十位和個(gè)位
  427. */
  428. void write_liangwei(uchar add,uchar date)
  429. {
  430.               uchar shi,ge;
  431.               shi=date/10;//分解一個(gè)2位數(shù)的十位和個(gè)位
  432. ……………………

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

所有資料51hei提供下載:
51單片機(jī)實(shí)驗(yàn)_在1602上制作電子鐘(包含日期).rar (227.01 KB, 下載次數(shù): 84)

具體的思路和過(guò)程在壓縮包里。
壓縮包包含工程文件和實(shí)驗(yàn)報(bào)告。

評(píng)分

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

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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