分享帖終于和大家在51hei論壇見面了,本來想0點發的,不過……嘿嘿,還是開源分享帖哦~~不過實在太冷了,就沒去實驗室錄專門的技術支持教程給大家。完全靠打字了,手生凍瘡,也很辛苦的,大家諒解!
這“下”帖讓大家等了那么久,本人后面發帖也倍感壓力啊,如果這“下”帖不給力的話,對不起觀眾啊。先給大家看看,我共享給大家的資料里,包含哪些東西吧,先看資料給不給力哈。壓縮包包含以下內容:
000754bwhh7fke9obzhw7r.jpg (33.51 KB, 下載次數: 232)
下載附件
2013-8-16 22:50 上傳
先看視頻展示:
大家請結合上帖來看下帖:http://www.zg4o1577.cn/bbs/dpj-20607-1.html
我這個分享帖打算分為以下幾個部分:
一、曬整體原理圖和PCB:
二、整體硬件的介紹
三、整體軟件編程技巧
四、各個模塊介紹
五、關于手工雙面板制作的介紹
六、開源分享的資料
很多都是本人的經驗,有不對地方,請大家指正。
一、曬整體原理圖和PCB:
主控原理圖及PCB:
211411eof9o70ijtzsjojg.jpg (56.88 KB, 下載次數: 238)
下載附件
2013-8-16 22:50 上傳
211416j62vo6bz2a3frpy2.jpg (109.22 KB, 下載次數: 241)
下載附件
2013-8-16 22:50 上傳
TEA5767收音機、TDA2822功放原理圖及PCB:
211416ui94r91x14mmr019.jpg (48.82 KB, 下載次數: 208)
下載附件
2013-8-16 22:50 上傳
211417970vexzv9l099pdd.jpg (78.88 KB, 下載次數: 192)
下載附件
2013-8-16 22:50 上傳
PL2303 RS232轉TTL下載器原理圖及PCB:
211418zqaanxhqa281zajp.jpg (50.39 KB, 下載次數: 200)
下載附件
2013-8-16 22:50 上傳
211419p8ozj7za68sxxaqh.jpg (57.81 KB, 下載次數: 209)
下載附件
2013-8-16 22:50 上傳
對于制作的過程,只保留有以下三個圖片,大家可看下:
211406zzp05gwusqgw9qs3.jpg (51 KB, 下載次數: 215)
下載附件
2013-8-16 22:50 上傳
211409blf7zs77zi3zoyb9.jpg (50.92 KB, 下載次數: 222)
下載附件
2013-8-16 22:50 上傳
211413ai22iaead7yezpae.jpg (46.84 KB, 下載次數: 215)
下載附件
2013-8-16 22:50 上傳
下面是硬件說明圖:
211420jhsiods88ishp8tu.jpg (65.25 KB, 下載次數: 245)
下載附件
2013-8-16 22:50 上傳
211421ewnqhae5w5hqpjp1.jpg (55.06 KB, 下載次數: 224)
下載附件
2013-8-16 22:50 上傳
211422zed9a3if56wj9396.jpg (56.14 KB, 下載次數: 214)
下載附件
2013-8-16 22:50 上傳
硬件介紹在上面的三個圖示已標明,看不清的可下我分享的資料!
二、整體硬件的介紹
1、使用STC12C5A60S2:
(1)內部有AD,實現了電壓表功能,以及以后擴展作頻譜顯示屏;
(2)其工作的最低電壓是3.3V,所以可以用鋰電工作哈(鋰電電壓為3.7V左右);
(3)內有RC振蕩器,所以對時序要求不是很高的場合可以使用。但是由于初始芯片默認是用外部晶振,且STC-ISP下載軟件默認使用外部晶振,一不小心就變成外部晶振,如果不接外部晶振的話,很容易不小心選成外部晶振而無法啟動芯片。所以后面我還是加了外部晶振,我的程序,可以使用外部12M晶振,也可以使用內部RC振蕩器(13M左右)。
(4)該芯片IO口可以拉電流,像AVR單片機一樣,可以設置IO口狀態,使得灌電流和拉電流都可以達到20mA左右,所以可以IO口直接驅動數碼管,但注意加限流電阻,不然很可能燒壞IO口而使芯片無法作用。
(5)有1K的EEPROM,可以掉電存數據,所以可以掉電保存鬧鈴設置的時間,開關標志位等,但嚴格的講,這個根本不是真正的EEPROM,只能說湊合著用吧。而且在使用鋰電供電時,會出現電壓偏壓而無法正常讀取該EEPROM區。
(6)該芯片還有P4口,PWM等等功能,而且RAM和ROM都很大。對于該芯片最小系統的連接及使用等等詳情請參看其數據手冊。
2、顯示電路的設計:
為了方便橫屏和豎屏的顯示,大家看我的硬件原理圖就會發現,我的顯示電路在點陣的處理方面既可行掃描顯示,也可以列掃描顯示。
一般點陣的顯示都是行掃描顯示,特別是只有16行的點陣,很多都會用到兩片3-8譯碼器構成4-16譯碼器或直接用74LC154做4-16譯碼器,這種做法優點是控制簡單,又比較節約IO,寫程序也方便。但這種做法只能固定的用行掃描顯示。
而我的行線用的是595串入并出的芯片,豎屏是595控制行線,單片機P0輸出每行的數據,豎屏掃描原理如下:
211423i82gizxyf000igix.jpg (92.11 KB, 下載次數: 198)
下載附件
2013-8-16 22:50 上傳
橫屏是單片機P0進行每行數據的掃描,而595這時輸出每行的數據,如下:
211424bnd9m95n6q9m6bz7.jpg (63.95 KB, 下載次數: 227)
下載附件
2013-8-16 22:50 上傳
上面所說的行和列,都是相對橫屏和豎屏而言的。具體為什么在橫屏和豎屏要分不同的掃描方式呢?下面的程序講解會提到哈~~
3、PL2303下載器:
其實我以前有串口的下載器,是通過USB轉串口,再用MAX232芯片把串口轉成TTL,感覺那樣非常麻煩,而且很容易出問題。所以這一次我自己手工做了PL2303下載器,這個PL2303芯片也難搞,只有貼片的,毛毛腳的,加上我的板是手工轉印、烙鐵又差,所以焊接還費了不少時間,還好,本人焊貼片的水平不是蓋的,還是焊好了。為了方便STM32芯片的下載還對原始電路做了修改,有RESET、和BOOT0。這個帖子的主角不是下載器,因此后面我會另外開帖給大家分享我做的一些常用單片機的下載器。我最后做好的下載器如下:
211425mbezbzcf6az511ff.jpg (97.81 KB, 下載次數: 206)
下載附件
2013-8-16 22:50 上傳
三、整體軟件編程技巧在這里我只簡單的說說可能在很多單片機教學視頻里不涉及到,而在我這整個工程中用到的編程技巧和注意事項。
1、點陣顯示:
(1)一般點陣,特別我們發燒友做的點陣,基本上都是行掃描顯示的,為什么要行掃描顯示呢?我想還是因為很多點陣都是為了左右滾動的顯示,行掃描編程和硬件實現上都比較方便吧。因此,我的硬件設計也是為了迎合軟件的編程方便,不管橫屏還是豎屏,都是相對的采用行掃描顯示。但是,對于旋轉屏和“搖搖棒”這種顯示是必須要列掃描顯示的,為什么要列掃描還想不通的朋友自己揣摩了。
(2)特別還要注意點陣的消影,很多初學者寫數碼管或點陣掃描程序時會出現“鬼影”,所以消影的這一招也是要必須學會的,最簡單可行的辦法就是每掃描顯示一行或一個數碼管后,關閉一次全部的顯示。同時注意先傳數據碼、后點亮當前行或當前位。具體可參考我程序,我的是沒有任何鬼影的哈。
(3)為了實現滾動顯示,同時滾動顯示的數據能實時更新,必須有一個顯示緩存區,這個顯示緩存區必須是可讀可寫的。點陣顯示指針只是從頭到尾一行行的掃描顯示緩存中的數據,即“讀”的過程,而要實時更新緩存中的數據,還要把相關變量不斷的“寫”到顯示緩存對應的位置。從而需要一個可讀、寫的緩存區,這里定義為數組是方便掃描指針不斷下移讀取,這其實跟電腦中說的顯卡的顯存是一個道理的。而具體滾動顯示的編程技巧,大家可以參看我的程序,里面會有備注的,當然方法不是唯一的。
(4)這個可讀可寫的緩存區,很多人都直接定義為“data”的類型(如果不設置,默認也是這個類型),用這個類型本身沒錯,在寫小程序中還可以用,也不會超RAM空間,但當你定義的全局變量多,而且定義的可讀寫的數組多時,編譯就不過了,會提示你超RAM了,但實際RAM卻沒滿。這是為什么呢?這個要從51單片機硬件原理來講了,平時我們所說的如51單片機RAM是4K,52單片機RAM是8K,實際它們的內部直接尋址區的大小是一樣的,即data區,硬件地址是00H-7FH。而不同的是間接尋址的地址80H及以上不同,所以定義可讀寫數組時最好定義為“idata”,以節省可直接尋址區。而其它變量要不要也定義為"idata"呢?這個一般就不用了,除了數組外,其它變量最好不要定義為“idata”。下面是我定義的“idata”:
21142658v8akg98uhxcg7x.jpg (29.09 KB, 下載次數: 207)
下載附件
2013-8-16 22:50 上傳
(5)如果只是顯示固定字符,可以直接定義為 "code",單片機的內部程序存儲區,即ROM區,只可讀,顯示指針就一直往下讀就可以了。
像我開機歡迎畫面就是這樣寫的:
211427ghp3kbapzpbayb0b.jpg (39.8 KB, 下載次數: 243)
下載附件
2013-8-16 22:50 上傳
總的來說,這里涉及到KEIL C編譯器中定義的幾個字節型的變量,這里簡單總結如下:
data區(默認):單片機能直接訪問的直接尋址RAM區,00H-7FH;
bdata區:可位尋址的片內ram,位于20H-2FH,總共128位;
pdata區:分頁尋址片外ram (MOVX @R0) (256 BYTE/頁);
idata區:單片機間接防問的RAM區,80H-FFH,也有說法可以理解為前128和data的128完全相同,只是因為訪問的方式不同(MOX ACC,@Rx);
code區:單片機的內部程序存儲區,也就是單片機內置的FALSH 對應MOVC @DPTR;
xdata區:單片機外部尋址區,一般指片外的存儲器,0000H-FFFFH。
還有不理解的,可以百度或翻翻單片機原理方面的書籍。
2、關于break,return,goto等函數的使用
(首先聲明一下,我不是電子專業,我的專業沒學過C語言,只開了VB課程,我用的C是自學的,有說不當的請批評指正。┖芏鄦纹瑱C編程者,特別是剛入門的,很少會用到諸如break,return,goto,do…while,continue的函數,更不要說使用結構體和指針。當然我也很少用,在我這個工程中沒用過具體的指針和結構體,為了能讓大家都看得懂,用的都是相對簡單的語句,而且很多都是很啰嗦一個個拆開使用的,其實很多可以合并的。
Break:是只能在循環語句中使用的,程序執行到它后將退出當前循環。
Return:我的程序中很多用到了return,該語句的作用是退出當前所執行的子函數,是可以在任何函數,任何地方使用的。注意和break區別開,一個只是退出循環,而后者是退出整個函數。所以用return我可以實現在任意地方,哪怕是在死循環函數里面,離開現在的功能,轉到另外的一個功能。比如我程序用到的地方:
211429zafz7gf7lpp9ovpf.jpg (37.76 KB, 下載次數: 194)
下載附件
2013-8-16 22:50 上傳
211428thqho17l33o30o0w.jpg (35.53 KB, 下載次數: 205)
下載附件
2013-8-16 22:50 上傳
Goto:我沒有在這個工程用到,這個goto只能在同一個子函數中無條件調轉,可能以后會對大家有用吧。
還有continue等其它這里不再累述,大家自己查資料吧。
(3)關于STC和經典51單片機的延遲
這個我不想多說了,由于STC執行普通指令的速度是一般51單片機的3-12倍(具體參看芯片手冊),因此以前的51單片機延遲函數要修改,大家用STC的參看我的程序就行,我的程序是用12M外部晶振或內部RC振蕩器(大概13M)都是能用的,而且我沒有分頻哦。特別是那個18B20溫度傳感器的延遲,我測試了好久才把它的延遲搞定了~~~
還有更多的硬件和軟件的問題,下面將在各個模塊的介紹中有針對性的介紹。
(4)結構化編程
將復雜的程序分成一個模塊來寫,這是程序員必須要學會的,當然,現在我這里還是比較亂,相信大家會弄得更好。同時,我的程序,很多個子功能已經弄成頭文件,如DS0302、18B20、I2C、STC的各類功能等等,大家只要注意一下不同硬件的延遲函數(主要是I2C和18B20比較講究)就可以直接調用的,以下是我的工程截圖:
2114301gqlmbqsuuhqqg1q.jpg (52.13 KB, 下載次數: 209)
下載附件
2013-8-16 22:50 上傳
四、各個模塊介紹
在這里,為了減少大家的閱讀量,不再累述各個模塊的具體功能,大家可以對著上一帖子來看,下面著重講原理和編程技巧。
1、時鐘功能
211430931e9i9j121i39a0.jpg (50.61 KB, 下載次數: 220)
下載附件
2013-8-16 22:50 上傳
時鐘我用的是DS1302時鐘芯片,用鈕扣電池續電;農歷的計算是通過軟件實現的;溫度是通過DS18B20實現的;語音報時是通過YF-017語音芯片實現的;最后掉電能保存鬧鐘時間和開關標志位是通過STC12C5A60S2內置的EEPROM實現的,紅外遙控這個就不用說了。
(3)遙控器是用通用車載MP3的,很多開發板都送這個:
211431vn1wiz4vid3zzuw1.jpg (35.72 KB, 下載次數: 223)
下載附件
2013-8-16 22:50 上傳
附上各個按鍵的編碼:
機器編碼:0x00
各個按鍵鍵碼值: CH-:0x45 CH:0x46 CH+:0x47 PREV:0x44 NEXT:0x40 PLAY:0x43 VOL-:0x07 VOL+:0x15 EQ:0x09 0:0x16 100+:0x19 200+:0x0d 1:0x0c 2:0x18 3:0x5e 4:0x08 5:0x1c 6:0x5a 7:0x42 8:0x52 9:0x4a
2、俄羅斯方塊功能
223843p29xs9sne88fafsm.jpg (69.96 KB, 下載次數: 246)
下載附件
2013-8-16 22:50 上傳
硬件沒什么好說的,就是前面的點陣、按鍵和遙控器,內核全靠軟件實現的。
這里著重說下這個的編程原理(程序備注中有):
【特別說明:該俄羅斯方塊源程序不是本人的,是網友提供的源碼,然后我根據自己的硬件和需要,在充分理解源程序的基礎上做了大量的修改和BUG優化。在此向源程序提供者致敬!】
圖形方塊編碼機制介紹:
(1)由于俄羅斯方塊圖形的寬度和高度最多只有四位,所以要以4X4為基本單元;
(2)硬件采用18行掃描(16行點陣,兩個數碼管)、8位送顯示信號;
(3)各個圖形的寬度不一致,所以要人為給圖形設定居中位置,若圖形寬度為偶數可直接將其居中,若為奇數則靠左居中;
(4)由于圖形需要旋轉,所以由基本的圖形會衍生出另外3種圖形;
(5)因此每個圖形應該給定4個8位的二進制碼,并放入一個二維數組里;
(6)經典俄羅斯方塊游戲里有19種不同形狀的方塊,包括旋轉得到的;
(7)數組的第一個下標為該圖形的編號。
具體請參看全局定義的頭文件及程序內備注。
3、收音機功能
223844ocbjzsf55npksskz.jpg (53.06 KB, 下載次數: 217)
下載附件
2013-8-16 22:50 上傳
這里的收音機我使用的芯片是TEA5767飛利浦的收音芯片,并使用I2C通訊,實際的效果大家在視頻中也看到幾乎收不到臺。這不是我軟件問題,而是我所處的位置問題,我住的是學校宿舍區,是一樓的,由于鋼筋水泥等等的屏蔽和影響,加上本身硬件上的各類干擾,收不到電臺是否很正常的,我試過拿到室外,還是勉強可以收到臺的。而且我這個TEA5767是多另外一塊開發板上拆下來的,可能也不太行了吧。但程序與芯片的通訊還是通的。為什么我敢這么說,因為給芯片發數據還是有反應的,而且還可以讀出頻率及啟動自動搜臺。
總的來說,這個功能現在看起來只能是“雞肋”,但程序和硬件連接大家還是可以參考的,還有我用的天線是網上賣的專用耳機天線哈。
這里的功放用的是TDA2822構成單聲道功能,效果一般,原理圖和網上的一樣。但由于收音芯片的聲音輸出及單片機的P10相接,并和外面的音源輸入相連,通過外接音源時,音質很差的,大家在視頻中也看到了。加上接YF017語音芯片的喇叭與TDA2822的輸出共用一個喇叭,那問題更大了,因此,這里現在的功能只能算“雞肋”了,后面會再優化吧。
4、“搖搖棒”功能
2238467cd1vrpdlvv3crcr.jpg (48.53 KB, 下載次數: 221)
下載附件
2013-8-16 22:50 上傳
“搖搖棒”主要是靠水銀開關了,這個程序我沒有參考別人的,因為之前我寫過旋轉屏的程序,“搖搖棒”的原理和它幾乎如出一轍。旋轉屏是靠上下的紅外對管控制中斷,從而決定從哪播放的,而“搖搖棒”主要是靠水銀開關來引發中斷,控制要從一個方向開始播放,沒有水銀開關也可以顯示,但由于是來回甩動的,沒有水銀開關控制方向會出現“鏡像字”。特別要注意水銀開關的安裝方向,如果你軟件圖形的取模和顯示是從左到右掃描一列一列顯示的,那么你的水銀開關應該面向顯示面且相對水平面呈銳角45度安裝(引腳朝下);反之,如果你軟件圖形的取模和顯示是從右到左掃描一列一列顯示的,那么你的水銀開關應該面向顯示面且相對水平面呈鈍角135度安裝(引腳朝下)。大家看我的是從左到右掃描顯示的,所以,相對顯示正面是呈銳角45度安裝的。我編程顯示的時候是只選擇8列中的一列進行顯示,比如我用了P03控制的那一列來顯示,然后595傳每列的數據,具體程序參看我提供的程序。
5、簡單電壓表功能
223847hv6opes06one6oas.jpg (39.19 KB, 下載次數: 209)
下載附件
2013-8-16 22:50 上傳
這里的電壓表主要是靠STC12C5A60S2內部的AD功能實現的,通過讀芯片手冊可以知道,該AD功能的參考電壓是芯片自身的工作電壓。然后問題就來了,我的整個設計是既可用外部5V供電,也可用鋰電供電,兩個差別很大的參考電壓,我是什么處理的呢?其實,實際的話,雖然說芯片本身不提供輸入外部基準電壓的功能,但是如果采用同時采樣兩路AD值,其中一路的電壓值(作為外接基準電壓)是已知的,那么通過兩個方程,兩個未知數,是不是可以輕易的求出準確的AD值了呢?所謂兩個方程如下:
如我在P17引腳輸入已知的1.25V作為參考電壓,而我要測P10的實際電壓,然后我假設芯片電源電壓是5V,那么我AD轉換后得到P17的電壓值為:
AD_C0=(uint)((get_adc(0x07)*5)/1.024); //“5”為假設的芯片電壓。
待測P10的AD電壓值為
AD_C1_tmp=(uint)((get_adc(0x00)*5)/1.024); //“5”為假設的
最后整合這兩個方程,就可以消掉“5”即芯片的實際電壓可以不用管,最后處理P10實際電壓值是:
AD_C1=(uint)( AD_C1_tmp *12.50/AD_C0);
這是一個方法了哈,還不明白的,自己慢慢消化了。
而我在這個東西用的卻不是以上方法,因為當初設計的硬件原因,最后我采用最簡單的辦法,方法就是在主開關那里動手腳。注意看,我用的是按鍵自鎖型的雙刀雙擲開關,其中的一“刀”我用到了電源的正極上,通過對正極的切換實現內部鋰電和外接電源的切換;而另外的一“刀”中我當作接負極的開關接到單片機的P45 IO口,因此,在切換電源的同時,也切換了P45 IO口的電平變化。因此,在精度要求很高的場合,我只要檢測P45 IO口的電平,就有選擇的在程序里改變了參考電壓,在程序中我是這樣處理的:
ad_tmp=get_adc(0x01); //獲得P11引腳上的AD值
if(!P45) ad_val=(uint)((ad_tmp*3.85)/1.024); ///AD值處理,3.85為使用鋰電時MCU的電壓,最終ad_val單位為mV
else ad_val=(uint)((ad_tmp*4.95)/1.024); ///AD值處理,4.95為MCU現在的電壓,最終ad_val單位為mV。
終于介紹完了各個模塊,很多的技巧也都告訴大家了~~
也許還有一些細節和我DIY的地方沒跟大家嘮,因為有些大家可以沒必要效仿或我覺得大家應該都了解了,還有什么疑問,大家再跟帖問吧。哦,還有,剛才提到了鋰電和外接5V的切換開關,有人可能會問,我這個東西可不可以接5V時,一邊用一邊充電,F在是不可以的,因為我沒做或買5V轉鋰電充電的板子,我的鋰電充電是另外引出,用萬能充充電的,
五、關于手工雙面板制作的介紹(另開帖)
六、開源分享的資料
這里的壓縮包包含原理圖(當然,只是畫有PCB的部分,還有一些我后面自己DIY或修改的地方就沒有咯,但上面都有介紹了~)、PCB圖、清楚的圖片講解圖、總工程程序源碼及部分模塊程序源碼等等。
對于本帖未詳盡事項,如“五、關于手工雙面板制作的介紹”,請移步到下一帖(鏈接:),因為這一帖的內容夠多了,我打字排版辛苦不要緊,重要的還是讓大家看得明白。以及帖子中提到的下載器介紹和PCB打印,打印機設置及注意問題……還有,等等,我之前說過還有語音計算器和頻譜展示及分享這兩個的程序,由于篇幅和時間問題,還是全部留到后面另開帖吧,大家請期待!感謝你的關注和支持!新年快樂!
“多功能智能玩具”共享資料.rar
(3.43 MB, 下載次數: 286)
2013-8-16 22:45 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|