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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機自動感應環境光的調光控制器程序+電路設計

[復制鏈接]
跳轉到指定樓層
樓主
ID:559365 發表于 2019-6-12 14:59 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
1)設計一個環境光亮度檢測電路,并根據環境亮度進行臺燈光照強度的自動調節;
2)采用多只LED指示亮度等級,環境亮度達到最高時,自動關閉;
3)拓展部分:具有LED數碼顯示亮度等級功能;
4)安裝、調試電路,記錄調零、測試的數據,進行測試、分析。

2.1 設計的總體方案
無論LED是經由降壓、升壓、降壓/升壓或線性穩壓器驅動,連接每一個驅動電路最常見的線程就是須要控制光的輸出。。目前,針對亮度控制方面,主要的兩種解決方案為線性調節LED的電流(模擬調光)或在肉眼無法察覺的高頻下,讓驅動電流從0到目標電流值之間來回切換(數字調光)。利用脈沖寬度調變(PWM)來設定循環和工作周期可能是實現數字調光的最簡單的方法。
PWM方法的基本思想是利用單片機具有的PWM端口,在不改變PWM方波周期的前提下,通過軟件的方法調整單片機的PWM控制寄存器來調整PWM的占空比,從而控制充電電流。本方法把設定的充電電流與實際讀取到的充電電流進行比較,若實際電流偏小則向增加充電電流的方向調整PWM的占空比,LED燈光度變亮;若實際電流偏大則向減小充電電流的方向調整PWM的占空比,LED燈光度變暗。本文介紹了以STC12C5A60S2為控制核心,通過光敏電阻感應光度,并利用PWM調光技術對LED進行光度的自動調節。
2.2 設計的總體構思及框圖
基于STC單片機的PWM調光是以STC12C5A60S2作為主控芯片,設置了手動控制和自動控制。在手動控制時,分為三檔,輸出不同的PWM占空比對LED的電流進行控制,從而實現了對光度的手動調節。在自動控制時,通過STC12C5A60S2內部模擬-數字不斷檢驗光敏電阻的電壓來間接測量感應光度,將電壓和預設的閾值進行對比,調整PWM的占空比對LED的電流進行控制,從而實現了對光度的自動調節。如圖2-1所示為設計的總體框圖。

圖2-1 總體框圖

第3章 系統硬件電路設計

3.1 STC12C5A60S2單片機簡介
STC12C5A60S2是STC生產的單時鐘/機器周期(1T)的單片機,是高速、低功耗、超強抗干擾的新一代8051單片機,指令代碼完全兼容傳統8051,但速度快8-12倍。內部集成MAX810專用復位電路,2路PWM,8路高速10位A/D轉換,針對電機控制,強干擾場合。

    利用STC12C5A60S2的IO口P1.1接收光敏電阻采集的當前光照測檢測輸出數據。IO口P1.3產生產生相應的PWM波,給高亮度LED,從而有不同的光照。IO口P0作為LCD液晶顯示器的數據/指令輸入端口。

STC12C5A60S2單片機的時鐘電路采用的是內部的時鐘電路,利用單片機內部的振蕩電路,并在XLAT1和XLAT2兩引腳間外接石英晶體和電容構成的并聯諧振電路,使內部振蕩器產生自激振蕩。石英晶體Y1頻率是12.0M,C1和C2是30pf。STC12C5A60S2單片機最小系統線路圖如圖3-1所示。

      

  圖3-1  STC12C5A60S2單片機最小系統線路圖

3.2 A/D轉換電路
A/D轉換是用來通過一定的電路將模擬量轉變為數字量。模擬量可以是電壓、電流等電信號,也可以是壓力、溫度、濕度、位移、聲音等非電信號。但在A/D轉換前,輸入到A/D轉換器的輸入信號必須經各種傳感器把各種物理量轉換成電壓信號。

將模擬量或連續變化的量進行量化(離散化),轉換為相應的數字量的電路。 A/D變換包含三個部分:抽樣、量化和編碼。一般情況下,量化和編碼是同時完成的。 抽樣是將模擬信號在時間上離散化的過程; 量化是將模擬信號在幅度上離散化的過程; 編碼是指將每個量化后的樣值用一定的二進制代碼來表示。

采集光照強度運用光敏電阻和電位器來構成信號采集電路。AD轉換電路有STC12內部10位AD組成。STC125A60S2內部AD基準電壓5V,輸入電壓范圍為0~5V,輸出數字量最大值為1024。如圖3-2所示為信號采集電路。

