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

QQ登錄

只需一步,快速開始

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

健康節(jié)能臺(tái)燈的設(shè)計(jì)電子實(shí)踐論文 附單片機(jī)源程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:290266 發(fā)表于 2018-4-4 17:41 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
機(jī)械工程學(xué)院
小學(xué)期
電子實(shí)踐論文
參賽課題:健康節(jié)能臺(tái)燈

在現(xiàn)代城市中,隨著人口和能源消耗的急劇增長,總用電量也在日益增加,要是沒有節(jié)能措施,便會(huì)造成能源枯竭的不良后果。同時(shí),人們長期久坐也會(huì)帶來一系列的健康問題。因此,健康智能臺(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)檢測桌前是否有人并自動(dòng)開啟/關(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í)模塊、溫度檢測模塊、顯示模塊,紅外傳感模塊等七個(gè)部分。單片機(jī)控制就用 AT89C52,溫度檢測模塊由DS18B20 完成,顯示模塊用數(shù)碼管顯示時(shí)間、日期及溫度,按鍵模塊用來調(diào)整時(shí)間、日期等,臺(tái)燈模塊自制的電路,用蜂鳴器發(fā)出整點(diǎn)報(bào)時(shí),檢測人的用FC-51避障模塊。軟件設(shè)計(jì)用單片機(jī) C 語言編寫,實(shí)現(xiàn)了全部控制功能。


目錄
摘要2
目錄3
第一章LED臺(tái)燈功能描述及總體方案4
11功能描述4
12系統(tǒng)組成及工作過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) 能檢測桌前是否有人并自動(dòng)開啟/關(guān)閉;
5) 可自動(dòng)\手動(dòng)調(diào)節(jié)燈光亮度;

1.2 系統(tǒng)組成及工作過程
六大模塊以 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)電路,電源通過排阻向
P0 口供電,使其能夠驅(qū)動(dòng)與 P0 口相連的元件。
2.2 按鍵模塊電路設(shè)計(jì)

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

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



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


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

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

3.2 按鍵模塊程序設(shè)計(jì)
按鍵用來調(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 到送高電平即可,再通過手動(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),檢測有人與否,若有人,傳感器發(fā)給單片機(jī)一個(gè)低電平,單片機(jī)同時(shí)判斷燈開關(guān)是否打開,使得單片機(jī)P3.6口為高電平,控制臺(tái)燈電路上電;若人離開桌前,則P3.4為高電平,臺(tái)燈斷電。這就實(shí)現(xiàn)了檢測屋內(nèi)有人與否并自動(dòng)開啟或關(guān)閉的智能節(jié)能的臺(tái)燈。

4 總結(jié)

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

以上的程序見附錄


實(shí)物圖
仿真及實(shí)物演示視頻見設(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;                //開啟定時(shí)器T0中斷允許
  123.     EA=1;                 //開啟中斷總控制

  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


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

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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