久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

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

QQ登錄

只需一步,快速開(kāi)始

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

帶兩個(gè)鬧鐘的LCD1602屏小型單片機(jī)萬(wàn)年歷制作

  [復(fù)制鏈接]
ID:88481 發(fā)表于 2018-7-27 20:03 | 顯示全部樓層 |閱讀模式
本設(shè)計(jì)中,在按鍵處理方面,下了不少功夫,雖然只有三個(gè)按鍵,不同狀態(tài)下,實(shí)現(xiàn)不同的功能.
為了節(jié)省用電,設(shè)計(jì)背景燈有按鍵銨下才亮,延時(shí)5秒后滅.長(zhǎng)按K1進(jìn)入設(shè)置狀態(tài),按K2移位,K3數(shù)字加.依次設(shè)置年月日,星期,時(shí)分秒,鬧鐘1,鬧鐘2.
在走時(shí)狀態(tài)下,按K2顯示鬧鐘1,按K3顯示鬧鐘2,延時(shí)5秒后返回走時(shí).在顯示鬧鐘狀態(tài)下,按K1,開(kāi)關(guān)鬧鐘,顯示"*"為開(kāi).走時(shí)狀態(tài)下顯示"%"為只有一個(gè)鬧鐘開(kāi),顯示"@"為兩個(gè)鬧鐘開(kāi).在鬧鐘響鈴時(shí),按任意鍵關(guān)閉聲音.

制作出來(lái)的原理圖如下:
1532689260920.jpg IMG_20180725_214417.jpg IMG_20180724_101645.jpg

Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
IMG_20180727_191855.jpg

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
IMG_20180727_191906.jpg