圖3-2 信號采集電路
3.3 LED驅動
脈寬調制(PWM)是利用微處理器的數字輸出來對模擬電路進行控制的一種非常有效的技術,廣泛應用在從測量、通信到功率控制與變換及LED照明等許多領域中。通過以數字方式控制模擬電路,可以大幅度降低系統的成本和功耗。LED器件對驅動電源的要求近乎于苛刻,LED不像普通的白熾燈泡,可以直接連接220V的交流市電。LED是2~3伏的低電壓驅動,必須要設計復雜的變換電路,不同用途的LED燈,要配備不同的電源適配器。
電流控制LED的亮度,通過控制電流調節LED燈的亮度。利用公式i*t/T可知,利用調整PWM不同的占空比t/T就可以控制電流的大小。電流由三極管9013提供驅動,PWM由P1.3輸出,低電平有效。如圖3-3所示為PWM電路。

         

圖3-3 PWM電路

3.4 LCD顯示電路
1602采用標準的16腳接口,本設計當前光照采用的是LCD1602顯示檢測信息。所以單片機需要給LCD分配3位個控制信號IO口和8位數據傳輸IO口,LCD的EN控制端連接P2.2,RS控制端連接P2.0,RW控制端連接P2.1,8位據總線連接PO口。如圖3-4所示為LCD電路。

         

圖3-4 LCD電路

3.5 按鍵切換手動和自動
K3按下為自動控制,K4按下為手動控制,來回按K3、K4切換。當手動按鍵按下時,K1為LED亮度增加,當增加到最大值自動為最小,K2為LED亮度減小,當減少到最小值時自動為最大。
按鍵電路的工作原理:芯片的控制器通過讀取I/O口的信息(可采用逐位讀入,或者整個字節讀入的方法),來判斷哪一個按鍵被按下(或哪幾個按鍵被同時按下),按下按鍵時I/O位的信息為”高電位“。然后根據內部設定的判斷,轉去執行相應的程序。如圖3-5所示為按鍵電路:

            

圖3-5 按鍵電路

3.6 光敏電阻
光敏電阻器是利用半導體的光電導效應制成的一種電阻值隨入射光的強弱而改變的電阻器,又稱為光電導探測器;入射光強,電阻減小,入射光弱,電阻增大。還有另一種入射光弱,電阻減小,入射光強,電阻增大。
光敏電阻器一般用于光的測量、光的控制和光電轉換(將光的變化轉換為電的變化)。常用的光敏電阻器硫化鎘光敏電阻器,它是由半導體材料制成的。光敏電阻器對光的敏感性(即光譜特性)與人眼對可見光(0.4~0.76)μm的響應很接近,只要人眼可感受的光,都會引起它的阻值變化。設計光控電路時,都用白熾燈泡(小電珠)光線或自然光線作控制光源,使設計大為簡化。光敏電路如圖3-6所示:

  

   圖3-6 光敏電路

3.7 電源設計

電源電路是指提供給用電設備電力供應的電源部分的電路設計,使用的電路形式和特點。常見的電源電路有交流電源電路、直流電源電路等。

此次采用 78XX系列固定三端穩壓器穩壓,三端正穩壓電路,能提供多種固定的輸出電壓,應用范圍廣,內含過流,過熱和過載保護電路。降壓穩壓部分由三端穩壓管7805、電解電容組成,將9V轉換成穩定的5V。如圖3-7所示為電源電路。

   

圖3-7 電源電路

第4章 系統軟件設計

4.1 系統流程圖
  此次系統軟件設計利用信號采集電路讀取當前亮度,并通過程序及系統判斷其亮度是否大于設定亮度,是則減小PWM輸出,否則增大PWM輸出,通過程序所得PWM值調節LED亮度,從而控制系統達到調光功能。程序流程圖如圖4-1所示:

圖4-1 程序流程圖

