第一篇:單片機(jī)課程設(shè)計(jì)
武漢理工大學(xué)單片機(jī)實(shí)訓(xùn)報(bào)告
第一章 緒論.....................................................................................................................................2 1.1概述....................................................................................................................................2 1.2課程設(shè)計(jì)任務(wù).....................................................................................................................2 第二章硬件系統(tǒng)設(shè)計(jì).......................................................................................................................3 2.1單片機(jī)最小系統(tǒng).................................................................................................................3 2.1.1 STC89C52的介紹.....................................................................................................3 2.1.2 stc89c52系列單片機(jī)最小系統(tǒng)的介紹...................................................................4 2.2矩陣鍵盤模塊.....................................................................................................................5 2.3數(shù)碼管顯示單元.................................................................................................................5 2.4 LCD1602液晶顯示電路.....................................................................................................6 2.5蜂鳴器單元.........................................................................................................................7 第三章 軟件設(shè)計(jì).............................................................................................................................8 3.1數(shù)碼管實(shí)驗(yàn).........................................................................................................................8 3.1.1循環(huán)數(shù)碼管顯示0—F程序設(shè)計(jì)結(jié)構(gòu)圖:............................................................8 3.1.2 59秒倒計(jì)數(shù)流程圖..............................................................................................9 3.2 矩陣鍵盤流程圖..............................................................................................................10 3.3 LCD1602滾動(dòng)顯示年月日時(shí)分秒....................................................................................11 3.4 AD轉(zhuǎn)換,.........................................................................................................................12 3.5家電遙控器.......................................................................................................................13 第四章調(diào)試結(jié)果分析.....................................................................................................................14 4.1數(shù)碼管調(diào)試及分析.........................................................................................................14 4.1.1循環(huán)數(shù)碼管顯示0—F...........................................................................................14 4.1.2數(shù)碼管59秒倒計(jì)數(shù)............................................................................................15 4.2矩陣鍵盤...........................................................................................................................15 4.3 LCD1602滾動(dòng)顯示年月日時(shí)分秒....................................................................................16 4.4 AD轉(zhuǎn)換.............................................................................................................................16 4.5家電遙控器.......................................................................................................................17 第五章小結(jié).....................................................................................................................................17 參考文獻(xiàn):.....................................................................................................................................18
武漢理工大學(xué)單片機(jī)實(shí)訓(xùn)報(bào)告
第一章緒論
1.1概述
隨著我國工業(yè)技術(shù)和電子技術(shù)的發(fā)展和進(jìn)步,自動(dòng)控制技術(shù)也已經(jīng)得到了極大的普及和應(yīng)用,而這些自動(dòng)控制技術(shù)的核心技術(shù)就是單片微型計(jì)算機(jī),簡稱單片機(jī)。它以其高可靠性、高性價(jià)比、低電壓、低功耗等一系列優(yōu)點(diǎn),被廣泛應(yīng)用于控制系統(tǒng)、數(shù)據(jù)采集等領(lǐng)域。而51單片機(jī)系列以其超高的性價(jià)比深受廣大電子愛好者和開發(fā)者以及大學(xué)生群體的歡迎。故而本次課程設(shè)計(jì)采用STC89C52單片機(jī)。
1.2課程設(shè)計(jì)任務(wù)
必做項(xiàng)目(這是每個(gè)學(xué)生必做的任務(wù)):
1. 基本系統(tǒng):在51單片機(jī)開發(fā)系統(tǒng)PCB電路板上完成電子元器件的焊接、調(diào)試、程序下載,并實(shí)現(xiàn)數(shù)碼管顯示、矩陣鍵盤掃描、中斷程序、定時(shí)器程序、串口通訊等基本功能; 2. 顯示功能:焊接電路并實(shí)現(xiàn)對(duì)1602液晶屏的顯示功能,要求能滾動(dòng)顯示字符;
3. 輸出控制:焊接電路并實(shí)現(xiàn)對(duì)繼電器的控制功能;
4. 數(shù)據(jù)采集:焊接電路并實(shí)現(xiàn)對(duì)AD0832的數(shù)據(jù)采集功能; 選做項(xiàng)目(以下任選一):
1. 家電遙控器:實(shí)現(xiàn)對(duì)紅外接收管和發(fā)射管的控制功能,要求能夠?qū)W習(xí)遙控器的紅外碼,并能發(fā)射相應(yīng)的編碼,實(shí)現(xiàn)紅外遙控器的功能。
2. 增強(qiáng)顯示:實(shí)現(xiàn)光魔方的功能,要求搭建不少于8*8*4單元的光魔方,能夠動(dòng)態(tài)顯示字符。
3. 空氣質(zhì)量監(jiān)測:實(shí)現(xiàn)對(duì)室外空氣PM2.5濃度測量,要求能夠?qū)崟r(shí)讀取PM2.5模塊數(shù)據(jù)計(jì)算濃度,并將結(jié)果顯示在屏幕中,或者通過無線方式發(fā)送到PC機(jī)中顯示,或者超過設(shè)定值啟動(dòng)電機(jī)模擬開關(guān)窗。
4. 入侵在線報(bào)警:要求通過采集遠(yuǎn)紅外傳感器數(shù)據(jù),自動(dòng)觸發(fā)相機(jī)模塊抓拍,照片發(fā)至PC或網(wǎng)絡(luò)中。
5. 穿戴式設(shè)備控制:對(duì)陀螺儀傳感器的數(shù)據(jù)采集和處理,要求能根據(jù)采集到的數(shù)據(jù)計(jì)算出傳感器加速度值,識(shí)別基本動(dòng)作觸發(fā)繼電器開合,模擬啟動(dòng)外部設(shè)備。
6. 智能臺(tái)燈:根據(jù)環(huán)境光強(qiáng)度自動(dòng)調(diào)節(jié)LED亮度,通過光敏元器件采集環(huán)境亮度,通過PWM方式控制LED燈亮度。定時(shí)自動(dòng)開燈,設(shè)定開燈時(shí)間,到時(shí)間由暗逐漸變亮。通過門控檢測夜晚有人回家時(shí)自動(dòng)開啟LED燈等功能。
7. 火災(zāi)在線探測:采集煙感/異味傳感器數(shù)據(jù),并進(jìn)行判斷有無火情,繼而控制繼電器動(dòng)作同時(shí)通過無線發(fā)送信息到PC或網(wǎng)絡(luò)中。
8. 智能門磁:設(shè)計(jì)門磁開關(guān),一端安裝門上,另一端安裝在門框。讀取霍爾傳感器輸出,確定門開合狀態(tài),并在門狀態(tài)變化時(shí)發(fā)送提示信息到PC或者網(wǎng)絡(luò)中。
9. 智能窗簾:根據(jù)光強(qiáng)變化、夜晚休息、人離開等多種條件自動(dòng)開閉窗簾??梢栽O(shè)計(jì)導(dǎo)軌及電機(jī)控制機(jī)構(gòu)。10. 智能信息提示:每天早上自動(dòng)搜集門戶網(wǎng)站頭條新聞、當(dāng)天天氣情況等,武漢理工大學(xué)單片機(jī)實(shí)訓(xùn)報(bào)告
滾動(dòng)顯示在屏幕中。也可以將用戶設(shè)定的提醒信息從PC機(jī)推送至單片機(jī)系統(tǒng)顯示;也可以若置于門背,開門時(shí)顯示重要提示信息。
上述無線方式包括WIFI,藍(lán)牙,Zigbee,433M等多種
第二章硬件系統(tǒng)設(shè)計(jì)
2.1單片機(jī)最小系統(tǒng) 2.1.1 STC89C52的介紹
STC89C52是一種帶8K字節(jié)閃爍可編程可擦除只讀存儲(chǔ)器的低電壓,高性能COMOS8的微處理器,俗稱單片機(jī)。該器件采用ATMEL高密度非易失存儲(chǔ)器制作技術(shù)制造,與工業(yè)標(biāo)準(zhǔn)的MCS-51指令集和輸出管腳相兼容。其引腳圖如下圖所示。
圖2.1 STC89C52單片機(jī)
STC89C52RC引腳功能說明:
VCC(40引腳):電源電壓 VSS(20引腳):接地
P0端口(P0.0~P0.7,39~32引腳):P0口是一個(gè)漏極開路的8位雙向I/O口。
P1端口(P1.0~P1.7,1~8引腳):P1口是一個(gè)帶內(nèi)部上拉電阻的8位雙向I/O口。
P2端口(P2.0~P2.7,21~28引腳):P2口的基本功能和P1端口相同。P3端口(P3.0~P3.7,10~17引腳):P3口的基本功能和P1端口相同。
ALE/(30引腳):地址鎖存控制信號(hào)(ALE)是訪問外部程序存儲(chǔ)器時(shí),鎖存低8位地址的輸出脈沖。
武漢理工大學(xué)單片機(jī)實(shí)訓(xùn)報(bào)告
2.1.2 stc89c52系列單片機(jī)最小系統(tǒng)的介紹
單片機(jī)最小系統(tǒng)是單片機(jī)工作的最簡單電路,它由單片機(jī)、電源、晶體振蕩器、復(fù)位電路等構(gòu)成。它是本系統(tǒng)的處理單元也是控制單元,負(fù)責(zé)處理信號(hào)、外設(shè)的接口與控制,同時(shí)它也是所有軟件的載體。對(duì)52單片機(jī)來說,最小系統(tǒng)一般應(yīng)該包括:單片機(jī)、時(shí)鐘電路、復(fù)位電路、輸入/ 輸出設(shè)備等。52單片機(jī)最小系統(tǒng)見下圖。
圖2.1.2 STC89C52單片機(jī)最小系統(tǒng)
(1)時(shí)鐘電路:
XTAL1(19 腳):芯片內(nèi)部振蕩電路輸入端。
XTAL2(18 腳):芯片內(nèi)部振蕩電路輸出端。
XTAL1 和XTAL2 是獨(dú)立的輸入和輸出反相放大器,它們可以被配置為使用石英晶振的片內(nèi)振蕩器,或者是器件直接由外部時(shí)鐘驅(qū)動(dòng)。圖2-2 中采用的是內(nèi)時(shí)鐘模式,即采用利用芯片內(nèi)部的振蕩電路,在XTAL1、XTAL2 的引腳上外接定時(shí)元件(一個(gè)石英晶體和兩個(gè)電容),內(nèi)部振蕩器便能產(chǎn)生自激振蕩。
(2)復(fù)位電路:
在單片機(jī)系統(tǒng)中,復(fù)位電路是非常關(guān)鍵的,當(dāng)程序跑飛(運(yùn)行不正常)或死機(jī)(停止運(yùn)行)時(shí),就需要進(jìn)行復(fù)位。
5l 系列單片機(jī)的復(fù)位引腳RST(第9 管腳)出現(xiàn)2個(gè)機(jī)器周期以上的高電平時(shí),單片機(jī)就執(zhí)行復(fù)位操作。如果RST 持續(xù)為高電平,單片機(jī)就處于循環(huán)復(fù)位狀態(tài)。
武漢理工大學(xué)單片機(jī)實(shí)訓(xùn)報(bào)告
2.2矩陣鍵盤模塊
矩陣鍵盤的工作原理是:從0行開始,順序行掃描,即該行輸出為0。每掃描一行,讀入列線數(shù)據(jù),從0開始,列檢查,找該行輸出為0的列,若無,則順序掃描下一行,并檢查其各列;若找到某列線為0,則該列與檢查行交叉的按鍵為被按下的鍵。從0行0列開始,順序?qū)存I編號(hào),就可以按掃描的值得到按鍵的值。此外還要消除按鍵在閉合或斷開時(shí)的抖動(dòng)。消除抖動(dòng)的方法可采用消抖電路(RS觸發(fā)器閂鎖電路硬件消除抖動(dòng)),也克采用延時(shí)方式軟件消除抖動(dòng)(延時(shí)后再重讀,以跳過抖動(dòng)期)。在矩陣鍵盤中,通常采用軟件消除抖動(dòng)。
本設(shè)計(jì)中主要使用了獨(dú)立鍵盤,故電路圖中簡要的畫出了4*4的矩陣鍵盤,其電路原理圖如圖2.2所示
圖2.2矩陣鍵盤
2.3數(shù)碼管顯示單元
本次設(shè)計(jì)的顯示單元是由4個(gè)共陰的7段LED數(shù)碼管組成的顯示電路。原理電路圖見圖2.3所示:
圖2.3數(shù)碼管顯示單元
如上圖所示,4個(gè)數(shù)碼管的段選和位選分別由單片機(jī)的不同IO口控制,此圖用
武漢理工大學(xué)單片機(jī)實(shí)訓(xùn)報(bào)告
了一個(gè)鎖存器74HC573來實(shí)現(xiàn)數(shù)碼管的段選,而其位選則由單片機(jī)的其他IO口控制。
2.4LCD1602液晶顯示電路
本次課程設(shè)計(jì)采用的液晶顯示屏是LCD1602,其具有體積小、功耗小、顯示操作簡單LCD1602主要技術(shù)參數(shù): 顯示容量:16×2個(gè)字符 芯片工作電壓:4.5—5.5V 工作電流:2.0mA(5.0V)模塊最佳工作電壓:5.0V
字符尺寸:2.95×4.35(W×H)mm
LCD1602采用標(biāo)準(zhǔn)的14腳(無背光)或16腳(帶背光)接口,各引腳接口說明如表所示:
引腳功能說明: 第1腳:VSS為地電源。第2腳:VDD接5V正電源。
第3腳:VL為液晶顯示器對(duì)比度調(diào)整端,接正電源時(shí)對(duì)比度最弱,接地時(shí)對(duì)比度最高,對(duì)比度過高時(shí)會(huì)產(chǎn)生“鬼影”,使用時(shí)可以通過一個(gè)10K的電位器調(diào)整對(duì)比度。
第4腳:RS為寄存器選擇,高電平時(shí)選擇數(shù)據(jù)寄存器、低電平時(shí)選擇指令寄存器。
第5腳:R/W為讀寫信號(hào)線,高電平時(shí)進(jìn)行讀操作,低電平時(shí)進(jìn)行寫操作。當(dāng)RS和R/W共同為低電平時(shí)可以寫入指令或者顯示地址,當(dāng)RS為低電平R/W為高電平時(shí)可以讀忙信號(hào),當(dāng)RS為高電平R/W為低電平時(shí)可以寫入數(shù)據(jù)。第6腳:E端為使能端,當(dāng)E端由高電平跳變成低電平時(shí),液晶模塊執(zhí)行命令。
武漢理工大學(xué)單片機(jī)實(shí)訓(xùn)報(bào)告
第7~14腳:D0~D7為8位雙向數(shù)據(jù)線。第15腳:背光源正極。第16腳:背光源負(fù)極。其原理圖如圖2.4所示:
圖2.4LCD1602接口電路
2.5蜂鳴器單元
本次課程設(shè)計(jì)采用的蜂鳴器為電磁式蜂鳴,其采用直流供電,其可分為兩種類型:有源式和無源式。本次課程設(shè)計(jì)采用的為無源蜂鳴。其原理圖如圖2.5所示:
武漢理工大學(xué)單片機(jī)實(shí)訓(xùn)報(bào)告
圖2.5蜂鳴器
第三章 軟件設(shè)計(jì)
3.1數(shù)碼管實(shí)驗(yàn)
3.1.1循環(huán)數(shù)碼管顯示0—F程序設(shè)計(jì)結(jié)構(gòu)圖:
實(shí)驗(yàn)要求:能循環(huán)數(shù)碼管顯示0—F
武漢理工大學(xué)單片機(jī)實(shí)訓(xùn)報(bào)告
圖3.1.1循環(huán)數(shù)碼管顯示0—F
3.1.2 59秒倒計(jì)數(shù)流程圖
實(shí)驗(yàn)要求:能用定時(shí)器循環(huán)顯示59秒倒計(jì)時(shí)。
武漢理工大學(xué)單片機(jī)實(shí)訓(xùn)報(bào)告
圖3.1.2 數(shù)碼管59秒倒計(jì)數(shù)
3.2 矩陣鍵盤流程圖
實(shí)驗(yàn)要求:實(shí)現(xiàn)按鍵檢測能用按鍵控制數(shù)碼管加減,控制定時(shí)器的啟動(dòng)和停止 0
武漢理工大學(xué)單片機(jī)實(shí)訓(xùn)報(bào)告
圖3.2矩陣鍵盤
3.3 LCD1602滾動(dòng)顯示年月日時(shí)分秒
實(shí)驗(yàn)要求:要求用1602滾動(dòng)顯示年月日時(shí)分秒,并可發(fā)送到上位機(jī),上位機(jī)可修改1602上顯示的時(shí)間1
武漢理工大學(xué)單片機(jī)實(shí)訓(xùn)報(bào)告
3.4 AD轉(zhuǎn)換,實(shí)驗(yàn)要求:實(shí)現(xiàn)AD采集電阻的電壓,并把采集到的數(shù)據(jù)通過串口傳送給上位機(jī)。2
武漢理工大學(xué)單片機(jī)實(shí)訓(xùn)報(bào)告
3.5家電遙控器
實(shí)驗(yàn)要求:實(shí)現(xiàn)對(duì)紅外接收管和發(fā)射管的控制功能,要求能夠?qū)W習(xí)遙控器的紅外碼,并能發(fā)射相應(yīng)的編碼,實(shí)現(xiàn)紅外遙控器的功能。
圖3.5家電遙控器接收紅外數(shù)據(jù)3
武漢理工大學(xué)單片機(jī)實(shí)訓(xùn)報(bào)告
第四章調(diào)試結(jié)果分析
4.1數(shù)碼管調(diào)試及分析
4.1.1循環(huán)數(shù)碼管顯示0—F 數(shù)碼管位選接單片機(jī)的P2口,段選接+5V電壓。當(dāng)用KEIL軟件把程序編號(hào)以后點(diǎn)擊編譯按鈕,程序便編譯好了,然后通過數(shù)據(jù)線把生成的HEX文下載進(jìn)單片機(jī),其實(shí)驗(yàn)現(xiàn)象如圖4.1.1所示為數(shù)碼管循環(huán)顯示的部分圖片。
圖
4.1.1數(shù)碼管循環(huán)顯示 由其現(xiàn)象可知其程序調(diào)試成功。4
武漢理工大學(xué)單片機(jī)實(shí)訓(xùn)報(bào)告
4.1.2數(shù)碼管59秒倒計(jì)數(shù)
數(shù)碼管的段選端接單片機(jī)的P2口,四個(gè)位選端接單片機(jī)P0端口,當(dāng)編譯好后,并把線路連接好后,數(shù)碼管變開始從60開始每隔一秒倒計(jì)數(shù),當(dāng)記到0時(shí),數(shù)碼管的值便又變成60,如此開始循環(huán)。其部分實(shí)驗(yàn)現(xiàn)象圖如圖4.1.2所示:
圖4.2.1數(shù)碼管59秒倒計(jì)數(shù)
4.2矩陣鍵盤
矩陣鍵盤的接口接單片機(jī)的P1口,數(shù)碼管的段選端接單片機(jī)的P2口,四個(gè)位選端接單片機(jī)P0端口。當(dāng)開始運(yùn)行程序時(shí)矩陣鍵盤從0行開始,順序行掃描,即該行輸出為0。每掃描一行,讀入列線數(shù)據(jù),從0開始,列檢查,找該行輸出為0的列,若無,則順序掃描下一行,并檢查其各列;若找到某列線為0,則該列與檢查行交叉的按鍵為被按下的鍵。通過賦予相應(yīng)按鍵++或——或停止數(shù)碼管中斷的功能并對(duì)相應(yīng)按鍵進(jìn)行編程即可實(shí)現(xiàn)數(shù)碼管++、——、讓定時(shí)器停止的功能。其實(shí)驗(yàn)現(xiàn)像如下:
圖4.2矩陣鍵盤控制數(shù)碼管加數(shù)字加減及定時(shí)器開啟及停止 5
武漢理工大學(xué)單片機(jī)實(shí)訓(xùn)報(bào)告
4.3 LCD1602滾動(dòng)顯示年月日時(shí)分秒
本次設(shè)計(jì)的程序的LCD數(shù)據(jù)端接單片機(jī)的P0口,E,RW,RS分別接P3.7,P3.6,P3.5。矩陣鍵盤接單片機(jī)的P1口。當(dāng)程序正確運(yùn)行時(shí)應(yīng)該可以在LCD1602上看到年月日,和時(shí)分秒的時(shí)間,且此時(shí)正在計(jì)時(shí)。其實(shí)驗(yàn)現(xiàn)象如下圖所示:
圖4.3LCD1602滾動(dòng)顯示年月日時(shí)分秒
由實(shí)驗(yàn)現(xiàn)象可知程序調(diào)試成功。
4.4 AD轉(zhuǎn)換
本次實(shí)驗(yàn)采用的AD是ADC0832,它是一款8位AD。其各控制引腳接線如下Cs= P1^0;Clk= P1^1;Di=P1^7;Do= P1^7;其通道1接可調(diào)電阻,通道應(yīng)為不用顧不接。當(dāng)程序正確運(yùn)行時(shí)可以在LCD1602上看到通道1所測試的電壓值。并可以通過串口調(diào)試助手看到單片機(jī)發(fā)送到串口調(diào)試助手的電壓值。其實(shí)驗(yàn)現(xiàn)象如圖4.4所示: 6
武漢理工大學(xué)單片機(jī)實(shí)訓(xùn)報(bào)告
圖4.4 AD轉(zhuǎn)換
由以上實(shí)驗(yàn)現(xiàn)象可知和預(yù)測的功能相同顧本次實(shí)驗(yàn)調(diào)試成功。
4.5家電遙控器
本次遙控器實(shí)驗(yàn)采用的是NEC編碼方式對(duì)遙控器的鍵值進(jìn)行編碼,以及對(duì)遙控器發(fā)送的紅外線進(jìn)行解碼。其編碼圖如圖4.5所示
圖4.5 紅外編碼時(shí)序圖
由次時(shí)序圖可見,本次紅外編碼成功。
第五章小結(jié)
經(jīng)過這次為期一周的單片機(jī)實(shí)訓(xùn),讓我受益匪淺。通過這次實(shí)訓(xùn),使我不僅對(duì)單片機(jī)的各個(gè)模塊更加的了解了,而且加深了我對(duì)于單片機(jī)這門課程知識(shí)的理解。這次實(shí)訓(xùn)不僅提高了我的編程能力,同時(shí)也提高了我的動(dòng)手能力。在剛開始拿到單片機(jī)最小系統(tǒng)板的硬件時(shí),面對(duì)這那些細(xì)如針眼芯片引腳和及其微小的貼片電阻,我感到了十分的無助,然而通過學(xué)長的演示和詢問其他同學(xué)焊接方法,漸漸的我逐漸掌握了方法。焊接貼片電阻和芯片的速度也逐漸變快,然而當(dāng)7
武漢理工大學(xué)單片機(jī)實(shí)訓(xùn)報(bào)告
焊完芯片和貼片電阻后卻發(fā)現(xiàn)下載不來程序,經(jīng)過我用萬用表對(duì)每個(gè)部件的電位進(jìn)行檢查后發(fā)現(xiàn),原來焊接的下載芯片的引腳有些部位是虛焊,因而下不進(jìn)程序,當(dāng)我對(duì)虛焊部位重新焊了一遍后,單片機(jī)才可以下載程序。然而在后來的編程過程中我也遇到了許多小問題,讓我調(diào)了很久的程序,比如把變量的的類型定義錯(cuò)誤,該定義為全局變量的變量我定義成了局部變量等等,總之這一次實(shí)訓(xùn)讓我受益匪淺,使我認(rèn)識(shí)到了自身知識(shí)的匱乏,督促我去提升自己。
參考文獻(xiàn):
[1] 李群芳,張士軍等.《單片微型計(jì)算機(jī)與接口技術(shù)》(第三版).電子工業(yè)出版社.出版年份:2008年。
[2] 楊路明《.C語言程序設(shè)計(jì)教程》.北京郵電大學(xué)出版社.出版年份:2005年。
[4] 趙亮,侯國銳.《單片機(jī)C語言編程與實(shí)例》.人民郵電出版社.出版年份:2007年。
[5] 彭虎, 周佩玲, 傅忠謙.《單片機(jī)原理與接口技術(shù)》(第二版).電子工業(yè)出版社.出版年份:2008年。
[5] 郭天祥,《新概念51單片機(jī)C語言教程》,電子工業(yè)出版社,出版年份:2010年.8
武漢理工大學(xué)單片機(jī)實(shí)訓(xùn)報(bào)告
實(shí)驗(yàn)5家電遙控器程序:
紅外編碼程序:
#include “reg52.h” #define uchar unsigned char #define uint unsigned int uchar key,key1,key2,key3,key4;sbit IR_OUT=P1^0;void delay_ms(uint ms){
uint i,j;
for(i=0;i<120;i++)
{
for(j=0;j } } //T1 13us產(chǎn)生一次中斷 用于產(chǎn)生38K載波((1/26)*1000000 //T0 方式1 16位 用于定時(shí) void Init_Timer(void)//初始化定時(shí)器1方式2 { TMOD=0x21;//T0 mode 1 ,T1 mode 2(8位自動(dòng)重裝初值) TH1=256-(1000*11.0592/38.0/12)/2+0.5;//(0.5為誤差) //特殊 TL1=256-(1000*11.0592/38.0/12)/2+0.5; ET1=1;//開定時(shí)器中斷1 EA=1;//開總中斷 } //發(fā)送引導(dǎo)碼(9ms)發(fā)送方:4.5ms高電平+4.5ms低電平.void Send_Start_Bit(void)//TR1的值=發(fā)送的電平{ //4.5ms 1 TH0=(65536-8295)/256; TL0=(65536-8295)%256; TR0=1;// 啟動(dòng)定時(shí)器0; TR1=1; while(!TF0); TR1=0; TF0=0;//定時(shí)器0溢出標(biāo)志位。 TR0=0;//關(guān)閉定時(shí)器0.武漢理工大學(xué)單片機(jī)實(shí)訓(xùn)報(bào)告 IR_OUT=0; //4.5ms 0 TH0=(65536-4146)/256; TL0=(65536-4146)%256; TR0=1; TR1=0; while(!TF0);//等待定時(shí)器0產(chǎn)生中斷。 TR1=0;TF0=0;TR0=0; IR_OUT=0;} //發(fā)送二進(jìn)制0(0.565us載波+0.565us空閑)void Send_Bit_0(void){ //0.565us 1 載波 TH0=(65536-521)/256; TL0=(65536-521)%256;TR0=1;TR1=1; while(!TF0); TR1=0;TF0=0;TR0=0; IR_OUT=0;//0.565us 0 空閑 TH0=(65536-521)/256; TL0=(65536-521)%256;TR0=1;TR1=0; while(!TF0); TR1=0;TF0=0;TR0=0; 武漢理工大學(xué)單片機(jī)實(shí)訓(xùn)報(bào)告 IR_OUT=0;} //發(fā)送二進(jìn)制 1(0.565us載波+1.685ms空閑)void Send_Bit_1(void){ //0.565us 1 載波 TH0=(65536-521)/256; TL0=(65536-521)%256;TR0=1;TR1=1; while(!TF0); TR1=0;TF0=0;TR0=0; IR_OUT=0;//1.685ms 0 空閑 TH0=(65536-1563)/256; TL0=(65536-1563)%256;TR0=1;TR1=0; while(!TF0); TR1=0;TF0=0;TR0=0; IR_OUT=0;/*****************************************/ } void Send_over(void)//發(fā)送一個(gè)結(jié)束碼,因?yàn)樽詈笠粋€(gè)位只有遇到下降沿才能讀?。òl(fā)射端的上升沿){ //0.565us 1 //小于0.5us 接收端很難識(shí)別到 TH0=(65536-521)/256; TL0=(65536-521)%256;TR0=1;TR1=1; 武漢理工大學(xué)單片機(jī)實(shí)訓(xùn)報(bào)告 while(!TF0); TR1=0;TF0=0;TR0=0; IR_OUT=0;//0.565us 0 TH0=(65536-521)/256; TL0=(65536-521)%256;TR0=1;TR1=0; while(!TF0); TR1=0;TF0=0;TR0=0; IR_OUT=0;} //發(fā)送一字節(jié) 8位 void Send_Char(){ unsigned char i,j1,j2,Key3,Key33,Key4,Key44;j1=0xBE;//用戶碼 j2=0x41;//用戶反碼 Key3=0xDE;//key1 鍵值碼 Key33=0x20;//key1 鍵值反碼 Key4=0x30;//key2 鍵值碼 Key44=0xc0;//key2 鍵值反碼 Send_Start_Bit();//發(fā)送引導(dǎo)碼 Send_Bit_0();// for(i=0;i<8;i++){ if(j1&0x80) Send_Bit_0(); else Send_Bit_1();j1=j1<<1; 武漢理工大學(xué)單片機(jī)實(shí)訓(xùn)報(bào)告 //先發(fā)射低位 } j2=0;for(i=0;i<8;i++){ if(j2&0x80) Send_Bit_0(); else Send_Bit_1(); j2=j2<<1; //先發(fā)射低位 } for(i=0;i<8;i++) { if(key3&0x80) Send_Bit_0(); else Send_Bit_1(); key3=key3<<1; } for(i=0;i<8;i++) { if(Key33&0x80) Send_Bit_0(); else Send_Bit_1(); Key33=Key33<<1; //先發(fā)射低位 } //} for(i=0;i<8;i++) { if(Key4&0x80) Send_Bit_0(); else Send_Bit_1(); 武漢理工大學(xué)單片機(jī)實(shí)訓(xùn)報(bào)告 Key4=Key4<<1; } for(i=0;i<8;i++) { if(Key44&0x80) Send_Bit_0(); else Send_Bit_1(); Key44=Key44<<1; //先發(fā)射低位 } //} Send_over();//結(jié)束符 } void T1_ISR(void)interrupt 3 { IR_OUT=!IR_OUT;} void main(void){ Init_Timer();while(1){ Send_Char();//發(fā)送8位數(shù)據(jù) delay_ms(1000);} } 武漢理工大學(xué)單片機(jī)實(shí)訓(xùn)報(bào)告 紅外解碼程序: #include“reg52.h” #define LCD P0 #define uchar unsigned char #define uint unsigned int sbit IR_INPUT = P3^2;//紅外接收引腳 sbit E=P2^7; sbit RW=P2^5;sbit RS=P2^6;sbit int0=P3^2;uchar code tab1[11]={“key value:”};uchar code tab2[13]={“ -H”};uchar hongwaivalue[6];uchar Time;void IrInit(); void delay(uint x) //10us { unsigned char i;while(x--){ for(i = 0;i<10;i++) {} } } void write_com(uchar cmd)//寫指令函數(shù) { RS=0;RW=0;LCD=cmd;delay(1);E=1;delay(5); E=0;} void write_data(uchar dat)//寫數(shù)據(jù) { RS=1;RW=0;LCD=dat;delay(1);E=1;delay(10); 武漢理工大學(xué)單片機(jī)實(shí)訓(xùn)報(bào)告 E=0;} void lcd_init(){ write_com(0x38);write_com(0x0c); write_com(0x06);write_com(0x01);write_com(0x80);} void hongwai_init()//7./* 初始化紅外接收功能 */ { IT0=1;//下降沿觸發(fā) EX0=1;//打開中斷0允許 EA=1;//打開總中 int0=1;//初始化端口 } void lcd_display(){ hongwaivalue[4]=hongwaivalue[2]>>4; //高位 hongwaivalue[5]=hongwaivalue[2]&0x0f;//低位 if(hongwaivalue[4]>9) { write_com(0xc0+0x09); //設(shè)置顯示位置 write_data(0x37+hongwaivalue[4]);//將數(shù)值轉(zhuǎn)換為該顯示的ASCII碼 } else { write_com(0xc0+0x09); write_data(hongwaivalue[4]+0x30);//將數(shù)值轉(zhuǎn)換為該顯示的ASCII碼 } if(hongwaivalue[5]>9) { write_com(0xc0+0x0a); write_data(hongwaivalue[5]+0x37);//將數(shù)值轉(zhuǎn)換為該顯示的ASCII碼 } 武漢理工大學(xué)單片機(jī)實(shí)訓(xùn)報(bào)告 else { write_com(0xc0+0x0a); write_data(hongwaivalue[5]+0x30);//將數(shù)值轉(zhuǎn)換為該顯示的ASCII碼 } } void main(){ uchar i; hongwai_init(); lcd_init(); write_com(0x80); for(i=0;i<10;i++) { write_data(tab1[i]); } write_com(0x80+0x40); for(i=0;i<12;i++) { write_data(tab2[i]); } while(1) { lcd_display(); } } void Read()interrupt 0 { uchar j,k;uint n;Time=0; delay(70); if(int0==0)//確認(rèn)是否真的接收到正確的信號(hào) { n=1000; //1000*10us=10ms,超過說明接收到錯(cuò)誤的信號(hào) //當(dāng)兩個(gè)條件都為真則循環(huán),如果有一個(gè)條件為假的時(shí)候跳出循環(huán),免 武漢理工大學(xué)單片機(jī)實(shí)訓(xùn)報(bào)告 得 //程序出錯(cuò)的時(shí)侯,程序死在這里 while((int0==0)&&(n>0))//等待前面9ms的載波低電平過去 { delay(1);//10us n--; } 鍵碼反碼) 過去 if(int0==1) //如果正確等到9ms低電平{ n=500;while((int0==1)&&(n>0))//等待4.5ms的空閑起始高電平過去 { delay(1);//10us n--;} for(k=0;k<4;k++)//共有4組數(shù)據(jù)(用戶碼、用戶反碼、鍵碼、{ for(j=0;j<8;j++)//接收一組數(shù)據(jù) { n=60; while((int0==0)&&(n>0))//等待信號(hào)前面的560us低電平 { delay(1);//10us n--; } n=500; while((int0==1)&&(n>0))//計(jì)算高電平的時(shí)間長度。 { delay(1); Time++; n--; if(Time>30) { EX0=1; return; } } hongwaivalue[k]>>=1;//k表示第幾組數(shù)據(jù) if(Time>=8) //如果高電平出現(xiàn)大于565us,那么 武漢理工大學(xué)單片機(jī)實(shí)訓(xùn)報(bào)告 是1 { hongwaivalue[k]|=0x80; } Time=0;//用完時(shí)間要重新賦值 } } } } } if(hongwaivalue[2]!=~hongwaivalue[3]){ return;} 設(shè)計(jì)題目: 單片機(jī)課程設(shè)計(jì) 學(xué)生姓名: 學(xué) 院: 電氣與信息工程學(xué)院 班 級(jí): 電子111班 指導(dǎo)教師: 日 期: 2014年9月20日 一、課程設(shè)計(jì)目的: 了解電子元器件的功能與原理,掌握單片機(jī)的結(jié)構(gòu)和原理,學(xué)會(huì)使用單片機(jī)應(yīng)用開發(fā)技術(shù)的相關(guān)軟件如 keill、STC_ISP_V394等,能夠使用c語言的語言編程簡單的功能。 二、設(shè)計(jì)的思想: 利用所提供的單片機(jī)和開發(fā)板的原理圖用keill軟件編程程序以實(shí)現(xiàn)一些功能。然后用STC_ISP_V394.exe軟件將編譯完全正確的程序生成的hxe文件下載到開發(fā)板上,再調(diào)試編譯的程序能否實(shí)現(xiàn)其所設(shè)計(jì)的功能。 1、對(duì)蜂鳴器的了解: 蜂鳴器是一種一體化結(jié)構(gòu)的電子訊響器,采用直流電壓供電,它由振蕩器、電磁線圈、磁鐵、振動(dòng)膜片及外殼組成,接通電源后,振蕩器產(chǎn)生的音頻信號(hào)由電流通過電磁線圈,使電磁線圈產(chǎn)生磁場,振動(dòng)膜片在電磁線圈和磁鐵的相互作用下,周期性的振動(dòng)發(fā)聲。 2、設(shè)計(jì): 我們所使用的開發(fā)板實(shí)物圖如圖一,單片機(jī)對(duì)右上角蜂鳴器的控制是加入三極管接入vcc,單片機(jī)的第22引腳和負(fù)極上,以此來控制蜂鳴器工作。單片機(jī)我們選擇STC89C52RC+1602液晶來實(shí)現(xiàn)對(duì)蜂鳴器的控制及顯示所需要的信息。 圖一 調(diào)試說明: 首先用Keil軟件創(chuàng)建一個(gè)工程,將程序源代碼輸入并編譯生成單片可執(zhí)行的.hex文件。其次,打開單片機(jī)實(shí)踐板的電源,接好串口線,用STC-ISP燒錄軟件,將.hex文件燒錄入單片機(jī)中。程序下載完畢后,單片機(jī)會(huì)自動(dòng)執(zhí)行程序功能。最后,觀察程序功能的執(zhí)行情況,看是否達(dá)到了設(shè)計(jì)要求。 如果單片機(jī)實(shí)踐板硬件電路的執(zhí)行結(jié)果與設(shè)計(jì)結(jié)果一致,則說明設(shè)計(jì)過程及流程沒有問題,完全符合設(shè)計(jì)要求。否則,先檢查單片機(jī)實(shí)踐板的硬件電路是否完好,是否有斷點(diǎn)、漏焊、虛焊以及元器件是否完好等情況,排除故障重新連接后重新進(jìn)行調(diào)試。如果仍然無法正 常實(shí)現(xiàn),則說明程序編寫有誤,需要認(rèn)真檢查程序流程,然后經(jīng)過反復(fù)的修改與調(diào)試排除故障,實(shí)現(xiàn)設(shè)計(jì)要求的各項(xiàng)功能。編譯和燒寫該程序到單片機(jī): (1)用Keil編譯上面的代碼,并設(shè)置產(chǎn)生16進(jìn)制代碼文件*.hex.(2)用專用下載線,連接好實(shí)驗(yàn)板和電腦串口(DB9)(2)運(yùn)行hex文件燒寫軟件STC_ISP_V394.exe 選單片機(jī)的型號(hào),并打開編譯產(chǎn)生好的hex文件 點(diǎn)擊下載,給開發(fā)板上電。 3、實(shí)現(xiàn)的功能:使用單片機(jī)將歌曲《八月桂花》的調(diào)子通過蜂鳴器播放出來,用1602液晶將想要表達(dá)的信息有步驟地顯示在液晶顯示屏上,并且調(diào)子與顯示內(nèi)容可以任意通過修改的程序燒錄到單片機(jī)內(nèi),實(shí)現(xiàn)設(shè)計(jì)產(chǎn)品的使用性與靈活性。 三、實(shí)驗(yàn)程序: /************************************************************************ [主題] C51音樂程序《八月桂花》 [功能] 通過單片機(jī)演奏音樂,顯示一些內(nèi)容 /**********************************************************************/ #include #include //本例采用89C52, 晶振為11.0592MHZ //關(guān)于如何編制音樂代碼, 其實(shí)十分簡單,各位可以看以下代碼.//頻率常數(shù)即音樂術(shù)語中的音調(diào),而節(jié)拍常數(shù)即音樂術(shù)語中的多少拍; //所以拿出譜子, 試探編吧! unsigned char i=0;sbit Beep = P2^7; unsigned char p,m; //m為頻率常數(shù)變量 unsigned char n=0;//n為節(jié)拍常數(shù)變量 unsigned char code music_tab[] ={ 0x18, 0x30, 0x1C , 0x10, //格式為: 頻率常數(shù), 節(jié)拍常數(shù), 頻率常數(shù), 節(jié)拍常數(shù),0x20, 0x40, 0x1C , 0x10,0x18, 0x10, 0x20 , 0x10,0x1C, 0x10, 0x18 , 0x40,0x1C, 0x20, 0x20 , 0x20,0x1C, 0x20, 0x18 , 0x20,0x20, 0x80, 0xFF , 0x20,0x30, 0x1C, 0x10 , 0x18,0x20, 0x15, 0x20 , 0x1C,0x20, 0x20, 0x20 , 0x26,0x40, 0x20, 0x20 , 0x2B,0x20, 0x26, 0x20 , 0x20,0x20, 0x30, 0x80 , 0xFF,0x20, 0x20, 0x1C , 0x10,0x18, 0x10, 0x20 , 0x20,0x26, 0x20, 0x2B , 0x20,0x30, 0x20, 0x2B , 0x40,0x20, 0x20, 0x1C , 0x10,0x18, 0x10, 0x20 , 0x20,0x26, 0x20, 0x2B , 0x20,0x30, 0x20, 0x2B , 0x40,0x20, 0x30, 0x1C , 0x10,0x18, 0x20, 0x15 , 0x20,0x1C, 0x20, 0x20 , 0x20,0x26, 0x40, 0x20 , 0x20,0x2B, 0x20, 0x26 , 0x20,0x20, 0x20, 0x30 , 0x80,0x20, 0x30, 0x1C , 0x10,0x20, 0x10, 0x1C , 0x10,0x20, 0x20, 0x26 , 0x20,0x2B, 0x20, 0x30 , 0x20,0x2B, 0x40, 0x20 , 0x15,0x1F, 0x05, 0x20 , 0x10,0x1C, 0x10, 0x20 , 0x20,0x26, 0x20, 0x2B , 0x20,0x30, 0x20, 0x2B , 0x40,0x20, 0x30, 0x1C , 0x10,0x18, 0x20, 0x15 , 0x20,0x1C, 0x20, 0x20 , 0x20,0x26, 0x40, 0x20 , 0x20,0x2B, 0x20, 0x26 , 0x20,0x20, 0x20, 0x30 , 0x30,0x20, 0x30, 0x1C , 0x10,0x18, 0x40, 0x1C , 0x20,0x20, 0x20, 0x26 , 0x40,0x13, 0x60, 0x18 , 0x20,0x15, 0x40, 0x13 , 0x40,0x18, 0x80, 0x00 }; void int0()interrupt 1 //采用中斷0 控制節(jié)拍 { TH0=0xd8; TL0=0xef; n--; } void delay(unsigned char m) //控制頻率延時(shí) { unsigned i=3*m; while(--i); } void delayms(unsigned char a)//豪秒延時(shí)子程序 { while(--a); //采用while(--a)不要采用while(a--);各位可編譯一下看看匯編結(jié)果就知道了! } typedef unsigned char BYTE;typedef bit BOOL; sbit LCD_RS = P2^0; sbit LCD_RW = P2^1;sbit LCD_EP = P2^2; BYTE code dis1[] = {“ WLCOME TO ”};BYTE code dis2[] = {“ DanPianJi ”};BYTE code dis3[] = {“ 111iZnaiD ”};BYTE code dis4[] = {“ eiXeiX ”}; delays(int ms){ // 延時(shí)子程序 int i;while(ms--){ for(i = 0;i< 250;i++) { _nop_(); _nop_(); _nop_(); _nop_(); } } } BOOL lcd_bz(){ // 測試LCD忙碌狀態(tài) BOOL result;LCD_RS = 0;LCD_RW = 1;LCD_EP = 1;_nop_();_nop_();_nop_();_nop_();result =(BOOL)(P0 & 0x80);LCD_EP = 0;return result;} lcd_wcmd(BYTE cmd){ while(lcd_bz());LCD_RS = 0;LCD_RW = 0;LCD_EP = 0;_nop_();_nop_();P0 = cmd;_nop_();_nop_();_nop_();_nop_();LCD_EP = 1;_nop_();_nop_();_nop_();_nop_();LCD_EP = 0; } lcd_pos(BYTE pos){ lcd_wcmd(pos | 0x80); // 寫入指令數(shù)據(jù)到LCD //設(shè)定顯示位置 } lcd_wdat(BYTE dat) { //寫入字符顯示數(shù)據(jù)到LCD while(lcd_bz());LCD_RS = 1;LCD_RW = 0;LCD_EP = 0;P0 = dat;_nop_();_nop_();_nop_();_nop_();LCD_EP = 1;_nop_();_nop_();_nop_();_nop_();LCD_EP = 0;} lcd_init(){ lcd_wcmd(0x38); delays(1);lcd_wcmd(0x0c); delays(1);lcd_wcmd(0x06); delays(1);lcd_wcmd(0x01); delays(1);} void main() { BYTE j; lcd_init(); delays(10); //LCD初始化設(shè)定 //16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)//顯示開,關(guān)光標(biāo) //移動(dòng)光標(biāo) //清除LCD的顯示內(nèi)容 // 初始化LCD lcd_wcmd(0x06); //向右移動(dòng)光標(biāo) lcd_pos(0); //設(shè)置顯示位置為第一行的第1個(gè)字符 j = 0; while(dis1[ j ]!= '
第二篇:單片機(jī)課程設(shè)計(jì)