標(biāo)題: 健康節(jié)能臺(tái)燈的設(shè)計(jì)電子實(shí)踐論文 附單片機(jī)源程序 [打印本頁(yè)]

作者: 51hei小明    時(shí)間: 2018-4-4 17:41
標(biāo)題: 健康節(jié)能臺(tái)燈的設(shè)計(jì)電子實(shí)踐論文 附單片機(jī)源程序
機(jī)械工程學(xué)院
小學(xué)期
電子實(shí)踐論文
參賽課題:健康節(jié)能臺(tái)燈

在現(xiàn)代城市中,隨著人口和能源消耗的急劇增長(zhǎng),總用電量也在日益增加,要是沒(méi)有節(jié)能措施,便會(huì)造成能源枯竭的不良后果。同時(shí),人們長(zhǎng)期久坐也會(huì)帶來(lái)一系列的健康問(wèn)題。因此,健康智能臺(tái)燈便有了其設(shè)計(jì)的必要性。
本課程設(shè)計(jì)的任務(wù)就是設(shè)計(jì)一個(gè)健康智能臺(tái)燈系統(tǒng)。鼓勵(lì)學(xué)生在熟悉基本原理的前提下,與實(shí)際應(yīng)用相聯(lián)系,提出自己的方案,完善設(shè)計(jì)。
該設(shè)計(jì)是以 AT89C52 單片機(jī)為控制核心的集多種功能于一體的健康智能臺(tái)燈。該臺(tái)燈實(shí)現(xiàn)了自動(dòng)檢測(cè)桌前是否有人并自動(dòng)開(kāi)啟/關(guān)閉功能;臺(tái)燈光亮度具有手動(dòng)\自動(dòng)調(diào)節(jié)功能;具有時(shí)間顯示功能;整點(diǎn)報(bào)時(shí)功能。硬件設(shè)計(jì)分為單片機(jī)控制模塊、按鍵模塊、臺(tái)燈模塊、時(shí)鐘模塊、報(bào)時(shí)模塊、溫度檢測(cè)模塊、顯示模塊,紅外傳感模塊等七個(gè)部分。單片機(jī)控制就用 AT89C52,溫度檢測(cè)模塊由DS18B20 完成,顯示模塊用數(shù)碼管顯示時(shí)間、日期及溫度,按鍵模塊用來(lái)調(diào)整時(shí)間、日期等,臺(tái)燈模塊自制的電路,用蜂鳴器發(fā)出整點(diǎn)報(bào)時(shí),檢測(cè)人的用FC-51避障模塊。軟件設(shè)計(jì)用單片機(jī) C 語(yǔ)言編寫,實(shí)現(xiàn)了全部控制功能。


目錄
摘要2
目錄3
第一章LED臺(tái)燈功能描述及總體方案4
11功能描述4
12系統(tǒng)組成及工作過(guò)4
第二章硬件設(shè)計(jì)4
21單片機(jī)控制模塊設(shè)4
22按鍵模塊電路設(shè)5
23臺(tái)燈模塊電路設(shè)6
24時(shí)鐘模塊電路設(shè)7
25報(bào)時(shí)模塊電路設(shè)7
26 溫度模塊程序設(shè)計(jì)8
27 紅外傳感器模塊電路設(shè)計(jì)8
第三章軟件設(shè)計(jì)9
31 主程序的設(shè)計(jì)9
32 按鍵模塊程序設(shè)計(jì)9
33 臺(tái)燈模塊程序設(shè)計(jì)9
34 時(shí)鐘模塊程序設(shè)計(jì)9
35 報(bào)時(shí)模塊程序設(shè)計(jì)9
36 溫度模塊程序設(shè)計(jì)10
37 紅外傳感器模塊程序設(shè)計(jì)10
第四章總結(jié)10
實(shí)物圖11
系統(tǒng)連接圖12
附錄13
第一章 LED 臺(tái)燈功能描述及總體該方案

1.1 功能描述
根據(jù)主要功能要求,該設(shè)計(jì)利用 51 單片機(jī)實(shí)現(xiàn)了電子時(shí)鐘、溫度的顯示以
及整點(diǎn)報(bào)時(shí)等功能。具體可分為一下幾種:
1) 顯示當(dāng)前的日期及時(shí)間,24 時(shí)制的時(shí)、分、秒;
2) 可調(diào)節(jié)時(shí)間;
3) 整點(diǎn)報(bào)時(shí)并響鈴。
4) 能檢測(cè)桌前是否有人并自動(dòng)開(kāi)啟/關(guān)閉;
5) 可自動(dòng)\手動(dòng)調(diào)節(jié)燈光亮度;