單片機(jī)源程序如下:
  1. #include "Lcd1602.h"
  2. #include "KEY.h"
  3. #include "DS18B20.h"
  4. #include "DS1302.h"

  5. uchar T0RH,T0RL;
  6. bit flag1s = 1;                         //1秒標(biāo)志
  7. bit flag200ms = 1;                 //200毫秒標(biāo)志
  8. bit beeonoff1=0,beeonoff2=0;         //鬧鐘1,2開(kāi)關(guān)標(biāo)志
  9. bit beeon = 0;                                         //峰鳴開(kāi)關(guān)
  10. uchar keybee = 0;                //按鍵鬧鐘1,2切換
  11. uchar hourbee1=0x08,minbee1=0x00,hourbee2=0x13,minbee2=0x30;          //鬧鐘1,2存放值
  12. uchar flag = 0;                //鬧鐘顯示時(shí)間
  13. uchar pos = 0;                 //設(shè)置時(shí)間引索
  14. sint buftemp;                //溫度暫存

  15. struct  sTime {
  16.         uchar year;
  17.         uchar mon;
  18.         uchar day;
  19.         uchar hour;
  20.         uchar min;
  21.         uchar sec;
  22.         uchar week;
  23.   };
  24. struct sTime buftime;

  25. void ConfigTimer0(uchar ms);
  26. void ShowTemp();
  27. void RefrTime();

  28. void main()
  29. {
  30.         bit reg = 0;
  31.         uchar bufsec = 0xaa;
  32.        
  33.         EA = 1;
  34.         ConfigTimer0(2);
  35.         LcdInit();
  36.         DS1302Init();
  37.         Start18B20();
  38.         GainTime(&buftime);
  39.         RefrTime();
  40.         while(1)
  41.         {
  42.                 KeyDriver();
  43.                 if (!pos)
  44.                 {
  45.                         if (flag200ms)
  46.                         {
  47.                                 flag200ms = 0;
  48.                                 GainTime(&buftime);
  49.                                 if (bufsec != buftime.sec)
  50.                                 {
  51.                                         RefrTime();
  52.                                         bufsec = buftime.sec;               
  53.                                 }
  54.                                 if (((hourbee1==buftime.hour) && (minbee1==buftime.min) && beeonoff1) || (hourbee2==buftime.hour) && (minbee2==buftime.min) && beeonoff2)
  55.                                 {
  56.                                         beeon = 1;
  57.                                 }
  58.                                 else
  59.                                 {
  60.                                         beeon = 0;
  61.                                 }
  62.                         }  
  63.                         if (flag1s )
  64.                         {
  65.                                 flag1s = 0;
  66.                                 reg = Get18B20Temp(&buftemp);
  67.                                 if (reg)
  68.                                 {
  69.                                         ShowTemp();          
  70.                                 }
  71.                                 Start18B20();                 
  72.                         }               
  73.                 }               
  74.         }       
  75. }

  76. void ShowTemp()                         //溫度顯示
  77. {
  78.         schar i = 0;
  79.         uchar len=0;
  80.         uchar tempint,tempdec;           //溫度整數(shù)部分,小數(shù)部分存放
  81.         uchar buf[4],str[6];

  82.         tempint = (buftemp>>4) & 0x7f;                //取出整數(shù)部分
  83.         tempdec = buftemp & 0x0f;                        //取出小數(shù)部分
  84.         do {
  85.                 buf[i++] = tempint%10;          
  86.                 tempint = tempint/10;
  87.           }while (tempint > 0);       
  88.         if (i < 2)
  89.         {
  90.                 str[len++] = ' ';
  91.         }         
  92.         while (i-- > 0)
  93.         {
  94.                 str[len++] = buf[i] + '0';       
  95.         }                                                                           
  96.         str[len++] = '.';
  97.         str[len++] = (tempdec*10/16) +'0';
  98.        
  99.         str[len] = '\0';                                          
  100.         LcdShowStr(11,1,str);         
  101. }                                         

  102. void NumToStr(uchar x,uchar y, uchar *str)                 //數(shù)據(jù)轉(zhuǎn)換字符
  103. {
  104.         uchar buf[3];

  105.         buf[0] = (*str>>4) + '0';
  106.         buf[1] = (*str&0x0f) + '0';
  107.         buf[2] = '\0';
  108.         LcdShowStr(x,y,buf);
  109. }

  110. void RefrTime()                                                  //刷新時(shí)間
  111. {
  112.         NumToStr(2,0,&buftime.year);
  113.         NumToStr(5,0,&buftime.mon);
  114.         NumToStr(8,0,&buftime.day);
  115.         LcdShowStr(15,0,&buftime.week);       
  116.         if  (((flag>0) && (keybee ==1)) || ((pos>=14) && (pos<=17)))        //鬧鐘1顯示       
  117.         {
  118.                 NumToStr(2,1,&hourbee1);
  119.                 NumToStr(5,1,&minbee1);
  120.                 LcdShowStr(8,1,"-1");
  121.         }
  122.         else if (((flag>0) && (keybee ==2)) || ((pos>=18) && (pos<=21)))         //鬧鐘2顯示
  123.         {
  124.                 NumToStr(2,1,&hourbee2);
  125.                 NumToStr(5,1,&minbee2);
  126.                 LcdShowStr(8,1,"-2");
  127.         }
  128.         else
  129.         {
  130.                 NumToStr(2,1,&buftime.hour);
  131.                 NumToStr(5,1,&buftime.min);
  132.                 NumToStr(8,1,&buftime.sec);
  133.                 if (beeonoff1 && beeonoff2)                                  //如果兩個(gè)鬧鐘開(kāi),則顯示"@"
  134.                         LcdShowStr(0,1,"@");
  135.                 else if (!beeonoff1 && !beeonoff2)                  //如果兩個(gè)鬧鐘關(guān),則不顯示,
  136.                         LcdShowStr(0,1," ");
  137.                 else
  138.                         LcdShowStr(0,1,"%");                                  //如果其中一個(gè)鬧鐘開(kāi),則顯示"%"
  139.         }                                                                               
  140. }

  141. void BeeOnroOff()                        //鬧鐘開(kāi)關(guān)時(shí)顯示
  142. {
  143.         if (keybee == 1)                //鬧鐘1開(kāi)關(guān)
  144.         {
  145.                 beeonoff1 = ~beeonoff1;
  146.                 if (beeonoff1)
  147.                 {
  148.                         LcdShowStr(0,1,"*");                         //顯示"*",表示鬧鐘開(kāi)
  149.                 }
  150.                 else
  151.                 {
  152.                         LcdShowStr(0,1," ");
  153.                 }
  154.         }
  155.         else if (keybee == 2)         //鬧鐘2開(kāi)關(guān)
  156.         {
  157.                 beeonoff2 = ~beeonoff2;       
  158.                 if (beeonoff1 || beeonoff2)
  159.                 {
  160.                         LcdShowStr(0,1,"*");       
  161.                 }
  162.                 else
  163.                 {
  164.                         LcdShowStr(0,1," ");
  165.                 }
  166.         }        
  167. }

  168. void CurPosit()                                                           //光標(biāo)位置,設(shè)置修改的位置
  169. {
  170.         switch(pos)
  171.         {
  172.                 case 1: LcdSetCort(2,0); break;                //日期
  173.                 case 2: LcdSetCort(3,0); break;
  174.                 case 3: LcdSetCort(5,0); break;
  175.                 case 4: LcdSetCort(6,0); break;
  176.                 case 5: LcdSetCort(8,0); break;
  177.                 case 6: LcdSetCort(9,0); break;                 
  178.                 case 7: LcdSetCort(15,0); break;         //星期
  179.                 case 8: LcdSetCort(2,1); break;                 //時(shí)間
  180.                 case 9: LcdSetCort(3,1); break;
  181.                 case 10: LcdSetCort(5,1); break;
  182.                 case 11: LcdSetCort(6,1); break;
  183.                 case 12: LcdSetCort(8,1); break;
  184.                 case 13: LcdSetCort(9,1); break;
  185.                 case 14: LcdSetCort(2,1); break;          //鬧鐘1
  186.                 case 15: LcdSetCort(3,1); break;
  187.                 case 16: LcdSetCort(5,1); break;
  188.                 case 17: LcdSetCort(6,1); break;
  189.                 case 18: LcdSetCort(2,1); break;           //鬧鐘2
  190.                 case 19: LcdSetCort(3,1); break;
  191.                 case 20: LcdSetCort(5,1); break;
  192.                 case 21: LcdSetCort(6,1); break;
  193.                 default:        break;                       
  194.         }       
  195. }

  196. void RightShift()                          //向右移動(dòng)
  197. {
  198.         if (pos != 0)
  199.         {
  200.                 if (pos < 21)
  201.                         pos++;
  202.                 else
  203.                         pos = 1;
  204.                 if ((pos==14) || (pos==18) || (pos==1))
  205.                         RefrTime();
  206.                 CurPosit();
  207.         }
  208. }

  209. uchar IncBcdHigh(uchar dat, uchar n)           //高位加
  210. {
  211.         if ((dat&0xf0) < (n<<4))
  212.                 dat += 0x10;
  213.         else
  214.                 dat &= 0x0f;
  215.         return dat;
  216. }

  217. uchar IncBcdLow(uchar dat, uchar n)                   //低位加
  218. {
  219.         if ((dat&0x0f) < n)
  220.                 dat += 0x01;
  221.         else
  222.                 dat &= 0xf0;
  223.         return dat;
  224. }

  225. uchar IncBcdWeek(uchar dat, uchar n)                //星期加
  226. {
  227.         if ((dat&0x0f) < n)
  228.                 dat += 0x01;
  229.         else
  230.                 dat = 1;
  231.         return dat;
  232. }

  233. void IncSetTime()                 //向上(加)
  234. {
  235.         switch (pos)
  236.         {
  237.                 case 1: buftime.year = IncBcdHigh(buftime.year,9); break;
  238.                 case 2: buftime.year = IncBcdLow(buftime.year,9); break;
  239.                 case 3: buftime.mon = IncBcdHigh(buftime.mon,1); break;
  240.                 case 4: buftime.mon = IncBcdLow(buftime.mon,9); break;
  241.                 case 5: buftime.day = IncBcdHigh(buftime.day,3); break;
  242.                 case 6: buftime.day = IncBcdLow(buftime.day,9); break;
  243.                 case 7: buftime.week = IncBcdWeek(buftime.week,7); break;
  244.                 case 8: buftime.hour = IncBcdHigh(buftime.hour,2); break;
  245.                 case 9: buftime.hour = IncBcdLow(buftime.hour,9); break;
  246.                 case 10: buftime.min = IncBcdHigh(buftime.min,5); break;
  247.                 case 11: buftime.min = IncBcdLow(buftime.min,9); break;
  248.                 case 12: buftime.sec = IncBcdHigh(buftime.sec,5); break;
  249.                 case 13: buftime.sec = IncBcdLow(buftime.sec,9); break;

  250.                 case 14: hourbee1 = IncBcdHigh(hourbee1,2); break;
  251.                 case 15: hourbee1 = IncBcdLow(hourbee1,9); break;
  252.                 case 16: minbee1 = IncBcdHigh(minbee1,5); break;
  253.                 case 17: minbee1 = IncBcdLow(minbee1,9); break;

  254.                 case 18: hourbee2 = IncBcdHigh(hourbee2,2); break;
  255.                 case 19: hourbee2 = IncBcdLow(hourbee2,9); break;
  256.                 case 20: minbee2 = IncBcdHigh(minbee2,5); break;
  257.                 case 21: minbee2 = IncBcdLow(minbee2,9); break;
  258.                 default: break;
  259.         }
  260.         RefrTime();
  261.         CurPosit();       
  262. }

  263. void EntertimeSet()                        //進(jìn)入時(shí)間設(shè)置
  264. {
  265.         pos = 21;
  266.         RightShift();
  267.         LcdCoorTwin();                //光標(biāo)閃動(dòng)
  268. }

  269. void KeyAction(uchar cod,bit set)                          //按鍵動(dòng)作
  270. {
  271.         switch(cod)
  272.         {
  273.                 case 0: if (!set)       
  274.                                 {
  275.                                         if (flag > 0)                        //鬧鐘延時(shí)顯示狀態(tài)下,則可以設(shè)置鬧鐘開(kāi)關(guān)
  276.                                                 BeeOnroOff();
  277.                                         pos = 0;
  278.                                         SetTime(&buftime);
  279.                                         LcdClsCur();                 //光標(biāo)閃動(dòng)清除
  280.                                 }
  281.                                 else                                          //進(jìn)入設(shè)置
  282.                                 {
  283.                                         flag = 0;                          //延時(shí)顯示時(shí)間清零                                       
  284.                                         EntertimeSet();
  285.                                 }
  286.                                         break;
  287.                 case 1: if (!set && (pos==0))                        //非設(shè)置狀態(tài),顯示鬧鐘1
  288.                                 {
  289.                                         keybee = 1;
  290.                                         flag = 3;                                        //延時(shí)6秒計(jì)算
  291.                                         if (beeonoff1)
  292.                                         {
  293.                                                 LcdShowStr(0,1,"*");         //顯示鬧鐘標(biāo)志
  294.                                         }
  295.                                         else
  296.                                         {
  297.                                                 LcdShowStr(0,1," ");
  298.                                         }
  299.                                         RefrTime();       
  300.                                 }
  301.                                 else if (pos!=0)                                 //設(shè)置狀態(tài),數(shù)字移動(dòng)
  302.                                 {
  303.                                         RightShift();                               
  304.                                 }                       
  305.                                         break;
  306.                 case 2: if (!set && (pos==0))                        //非設(shè)置狀態(tài),顯示鬧鐘2
  307.                                 {
  308.                                         keybee = 2;
  309.                                         flag = 3;                                         //延時(shí)6秒計(jì)算
  310.                                         if (beeonoff2)
  311.                                         {
  312.                                                 LcdShowStr(0,1,"*");           //顯示鬧鐘標(biāo)志
  313.                                         }
  314.                                         else
  315.                                         {
  316.                                                 LcdShowStr(0,1," ");
  317.                                         }
  318.                                         RefrTime();       
  319.                                 }
  320.                                 else if (pos!=0)                           //設(shè)置狀態(tài),數(shù)字加
  321.                                 {
  322.                                         IncSetTime();
  323.                                 }                               
  324.                                           break;
  325.         }       
  326. }

  327. void LedLigh(bit ledt)                                  //背影燈開(kāi)啟
  328. {
  329.         static bit ledflag = 0;
  330.         static uint ledcou=0;

  331.         if (ledt)
  332.         {
  333.                 ledflag = 1;
  334.                 ledcou = 3000;
  335.                 LED = 0;
  336.         }
  337.         if (ledflag)
  338.         {               
  339.                 if (ledcou > 0)
  340.                 {
  341.                         ledcou--;
  342.                 }
  343.                 else
  344.                 {
  345.                         ledflag = 0;
  346.                         LED = 1;       
  347.                 }
  348.         }
  349. }

  350. void AlarmClock(bit on, bit beet)                //鬧鐘發(fā)聲         on 鬧鐘觸發(fā)開(kāi)關(guān),beet為按鍵暫時(shí)關(guān)
  351. {
  352.         static bit off = 0;
  353.         static uchar alcou=0;

  354.         if (on)
  355.         {
  356.                 if (beet)
  357.                         off = 1;
  358.                 if (!off)
  359.                 {               
  360.                         alcou++;
  361.                         if (alcou == 255)
  362.                         {
  363.                         alcou = 0;
  364.                         }
  365.                         if (alcou > 150)
  366.                         {
  367.                                 BEE = ~BEE;
  368.                         }
  369.                 }
  370.                 else
  371.                 {
  372.                         BEE = 1;
  373.                 }       
  374.         }
  375.         else
  376.         {
  377. ……………………

  378. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
0.png
所有資料51hei提供下載:
自制小型萬(wàn)年歷.zip (440.2 KB, 下載次數(shù): 150)

評(píng)分

參與人數(shù) 2黑幣 +55 收起 理由
不負(fù)時(shí)光~田 + 5 絕世好帖!
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:367440 發(fā)表于 2018-7-29 18:36 | 顯示全部樓層
大神,膜拜
回復(fù)

使用道具 舉報(bào)

ID:307566 發(fā)表于 2018-9-8 20:09 | 顯示全部樓層
和我想做的差不多,就等下下來(lái)實(shí)踐一下
回復(fù)

使用道具 舉報(bào)

ID:457329 發(fā)表于 2018-12-31 13:30 | 顯示全部樓層
老哥,我下載下來(lái)修改,發(fā)現(xiàn)好多.C文件不知道怎么修改,求教
回復(fù)

使用道具 舉報(bào)

ID:154310 發(fā)表于 2018-12-31 22:38 | 顯示全部樓層
太厲害了,求指導(dǎo)呀。。。。
回復(fù)

使用道具 舉報(bào)

ID:133790 發(fā)表于 2019-1-2 11:39 | 顯示全部樓層
這個(gè)帖子不錯(cuò),自從自己開(kāi)始自己自學(xué)單片機(jī),從來(lái)都沒(méi)有系統(tǒng)的學(xué)習(xí)過(guò)。多謝了。
回復(fù)

使用道具 舉報(bào)

ID:479216 發(fā)表于 2019-2-22 11:02 來(lái)自手機(jī) | 顯示全部樓層
謝謝樓主,正準(zhǔn)備做個(gè)這種的。
回復(fù)

使用道具 舉報(bào)

ID:517951 發(fā)表于 2020-11-15 14:10 | 顯示全部樓層
謝謝樓主分享,,51hei有你更精彩!!
回復(fù)

使用道具 舉報(bào)

ID:336670 發(fā)表于 2023-1-31 12:24 | 顯示全部樓層
謝謝樓主分享,,51hei有你更精彩!!
回復(fù)

使用道具 舉報(bào)

ID:512651 發(fā)表于 2023-2-1 10:51 | 顯示全部樓層
感謝樓主分享,收下了。
回復(fù)

使用道具 舉報(bào)

ID:1026113 發(fā)表于 2023-2-6 16:36 | 顯示全部樓層
老哥怎么沒(méi)有復(fù)位
回復(fù)

使用道具 舉報(bào)

ID:824664 發(fā)表于 2023-3-12 23:37 | 顯示全部樓層
正在學(xué)習(xí)的內(nèi)容,非常感謝!!!
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 一区二区三区视频在线观看 | 91一区二区 | 国产午夜精品久久久久免费视高清 | 久久亚洲春色中文字幕久久久 | 亚洲成人在线视频播放 | 草草影院ccyy | www.蜜桃av | 国产网站在线 | 成人亚洲片 | 久久综合国产 | 久久久久无码国产精品一区 | 麻豆av电影网 | 最近日韩中文字幕 | 视频在线一区二区 | 亚洲精品久久久一区二区三区 | 欧美国产大片 | 不卡av在线| 波多野结衣精品在线 | 国产成人精品久久二区二区91 | 91在线视频免费观看 | 国产人成在线观看 | 男女激情网 | 观看av | 91视频一区二区三区 | 久久久91精品国产一区二区三区 | www.亚洲一区二区 | 中文字幕一区二区三区四区五区 | 亚卅毛片| 亚洲一区二区三区免费观看 | 天天天天操 | 国产精品网址 | 我要看黄色录像一级片 | 91看片免费版 | 国产一二三视频在线观看 | 福利片一区二区 | 羞羞在线视频 | 免费一区 | 亚洲精品美女视频 | 中文字幕在线观看 | 中文字幕 欧美 日韩 | 国产一区二区三区视频免费观看 |