c语言delay_利用C语言编程单片机,制作可以根据环境光照调整亮度的智能灯
上一節,我們利用C語言編程單片機仿制了達文西的“古怪手電筒”,達成了“在有光的時候就會亮,在沒有光的情況下絕對不會亮!”的目標。
其實在此基礎上,C語言還能做些更好玩的東西。例如,制作一個小燈,這個小燈的亮度能夠隨著環境光線自我調整改變,如下圖:
可以看出,當環境光線較強時,LED 小燈的亮度較暗,用塑料板遮住一部分光,使環境光線較暗時,LED 小燈則變亮了。或者稍作修改,也能實現相反的效果:環境光線越強,LED 小燈越亮,環境光線越弱,LED 小燈越暗。
設計能夠自我調整亮度的 LED 小燈
和上一節一樣,這里計劃仍然使用C語言編程 51 單片機實現能夠自我調整亮度的 LED 小燈,那么,51 單片機就是負責控制 LED 小燈的亮度的大腦。
使用 51 單片機控制 LED 小燈的亮度,可以參考第三節介紹的“呼吸燈”。此外,單片機還需要能夠感知環境光線的“眼睛”,光敏電阻就非常適合做單片機的眼睛,因為光敏電阻的阻值會隨著照射在其上的光照強度改變而改變:
這樣一來,我們可以將光敏電阻串入電路,再利用 51 單片機的 ADC 功能采集電阻兩端的電壓值。
因為光敏電阻的阻值隨著環境光照改變,電阻兩端的電壓值也會隨著環境光照改變,所以單片機就能夠通過ADC模塊采樣值變化,獲取環境光照情況。
讓單片機“看到”環境光線
先來實現單片機的“眼睛”,即單片機的 ADC 模塊。ADC的初始化是簡單的,請看C語言代碼如下:
void adc_init(){ P1ASF = 0x01; ADC_RES = 0; ADC_CONTR = ADC_POWER|ADC_SPEEDLL; delay_about_100ms(2);}P1ASF = 0x01;表示將ADC的通道0打開,也即使用單片機的 P1.0 作為 ADC 輸入口。獲取一次 ADC 采樣值的C語言代碼如下:
// 獲取 10 位 adcWORD get_adc_res(BYTE ch){ WORD res = 0; res = get_adc_h8bit(ch); res <<= 2; res |= ADC_LOW2; return res;}能夠看出,因為 51 單片機是 8 位的單片機,所以若想采集 10 位的 ADC 值,需要兩次組合。
這里的ADC相關代碼比較簡要,詳細介紹可參考第9節文章。使單片機具有控制 LED 小燈發光強度的能力
現在單片機能夠“看到”環境光線強度了,再來看看單片機如何控制 LED 小燈的亮度。在第 3 節介紹“呼吸燈”時提到,可以控制一個周期內LED 小燈的亮滅持續時間長短,來實現控制 LED 小燈的亮度,核心 C 語言代碼如下:
void delay(unsigned int n){ unsigned int x; while(n--){ x = 50; while(x--); }}void twinkle_once(unsigned char darkTime){ P20 = 0; delay(100-darkTime); P20 = 1; delay(darkTime);}這里使用單片機的 P2.0 口控制 LED 小燈的發光周期。“呼吸燈”的C語言程序的設計思路是不斷修改 darkTime 的值,使 LED 小燈亮暗逐漸緩慢變化。如果只是想實現控制 LED 小燈的亮度,可以將 twinkle_once() 函數放入 while 循環,通過修改傳遞給它的參數值來控制 LED 小燈的亮度。
C語言編程單片機,實現能夠自我調整亮度的 LED 小燈
現在單片機既能“看到”環境光線,又能控制 LED 小燈的發光亮度了,現在將二者組合,使單片機能夠根據環境光線的強度,自主改變 LED 小燈的發光強度。請看C語言代碼如下:
void main(){ float vol; int dark_time = 0; adc_init(); while(1){ vol = 5.0*((float)get_adc_res(0))/1024.0; dark_time = (char)(110.0 *(vol/5.0)); if(dark_time>100) dark_time = 100; twinkle_once(dark_time) ; }}以上C語言代碼還是非常簡單的,因為ADC采集的電壓值 vol 介于 0~5V 之間,并且會隨著環境光線的改變而改變。
dark_time 的最大值本應該是 100,但是 LED 小燈的發光強度與 dark_time 并不是線性的關系,這里為了獲得更佳的效果,讓最大值等于 110 了。
現在編譯 C語言程序并燒寫到單片機,會發現我們的設計成功了!當環境光線較強時,LED 小燈的亮度較暗,用塑料板遮住一部分光,使環境光線較暗時,LED 小燈則變亮了。
思考
本節介紹的能夠自主根據環境光線強弱調整自己亮度的 LED 小燈,在某種程度上已經算是比較“智能”的小燈了,加上適當的調整,還能實現超過一定的亮度就關閉小燈,這就很有用了:黑夜里小燈較亮,能夠照明環境,當天慢慢變亮時,燈就無需太亮,因為人們還可以借助自然光看清周圍環境。當天大亮時,就不再需要小燈發光了,因此小燈就被自主關閉了。
通過這一節也能看出,傳感器(如本節的光敏電阻)真的是“智能機器”的基礎,離開傳感器,中央處理器就很難感知環境參數的變化,也就很難做出自我調整了。
歡迎在評論區一起討論,質疑。文章都是手打原創,每天最淺顯的介紹C語言、linux等嵌入式開發,喜歡我的文章就關注一波吧,可以看到最新更新和之前的文章哦。
總結
以上是生活随笔為你收集整理的c语言delay_利用C语言编程单片机,制作可以根据环境光照调整亮度的智能灯的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言斐波那契数列_视频丨神奇的斐波那契
- 下一篇: arcgis设置nodata值_新版白话