1.2 系統(tǒng)組成及工作過(guò)程
六大模塊以 AT89C52單片機(jī)為控制核心,實(shí)現(xiàn)了該智能臺(tái)燈的各項(xiàng)要求,外接一個(gè)5V 的直流電源,為整個(gè)系統(tǒng)供電。

2 硬件設(shè)計(jì)
2.1 單片機(jī)控制模塊設(shè)計(jì)
硬件電路如圖 2            




圖 2 單片機(jī)控制模塊電路(最小系統(tǒng))

這里我們選用 12M 的晶振,晶振系統(tǒng)由兩個(gè) 30pF 的電容 CAP 和晶振組成,
接到單片機(jī)的 18、19 兩管腳。晶振給單片機(jī)提供硬件本身的時(shí)鐘振蕩。一個(gè) 10μF
的電解電容和一個(gè) 1k 的電阻組成復(fù)位電路,接至單片機(jī)的第 9 管腳。P0 口加上
排阻,即其就是 P0 口的上拉電阻,這就是給 P0 加驅(qū)動(dòng)電路,電源通過(guò)排阻向
P0 口供電,使其能夠驅(qū)動(dòng)與 P0 口相連的元件。
2.2 按鍵模塊電路設(shè)計(jì)

按鍵模塊電路
三個(gè)按鍵分別用來(lái)選取需要調(diào)節(jié)的數(shù)碼管、增加數(shù)值及減少數(shù)值,即設(shè)置日期時(shí)間當(dāng)前。
兩個(gè)開(kāi)關(guān)控制燈電路的開(kāi)通或是關(guān)閉狀態(tài),上方以開(kāi)關(guān)代替模擬FC-51模塊的狀態(tài)(proteus中無(wú)相似元件),當(dāng)模塊檢測(cè)到有人時(shí)輸出低電平;下方開(kāi)關(guān)為手動(dòng)開(kāi)關(guān)(開(kāi)關(guān)燈)。
按鍵及開(kāi)關(guān)均采用低電平有效連接方式。

2.3 臺(tái)燈模塊電路設(shè)計(jì)



臺(tái)燈模塊電路如圖 4,


3.1 主程序的設(shè)計(jì)
主程序流程圖

主程序如圖,一給單片機(jī)上電,單片機(jī)就初始化。然后掃描各個(gè)按鍵、開(kāi)關(guān)的狀態(tài),檢測(cè)開(kāi)關(guān)是否打開(kāi)、屋內(nèi)是否有人,若同時(shí)滿足則給臺(tái)燈電路上電。同時(shí)向數(shù)碼管輸出時(shí)間初值,隨后時(shí)間計(jì)時(shí)子函數(shù)運(yùn)行,時(shí)鐘正常工作。然后檢測(cè)時(shí)間調(diào)整按鍵是否按下,判斷修改哪個(gè)數(shù)據(jù),掃描調(diào)整按鍵,增加或減少數(shù)值。單片機(jī)接收并處理來(lái)自 DS18B20 傳過(guò)來(lái)的數(shù)據(jù)在數(shù)碼管上顯示當(dāng)時(shí)的室內(nèi)溫度,最后進(jìn)入循環(huán)。

3.2 按鍵模塊程序設(shè)計(jì)
按鍵用來(lái)調(diào)整時(shí)間和日期,各鍵功能在介紹硬件部分已描述。
因?yàn)橛心暝氯,時(shí)分秒幾個(gè)參數(shù)要調(diào),所以設(shè)置這幾個(gè)參數(shù)的計(jì)數(shù)。當(dāng)按模式
鍵時(shí),單片機(jī)進(jìn)行相應(yīng)的操作。

3.3 臺(tái)燈模塊程序設(shè)計(jì)
該模塊只需給 P3.6 到送高電平即可,再通過(guò)手動(dòng)旋鈕\環(huán)境光強(qiáng)調(diào)整燈光亮度。

3.4 時(shí)鐘模塊程序設(shè)計(jì)
分別出寫時(shí)間、日期的函數(shù),再寫出時(shí)間、日期的顯示函數(shù)。設(shè)計(jì)時(shí)、分、
秒,年、月、日幾個(gè)變量分別表示時(shí)分秒,年月日。