4.2 系統程序

  1. #include" STC12c5a.h" //stc頭文件
  2. #include"intrins.h" //包含_nop_空操作的定義
  3. typedef unsigned char uchar;
  4. typedef unsigned int  uint;
  5. sbit RW=P2^1;//寫入時一直為低電平,讀出時為高。
  6. sbit RS=P2^0; //指令數據選擇端
  7. sbit LCDEN=P2^2;//使能端
  8. sbit key1=P3^0;
  9. sbit key2=P3^1;
  10. sbit key3=P3^2;
  11. sbit key4=P3^3;
  12. uchar j=0;
  13. void AD_init();//AD初始化
  14. //函數聲明
  15. void delay(uint a);
  16. uint AD_work(uchar channel);
  17. uint  AD_get(uchar channel);
  18. uchar disbuf[]=" illumin: .    ";
  19. uchar PWM[]={0xec,0xe7,0xe0,0xda,0xd3,0xcd,0xc0,0xa6,0x9a,0x80,0x33,0x00} ;              //                92.5%-0%
  20. void pwm_set(unsigned char a);
  21. void pwm_init()
  22. {
  23. CCON=0; //PCA初始化
  24. CH=0;                //PCA              高8位
  25. CL=0;                //PCA              低8位
  26. CMOD=0x00;  //f=sysclk/256/12
  27. CCAPM0=0x42;              //p1.3
  28. PCA_PWM0=0x00;
  29. CR=1;  //啟動PCA計數器
  30. }
  31. void pwm_set(unsigned char a)              //占空比設置
  32. {
  33. CCAP0H=CCAP0L=a;
  34. }
  35. void write_com(uchar com )
  36. {
  37. RS=0;
  38. RW=0;
  39. LCDEN=0;
  40. P0=com ;
  41. delay(5);
  42. LCDEN=1;
  43. delay(5);
  44. LCDEN=0;
  45. }
  46. void write_dat(uchar date)
  47. {
  48. RW=0;
  49. RS=1;
  50. LCDEN=0;
  51. P0=date;
  52. delay(5);
  53. LCDEN=1;
  54. delay(5);
  55. LCDEN=0;
  56. }
  57. //液晶初始化
  58. void LCDinit()
  59. {
  60. write_com(0x0c);
  61. write_com(0x06);
  62. write_com(0x01);
  63. write_com(0x38);
  64. }
  65. void  display(unsigned int z)
  66. {
  67. uchar i;
  68. disbuf[9]=z%1000/100+0x30;
  69. disbuf[11]=z%100/10+0x30;
  70. disbuf[12]=z%10+0x30;
  71. for(i=0;i<13;i++)
  72. write_dat(disbuf[i]);
  73. }
  74. void main()
  75. {
  76. AD_get(1);
  77. AD_init(); //A/D轉換初始化
  78. LCDinit(); //液晶初始化
  79. pwm_init();//照度檢測
  80. pwm_set(0xda);
  81. delay(200);
  82. while(1)
  83. {
  84. write_com(0x80);
  85. display(AD_work(1));
  86. if(key3==0)
  87. {
  88. delay(5);
  89. if(key3==0)                                                                                    //自動模式
  90. {
  91. while(key4==1)
  92. {
  93. write_com(0x80);
  94. display(AD_work(1));
  95. if(AD_work(1)>=900)
  96. pwm_set(0xEC);                 
  97. if((850<=AD_work(1))&&(AD_work(1)<900))
  98. pwm_set(0xE7);
  99. if((750<=AD_work(1))&&(AD_work(1)<850))
  100. pwm_set(0xe0);
  101. if((700<=AD_work(1))&&(AD_work(1)<750))
  102. pwm_set(0xda);
  103. if((600<=AD_work(1))&&(AD_work(1)<700))
  104. pwm_set(0xd3);
  105. if((500<=AD_work(1))&&(AD_work(1)<600))
  106. pwm_set(0xCD);
  107. if((400<=AD_work(1))&&(AD_work(1)<500))
  108. pwm_set(0xC0);
  109. if((300<=AD_work(1))&&(AD_work(1)<400))
  110. pwm_set(0xA6);
  111. if((200<=AD_work(1))&&(AD_work(1)<300))
  112. pwm_set(0x9A);
  113. if((150<=AD_work(1))&&(AD_work(1)<200))
  114. pwm_set(0x80);
  115. if((100<=AD_work(1))&&(AD_work(1)<150))
  116. pwm_set(0x33);
  117. if(AD_work(1)<100 )
  118. pwm_set(0x00);
  119. }
  120. }
  121. }
  122. if(key4==0)                                                                                    // 手動模式
  123. {
  124. delay(5);
  125. if(key4==0)
  126. {
  127. while(key3==1)
  128. {
  129. write_com(0x80);
  130. display(AD_work(1));
  131. if(key1==0)
  132. {
  133. delay(5);
  134. if(key1==0)
  135. {
  136. if(j==11)
  137. j=0;
  138. pwm_set((PWM[j++]));
  139. }
  140. }
  141. if(key2==0)
  142. {
  143. delay(5);
  144. if(key2==0)
  145. {
  146. if(j==0)
  147. j=11;
  148. pwm_set((PWM[j--]));
  149. }
  150. }
  151. }
  152. }
  153. }
  154. }
  155. }
  156. uint AD_get(uchar channel)
  157. {
  158. ADC_CONTR=0x88|channel;    //開啟AD轉換1000 1000 即POWER SPEED1 SPEED0 ADC_FLAG   ADC_START CHS2 CHS1 CHS0
  159. _nop_(); _nop_(); _nop_(); _nop_();//要經過4個CPU時鐘的延時,其值才能夠保證被設置進ADC_CONTR 寄存器
  160. while(!(ADC_CONTR&0x10));    //等待轉換完成
  161. ADC_CONTR&=0xe7;      //關閉AD轉換,ADC_FLAG位由軟件清0
  162. return(ADC_RES*4+ADC_RESL);   //返回AD轉換完成的10位數據(16進制)
  163. }
  164. /*unsigned char GETADCResult()//AD轉換
  165. {
  166. unsigned char AD;
  167. ADC_CONTR=ADC_POWER|ADC_SPEEDHH|ADC_START;
  168. _nop_();
  169. _nop_();
  170. _nop_();
  171. _nop_();
  172. while(!(ADC_CONTR&ADC_FLAG));
  173. ADC_CONTR&=~ADC_FLAG;//關閉AD
  174. Vo=ADC_RES*5*10/256              ;
  175. return Vo;
  176. }
  177. uint AD_work(uchar channel)
  178. {
  179. float AD_val;     //定義處理后的數值AD_val為浮點數
  180. uchar i;
  181. uint AD_V;
  182. for(i=0;i<100;i++)
  183. AD_val+=AD_get(channel); //轉換100次求平均值(提高精度)
  184. AD_val/=100;
  185. AD_V=(uint)AD_val;
  186. return AD_V;
  187. }
  188. void delay(uint a) //延時約1ms
  189. {
  190. uint i;
  191. while (--a!=0)
  192. for(i=600;i>0;i--);   //1T單片機i=600,若是12T單片機i=125
  193. }
  194. void AD_init()
  195. {
  196. P1ASF=0x02; //P1.1 作為模擬功能AD使用                                                                                                
  197. ADC_RES=0;   //清零轉換結果寄存器高8位
  198. ADC_RESL=0; //清零轉換結果寄存器低2位
  199. ADC_CONTR=0x80;//開啟AD電源
  200. delay(2);   //等待1ms,讓AD電源穩定
  201. ES=1;
  202. EA=1;
  203. }
復制代碼

第5章 系統仿真及調試
5.1 軟件調試
軟件程序設計對單片機的I/O接口的控制,智能光控臺燈主要通過光控電路對光的感應以達到輸出端口的控制,在黑暗時光控部分輸出高電平,通過單片機內部程序的控制以光控輸出高電平為準,給輸出端口定義低電平,臺燈是以低電平有效,當單片機輸出端達到低電平時臺燈亮。
5.2 系統仿真
系統的硬件及軟件都已經調試完成,然后利用protues進行系統仿真。在仿真中,利用光敏電阻模擬天黑天亮,用滑動變阻器來調整光亮的強度。
仿真圖如圖5-1所示。

   

圖5-1 光照強度強仿真圖

然后,調整光敏電阻阻值,使之達到天黑的效果。此時,單片機控制臺燈亮,仿真效果圖如圖5-2所示。

圖5-2 光照強度弱仿真圖


完整的Word格式文檔51黑下載地址:

自動感應環境光的調光控制器.docx (202.95 KB, 下載次數: 75)


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:585365 發表于 2019-9-16 20:15 | 只看該作者
謝謝樓主的分享
回復

使用道具 舉報

板凳
ID:713781 發表于 2020-3-30 15:24 | 只看該作者
求樓主程序頭文件
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲天堂一区 | 国产精品明星裸体写真集 | 久久久久9999 | 欧美一区免费 | 在线视频 亚洲 | av免费在线播放 | 二区亚洲| 夜夜骑综合| 国产精品成人在线观看 | 免费视频一区二区三区在线观看 | 欧美天堂 | 国产中文| 五月激情婷婷网 | 一区二区三区视频在线免费观看 | 中文字幕亚洲区一区二 | 亚洲精品视频一区二区三区 | 999久久久国产精品 欧美成人h版在线观看 | 久久精品一 | 毛片99 | 国产精品久久午夜夜伦鲁鲁 | 在线视频成人 | 久久中文免费视频 | 中国av在线免费观看 | 国产精品大片 | 精品国产乱码久久久久久88av | 午夜电影福利 | 国产精品日韩在线观看 | 精品国产乱码久久久久久影片 | 九色网址| 日韩三级免费观看 | 国产精品美女久久久免费 | 一区二区三区免费网站 | 91久久国产综合久久 | 久久精片| 国产清纯白嫩初高生在线播放视频 | 黄色免费在线观看网站 | 国产精品国产成人国产三级 | 九九九久久国产免费 | 久久久久国产一区二区三区 | 久久久精品影院 | 国产精品久久久久久福利一牛影视 |