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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3901|回復: 0
打印 上一主題 下一主題
收起左側

健康節能臺燈的設計電子實踐論文 附單片機源程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:290266 發表于 2018-4-4 17:41 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
機械工程學院
小學期
電子實踐論文
參賽課題:健康節能臺燈

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


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

1.1 功能描述
根據主要功能要求,該設計利用 51 單片機實現了電子時鐘、溫度的顯示以
及整點報時等功能。具體可分為一下幾種:
1) 顯示當前的日期及時間,24 時制的時、分、秒;
2) 可調節時間;
3) 整點報時并響鈴。
4) 能檢測桌前是否有人并自動開啟/關閉;
5) 可自動\手動調節燈光亮度;

1.2 系統組成及工作過程
六大模塊以 AT89C52單片機為控制核心,實現了該智能臺燈的各項要求,外接一個5V 的直流電源,為整個系統供電。

2 硬件設計
2.1 單片機控制模塊設計
硬件電路如圖 2            




圖 2 單片機控制模塊電路(最小系統)

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

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

2.3 臺燈模塊電路設計



臺燈模塊電路如圖 4,


3.1 主程序的設計
主程序流程圖

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

3.2 按鍵模塊程序設計
按鍵用來調整時間和日期,各鍵功能在介紹硬件部分已描述。
因為有年月日,時分秒幾個參數要調,所以設置這幾個參數的計數。當按模式
鍵時,單片機進行相應的操作。

3.3 臺燈模塊程序設計
該模塊只需給 P3.6 到送高電平即可,再通過手動旋鈕\環境光強調整燈光亮度。

3.4 時鐘模塊程序設計
分別出寫時間、日期的函數,再寫出時間、日期的顯示函數。設計時、分、
秒,年、月、日幾個變量分別表示時分秒,年月日。

3.5 報時模塊程序設計
對蜂鳴器,在其所接的 I/O 口P3.3寫 1 即可實現它的蜂鳴,當分鐘數增加到60時響鈴,寫程序時給它加了個1s延時,實現整點報時。


3.6 溫度模塊程序設計
設計初始化函數,設計讀 DS18B20 數據和對 DS118B20 寫數據的函數,再寫出
從 DS18B20 讀溫度并轉換為十進制的函數,最后逐位顯示溫度的函數。

3.7 紅外傳感器模塊程序設計
編寫一個讀端口P3.4的函數,即FC-51模塊OUT端口狀態,檢測有人與否,若有人,傳感器發給單片機一個低電平,單片機同時判斷燈開關是否打開,使得單片機P3.6口為高電平,控制臺燈電路上電;若人離開桌前,則P3.4為高電平,臺燈斷電。這就實現了檢測屋內有人與否并自動開啟或關閉的智能節能的臺燈。

4 總結

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

以上的程序見附錄


實物圖
仿真及實物演示視頻見設計文件

系統連接圖


附錄

單片機源程序如下:
  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. //讀一個字節
  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. //寫一個字節
  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;            //設置模式為定時器T0的模式2 (8位自動重裝計數初值的計數值)      
  119.     TH0=0x06;             //設置計數器初值,靠TH0存儲重裝的計數值X0=256-250=6
  120.     TL0=0x06;
  121.     TR0=1;                //啟動T0
  122.     ET0=1;                //開啟定時器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)//定時器的定時計數,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. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

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


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

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表