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 系統程序 - #include" STC12c5a.h" //stc頭文件
- #include"intrins.h" //包含_nop_空操作的定義
- typedef unsigned char uchar;
- typedef unsigned int uint;
- sbit RW=P2^1;//寫入時一直為低電平,讀出時為高。
- sbit RS=P2^0; //指令數據選擇端
- sbit LCDEN=P2^2;//使能端
- sbit key1=P3^0;
- sbit key2=P3^1;
- sbit key3=P3^2;
- sbit key4=P3^3;
- uchar j=0;
- void AD_init();//AD初始化
- //函數聲明
- void delay(uint a);
- uint AD_work(uchar channel);
- uint AD_get(uchar channel);
- uchar disbuf[]=" illumin: . ";
- uchar PWM[]={0xec,0xe7,0xe0,0xda,0xd3,0xcd,0xc0,0xa6,0x9a,0x80,0x33,0x00} ; // 92.5%-0%
- void pwm_set(unsigned char a);
- void pwm_init()
- {
- CCON=0; //PCA初始化
- CH=0; //PCA 高8位
- CL=0; //PCA 低8位
- CMOD=0x00; //f=sysclk/256/12
- CCAPM0=0x42; //p1.3
- PCA_PWM0=0x00;
- CR=1; //啟動PCA計數器
- }
- void pwm_set(unsigned char a) //占空比設置
- {
- CCAP0H=CCAP0L=a;
- }
- void write_com(uchar com )
- {
- RS=0;
- RW=0;
- LCDEN=0;
- P0=com ;
- delay(5);
- LCDEN=1;
- delay(5);
- LCDEN=0;
- }
- void write_dat(uchar date)
- {
- RW=0;
- RS=1;
- LCDEN=0;
- P0=date;
- delay(5);
- LCDEN=1;
- delay(5);
- LCDEN=0;
- }
- //液晶初始化
- void LCDinit()
- {
- write_com(0x0c);
- write_com(0x06);
- write_com(0x01);
- write_com(0x38);
- }
- void display(unsigned int z)
- {
- uchar i;
- disbuf[9]=z%1000/100+0x30;
- disbuf[11]=z%100/10+0x30;
- disbuf[12]=z%10+0x30;
- for(i=0;i<13;i++)
- write_dat(disbuf[i]);
- }
- void main()
- {
- AD_get(1);
- AD_init(); //A/D轉換初始化
- LCDinit(); //液晶初始化
- pwm_init();//照度檢測
- pwm_set(0xda);
- delay(200);
- while(1)
- {
- write_com(0x80);
- display(AD_work(1));
- if(key3==0)
- {
- delay(5);
- if(key3==0) //自動模式
- {
- while(key4==1)
- {
- write_com(0x80);
- display(AD_work(1));
- if(AD_work(1)>=900)
- pwm_set(0xEC);
- if((850<=AD_work(1))&&(AD_work(1)<900))
- pwm_set(0xE7);
- if((750<=AD_work(1))&&(AD_work(1)<850))
- pwm_set(0xe0);
- if((700<=AD_work(1))&&(AD_work(1)<750))
- pwm_set(0xda);
- if((600<=AD_work(1))&&(AD_work(1)<700))
- pwm_set(0xd3);
- if((500<=AD_work(1))&&(AD_work(1)<600))
- pwm_set(0xCD);
- if((400<=AD_work(1))&&(AD_work(1)<500))
- pwm_set(0xC0);
- if((300<=AD_work(1))&&(AD_work(1)<400))
- pwm_set(0xA6);
- if((200<=AD_work(1))&&(AD_work(1)<300))
- pwm_set(0x9A);
- if((150<=AD_work(1))&&(AD_work(1)<200))
- pwm_set(0x80);
- if((100<=AD_work(1))&&(AD_work(1)<150))
- pwm_set(0x33);
- if(AD_work(1)<100 )
- pwm_set(0x00);
- }
- }
- }
- if(key4==0) // 手動模式
- {
- delay(5);
- if(key4==0)
- {
- while(key3==1)
- {
- write_com(0x80);
- display(AD_work(1));
- if(key1==0)
- {
- delay(5);
- if(key1==0)
- {
- if(j==11)
- j=0;
- pwm_set((PWM[j++]));
- }
- }
- if(key2==0)
- {
- delay(5);
- if(key2==0)
- {
- if(j==0)
- j=11;
- pwm_set((PWM[j--]));
- }
- }
- }
- }
- }
- }
- }
- uint AD_get(uchar channel)
- {
- ADC_CONTR=0x88|channel; //開啟AD轉換1000 1000 即POWER SPEED1 SPEED0 ADC_FLAG ADC_START CHS2 CHS1 CHS0
- _nop_(); _nop_(); _nop_(); _nop_();//要經過4個CPU時鐘的延時,其值才能夠保證被設置進ADC_CONTR 寄存器
- while(!(ADC_CONTR&0x10)); //等待轉換完成
- ADC_CONTR&=0xe7; //關閉AD轉換,ADC_FLAG位由軟件清0
- return(ADC_RES*4+ADC_RESL); //返回AD轉換完成的10位數據(16進制)
- }
- /*unsigned char GETADCResult()//AD轉換
- {
- unsigned char AD;
- ADC_CONTR=ADC_POWER|ADC_SPEEDHH|ADC_START;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- while(!(ADC_CONTR&ADC_FLAG));
- ADC_CONTR&=~ADC_FLAG;//關閉AD
- Vo=ADC_RES*5*10/256 ;
- return Vo;
- }
- uint AD_work(uchar channel)
- {
- float AD_val; //定義處理后的數值AD_val為浮點數
- uchar i;
- uint AD_V;
- for(i=0;i<100;i++)
- AD_val+=AD_get(channel); //轉換100次求平均值(提高精度)
- AD_val/=100;
- AD_V=(uint)AD_val;
- return AD_V;
- }
- void delay(uint a) //延時約1ms
- {
- uint i;
- while (--a!=0)
- for(i=600;i>0;i--); //1T單片機i=600,若是12T單片機i=125
- }
- void AD_init()
- {
- P1ASF=0x02; //P1.1 作為模擬功能AD使用
- ADC_RES=0; //清零轉換結果寄存器高8位
- ADC_RESL=0; //清零轉換結果寄存器低2位
- ADC_CONTR=0x80;//開啟AD電源
- delay(2); //等待1ms,讓AD電源穩定
- ES=1;
- EA=1;
- }
復制代碼
第5章 系統仿真及調試 5.1 軟件調試軟件程序設計對單片機的I/O接口的控制,智能光控臺燈主要通過光控電路對光的感應以達到輸出端口的控制,在黑暗時光控部分輸出高電平,通過單片機內部程序的控制以光控輸出高電平為準,給輸出端口定義低電平,臺燈是以低電平有效,當單片機輸出端達到低電平時臺燈亮。 5.2 系統仿真系統的硬件及軟件都已經調試完成,然后利用protues進行系統仿真。在仿真中,利用光敏電阻模擬天黑天亮,用滑動變阻器來調整光亮的強度。 仿真圖如圖5-1所示。  圖5-1 光照強度強仿真圖 然后,調整光敏電阻阻值,使之達到天黑的效果。此時,單片機控制臺燈亮,仿真效果圖如圖5-2所示。 圖5-2 光照強度弱仿真圖 
完整的Word格式文檔51黑下載地址:
自動感應環境光的調光控制器.docx
(202.95 KB, 下載次數: 75)
2019-6-12 14:57 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|