一直從事于LED驅動電源及其他中小功率開關電源開發工作,現在算算也有五年多了,如果繼續這樣下去,再過幾年,我頂多算個老手,但成不了電源專才,所以我覺得有必要嘗試一下單片機的學習,讓自己全面一點。
自定義項目主題:
INT中斷檢測交流過零信號的上升或下降沿,利用定時器0中斷延時控制交流相角,利用內部EEPROM記憶斷電后亮度,兼容對白熾燈和LED可調光燈調光。
目的:
鼓勵那些自學單片機很迷惑或曾經想學單片機的同學、朋友們,其實單片機的入門真沒有想象中的那么復雜,如果嘗試用C語言編程的話,會更容易讓你上手,要相信自己!同時這也是自我宣告,我將從之前開關電源的開發初步轉行到智能產品的開發。
對于電子專業的朋友們,說起單片機,可能大家會對8051單片機頗有印象。因為在大學期間,電子專業的教科書,如微機原理、單片機的C語言等等全部都是以8051為藍本來進行宣導授課的。這便導致我,在大學期間錯誤的以為單片機就叫8051,而8051就叫單片機的荒唐謬論,后來才知8051其實是單片機系統的最早的構架,由因特爾公司推出,后被各大半導體公司引用其內核來開發他們自己各種型號的8位單片機,例如Intel MCS-51系列,Atmel 89C51/52,89C2051等等,當然這也許是我在那個時候壓根就沒有認真去學的緣故所導致,現在想想都還覺得有點小慚愧。但我不得不承認的是,當時學校學的東西真的很落伍,其實那個時候單片機在中國已經流行十多年了,單片機的品牌、型號其實早已是遍地開,其中不乏一些流行面很廣的品牌,如microchip PIC,臺灣義隆、AVR、ST、Maxim 等等,下面要介紹的就是以PIC單片機來實現的一個例子。至于為什么選用PIC的單片機,除了它的哈弗總線精簡構架外,最關鍵的原因就是它的受眾面廣泛,而且一些因仿制它可以直接替換的品牌也挺多。所以不會擔心貨源的問題。
在介紹之前,先推薦一下我正在拜讀的三本書,對于像我們這些初學者,我個人覺得是很受用。 三本書是分時段買的,第一本是《51單片機的C語言教程》作者:郭天祥,短短6個月,目前這本書已破舊不堪。由于目前單片機的品牌型號很多,但對應的書籍卻很少,只有51單片機系列的書滿天飛,目前自學入門最好的書籍還是51單片機系列的,個人覺得這是一本極好的入門書籍,仿佛是作者在寫他大學期間的自學傳記,通俗易懂的語言會讓你愛不釋手。我就是從這本書開始對單片機、C語言有了初步的了解和最終的興趣。
第二本書是《PIC單片機C語言》,這是隔了一個半月才買的,因為我的初衷就是想學會PIC單片機,所以這一本書讓我開始對PIC單片機及其內部結構有了初步的認識,剛開始還真有些不太習慣,因為PIC單片機的IO口復用功能很多,而且都有相關的寄存器需要設定,且中斷入口只有一個了,顯得有些緊湊,慢慢的直到現在才完全習慣過來。
第三本書是《單片機C語言程序設計實訓100例》,這是時隔兩個月后再買的,這本的屬于思路開拓篇,由于是基于Proteus仿真的一些例子,雖缺乏實際電路運行的效果,但其中作者寫程序思路可以值得一看。其實對于一個功能的實現,無論難易程度高低與否,例如實現一個流水燈,會有N多種途徑方法來實現它,每個人寫法都會不一樣,但看到的結果都是一樣,那就是燈一個接一個的亮。所以對于我們這些初學者,最好的方法就是不斷吸取別人好的方法,讓自己的思維更加廣泛,用最簡介的程序語言來實現
你所需要的功能。
下面就正式介紹我的自定義項目主題: 先看看我租住處的開發環境,三個字亂、差,簡。到現在我才明白搞技術開發的都是很苦逼的職業,慚愧的是到現在還沒混出個名堂來,情不忍堪,奈何!
這是我要實現的功能演示裸板,說的好聽點是全純手工打造板,說的不好聽就是乞丐板。說出來還不信,就連我的編程器(KIT 3.5)都是PIC單片機最低檔的編程器,而且還不是原裝(原裝型號是 PICKIT 3.0),是淘寶上淘的山寨貨,不過也還能用,至少現在還沒壞。
功能簡介:
1、采用PIC16F690單片機,DIP-20封裝,插件封裝易拆卸,方便學習用,實際采用貼片封裝即可。
2、斷電后亮度記憶功能,通電后亮度以50ms速度遞增到上次斷電后的亮度。
3、單個按鍵控制白熾燈亮度增加或減少,同樣以50ms速度來增減,最大100 級灰度控制。
單片機實際引腳只用到5個,VCC、VSS、復位、信號采集、信號數據出、按鍵輸入。利用單片機的內部RC振蕩提供時鐘,電路非常簡潔,功能說白了就是調光,準確的名字是:交流后沿切相式調光。相對于可控硅調光器(前沿切向式),優點是:在相位過零處開啟,電流應力很小,無噪音,干擾小,對MOS管基本零損傷開啟,壽命長。然而可控制調光器剛好相反。缺點是:成本要高很多。基本國內很少用,基本流行于歐洲國家。
整個思路簡介:首先將50HZ 220V的交流正弦波轉換成50HZ 5V的直流方波,然后用單片機采集方波信號的上升沿或下降沿,然后開啟MOS管,利用定時器0進行延時關斷,但不能超出交流半周期10mS,最大最小亮度可以程序設定,100%亮度有100級灰度,漸變的過程會比較平滑。利用內部EEPROM實現斷電后亮度記憶功能。通電后,如果沒有按按鍵,亮度會以50ms的速度進行遞增,增加到上次關電后的亮度。利用按鍵長按,同樣以50ms速度來調節你需要的亮度。最大調節時間5秒鐘。
右圖為100%亮度
右圖為50%亮度
下圖為10%亮度
由于家里沒有示波器,所以對波形的抓取就沒有上傳了,再后續還可以實現對無線RF遙控,紅外遙控,或是其他傳感器的對接功能,后續有時間再慢慢玩。 學至今,我依然只是個初學者,至少目前對C指針這一塊還不熟練,如果要想進一步提高,寫大型的、復雜的程序,需要融會貫通才行。現在時間傷不起,年紀也傷不起,如果沒有必要的話,我會放棄繼續深究這個C指針,因為現在如果要完成一個不是很復雜的功能的話,多練習一下,基本都能對付得了。當然我還是會鼓勵那些想學單片機的朋友,如果在單片機方面要有很深的造詣的話,最好還是熟練C指針的用法,當然這得花一點功夫。
雖說我之前一直從事開關電源的開發,但我不得不承認的是模擬電路的掌控一定要比數字電路的掌控要復雜的多,目前我頂多掌握一些皮毛。所以我一直都認為電源開發入門要比單片機入門難許多,所以我還是建議那些想學電子的朋友們,還是先學學單片機吧,入門比較容易,沒準過個幾年你就是單片機的頂級高手,但是模擬電子領域我不敢這樣說。