|
|
MCU 使用說明書
注:說明書只是提供部分參考實(shí)驗(yàn),供使用用戶熟悉,了解開發(fā)板和各模
塊電路。程序和開發(fā)板是配套的,可以很方便在此開發(fā)板上運(yùn)行。
UnRegistered
序言 .................................................................................................................................................. 4
第一章 :燒錄第一個(gè)程序 ............................................................................................................ 6
1.1 STC89 單片機(jī)下載(燒寫程序)方法 ............................................................................ 6
1.2 安裝 keil C51 軟件編寫第一個(gè)程序 ............................................................................ 10
第二章 LED 燈閃爍 ...................................................................................................................... 38
2.1 硬件設(shè)計(jì) .......................................................................................................................... 39
2.2 軟件設(shè)計(jì) .......................................................................................................................... 39
2.3 仿真與下載 ...................................................................................................................... 40
第三章LED 跑馬燈 ....................................................................................................................... 42
3.1 硬件設(shè)計(jì) .......................................................................................................................... 43
3.2 軟件設(shè)計(jì) .......................................................................................................................... 43
3.3 下載驗(yàn)證 .......................................................................................................................... 44
第四章 LED 漸亮漸滅 .................................................................................................................. 44
4.1 硬件設(shè)計(jì) .......................................................................................................................... 45
4.2 軟件設(shè)計(jì) .......................................................................................................................... 46
4.3 下載驗(yàn)證 .......................................................................................................................... 47
第五章 蜂鳴器 .............................................................................................................................. 47
5.1 蜂鳴器簡介 ..................................................................................................................... 48
5.2 硬件設(shè)計(jì) ......................................................................................................................... 48
5.3 軟件設(shè)計(jì) ......................................................................................................................... 49
5.4 下載驗(yàn)證 ......................................................................................................................... 50
第六章 數(shù)碼管動(dòng)態(tài)顯示 .............................................................................................................. 50
6.1 數(shù)碼管簡介 ..................................................................................................................... 51
6.2 硬件設(shè)計(jì) ......................................................................................................................... 52
6.3 軟件設(shè)計(jì) ......................................................................................................................... 53
} 6.4 下載驗(yàn)證 ...................................................................................................................... 54
第七章 獨(dú)立鍵盤 .......................................................................................................................... 55
7.1 硬件設(shè)計(jì) ......................................................................................................................... 55
7.2 軟件設(shè)計(jì) ......................................................................................................................... 55
7.3 下載驗(yàn)證 ......................................................................................................................... 57
第八章 定時(shí)中斷 .......................................................................................................................... 58
8.1 定時(shí)器簡介 ..................................................................................................................... 59
8.2 硬件設(shè)計(jì) ......................................................................................................................... 62
8.3 軟件設(shè)計(jì) ......................................................................................................................... 62
8.4 下載驗(yàn)證 ......................................................................................................................... 63
第九章 定時(shí)中斷顯示時(shí)鐘 .......................................................................................................... 63
第十章 外部中斷 .......................................................................................................................... 64
10.1 外部中斷簡介 ............................................................................................................... 65
10.2 硬件設(shè)計(jì) ....................................................................................................................... 66
10.3 軟件設(shè)計(jì) ....................................................................................................................... 66
10.4 下載驗(yàn)證 ....................................................................................................................... 67
第十一章 字符點(diǎn)陣液晶屏1602 ................................................................................................. 67
11.1 1602 簡介 ....................................................................................................................... 68
UnRegistered
11.2 硬件設(shè)計(jì) ....................................................................................................................... 70
11.3 軟件設(shè)計(jì) ....................................................................................................................... 71
11.4 下載驗(yàn)證 ....................................................................................................................... 72
第十二章 串口實(shí)驗(yàn) ...................................................................................................................... 73
12.1 UART 簡介 ..................................................................................................................... 74
12.2 硬件設(shè)計(jì) ....................................................................................................................... 74
12.3 軟件設(shè)計(jì) ....................................................................................................................... 74
12.4 下載驗(yàn)證 ....................................................................................................................... 75
第十三章 溫度測(cè)量 .................................................................................................................... 78
12.1 DS18B20 簡介 ................................................................................................................ 79
13.2 硬件設(shè)計(jì) ....................................................................................................................... 80
13.3 軟件設(shè)計(jì) ....................................................................................................................... 80
13.4 下載驗(yàn)證 ....................................................................................................................... 83
第一十四章 紅外遙控實(shí)驗(yàn) ........................................................................................................ 84
13.1 紅外接收頭簡介 ........................................................................................................... 85
14.2 硬件設(shè)計(jì) ....................................................................................................................... 85
14.3 軟件設(shè)計(jì) ....................................................................................................................... 85
14.4 下載驗(yàn)證 ....................................................................................................................... 88
第十五章 超聲波測(cè)距模塊 .......................................................................................................... 89
15.1 超聲波模塊工作原理 ................................................................................................... 90
15.2 硬件設(shè)計(jì) ....................................................................................................................... 90
15.3 軟件設(shè)計(jì) ....................................................................................................................... 90
15.4 下載驗(yàn)證 ....................................................................................................................... 93
UnRegistered
序言
開發(fā)板產(chǎn)品簡介:
本產(chǎn)品作為51 單片機(jī)的入門開發(fā)板,專門為各大院校的單片機(jī)課程而設(shè)計(jì),
能夠幫學(xué)生快速入門單片機(jī),帶領(lǐng)大家進(jìn)入單片機(jī)世界。很期待能給大家一同學(xué)
習(xí),探討單片機(jī)。
本開發(fā)板提供了大量的例程,幫助用戶徹底了解單片機(jī)。同時(shí)運(yùn)用C 語言
進(jìn)行編程。對(duì)于學(xué)過C 語言的用戶,可以將C 語言和單片機(jī)結(jié)合起來,領(lǐng)悟C
語言的神奇魅力,提高用戶的C 語言能力,為后續(xù)的嵌入式系統(tǒng)學(xué)習(xí)打下堅(jiān)實(shí)
的基礎(chǔ)。
本開發(fā)板為客戶提供了豐富的IO 資源,用戶可以根據(jù)自己的需求,利用排
線自由實(shí)現(xiàn)自己想要的功能,這樣用戶可以隨心所欲地控制單片機(jī)。
如何學(xué)好單片機(jī)?
有人說幾天就學(xué)會(huì)單片機(jī),也不是不可以,但需要基礎(chǔ)和足夠高的領(lǐng)悟能力。
單片機(jī)畢竟是專業(yè)知識(shí),大部人學(xué)習(xí)單片機(jī)要么是出于愛好,要么是為了工作,
不管出于哪種目的,學(xué)習(xí)必須要循序漸進(jìn),可以嘗試加快腳步,但是沒有捷徑。
有人說,我馬上要做個(gè)工程,我要快速學(xué)好單片機(jī),怎么辦?仔細(xì)想想,拿
到一個(gè)新買的手機(jī)僅僅使用這些功能還要花好長時(shí)間操作研究,并且要仔細(xì)閱讀
說明書才行。何況單片機(jī)這種相對(duì)專業(yè)的產(chǎn)品。
學(xué)習(xí)板、開發(fā)板是學(xué)習(xí)和實(shí)踐的最好產(chǎn)品,因?yàn)橛信涮诇y(cè)試好的軟件和硬件,
這樣用戶就不必操心組建開發(fā)系統(tǒng)的過程。這并不是說有了開發(fā)板你就能學(xué)會(huì)單
片機(jī),開發(fā)板只不過是個(gè)工具,如何能利用這個(gè)工具,讓它幫助你更快的了解并
掌握這個(gè)知識(shí)才是關(guān)鍵,一般情況配套的光盤資料都會(huì)有相關(guān)的電路、程序、使
用說明書已經(jīng)多種資料等。所以應(yīng)該先看一下光盤配套的資料。不要拿到手就把
他扔到一邊了,即便你是高手,也要花點(diǎn)時(shí)間看一下使用說明。
有些朋友沒有硬件電路基礎(chǔ),看不懂電路圖,有的朋友也沒有 c 語言基礎(chǔ),
看不懂程序,這個(gè)往往是增加學(xué)習(xí)難度的主要問題,基礎(chǔ)很重要,但沒有基礎(chǔ)也
不用灰心,很多知識(shí)都是從無到有學(xué)習(xí)來的,只要夠努力就好。單片機(jī)是硬件和
軟件結(jié)合的產(chǎn)品,所以不能忽略任何一個(gè),程序一定要根據(jù)對(duì)應(yīng)的硬件來寫,不
要隨便從網(wǎng)上下載個(gè)程序直接運(yùn)行到板子上,然后發(fā)現(xiàn)沒有效果就懷疑是硬件出
了問題,單片機(jī)不是電腦主板,尤其是單片機(jī)開發(fā)板,它們的通用性并不高,但
差別也不大,這時(shí)候就需要根據(jù)硬件修改程序。 所以如果看不懂電路的朋友請(qǐng)
學(xué)習(xí)電路的基礎(chǔ)原理后再去編程。
這里說一下個(gè)人建議:
1、多看書,尤其是單片機(jī)基礎(chǔ)的書,了解單片機(jī)原理才能更好的使用它,國內(nèi) 51
系列推廣了很多年,資料最為豐富。
2、多上網(wǎng)查資料,大家的力量是偉大的,單片機(jī)是外國人發(fā)明的,我們一般要
先學(xué)會(huì)它的語言再使用它,所以多出了很多步驟,很多人對(duì)單片機(jī)的理解層次也
不同,寫程序的風(fēng)格也各異。這個(gè)都沒有關(guān)系,一個(gè)問題查的資料多了,自己就
能分析出他的道理。
3、多調(diào)試。程序無論如何分析,不去調(diào)試,結(jié)果仍舊不能肯定。一般的單片機(jī)
UnRegistered
可以反復(fù)燒寫上萬次,好的數(shù)十萬次,一個(gè)單片機(jī)不過幾元錢,所以不要擔(dān)心芯
片損壞而不敢去反復(fù)燒寫實(shí)驗(yàn),開發(fā)板就是幫助我們學(xué)習(xí)開發(fā)的工具,不要讓它
成了花瓶!
開發(fā)板配置:
1. STC89C52(與51 兼容)支持在線下載程序。
2. 8 位LED 發(fā)光二極管
3. 4 位獨(dú)立按鍵
4. USB 下載模塊
5. 電源模塊
6. 4 位數(shù)碼管顯示
7. 蜂鳴器電路
8. 紅外接收頭電路
9. 18B20 溫度測(cè)量
10. 無線接收模塊
11. 12864/1602 液晶顯示電路
12. 單片機(jī)32 個(gè)IO 口全部引出,方便自己進(jìn)行擴(kuò)展
13. NRF24L01 無線通信模塊
UnRegistered
第一章:燒錄第一個(gè)程序
1.1 STC89 單片機(jī)下載(燒寫程序)方法
1.1.1 硬件連接 USB 方口線插入開發(fā)板的 USB 方口座子,只需用連接一根usb
線即可
1.1.2 驅(qū)動(dòng)安裝與程序下載
Usb 線插入電腦后,會(huì)提示如上信息,點(diǎn)擊“取消”
UnRegistered
手動(dòng)打開PL2303 驅(qū)動(dòng)文件夾(驅(qū)動(dòng)程序文件夾內(nèi)),雙擊安裝驅(qū)動(dòng)
點(diǎn)擊“INSTALL”安裝,成功后點(diǎn)擊“完成”,啟動(dòng)后,重新拔插usb 線,如果
不能識(shí)別請(qǐng)點(diǎn)擊自動(dòng)安裝即可。 UnRegistered
出現(xiàn)虛擬的 COM 口( COM5)
雙擊打開下載軟件,也可以到 http://www.mcu-memory.com/下載最新版本
UnRegistered
以上主要是操作分為 4 步
1、選擇芯片類型,必須是 STC 系列
2、.打開需要燒寫的 HEX 文件
3、選擇對(duì)應(yīng)的 COM 口
4、點(diǎn)擊“下載”,關(guān)掉開發(fā)板電源,然后稍等片刻打開電源,等待下載完成
5、以上步驟中 第 4 步的操作順序非常重要,冷啟動(dòng):即電源完全關(guān)掉,然后
重新上電。
UnRegistered
如果出現(xiàn)上圖現(xiàn)象長期不動(dòng)作,請(qǐng)檢查以下幾點(diǎn):
1、第 4 步開關(guān)順序不正確
2、串口沒有選擇正確
3、串口線或者 usb 轉(zhuǎn)串口線沒有連接好
4、晶振沒有插緊
5、芯片沒有放置正確(不要放偏)
6、軟件不兼容,去 http://www.mcu-memory.com/下載最新版本
1.2 安裝 keil C51 軟件編寫第一個(gè)程序
1.2.1 keil C51 安裝
雙擊光盤中開發(fā)板光盤資料\3、各種配套軟件\keil C51 完全破解版\setup
文件夾中 setup.exe 可執(zhí)行安裝文件,出現(xiàn)如下界面:
UnRegistered
選擇 full Version
點(diǎn)擊 Next
UnRegistered
點(diǎn)擊 Yes
點(diǎn)擊 Browse 選擇安裝路徑,我們這里選擇 D:\Keil
UnRegistered
點(diǎn)擊 Next
UnRegistered
需要輸入序列號(hào),這個(gè)時(shí)候打開開發(fā)板光盤資料\3、各種配套軟件\keil C51 完
全破解版 文件夾中 安裝方法.txt 文檔
分別復(fù)制 SN = K1DZP-5IUSH-A01UE 序列號(hào)到相應(yīng)位置
UnRegistered
姓名和公司名字可任意填寫,點(diǎn)擊 Next
點(diǎn)擊 Next
UnRegistered
UnRegistered
點(diǎn)擊 Next
UnRegistered
點(diǎn)擊 Finish 完成安裝聲明:本破解版本僅作測(cè)試使用,長期使用請(qǐng)到 keil 公
司購買正版軟件
1.2.2 用 keil C51 編寫一個(gè)新程序
雙擊打開桌面上圖標(biāo)
UnRegistered
點(diǎn)擊 Project->New Project
選擇保存路徑并填寫文件名,這里文件名為 test1
UnRegistered
注: )盡量單獨(dú)建立一個(gè)文件夾存放一個(gè)工程,這樣方便管理,如下:
存放在 test1 文件夾中,單擊 保存
選擇對(duì)于的芯片型號(hào),假設(shè)我們開發(fā)板上使用的是 AT89S52 單片機(jī),選擇如下
UnRegistered
選擇 Atmel 廠商中的 AT89S52 單擊確定
注: ) STC 系列單片機(jī)在 keil 中沒有此型號(hào),可以直接用 Atmel 的型號(hào)代
替,如 STC89c52 可以用 AT89C52 或者 AT89S52 代替,其他依次類推,也可以
到 STC 官網(wǎng)下載 STC 芯片型號(hào)插件。
提示是否加載 “標(biāo)準(zhǔn)啟動(dòng)文件” ,剛開始學(xué)習(xí)可以不用加載,選擇 “否”
這個(gè)時(shí)候工程就建立完成了,下一步需要建立一個(gè) c 或者 Asm 類型的文件,并
添加到該工程中,這里我們以 c 文件為例講解
UnRegistered
點(diǎn)擊 File ->New 出現(xiàn)一個(gè)空白 Text1 文檔.
UnRegistered
在空白文檔中輸入需要寫的程序,我們這里賦值一段代碼做為演示
點(diǎn)擊 File ->Save 出現(xiàn)如下對(duì)話框
UnRegistered
需要輸入文件名,這里要特別注意,文件默認(rèn)的保存類型是 All Files,而我們
需要的類型是C 文件,所以需要輸入后綴為“ .c”的文件名,如下輸入 led.c
單擊“保存”
UnRegistered
可以看到保存正確的 c 文件,關(guān)鍵字會(huì)用藍(lán)色顯示
UnRegistered
點(diǎn)擊前面“ +”號(hào),出現(xiàn)下圖
右擊 Source Group 1 出現(xiàn)下圖
UnRegistered
點(diǎn)擊添加文件選項(xiàng) Add Files to Group
選中剛才保存的 led.c 的文件,點(diǎn)擊 Add,然后點(diǎn)擊 Close,文件添加完成
UnRegistered
點(diǎn)擊“ +”號(hào),可以看到 c 文件已經(jīng)添加到工程中了下一步需要進(jìn)行編譯前工
程設(shè)置
點(diǎn)擊 Options for Target 出現(xiàn)如下對(duì)話框
UnRegistered
僅作編譯文件用時(shí)需要設(shè)置 OutPut 一項(xiàng),點(diǎn)擊 OutPut
在“ Create HEX File”前打鉤,表示編譯需要產(chǎn)生十六進(jìn)制文件,這個(gè)文件是
我們燒寫到單片機(jī)必須的文件,所以必須勾選此項(xiàng)。點(diǎn)擊“確定”
UnRegistered
至此,基礎(chǔ)設(shè)置完成,下一步進(jìn)行編譯工作
UnRegistered
點(diǎn)擊 Project -> Rebuild all target files (重新編譯所有目標(biāo)文件)
底部編譯結(jié)果顯示"test1" - 0 Error(s), 0 Warning(s). 表示沒有錯(cuò)誤沒有警
告;
Program Size: data=9.0 xdata=0 code=21 可以看到程序大小, data 占用 9 字
節(jié),程序代碼占用21 字節(jié);
creating hex file from "test1"... 產(chǎn)生 hex 文件,這個(gè)文件正式燒寫單片
機(jī)需要的
此時(shí)用上述燒寫單片機(jī)方法把生成的 hex 文件載入單片機(jī),即可在開發(fā)板上看
到實(shí)驗(yàn)結(jié)果。
2.3 仿真芯片 SST89E516 使用方法
SST 仿真芯片的使用方法
硬件要求:
1.已經(jīng)固化仿真程序的仿真芯片,如 SST89E58、 SST89E516
2.帶有串口資源的目標(biāo)板,如開發(fā)板
硬件連接: 1、將仿真芯片直接插到目標(biāo)板上,代替原有單片機(jī)的位置。
2,用一根 usb 線連接電腦
3、打開電源開關(guān)
連接圖和 STC 單片機(jī)一樣,使用時(shí)需要把 STC 單片機(jī)換成 SST89E516 仿真芯
片,只需要連接一根 usb 線至電腦
軟件設(shè)置:
1、 打開 keil 軟件,并打開一個(gè)需要仿真的程序(已經(jīng)編譯通過的工程)
如下圖:
以下以“流水燈”工程為例。
UnRegistered
2、 點(diǎn)擊上圖箭頭圖標(biāo)打開如下對(duì)話框
3、 點(diǎn)擊“ Debug(調(diào)試) ”選項(xiàng),按照下圖設(shè)置
UnRegistered
4、 如上圖設(shè)置后,點(diǎn)擊“ Setting”選項(xiàng),出現(xiàn)如下對(duì)話框
UnRegistered
★ Com 口選在當(dāng)前硬件連接的端口,不能選擇錯(cuò)誤,否則不能通訊
★ 波特率默認(rèn)選擇 38400,也可以嘗試選其他波特率,速度較低
然后“ OK” “確認(rèn)”完成設(shè)置
5、 點(diǎn)擊如下圖仿真“ ”圖標(biāo)
即可看到狀態(tài)欄有藍(lán)色程序載入進(jìn)展條,完成后出現(xiàn)如下界面
如果出現(xiàn)如下界面
UnRegistered
說明通訊異常請(qǐng)按一下目標(biāo)板復(fù)位鍵或者重新啟動(dòng)電源,然后點(diǎn)擊“ Try
Again”即可,如果多次嘗試仍不能進(jìn)入仿真界面,請(qǐng)點(diǎn)擊“ Settings”檢測(cè)端
口和波特率是否正確。然后重復(fù)操作。
下圖是成功進(jìn)入的界面,供參考對(duì)比
左側(cè)欄有如圖現(xiàn)象,狀態(tài)欄顯示仿真器的版本,這里顯示 Monitor–51 V3.4
這個(gè)時(shí)候就可以進(jìn)入仿真步驟了。
UnRegistered
6、 以下是常用的仿真按鈕圖標(biāo)
以上圖標(biāo)分別是(從左往右) :復(fù)位、全速運(yùn)行、停止、單步、跨步
點(diǎn)擊全速運(yùn)行就可以看到實(shí)際執(zhí)行效果。
用戶也可以單步、跨步或者斷點(diǎn)運(yùn)行。
使用注意事項(xiàng):
1.全速運(yùn)行后不能通過點(diǎn)擊“ ” 停止。產(chǎn)生原因如下:
下圖中“ ”未勾選。建議不要勾
選,否則會(huì)影響仿真的正確性。
這時(shí)候我們?nèi)绻胪V拐谌龠\(yùn)行的程序可以通過用戶板的復(fù)位按鍵停止,然
UnRegistered
后重新
進(jìn)入其他仿真步驟。
2.不能正常進(jìn)入仿真界面
請(qǐng)檢查一下原因:
◆ 硬件是否連接牢靠
◆ 電源是否打開
◆ 軟件設(shè)置是否正確
◆ 重新啟動(dòng) keil 軟件
UnRegistered
第二章 LED 燈閃爍
單片機(jī)的最簡單操作莫過于控制IO 口的電平,本章將通過一個(gè)經(jīng)典的跑馬
燈程序,帶大家開啟神奇的單片機(jī)之旅。通過本章的學(xué)習(xí),你將了解到單片機(jī)的
IO 口的使用方法。在本章中,我們將點(diǎn)亮開發(fā)板上的8 個(gè)LED 燈。本章分為如
下幾個(gè)部分:
2.1 硬件設(shè)計(jì)
2.2 軟件設(shè)計(jì)
2.3 仿真與下載
UnRegistered
2.1 硬件設(shè)計(jì)
LED 燈與1K 的電阻串聯(lián),接在P1 口,當(dāng)端口賦值為0 時(shí),點(diǎn)亮LED 燈,端
口賦值為1 時(shí),熄滅LED 燈,。下圖是LED 的原理圖。注意:在使用LED 時(shí),不
要忘了將J12 跳線帽短接!
2.2 軟件設(shè)計(jì)
此程序來自于開發(fā)板的實(shí)驗(yàn)1(LED 燈閃爍),此處略有改動(dòng)
/*******延時(shí)函數(shù)*************/
void delay(unsigned int i)
{
unsigned char j;
for(i; i > 0; i--)
for(j = 255; j > 0; j--);
}
void main()
{
while(1)
{
P1 = 0xff; //置P1 口為高電平(熄滅LED 燈)
delay(600); // 調(diào)用延時(shí)程序
P1 = 0x00; //置P1 口為低電平(點(diǎn)亮LED 燈)
delay(600); // 延時(shí)
}
}
UnRegistered
2.3 仿真與下載
具體怎么下載程序,請(qǐng)參考第一章的程序下載部分,在這里就不討論了。
實(shí)物效果圖如下圖所示
當(dāng)然有時(shí)候我們調(diào)試時(shí),每次都要把程序燒到芯片里面去,覺得很麻煩。如果身
邊沒有硬件仿真器,軟件仿真就不失為一種不錯(cuò)的選擇。注意:軟件仿真只能進(jìn)
行邏輯仿真,在一些情況下是不能用的,望讀者多留意。
首先,我們進(jìn)行軟件仿真(請(qǐng)先確保 Options for Target->Debug 選項(xiàng)卡里面
已經(jīng)設(shè)置為Use Simulator。查看一下,是否生成了HEX 文件。先按開始仿
真,接著按,顯示邏輯分析窗口,點(diǎn)擊,新建信號(hào)P1,如下圖所示
邏輯分析設(shè)置
然后單擊 Close 關(guān)閉該對(duì)話框。可以看到邏輯分析窗口出來了P1 信號(hào),如下圖
所示。
UnRegistered
設(shè)置后的邏輯分析窗口
接著點(diǎn)擊 ,開始運(yùn)行。運(yùn)行一段時(shí)間之后,按按鈕,暫停仿真回到邏
輯分析窗口,可以看到如下圖所示的波形。
仿真波形
UnRegistered
這里注意 Gird 要調(diào)節(jié)到 0.25s 左右比較合適,可以通過 Zoom 里面的 In 按
鈕來放大波形,通過 Out 按鈕來縮小波形,或者按 All 顯示全部波形。
第三章LED 跑馬燈
在第二章的基礎(chǔ)上,我們將進(jìn)一步學(xué)習(xí)開發(fā)板的LED 燈,實(shí)現(xiàn)LED 跑馬燈。徹底
掌握IO 口的使用。本章分為如下幾個(gè)部分:
3.1 硬件設(shè)計(jì)
3.2 軟件設(shè)計(jì)
3.3 下載驗(yàn)證
UnRegistered
3.1 硬件設(shè)計(jì)
此部分利用第二章的原理圖,如下圖所示。同樣需要注意,記得短接J12 跳
線帽哦!
3.2 軟件設(shè)計(jì)
此程序來自于開發(fā)板的實(shí)驗(yàn)2(LED 跑馬燈)
void main()
{
UnRegistered
uchar num,dat1,dat2;
delay(500);
while(1)
{
dat1=0xfe;
dat2=0x7f;
for(num=0;num<7;num++)
{
GPIO1 = dat1; //初始化賦值
dat1 = dat1<<1; //右移一位
delay(500); //延時(shí)
}
for(num=0;num<7;num++)
{
GPIO1 =dat2; //初始化賦值
dat2 = dat2>>1; //右移一位
delay(500); //延時(shí)
}
}
}
void delay(uint z)
{
uchar j;
for(z;z>0;z--)
for(j=200;j>0;j--);
}
3.3 下載驗(yàn)證
具體怎么下載程序,請(qǐng)參考第一章的程序下載部分,在這里就不討論了。
第四章 LED 漸亮漸滅
前面我們已經(jīng)學(xué)會(huì)了LED 燈閃爍和跑流水燈,這次我們將進(jìn)一步深入,來學(xué)
UnRegistered
習(xí)LED。LED 燈的漸亮漸滅,說白了,就是調(diào)節(jié)LED 的占空比。當(dāng)然實(shí)現(xiàn)方法有
多種多樣,可以利用中斷,也可以利用簡單的循環(huán)。這里就以循環(huán)為例,說明如
何實(shí)現(xiàn)LED 的漸亮漸滅,感興趣的讀者可以自己用中斷實(shí)現(xiàn)占空比的調(diào)節(jié)。本章
分為如下幾個(gè)部分:
4.1 硬件設(shè)計(jì)
4.2 軟件設(shè)計(jì)
4.3 下載驗(yàn)證
4.1 硬件設(shè)計(jì)
此部分利用第二章的原理圖,如下圖所示。同樣需要注意,記得短接J12 跳
線帽哦!
UnRegistered
4.2 軟件設(shè)計(jì)
此程序來自于開發(fā)板的實(shí)驗(yàn)3(LED 漸亮漸滅)
void Delay(uint uiTemp)
{
while(uiTemp--);
}
void main()
{
uint Duty_Ratio = 0;//調(diào)節(jié)亮度變量
uint i;
while(1)
{
for(i = 0; i < 71 ;i++)
{
Duty_Ratio += i;
GPIO1 = 0x00;
Delay(Duty_Ratio); //相當(dāng)于調(diào)節(jié)占空比
GPIO1 = 0xFF;
Delay(2500-Duty_Ratio); //周期大約為2500
}
for(i = 71; i > 15 ;i--)
{
Duty_Ratio -= i;
GPIO1 = 0x00;
Delay(Duty_Ratio); //相當(dāng)于調(diào)節(jié)占空比
GPIO1 = 0xFF;
UnRegistered
Delay(2500-Duty_Ratio); //周期大約為2500
}
Duty_Ratio = 0;
}
}
4.3 下載驗(yàn)證
可以看到LED 燈由暗到亮,然后慢慢地熄滅,接著就一直重復(fù)前面的現(xiàn)象,與我
們期望的是一致的。
第五章 蜂鳴器
前幾章我們學(xué)了通過IO 口來控制LED,這里我們將使用IO 口來控制蜂鳴器,
原理是一樣的。本章分為如下幾個(gè)部分:
5.1 蜂鳴器簡介
5.2 硬件設(shè)計(jì)
5.3 軟件設(shè)計(jì)
5.4 下載驗(yàn)證
UnRegistered
5.1 蜂鳴器簡介
蜂鳴器是一種一體化結(jié)構(gòu)的電子訊響器,采用直流電壓供電,廣泛應(yīng)用于計(jì)算機(jī)、
打印機(jī)、復(fù)印機(jī)、報(bào)警器、電子玩具、汽車電子設(shè)備、電話機(jī)、定時(shí)器等電子產(chǎn)
品中作發(fā)聲器件。蜂鳴器主要分為壓電式蜂鳴器和電磁式蜂鳴器兩種類型。此開
發(fā)板板載的蜂鳴器是電磁式的有源蜂鳴器,如圖所示:
有源蜂鳴器
這里的有源不是指電源的 “源”,而是指有沒有自帶震蕩電路,有源蜂鳴器自
帶了震蕩電路,一通電就會(huì)發(fā)聲;無源蜂鳴器則沒有自帶震蕩電路,必須外部提
供 2~5Khz 左右的方波驅(qū)動(dòng),才能發(fā)聲。
5.2 硬件設(shè)計(jì)
因?yàn)閱纹瑱C(jī)本身的IO 驅(qū)動(dòng)能力不夠,所以加上三極管能大大提高其驅(qū)動(dòng)能力,
感興趣的同學(xué)可以參考一下模電的相關(guān)知識(shí)。注意:記得將J9 短接。
UnRegistered
5.3 軟件設(shè)計(jì)
程序來自開發(fā)板的實(shí)驗(yàn)5(警報(bào)發(fā)生器)
void delay500(void)
{
uchar i;
for(i=230;i>0;i--);
}
main()
{
uchar j;
while(1)
{
for(j=200;j>0;j--)
{
BEEP=~BEEP; //輸出頻率1KHz
delay500(); //延時(shí)500us
}
for(j=200;j>0;j--)
{
BEEP=~BEEP; //輸出頻率500Hz
delay500(); //延時(shí)1ms
delay500();
}
UnRegistered
}
}
5.4 下載驗(yàn)證
我們可以聽見類似報(bào)警器的聲音,與我們的預(yù)期是一致的。
第六章 數(shù)碼管動(dòng)態(tài)顯示
前面的實(shí)驗(yàn)都是對(duì)單片機(jī)的IO 口進(jìn)行簡單的操作。這次我們將學(xué)習(xí)數(shù)碼管
的靜態(tài)顯示。當(dāng)然相對(duì)于前面的東西,我們學(xué)習(xí)數(shù)碼管要掌握的東西就比以前的
多一些,望讀者能好好掌握數(shù)碼管。因?yàn)閿?shù)碼管顯示比較直觀,而且操作方便,
所以以后還有很多實(shí)驗(yàn),都需要用到數(shù)碼管顯示結(jié)果。本章分為如下幾個(gè)部分:
6.1 數(shù)碼管簡介
UnRegistered
6.2 硬件設(shè)計(jì)
6.3 軟件設(shè)計(jì)
6.4 下載驗(yàn)證
6.1 數(shù)碼管簡介
4 位一體數(shù)碼管的引腳圖,共陽型。1,2,3,4 是從右邊數(shù)起的
UnRegistered
數(shù)碼管顯示對(duì)照表(共陽型,0 時(shí)點(diǎn)亮,1 時(shí)熄滅)
讀者可以使用萬用表來核對(duì)表格的值,以此來加深對(duì)數(shù)碼管的操作。例如要顯示
0.我們可以將萬用表筆的正極接共陽段,萬用表的負(fù)極接a,b,c,d,e,f。讀者會(huì)
發(fā)現(xiàn)這樣就形成了一個(gè)0.同樣如果將萬用表的負(fù)極接b,c 管教,會(huì)形成一個(gè)1.
有了這些基礎(chǔ),大家就可以編程了。
6.2 硬件設(shè)計(jì)
注意:在使用數(shù)碼管時(shí),記得把J10 短接。
UnRegistered
6.3 軟件設(shè)計(jì)
程序來自開發(fā)板的實(shí)驗(yàn)10(數(shù)碼管靜態(tài)顯示)
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,
0xf8,0x80,0x90};//共陽代碼
void delay(uchar i)
{
uchar j,k;
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
void display()
{
GPIO0 = table[4];//顯示數(shù)字4
P2_0 = 0;
delay(5);
P2_0 = 1;
GPIO0 = table[3];//顯示數(shù)字3
P2_1 = 0;
delay(5);
P2_1 = 1;
GPIO0 = table[2];//顯示數(shù)字2
P2_2 = 0;
delay(5);
P2_2 = 1;
GPIO0 = table[1];//顯示數(shù)字1
P2_3 = 0;
delay(5);
P2_3 = 1;
}
void main(void)
UnRegistered
{
while(1)
{
display();
}
}
6.4 下載驗(yàn)證
實(shí)驗(yàn)結(jié)果如下圖。可以在數(shù)碼管上看到1234 的顯示。試驗(yàn)成功。
UnRegistered
第七章獨(dú)立鍵盤
按鍵作為人機(jī)交互的輸入,讀者可以通過鍵盤來控制程序的運(yùn)行,這樣可以更好的看到
程序效果。在本章,我們學(xué)習(xí)開發(fā)板上的獨(dú)立鍵盤。本章分為如下幾個(gè)部分:
7.1 硬件設(shè)計(jì)
7.2 軟件設(shè)計(jì)
7.3 下載驗(yàn)證
7.1 硬件設(shè)計(jì)
注意:因?yàn)槲覀兊陌存I有一段接的是GND,需要檢測(cè)相應(yīng)的管腳為0,才能確認(rèn)
有按鍵按下(當(dāng)然在檢測(cè)管腳時(shí),要先將IO 口拉低,這樣檢測(cè)的數(shù)值才是正確
的)。這和我們平時(shí)的邏輯有點(diǎn)不同,呵呵
7.2 軟件設(shè)計(jì)
程序來自開發(fā)板的實(shí)驗(yàn)11(獨(dú)立鍵盤)
void delay(uint z)
{
uint i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
UnRegistered
}
void main()
{
P0 = 0;
while(1) //一直循環(huán)
{
if(key1==0) //KEY1 是否按下
{
delay(5); //軟件去抖
if(key1==0) //確認(rèn)按鍵按下(閃爍一次)
{
while(!key1);//松手檢測(cè)
P1=0;
delay(200);
P1=0XFF;
}
}
if(key2==0) //KEY2 是否按下
{
delay(5); //軟件去抖
if(key2==0) //確認(rèn)按鍵按下
{
while(!key2);//松手檢測(cè)(閃爍二次)
P1=0;
delay(200);
P1=0XFF;
delay(200);
P1=0;
delay(200);
P1=0XFF;
}
}
if(key3==0) //KEY3 是否按下
{
delay(5); //軟件去抖
if(key3==0) //確認(rèn)按鍵按下(閃爍三次)
{
while(!key3);//松手檢測(cè)
P1=0;
UnRegistered
delay(200);
P1=0XFF;
delay(200);
P1=0;
delay(200);
P1=0XFF;
delay(200);
P1=0;
delay(200);
P1=0XFF;
delay(200);
}
}
if(key4==0) //KEY4 是否按下
{
delay(5); //軟件去抖
if(key4==0) //確認(rèn)按鍵按下
{
while(!key4);//松手檢測(cè)(閃爍四次)
P1=0;
delay(200);
P1=0XFF;
delay(200);
P1=0;
delay(200);
P1=0XFF;
delay(200);
P1=0;
delay(200);
P1=0XFF;
delay(200);
P1=0;
delay(200);
P1=0XFF;
delay(200);
}
}
delay(10);
}
}
7.3 下載驗(yàn)證
當(dāng)我們按下獨(dú)立按鍵時(shí),會(huì)有相應(yīng)的LED 變化,與我們預(yù)期的是一樣的。
UnRegistered
第八章 定時(shí)中斷
前面的實(shí)驗(yàn)都是基本上沒有涉及寄存器。這章我們將會(huì)使用51 里面的寄存器。
熟悉并且熟練得掌握單片機(jī)寄存器將是學(xué)好單片機(jī)的關(guān)鍵。讀者以后可能會(huì)在
51 基礎(chǔ)上繼續(xù)學(xué)習(xí)例如STM32,MSP430 等芯片,這里面就有比較多的寄存器。
本章分為如下幾個(gè)部分:
8.1 定時(shí)器簡介
8.2 硬件設(shè)計(jì)
8.3 軟件設(shè)計(jì)
8.4 下載驗(yàn)證
UnRegistered
8.1 定時(shí)器簡介
中斷是為使單片機(jī)具有對(duì)外部或內(nèi)部隨機(jī)發(fā)生的事件進(jìn)行處理而設(shè)置的。51 單
片機(jī)有5 種中斷源,即有5 種對(duì)應(yīng)的情況發(fā)生時(shí)會(huì)使單片機(jī)去處理中斷程序(中
斷函數(shù))。其中,中斷寄存器,定時(shí)器/計(jì)數(shù)器相關(guān)寄存器本身或者相關(guān)位用來做
初始化,中斷函數(shù)的內(nèi)容主要是體現(xiàn)發(fā)生中斷后所需要的操作(在中斷函數(shù)內(nèi)寫
代碼)。
1.中斷允許寄存器IE
中斷寄存器IE
中斷寄存器用來設(shè)定各個(gè)中斷源的打開和關(guān)閉,IE 在特殊功能寄存器
中,字節(jié)地址為A8H,位地址(由低位到高位)分別是A8H~AFH,該寄存器運(yùn)
UnRegistered
行位尋址,即可對(duì)該寄存器的每一位進(jìn)行單獨(dú)操作。單片機(jī)復(fù)位時(shí)IE 全部
被清零。下面列舉各位的在不同狀態(tài)下的具體含義:
EA-------全局中斷允許位
EA = 1,打開全局中斷控制,在此條件下由各個(gè)中斷控制位(TCON 寄存
器中的TRn 位)控制相應(yīng)中斷的打開和關(guān)閉。
EA = 0,關(guān)閉全部中斷。
-- 無效位
ET2--定時(shí)器/計(jì)數(shù)器2 中斷允許位
ET2 = 1,打開T2 中斷。
ET2 = 0,關(guān)閉T2 中斷。
ES--串行口中斷允許位
ES = 1,打開串行口中斷。
ES = 0,關(guān)閉串行口中斷。
ET1--定時(shí)器/計(jì)數(shù)器中斷允許位
ET1 = 1,打開T1 中斷。
ET1 = 0, 關(guān)閉T1 中斷.
EX1--外部中斷1 中斷允許位
EX1 = 1,打開外部中斷1 中斷。
EX1 = 0,關(guān)閉外部中斷1 中斷。
ET0--定時(shí)器/計(jì)數(shù)器0 中斷允許位
ET0 = 1, 打開T0 中斷。
ET0 = 0,關(guān)閉T0 中斷。
EX--外部中斷0 中斷允許位
EX0 = 1,打開外部中斷0 中斷。
EX0 = 0,關(guān)閉外部中斷0 中斷。
2.定時(shí)器/計(jì)數(shù)器相關(guān)寄存器(TMOD,TCON)
定時(shí)器/計(jì)數(shù)器工作方式寄存器(TMOD)
定時(shí)器/計(jì)數(shù)器工作方式寄存器
UnRegistered
定時(shí)器/計(jì)數(shù)器工作方式寄存器在特殊功能寄存器中,字節(jié)地址為89H,
不能位尋址。TMOD 用來確定定時(shí)器的工作方式及功能選擇。單片機(jī)復(fù)位時(shí)
TMOD 全被被清零。下面介紹各位在不同值下的含義:
GATE --門控制位。
GATE = 0,定時(shí)器/計(jì)數(shù)器啟動(dòng)與停止僅受TCON 寄存器中TRn(n = 0, 1)
來控制。
GATE = 1,定時(shí)器/計(jì)數(shù)器啟動(dòng)與停止由TCON 寄存器中的TRn(n=0, 1)
和外部中斷引腳(INT0 或INT1)的電平狀態(tài)來共同控制。
C/T`--定時(shí)器模式和計(jì)數(shù)器模式選擇位。
C/T` = 1,為計(jì)數(shù)器模式;C/T` = 0,為定時(shí)器模式。
M1M0--工作方式選擇位(見下表)
定時(shí)器/計(jì)數(shù)器的4 中工作方式
定時(shí)器/計(jì)數(shù)器控制寄存器TCON
定時(shí)器/計(jì)數(shù)器控制寄存器在特殊功能寄存器中,字節(jié)地址為88H,位
地址(由低到高)分別為88H~8FH,該寄存器可進(jìn)行位尋址。TCON 寄存器用來
控制定時(shí)器啟,停,標(biāo)志寄存器溢出和中斷情況。單片機(jī)復(fù)位時(shí)TCON 全部
被清零。各位被賦不同值的含義如下:
定時(shí)器/計(jì)數(shù)器控制寄存器TCON
TF1--定時(shí)器1 溢出標(biāo)志位
當(dāng)定時(shí)器1 計(jì)滿溢出時(shí),由硬件使TF1 置1,并申請(qǐng)中斷。進(jìn)入中斷程
序后由硬件自動(dòng)清零。如使用定時(shí)器中斷,則該位不用人為操作;但如用軟
件查詢方式,當(dāng)查詢到該位為1 時(shí),需用軟件清零。
TR1--定時(shí)器1 運(yùn)行控制位
由軟件清0 關(guān)閉定時(shí)器1。當(dāng)GATE = 1,且INT1 為高電平時(shí),TR1 置
1 啟動(dòng)定時(shí)器1;當(dāng)GATE = 0 時(shí),TR1 置1 時(shí)即可啟動(dòng)定時(shí)器1.
UnRegistered
TF0--定時(shí)器0 溢出標(biāo)志位,功能和操作方式和TF1 相同。
TR0--定時(shí)器0 運(yùn)行標(biāo)志位,其功能和操作方式同TR1。
IE1--外部中斷1 請(qǐng)求標(biāo)志
當(dāng)IT1 = 0,時(shí)為電平觸發(fā)方式,每個(gè)機(jī)器周期的S5P2 采樣INT1 引腳;
若INT1 引腳為低電平,則置1,否則IE1 清0。
當(dāng)IT1 = 1,INT1 為跳變沿觸發(fā)方式,當(dāng)?shù)谝粋(gè)機(jī)器周期采樣到INT1
為低電平時(shí),則IE1 置1。IE1=1 時(shí),表示外部中斷1 正在向CPU 申請(qǐng)中斷。
當(dāng)CPU 響應(yīng)中斷,轉(zhuǎn)向中斷服務(wù)程序時(shí),該位由硬件清0.
IT1--外部中斷1 觸發(fā)方式選擇位
IT1= 0,為電平觸發(fā)方式,引腳INT1 上低電平有效。
IT1 = 1,為跳變沿觸發(fā)方式,引腳INT1 上的電平從高到低的負(fù)跳變
有效。
IE0--外部中斷0 請(qǐng)求標(biāo)志,其功能及操作方式同IE1。
IT0--外部中斷0 觸發(fā)方式選擇位,其功能及操作方式同IT1。
詳細(xì)資料,請(qǐng)查看開發(fā)板的實(shí)驗(yàn)12(定時(shí)中斷模式2)目錄下的資料。
8.2 硬件設(shè)計(jì)
為了便于觀察定時(shí)中斷的效果,這里我們就使用一個(gè)LED 燈來檢測(cè)是否發(fā)生定時(shí)
中斷。順便說一下,中斷函數(shù)和其他函數(shù)的區(qū)別很小,使用時(shí)可以把它理解成一
個(gè)普通函數(shù),只是它是靠事情來調(diào)用函數(shù)的。
8.3 軟件設(shè)計(jì)
void Timer_Mode2_Init(void)//定時(shí)中斷初始化函數(shù)
{
TMOD |= 0x02; //模式二,自動(dòng)重裝
UnRegistered
ET0 = 1; //開定時(shí)器0 中斷
TR0 = 1; //啟動(dòng)定時(shí)計(jì)數(shù)器
TH0 = 72; //T0 賦值,每次進(jìn)中斷時(shí)間為200us
TL0 = 72;
}
void Timer_Mode2(void) interrupt 1//中斷函數(shù)
{
static unsigned int i=0;
i++;
if(i==2500)//延時(shí)0.5s 閃爍(因?yàn)槊看芜M(jìn)中斷的時(shí)間是200us)
{
LED2 = ~LED2;//開LED 燈
i = 0;
}
}
void main()
{
Timer_Mode2_Init();
EA = 1; //開總中斷
for(;;)
;
}
8.4 下載驗(yàn)證
將程序下到芯片后,可以看到LED 燈不停閃爍。LED 燈的狀態(tài)改變是發(fā)生在中斷
程序中,說明中斷起作用了。
第九章定時(shí)中斷顯示時(shí)鐘
8.1 硬件設(shè)計(jì)
8.2 軟件設(shè)計(jì)
8.3 下載驗(yàn)證
UnRegistered
第十章 外部中斷
前面我們用到了定時(shí)中斷,本章我們將學(xué)習(xí)外部中斷。51 單片機(jī)一般有兩個(gè)外
部中斷輸入端,并允許外部中斷源以低電平或負(fù)邊沿兩種觸發(fā)方式輸入中斷請(qǐng)求
信號(hào)。本實(shí)驗(yàn)是基于負(fù)邊沿觸發(fā)方式。本章分為如下幾個(gè)部分:
10.1 外部中斷簡介
10.2 硬件設(shè)計(jì)
10.3 軟件設(shè)計(jì)
10.4 下載驗(yàn)證
UnRegistered
10.1 外部中斷簡介
外部中斷需要用到寄存器如下:
1.中斷允許寄存器IE
UnRegistered
中斷優(yōu)先級(jí)次序寄存器IP
詳細(xì)資料,請(qǐng)看開發(fā)板的實(shí)驗(yàn)14(外部中斷)目錄下的資料。
10.2 硬件設(shè)計(jì)
K1,K2 與外部中斷0,1 的連接如下圖
10.3 軟件設(shè)計(jì)
程序來自開發(fā)板的實(shí)驗(yàn)14(外部中斷)。注意:在這里我是用了H 文件和C 文
件。目的是希望讀者能夠從這個(gè)簡單的例子中,體會(huì)到H 文件和C 文件的使用。
/************* Ex_Inter.c 文件 *****************/
void EXT1_Initial()
{
EX1 = 1;
IT1 = 1;
}
void EXT0_Initial()
{
EX0 = 1;
IT0 = 1;
}
void INT_1 (void ) interrupt 2 //外部中斷2 函數(shù)
{
LED = LED_ON;//LED 亮
UnRegistered
}
void INT_0 (void ) interrupt 0 //外部中斷0 函數(shù)
{
LED = LED_OFF;//LED 滅
}
/************* main.c 文件 *****************/
void main(void )
{
EXT0_Initial(); //初始化外部中斷0
EXT1_Initial(); //初始化外部中斷1
EA = 1;//開中斷
for(;;)
{
}
}
10.4 下載驗(yàn)證
當(dāng)我們按下K1,K2 時(shí),
第十一章 字符點(diǎn)陣液晶屏1602
前面的實(shí)驗(yàn)基本上只是簡單的IO 口操作,本章我們要學(xué)習(xí)1602 字符型液晶顯示
屏。我們可以將1602 理解成一個(gè)芯片,對(duì)此我們只要把相應(yīng)的命令和數(shù)據(jù)寫進(jìn)
去就可以了。本章分為如下幾個(gè)部分:
11.1 1602 簡介
11.2 硬件設(shè)計(jì)
11.3 軟件設(shè)計(jì)
11.4 下載驗(yàn)證
UnRegistered
11.1 1602 簡介
1602 液晶模塊內(nèi)部的字符發(fā)生存儲(chǔ)器(CGROM)已經(jīng)存儲(chǔ)了160 個(gè)不同的點(diǎn)陣
字符圖形,這些字符有:阿拉伯?dāng)?shù)字、英文字母的大小寫、常用的符號(hào)、和日文
假名等,每一個(gè)字符都有一個(gè)固定的代碼,比如大寫的英文字母“A”的代碼是
01000001B(41H),顯示時(shí)模塊把地址41H 中的點(diǎn)陣字符圖形顯示出來,我們就
能看到字母“A”。
因?yàn)?602 識(shí)別的是ASCII 碼,試驗(yàn)可以用ASCII 碼直接賦值,在單片機(jī)編
程中還可以用字符型常量或變量賦值,如'A’。
以下是1602 的16 進(jìn)制ASCII 碼表:
UnRegistered
讀的時(shí)候,先讀上面那行,再讀左邊那列,如:感嘆號(hào)!的ASCII 為0x21,字
母B 的ASCII 為0x42(前面加0x 表示十六進(jìn)制)。
1602 顯示地址
1602 字符液晶顯示可分為上下兩部分各16 位進(jìn)行顯示,處于不同行時(shí)的字符顯
示地址如下
1602 指令集
UnRegistered
詳細(xì)資料,請(qǐng)參考開發(fā)板的實(shí)驗(yàn)15(LCD1602)目錄下的LCD1602 的數(shù)據(jù)手冊(cè)。
11.2 硬件設(shè)計(jì)
LCD1602 的原理圖如下。注意:記得拔下J10 的跳線帽。
UnRegistered
11.3 軟件設(shè)計(jì)
程序來自開發(fā)板的實(shí)驗(yàn)15(LCD1602)
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com)
{ wela=0;
lcdrs=0;
GP_P2=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_data(uchar date)
{
wela=0;
lcdrs=1;
GP_P2=date;
delay(5);
UnRegistered
lcden=1;
delay(5);
lcden=0;
}
void init()
{
lcden=0;
write_com(0x38);//顯示倆行,8 位數(shù)據(jù),5*7 點(diǎn)陣(多次初始化)
delay(90);
write_com(0x38);
delay(90);
write_com(0x38);
delay(90);
write_com(0x0e);//打開顯示,顯示光標(biāo)
write_com(0x06);//當(dāng)讀取一個(gè)字符之后,地址指針加一
write_com(0x01);//清屏指令
}
void main()
{
init();
write_com(0x80);//設(shè)置顯示地址,第一行顯示
for(num=0;num<16;num++)
{
write_data(table[num]);//顯示數(shù)據(jù)
delay(20);//可以不用添加延時(shí)
}
write_com(0x80+0x40);//設(shè)置顯示地址,在第二行顯示
for(num=0;num<16;num++)
{
write_data(table1[num]);//顯示數(shù)據(jù)
delay(20);
}
while(1);
}
11.4 下載驗(yàn)證
程序下載之后,可以看到液晶屏上顯示倆行:0123456789abcdef,與預(yù)期的一致,
實(shí)驗(yàn)成功。
UnRegistered
第十二章 串口實(shí)驗(yàn)
通信的三種基本類型常用的通信從傳輸方向上可以分為單工通信、半雙工通
信、全雙工通信三類。單工通信就是指只允許一方向另外一方傳送信息,而另一
方不能回傳信息。比如電視遙控器、收音機(jī)廣播等,都是單工通信技術(shù)。半雙工
通信是指數(shù)據(jù)可以在雙方之間相互傳播,但是同一時(shí)刻只能其中一方發(fā)給另外一
方,比如我們的對(duì)講機(jī)就是典型的半雙工。全雙工通信就發(fā)送數(shù)據(jù)的同時(shí)也能夠
接收數(shù)據(jù),兩者同步進(jìn)行,就如同我們的電話一樣,我們說話的同時(shí)也可以聽到
對(duì)方的聲音。本章分為如下幾個(gè)部分:
12.1 UART 簡介
12.2 硬件設(shè)計(jì)
12.3 軟件設(shè)計(jì)
12.4 下載驗(yàn)證
UnRegistered
12.1 UART 簡介
IO 口模擬串口通信,讓大家了解了串口通信的本質(zhì),但是我們的單片機(jī)程序卻需要不
停的檢測(cè)掃描單片機(jī) IO 口收到的數(shù)據(jù),大量占用了單片機(jī)的運(yùn)行時(shí)間。這時(shí)候就會(huì)有聰明
人想了,其實(shí)我們并不是很關(guān)心通信的過程,我們只需要一個(gè)通信的結(jié)果,最終得到接收到
的數(shù)據(jù)就行了。這樣我們可以在單片機(jī)內(nèi)部做一個(gè)硬件模塊,讓它自動(dòng)接收數(shù)據(jù),接收完了,
通知我們一下就可以了,我們的 51 單片機(jī)內(nèi)部就存在這樣一個(gè) UART 模塊,要正確使用它,
當(dāng)然還得先把對(duì)應(yīng)的特殊功能寄存器配置好。
詳細(xì)的寄存器描述,由于篇幅過長,這里就不贅述,讀者可以參考開發(fā)板的
實(shí)驗(yàn)17(單片機(jī)的UART 串口通信)目錄下的51 單片機(jī)串行通信,這里面有詳
細(xì)的講解。
12.2 硬件設(shè)計(jì)
由于單片機(jī)的UART 端口不能直接和電腦相連,所以就通過CH340 進(jìn)行電平
轉(zhuǎn)換。
12.3 軟件設(shè)計(jì)
void UART_Init(void)
{
TMOD = 0x20; //用定時(shí)器設(shè)置串口波特率 9600
TH1 = 0xfd;
TL1 = 0xfd;
TR1 = 1;
REN = 1; //串口初始化
SM0 = 0;
SM1 = 1;
ES = 1;
}
void main()
{
UART_Init();
UnRegistered
EA = 1; //開啟總中斷
while(1)
{
if(Flag==1) //判斷是否有串口數(shù)據(jù)的傳送
{
ES = 0;
Flag = 0;
SBUF = a; //發(fā)送數(shù)據(jù)a 到SBUF,即將單片機(jī)的數(shù)據(jù)發(fā)送
到計(jì)算機(jī)
while(!TI); //等待發(fā)送結(jié)束
TI = 0;
ES = 1;
}
}
}
void ser() interrupt 4
{
if(RI)
{
RI = 0; //接收數(shù)據(jù)SBUF,即將計(jì)算機(jī)的數(shù)據(jù)接收。
a = SBUF;
Flag = 1;
}
}
12.4 下載驗(yàn)證
讀者可以自己到網(wǎng)上下載SSCOM3.3 串口調(diào)試軟件。打開SSCOM3.3。設(shè)置串
口為 CH340 的 USB 串口(根據(jù)你自己的電腦選擇,我的電腦是 COM4).波特率
為9600,數(shù)據(jù)位為8 位,一位停止位。無校驗(yàn),無流控制。參數(shù)配置后,如下
圖所示。 UnRegistered
UnRegistered
讀者可以在字符框輸入任意一串字符,例如:長沙冠陽電子科技有限公司,
就可以在輸出欄顯示:長沙冠陽電子科技有限公司。
注意:UART 是通過一個(gè)個(gè)的字符傳送的。
UnRegistered
第十三章 溫度測(cè)量
本章我們將學(xué)習(xí)DS18B20 這款傳感器。這里面最重要的一點(diǎn)是我們要學(xué)會(huì)看
DS18B20 的通信協(xié)議和它的時(shí)序圖。本章分為如下幾個(gè)部分:
13.1 DS18B20 簡介
13.2 硬件設(shè)計(jì)
13.3 軟件設(shè)計(jì)
13.4 下載驗(yàn)證
UnRegistered
12.1 DS18B20 簡介
DS18B20 是常用的溫度傳感器,具有體積小,硬件開銷低,抗干擾能力強(qiáng),精度
高的特點(diǎn)。DS18B20 數(shù)字溫度傳感器接線方便,封裝成后可應(yīng)用于多種場(chǎng)合,如
管道式,螺紋式,磁鐵吸附式,不銹鋼
封裝式,型號(hào)多種多樣,有LTM8877,LTM8874 等等。主要根據(jù)應(yīng)用場(chǎng)合的不同
而改變其外觀。封裝后的DS18B20 可用于電纜溝測(cè)溫,高爐水循環(huán)測(cè)溫,鍋爐測(cè)
溫,機(jī)房測(cè)溫,農(nóng)業(yè)大棚測(cè)溫,潔凈室測(cè)溫,彈藥庫測(cè)溫等各種非極限溫度場(chǎng)合。
耐磨耐碰,體積小,使用方便,封裝形式多樣,適用于各種狹小空間設(shè)備數(shù)字測(cè)
溫和控制領(lǐng)域。
DS18B20 讀寫時(shí)序
DS18B20 初始化過程
UnRegistered
上面只是基本的操作信息。詳細(xì)資料,請(qǐng)參考開發(fā)板的實(shí)驗(yàn)19(并行數(shù)碼管溫
度測(cè)量)目錄下面的資料。在這里,就不贅述了。
13.2 硬件設(shè)計(jì)
注意:這里在數(shù)據(jù)端接上了1K 的上拉電阻,同時(shí)記得將J16,J10 跳線帽短
接。
13.3 軟件設(shè)計(jì)
程序來自開發(fā)板的實(shí)驗(yàn)19(并行數(shù)碼管溫度測(cè)量)
void delay1ms()
{
unsigned char i;
for(i=124;i>0;i--); //延時(shí)124*8+10=1002us
}
void Init_DS18B20(void)
{
unsigned char x=0;
DQ=1; //DQ 先置高
delay(8); //稍延時(shí)
DQ=0; //發(fā)送復(fù)位脈沖
delay(80); //延時(shí)(>480us)
DQ=1; //拉高數(shù)據(jù)線
delay(5); //等待(15~60us)
x=DQ; //用X 的值來判斷初始化有沒有成功,18B20 存在的話X=0,否則X=1
delay(20);
}
ReadOneChar(void) //主機(jī)數(shù)據(jù)線先從高拉至低電平1us 以上,再使數(shù)據(jù)線升
為高電平,從而產(chǎn)生讀信號(hào)
{
UnRegistered
unsigned char i=0; //每個(gè)讀周期最短的持續(xù)時(shí)間為60us,各個(gè)讀周期之間必
須有1us 以上的高電平恢復(fù)期
unsigned char dat=0;
for (i=8;i>0;i--) //一個(gè)字節(jié)有8 位
{
DQ=1;
delay(1);
DQ=0;
dat>>=1;
DQ=1;
if(DQ)
dat|=0x80;
delay(4);
}
return(dat);
}
void WriteOneChar(unsigned char dat)
{
unsigned char i=0; //數(shù)據(jù)線從高電平拉至低電平,產(chǎn)生寫起始信號(hào)。15us
之內(nèi)將所需寫的位送到數(shù)據(jù)線上,
for(i=8;i>0;i--) //在15~60us 之間對(duì)數(shù)據(jù)線進(jìn)行采樣,如果是高電平就寫
1,低寫0 發(fā)生。
{
DQ=0; //在開始另一個(gè)寫周期前必須有1us 以上的高電平恢復(fù)期。
DQ=dat&0x01;
delay(5);
DQ=1;
dat>>=1;
}
delay(4);
}
void ReadTemperature(void)
{
Init_DS18B20(); //初始化
WriteOneChar(0xcc); //跳過讀序列號(hào)的操作
WriteOneChar(0x44); //啟動(dòng)溫度轉(zhuǎn)換
delay(125); //轉(zhuǎn)換需要一點(diǎn)時(shí)間,延時(shí)
Init_DS18B20(); //初始化
WriteOneChar(0xcc); //跳過讀序列號(hào)的操作
WriteOneChar(0xbe); //讀溫度寄存器(頭兩個(gè)值分別為溫度的低位和高位)
tempL=ReadOneChar(); //讀出溫度的低位LSB
tempH=ReadOneChar(); //讀出溫度的高位MSB
if(tempH>0x7f) //最高位為1 時(shí)溫度是負(fù)
UnRegistered
{
tempL=~tempL; //補(bǔ)碼轉(zhuǎn)換,取反加一
tempH=~tempH+1;
fg=0; //讀取溫度為負(fù)時(shí)fg=0
}
sdata = tempL/16+tempH*16; //整數(shù)部分
xiaoshu1 = (tempL&0x0f)*10/16; //小數(shù)第一位
xiaoshu2 = (tempL&0x0f)*100/16%10;//小數(shù)第二位
xiaoshu=xiaoshu1*10+xiaoshu2; //小數(shù)兩位
}
void Led(unsigned int date)
{
if(fg==1)
{
P2=0xf7; //P1.3=0,選通第四位,小數(shù)點(diǎn)第二位
P0=seg7code[date/10]; //十位數(shù),查表,輸出
delay1ms();
P0=0xff; //消影
P2=0xfb; //P1.3=0,選通第三位,小數(shù)點(diǎn)第一位
P0=seg7codeB[date%10];
delay1ms();
P0=0xff; //消影
P2=0xfd; //P1.1=0,選通第二位,個(gè)位數(shù)
P0=seg7code[xiaoshu1];
delay1ms();
P0=0xff; //消影
P2=0xfe; //P1.0=0,選通第一位
P0=seg7code[xiaoshu2];
delay1ms();
P0=0xff; //消影
}
if(fg==0) //溫度為負(fù)時(shí)顯示的數(shù)據(jù)
{
P2=0xfe; //P1.0=0,選通第一位
P0=seg7code[11]; //顯示負(fù)號(hào)
delay1ms();
P0=0xff; //消影
P2=0xfd; //P1.1=0,選通第二位,十位數(shù)
P0=seg7code[date/10];
UnRegistered
delay1ms();
P0=0xff; //消影
P2=0xfb; //P1.3=0,選通第三位,個(gè)位數(shù)
P0=seg7codeB[date%10];
delay1ms();
P0=0xff; //消影
P2=0xf7; //P1.3=0,選通第四位,小數(shù)點(diǎn)第一位
P0=seg7code[xiaoshu1];
delay1ms();
P0=0xff; //消影
}
}
main()
{
while(1)
{
ReadTemperature();
Led(sdata);
}
}
13.4 下載驗(yàn)證
下載完成后,我們可以看到數(shù)碼管顯示溫度了。說明DS18B20 開始工作了。
UnRegistered
第一十四章 紅外遙控實(shí)驗(yàn)
上一章我們介紹了DS18B20,本章我們將學(xué)習(xí)紅外遙控接收頭。同樣我們也需
要關(guān)注紅外接收頭的讀1 或0 時(shí)序。本章分為如下幾個(gè)部分:
14.1 紅外接收頭簡介
14.2 硬件設(shè)計(jì)
14.3 軟件設(shè)計(jì)
14.4 下載驗(yàn)證
UnRegistered
13.1 紅外接收頭簡介
紅外線接收頭就是接收紅外線的元件。紅外線的光譜位于紅色光之外, 波
長是0.76~1.5μm,比紅光的波長還長。紅外遙控是利用紅外線進(jìn)行傳遞信息
的一種控制方式,紅外遙控具有抗干擾,電路簡單,容易編碼和解碼,功耗小,
成本低的優(yōu)點(diǎn)。紅外遙控幾乎適用所有家電的控制。
紅外遙控時(shí)序圖
上圖是紅外遙控接收頭的基本時(shí)序,詳細(xì)資料,請(qǐng)參考開發(fā)板的實(shí)驗(yàn)20(紅外
遙控?cái)?shù)碼管顯示實(shí)驗(yàn))目錄下的資料。
14.2 硬件設(shè)計(jì)
注意:記得短接J15,J10 跳線帽
14.3 軟件設(shè)計(jì)
程序來自開發(fā)板的實(shí)驗(yàn)20(紅外遙控解碼數(shù)碼管顯示實(shí)驗(yàn))
void main()
{
unsigned int a;
IRIN=1; //I/O 口初始化
IE=0x81; //允許總中斷中斷,使能 INT0 外部中斷
TCON=TCON|0x01; //觸發(fā)方式為脈沖負(fù)邊沿觸發(fā)
while(1)
{
for(a=100;a>0;a--)
{
display();
}
}
UnRegistered
}
void IR_IN() interrupt 0 using 0
{
unsigned char j,k,N=0;
unsigned char q=0;
EX0 = 0;
delay(15);
if (IRIN==1)
{
EX0 =1;
return;
}
//確認(rèn)IR 信號(hào)出現(xiàn)
while (!IRIN) //等IR 變?yōu)楦唠娖剑^9ms 的前導(dǎo)低電平信
號(hào)。
delay(1);
for (j=0;j<4;j++) //收集四組數(shù)據(jù)
{
for (k=0;k<8;k++) //每組數(shù)據(jù)有8 位
{
while (IRIN) //等 IR 變?yōu)榈碗娖剑^4.5ms 的前
導(dǎo)高電平信號(hào)。
{delay(1);}
while (!IRIN) //等 IR 變?yōu)楦唠娖?br />
delay(1);
while (IRIN) //計(jì)算IR 高電平時(shí)長
{
delay(1);
N++;
if (N>=30)
{
EX0=1;
return;
} //0.14ms 計(jì)數(shù)過長自動(dòng)離開。
} //高電平計(jì)數(shù)完畢
IRCOM[j]=IRCOM[j] >> 1; //數(shù)據(jù)最高位補(bǔ)“0”
if(N>=8)
{
IRCOM[j] = IRCOM[j] | 0x80; //數(shù)據(jù)最高位補(bǔ)“1”
}
N=0;
}
UnRegistered
}
if(IRCOM[2]!=~IRCOM[3])
{
EX0=1;
return;
}
IRCOM[5]=IRCOM[2] & 0x0F; //取鍵碼的低四位
IRCOM[6]=IRCOM[2] >> 4; //右移4 次,高四位變?yōu)榈退奈?br />
if(IRCOM[5]>9)
{
IRCOM[5]=IRCOM[5]+0x37;
}
else
IRCOM[5]=IRCOM[5]+0x30;
if(IRCOM[6]>9)
{
IRCOM[6]=IRCOM[6]+0x37;
}
else
IRCOM[6]=IRCOM[6]+0x30;
q= (((IRCOM[6]&0x0f)<<4) + (IRCOM[5]&0x0f));
switch(q) //判斷按鍵鍵碼值
{
case 0x16:m=0;break; //串口發(fā)送0
case 0x03:m=1;break; //串口發(fā)送01
case 0x18:m=2;break; //串口發(fā)送02
case 0x55:m=3;break; //串口發(fā)送03
case 0x08:m=4;break; //串口發(fā)送04
case 0x13:m=5;break; //串口發(fā)送05
case 0x51:m=6;break; //串口發(fā)送06
case 0x42:m=7;break; //串口發(fā)送07
case 0x52:m=8;break; //串口發(fā)送08
case 0x41:m=9;break; //串口發(fā)送09
default :break;
}
UnRegistered
EX0 = 1;
}
14.4 下載驗(yàn)證
當(dāng)我們?cè)谶b控器上按下0~9 這里面的任意一個(gè)數(shù)字時(shí),數(shù)碼管上面將會(huì)顯示
我們按下的鍵值。
UnRegistered
第十五章 超聲波測(cè)距模塊
前一章,我們學(xué)習(xí)了紅外遙控接收器。本章我們將學(xué)習(xí)超聲波測(cè)距。當(dāng)然和
前面的有點(diǎn)不同,本章將使用紅外遙控模塊來測(cè)距。這章的內(nèi)容相比前章的內(nèi)容,
就簡單很多。本章分為如下幾個(gè)部分:
15.1 超聲波模塊工作原理
15.2 硬件設(shè)計(jì)
15.3 軟件設(shè)計(jì)
15.4 下載驗(yàn)證
UnRegistered
15.1 超聲波模塊工作原理
(1)采用IO 觸發(fā)測(cè)距,給至少10us 的高電平信號(hào);
(2)模塊自動(dòng)發(fā)送8 個(gè)40khz 的方波,自動(dòng)檢測(cè)是否有信號(hào)返回;
(3)有信號(hào)返回,通過IO 輸出一高電平,高電平持續(xù)的時(shí)間就是超聲波從發(fā)射到
返回的時(shí)間.測(cè)試距離=(高電平時(shí)間*聲速(340M/S))/2;
關(guān)鍵點(diǎn)是對(duì)輸入高電平的捕獲。因?yàn)?1 單片機(jī)沒有相應(yīng)的捕獲功能,所以我們這里就使用
中斷來計(jì)算高電平時(shí)間。
15.2 硬件設(shè)計(jì)
注意:短接J10 跳線帽(數(shù)碼管)。接線:模塊TRIG 接 P1.2 ECH0 接P1.1
15.3 軟件設(shè)計(jì)
程序來自開發(fā)板的實(shí)驗(yàn)31(超聲波測(cè)距數(shù)碼管顯示)
void delay1ms()
{
unsigned char i;
for(i=124;i>0;i--); //延時(shí)124*8+10=1002us
}
void Display(void) //掃描數(shù)碼管
{
UnRegistered
P2=0xf7;
P0=discode[disbuff[0]]&0x7f;
delay1ms();
P0=0xff; //消影
P2=0xfb;
P0=discode[disbuff[1]];
delay1ms();
P0=0xff; //消影
P2=0xfd;
P0=discode[disbuff[2]];
delay1ms();
P0=0xff; //消影
}
Conut(void)
{
time=TH0*256+TL0;
TH0=0;
TL0=0;
S=(time*1.7)/100; //算出來是CM
if((S>=700)||flag==1) //超出測(cè)量范圍顯示“-”
{
flag=0;
disbuff[0]=10; //“-”
disbuff[1]=10; //“-”
disbuff[2]=10; //“-”
}
else
{
disbuff[0]=S%1000/100;
disbuff[1]=S%1000%100/10;
disbuff[2]=S%1000%10 %10;
}
}
void zd0() interrupt 1 //T0 中斷用來計(jì)數(shù)器溢出,超過測(cè)距范圍
{
flag=1; //中斷溢出標(biāo)志
}
void zd3() interrupt 3 //T1 中斷用來掃描數(shù)碼管和計(jì)800MS
啟動(dòng)模塊
{
TH1=0xf8;
UnRegistered
TL1=0x30;
Display();
timer++;
if(timer>=400)
{
timer=0;
TX=1; //800MS 啟動(dòng)一次模塊
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TX=0;
}
}
void main(void)
{
TMOD=0x11; //設(shè)T0 為方式1,GATE=1;
TH0=0;
TL0=0;
TH1=0xf8; //2MS 定時(shí)
TL1=0x30;
ET0=1; //允許T0 中斷
ET1=1; //允許T1 中斷
TR1=1; //開啟定時(shí)器
EA=1; //開啟總中斷
while(1)
{
UnRegistered
while(!RX); //當(dāng)RX 為零時(shí)等待
TR0=1; //開啟計(jì)數(shù)
while(RX); //當(dāng)RX 為1 計(jì)數(shù)并等待
TR0=0; //關(guān)閉計(jì)數(shù)
Conut(); //計(jì)算
}
}
15.4 下載驗(yàn)證
UnRegistered |
評(píng)分
-
查看全部評(píng)分
|