3.5 報(bào)時(shí)模塊程序設(shè)計(jì)
對(duì)蜂鳴器,在其所接的 I/O 口P3.3寫 1 即可實(shí)現(xiàn)它的蜂鳴,當(dāng)分鐘數(shù)增加到60時(shí)響鈴,寫程序時(shí)給它加了個(gè)1s延時(shí),實(shí)現(xiàn)整點(diǎn)報(bào)時(shí)。


3.6 溫度模塊程序設(shè)計(jì)
設(shè)計(jì)初始化函數(shù),設(shè)計(jì)讀 DS18B20 數(shù)據(jù)和對(duì) DS118B20 寫數(shù)據(jù)的函數(shù),再寫出
從 DS18B20 讀溫度并轉(zhuǎn)換為十進(jìn)制的函數(shù),最后逐位顯示溫度的函數(shù)。

3.7 紅外傳感器模塊程序設(shè)計(jì)
編寫一個(gè)讀端口P3.4的函數(shù),即FC-51模塊OUT端口狀態(tài),檢測(cè)有人與否,若有人,傳感器發(fā)給單片機(jī)一個(gè)低電平,單片機(jī)同時(shí)判斷燈開(kāi)關(guān)是否打開(kāi),使得單片機(jī)P3.6口為高電平,控制臺(tái)燈電路上電;若人離開(kāi)桌前,則P3.4為高電平,臺(tái)燈斷電。這就實(shí)現(xiàn)了檢測(cè)屋內(nèi)有人與否并自動(dòng)開(kāi)啟或關(guān)閉的智能節(jié)能的臺(tái)燈。

4 總結(jié)

該設(shè)計(jì)實(shí)現(xiàn)了日期、時(shí)間及溫度檢測(cè)和顯示電路,具備整點(diǎn)報(bào)時(shí)功能,以提醒用戶久坐時(shí)長(zhǎng),避免長(zhǎng)期久坐導(dǎo)致的一系列健康問(wèn)題。同時(shí)自動(dòng)檢測(cè)桌前是否有人并自動(dòng)開(kāi)啟/關(guān)閉功能;臺(tái)燈具有光亮度自動(dòng)\手動(dòng)調(diào)節(jié)功能;但在細(xì)節(jié)
方面還有不足之處。燈光亮度達(dá)不到很亮的程度,只能在一個(gè)很小的范圍變化,
以致于光亮度不夠。關(guān)閉的功能。該傳感器檢測(cè)距離通過(guò)調(diào)節(jié)FC-1模塊上變阻器可在1m-20m間調(diào)節(jié)。蜂鳴器在仿真過(guò)程中不響,多次排查后仍沒(méi)有找到原因,在設(shè)計(jì)答辯完成后,我們會(huì)繼續(xù)尋找問(wèn)題的源頭,爭(zhēng)取解決。在實(shí)際的實(shí)物制作過(guò)程中,因材料的限制,觸發(fā)臺(tái)燈所用的三極管使用了雙向可控硅代替,這帶來(lái)了一系列問(wèn)題:1可控硅的參數(shù)不明,導(dǎo)致了變阻器在調(diào)節(jié)過(guò)程中無(wú)法精確到具體值,只能不斷嘗試2可控硅的負(fù)載能力小,使得燈在長(zhǎng)時(shí)間運(yùn)行后出現(xiàn)過(guò)載現(xiàn)象,自動(dòng)熄滅。
              原本的設(shè)計(jì)是只有臺(tái)燈電路,畢竟節(jié)能臺(tái)燈的節(jié)能應(yīng)考慮設(shè)計(jì)簡(jiǎn)化,但為提升本次設(shè)計(jì)作業(yè)的復(fù)雜性,加入了更多其他模塊,雖有些本末倒置的意味,但鍛煉了我們的動(dòng)手能力、單片機(jī)編程能力,更提升了我們對(duì)MC-51系列單片機(jī)、數(shù)碼管及DS18B20 的了解與認(rèn)識(shí),為以后的畢業(yè)設(shè)計(jì)及往后的工作打下經(jīng)驗(yàn)基礎(chǔ)。

以上的程序見(jiàn)附錄


實(shí)物圖
仿真及實(shí)物演示視頻見(jiàn)設(shè)計(jì)文件

系統(tǒng)連接圖


附錄

單片機(jī)源程序如下:
  1. #define uchar unsigned char
  2. #define uint  unsigned int
  3. #define DQ P3_7
  4. #include<AT89X51.H>

  5. uint sec;
  6. uint min=05;
  7. uint hour=13;
  8. uint day=19;
  9. uint month=7;
  10. uint yearl=17;
  11. uint yearh=20;
  12. uint tcnt;
  13. uint cursor=0;
  14. uchar a=0xff;
  15. uchar code Seg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

  16. void delay(uint t)
  17. {
  18.     uint i;
  19.     while(t--)
  20.     {for (i=0;i<125;i++);}
  21. }
  22. void Tdelay(unsigned int i)
  23. {
  24. while(i--);
  25. }
  26. void Kdelay()
  27. {
  28.     uchar i,j;
  29.     for(i=100;i>0;i--)
  30.     for(j=248;j>0;j--);
  31. }
  32. Init_DS18B20(void)
  33. {
  34. unsigned char x=0;
  35. DQ = 1;   
  36. Tdelay(8);
  37. DQ = 0;   
  38. Tdelay(80);
  39. DQ = 1;   
  40. Tdelay(14);
  41. Tdelay(20);
  42. }
  43. //讀一個(gè)字節(jié)
  44. ReadOneChar(void)
  45. {
  46. unsigned char i=0;
  47. unsigned char dat = 0;
  48. for (i=8;i>0;i--)
  49. {
  50.   DQ = 0;
  51.   dat>>=1;
  52.   DQ = 1;
  53.   if(DQ)
  54.    dat|=0x80;
  55.   Tdelay(4);
  56. }
  57. return(dat);
  58. }

  59. //寫一個(gè)字節(jié)
  60. WriteOneChar(unsigned char dat)
  61. {
  62. unsigned char i=0;
  63. for (i=8; i>0; i--)
  64. {
  65.   DQ = 0;
  66.   DQ = dat&0x01;
  67.   Tdelay(5);
  68.   DQ = 1;
  69.   dat>>=1;
  70. }
  71. }

  72. //讀取溫度
  73. ReadTemperature(void)
  74. {
  75. unsigned char a=0;
  76. unsigned char b=0;
  77. unsigned int t=0;
  78. float tt=0;
  79. Init_DS18B20();
  80. WriteOneChar(0xCC);
  81. WriteOneChar(0x44);
  82. Init_DS18B20();
  83. WriteOneChar(0xCC);
  84. WriteOneChar(0xBE);
  85. a=ReadOneChar();
  86. b=ReadOneChar();
  87. t=b;
  88. t<<=8;
  89. t=t|a;
  90. tt=t*0.0625;      
  91. t= tt*10+0.5;     
  92. return(t);
  93. }

  94. void display(uchar L1,uchar L2,uchar L3,uchar L4,uchar L5,uchar L6,uchar L7,uchar L8,uchar L9,uchar L10,uchar L11,uchar L12,uchar L13,uchar L14,uchar L15,uchar L16)
  95. {
  96.     P2=0x7F;P0=L1;delay(1);  //yearh
  97.     P2=0xBF;P0=L2;delay(1);  //yearh
  98.     if(cursor==6){P2=0xDF|a;P0=L3;delay(1);}else{P2=0xDF;P0=L3;delay(1);}   //yearl
  99.     if(cursor==6){P2=0xEF|a;P0=L4;delay(1);}else{P2=0xEF;P0=L4;delay(1);}   //yearl
  100.     if(cursor==5){P2=0xF7|a;P0=L5;delay(1);}else{P2=0xF7;P0=L5;delay(1);}   //month
  101.     if(cursor==5){P2=0xFB|a;P0=L6;delay(1);}else{P2=0xFB;P0=L6;delay(1);}   //month
  102.     if(cursor==4){P2=0xFD|a;P0=L7;delay(1);}else{P2=0xFD;P0=L7;delay(1);}   //day
  103.     if(cursor==4){P2=0xFE|a;P0=L8;delay(1);}else{P2=0xFE;P0=L8;delay(1);}   //day
  104.     P2=0xFF;
  105.     if(cursor==3){P1=0x7F|a;P0=L9;delay(1);}else{P1=0x7F;P0=L9;delay(1);}   //hour
  106.     if(cursor==3){P1=0xBF|a;P0=L10;delay(1);}else{P1=0xBF;P0=L10;delay(1);}  //hour
  107.     if(cursor==2){P1=0xDF|a;P0=L11;delay(1);}else{P1=0xDF;P0=L11;delay(1);} //min
  108.     if(cursor==2){P1=0xEF|a;P0=L12;delay(1);}else{P1=0xEF;P0=L12;delay(1);} //min
  109.     if(cursor==1){P1=0xF7|a;P0=L13;delay(1);}else{P1=0xF7;P0=L13;delay(1);} //sec
  110.     if(cursor==1){P1=0xFB|a;P0=L14;delay(1);}else{P1=0xFB;P0=L14;delay(1);} //sec
  111.     P1=0xFD;P0=L15;delay(1); //temp
  112.     P1=0xFE;P0=L16;delay(1); //temp
  113.     P1=0xFF;
  114. }

  115. main()
  116. {  
  117.     uint i;   
  118.     TMOD=0x02;            //設(shè)置模式為定時(shí)器T0的模式2 (8位自動(dòng)重裝計(jì)數(shù)初值的計(jì)數(shù)值)      
  119.     TH0=0x06;             //設(shè)置計(jì)數(shù)器初值,靠TH0存儲(chǔ)重裝的計(jì)數(shù)值X0=256-250=6
  120.     TL0=0x06;
  121.     TR0=1;                //啟動(dòng)T0
  122.     ET0=1;                //開(kāi)啟定時(shí)器T0中斷允許
  123.     EA=1;                 //開(kāi)啟中斷總控制

  124.     while(1)
  125.     {
  126.                             if(P3_4==0)
  127.                                           {if(P3_5==0)
  128.                                                         P3_6=1;}
  129.                             else P3_6=0;
  130.         if(P3_0==0)
  131.         {
  132.             Kdelay();
  133.             if(P3_0==0)
  134.             {
  135.                 cursor++;
  136.                 if(cursor>=7){cursor=0;}
  137.             }
  138.         }
  139.         if(P3_1==0)
  140.         {
  141.             Kdelay();
  142.             if(P3_1==0)
  143.             {
  144.                 if(cursor==1){sec++;if(sec==60)sec=0;}
  145.                 if(cursor==2){min++;if(min==60)min=0;}
  146.                 if(cursor==3){hour++;if(hour==24)hour=0;}
  147.                 if(cursor==4){day++;if(day==31)day=0;}
  148.                 if(cursor==5){month++;if(month==12)month=0;}
  149.                 if(cursor==6){yearl++;if(yearl==100)yearl=0;}
  150.                 if(cursor==7){yearh++;if(yearh==30)yearh=20;}
  151.             }
  152.         }
  153.         if(P3_2==0)
  154.         {
  155.             Kdelay();
  156.             if(P3_2==0)
  157.             {
  158.                 if(cursor==1){sec--;}
  159.                 if(cursor==2){min--;}
  160.                 if(cursor==3){hour--;}
  161.                 if(cursor==4){day--;}
  162.                 if(cursor==5){month--;}
  163.                 if(cursor==6){yearl--;}
  164.                 if(cursor==7){yearh--;}
  165.             }
  166.         }
  167.         i=ReadTemperature();
  168.         display(Seg[yearh/10],Seg[yearh%10],Seg[yearl/10],Seg[yearl%10],Seg[month/10],Seg[month%10],Seg[day/10],Seg[day%10],Seg[hour/10],Seg[hour%10],Seg[min/10],Seg[min%10],Seg[sec/10],Seg[sec%10],Seg[i/100],Seg[i/10%10]);   
  169.     }
  170. }

  171. void t0(void)interrupt 1 using 0   //t0的中斷程序
  172. {
  173.     tcnt++;
  174.     if(tcnt==4000)//定時(shí)器的定時(shí)計(jì)數(shù),4000次250us為1秒
  175.     {
  176.         tcnt=0;
  177.                             P3_3=0;
  178.         a=~a;
  179.         sec++;
  180.         if(sec==60)
  181.         {   
  182.             sec=0;
  183.             min++;
  184.             if(min==60)
  185.             {
  186.                 min=0;
  187.                                                         P3_3=1;
  188.                 hour++;
  189.                 if(hour==24)
  190.                 {
  191.                     hour=0;
  192.                     day++;
  193.                     if(month==2&&((yearl==0&&yearh%4==0)||(yearl!=0&&yearl%4==0))&&day==30)day=1;
  194. ……………………

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

所有資料51hei提供下載(仿真+源碼+論文):
http://www.torrancerestoration.com/bbs/dpj-111625-1.html







歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1