自動檢測教學(xué)教案_第1頁
自動檢測教學(xué)教案_第2頁
自動檢測教學(xué)教案_第3頁
自動檢測教學(xué)教案_第4頁
自動檢測教學(xué)教案_第5頁
已閱讀5頁,還剩60頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、- 64 -預(yù)備項目如果同學(xué)們從來沒有做過小項目,是很難下手開展應(yīng)用項目的設(shè)計的。為此設(shè)計了幾個預(yù)備項目,用于提高同學(xué)們單片機設(shè)計的基本動手能力,為實施自動檢測技術(shù)的應(yīng)用項目設(shè)計打好基礎(chǔ)。 如果單片機課程中開展過同類項目教學(xué)的,可以跳過預(yù)備項目或者選作部分項目。預(yù)備項目1用單片機設(shè)計一個簡易的自動檢測系統(tǒng)0 任務(wù)和要求請用單片機設(shè)計一個自動檢測系統(tǒng),具體要求如下:1) 有2個傳感器輸入接口 一個用于輸入電壓,包括ADC、VCC和GND三個引腳。 一個用于輸入頻率,包括Freq、VCC和GND三個引腳。Freq可以接單片機的T1。2) 具有4位獨立式按鍵接口,包括四根IO線和一根GND。用于插接

2、四個按鍵的小鍵盤。3) 兩個LED數(shù)碼管接口,用于驅(qū)動一個四聯(lián)LED數(shù)碼管。兩個接口包括12根線,分別是8根段碼,4根位碼。通過修改程序,可以顯示時鐘、電壓、溫度、速度、距離等。4) 電路板上帶一個LED電源指示燈5) 具有一個串口通訊接口,包括VCC、RXD、TXD、GND四根線。下載程序時可用作ISP下載端口,正常工作時,可用于單片機與單片機、單片機與PC機的通訊,接上無線模塊還可以實現(xiàn)無線通訊。1 基本原理分析1.1單片機簡介單片機又叫單片微型計算機 ,是采用超大規(guī)模集成電路技術(shù)把CPU、RAM、ROM、多種I/O口和中斷系統(tǒng)、定時器/計時器等功能集成到一塊硅片上構(gòu)成的一個小而完善的微型

3、計算機系統(tǒng)。常見的單片機有很多型號,外觀如下圖所示。 圖1 各種單片機的外觀芯片的顯微圖如下所示。為了理解單片機的工作原理,我們繪制單片機的內(nèi)部方框圖如下: 圖2 單片機的顯微圖 圖3 單片機的內(nèi)部方框圖胡老師提示:教材上花費大量的篇幅去講解單片機的結(jié)構(gòu)和原理,我們不設(shè)計芯片,也不需要對芯片的內(nèi)部結(jié)構(gòu)作過多了解,其實太詳細地學(xué)習(xí)冗長的工作原理也沒有用,反而讓同學(xué)們產(chǎn)生疲勞。重要的是如何快速學(xué)會用單片機設(shè)計電子產(chǎn)品。1.2單片機的特點單片機具有體積小、功耗低、控制功能強、擴展靈活、微型化和使用方便等優(yōu)點。 因此廣泛地應(yīng)用于家用電器、工農(nóng)業(yè)自動化控制、導(dǎo)彈自動跟蹤、電子儀表等領(lǐng)域。1.3.單片機的

4、廣泛應(yīng)用現(xiàn)代人類生活中所用的幾乎每件電子和機械產(chǎn)品中都會集成有單片機。手機、電話、計算器、家用電器、電子玩具、掌上電腦以及鼠標(biāo)等電腦配件中都配有1-2部單片機。 汽車上一般配備40多部單片機。飛機上各種儀表的控制,計算機的網(wǎng)絡(luò)通訊與數(shù)據(jù)傳輸,工業(yè)自動化過程的實時控制和數(shù)據(jù)處理,廣泛使用的各種智能IC卡,民用豪華轎車的安全保障系統(tǒng),錄像機、攝像機、全自動洗衣機的控制,以及程控玩具、電子寵物、機器人、智能儀表、醫(yī)療器械等等,這些都離不開單片機。 舉例如下:單片機在電子儀表中的應(yīng)用。結(jié)合不同類型的傳感器,可實現(xiàn)諸如電壓、電流、功率、頻率、濕度、溫度、流量、速度、厚度、角度、長度、硬度、元素、壓力等物

5、理量的測量。采用單片機控制使得儀器儀表數(shù)字化、智能化、微型化,且功能比起采用電子或數(shù)字電路更加強大。單片機在自動化控制中的應(yīng)用。用單片機可以構(gòu)成形式多樣的控制系統(tǒng)、數(shù)據(jù)采集系統(tǒng)、通信系統(tǒng)、信號檢測系統(tǒng)、無線感知系統(tǒng)、測控系統(tǒng)、機器人等應(yīng)用控制系統(tǒng)。例如工廠流水線的智能化管理,電梯智能化控制、各種報警系統(tǒng),與計算機聯(lián)網(wǎng)構(gòu)成二級控制系統(tǒng)等。單片機在家用電器中的應(yīng)用。現(xiàn)在的家用電器廣泛采用了單片機控制,從電飯煲、洗衣機、電冰箱、空調(diào)機、彩電、其他音響視頻器材。2.方案論證單片機選型:常用的單片機有 8051 、 STC 、 AVR 、C8051F 和凌陽單片機等。我們選擇 STC12C5A ,是因為

6、它與8051單片機完全兼容,還提供了 ISP下載 ,無需編程器;同時具有8路ADC模擬電壓采集電路, 。鍵盤選型:單片機常用的鍵盤有 獨立式 、 矩陣式 、 ADC鍵盤 。因為按鍵較少,我們選擇 獨立式 。顯示器選型:單片機常用的顯示器有 LED數(shù)碼管 、 LCD1602 、 LCD128*64 ,為了降低成本,我們選擇LED數(shù)碼管作為數(shù)字顯示。3.電路設(shè)計書上講的單片機最小系統(tǒng)是指 剛剛能使單片機工作 的系統(tǒng)。一般包括 單片機 、 時鐘振蕩電路 、 復(fù)位電路 三部分,但是這樣的系統(tǒng)什么用也沒有。我們一般講的最小系統(tǒng)是指 最小應(yīng)用系統(tǒng) ,要增加一些別的接口,如圖所示:如 鍵盤接口 、 顯示接口

7、 、 傳感器接口、 PWM 和 通訊 接口等。3.1 STC單片機設(shè)計單片機電路都是以單片機為核心的,我們可以不了解單片機內(nèi)部結(jié)構(gòu),但是一定要了解單片機的引腳分布。不同單片機引腳都有差異,一般來說8051系列單片機有40個引腳。我們選用的STC12C5A單片機與8051兼容,引腳如下圖所示。圖4 STC單片機的引腳分布從圖中看出,包括2個電源腳(Vcc,GND)、2個時鐘腳(XTAL1,XTAL2)和32個通用IO腳。我們選用的STC單片機內(nèi)部集成了復(fù)位電路,所以沒有復(fù)位腳。32個通用IO腳又分成4組,分別叫做P0、P1、P2和P3。因為四個口都可以當(dāng)做普通的輸入輸出端,所以英文叫Port,國

8、人簡稱為P口。P3還有一些特殊功能。如P3.0和P3.1又是 通訊口 ,P3.2和P3.3同時是 外中斷 ,P3.4和P3.5又是 定時器 。特別地,STC單片機的P1口還可以當(dāng)做 ADC 用來測量端口的直流電壓。3.2 時鐘振蕩電路設(shè)計因為單片機18和19腳內(nèi)部有一個振蕩放大電路,所以在18和19腳之間外接一個石英晶體就可以產(chǎn)生時鐘振蕩。振蕩頻率由石英晶體的額定頻率決定,一般采用12MH。但是,為了設(shè)置精確的通訊波特率,我們選擇 11.0592 MHZ的晶振。為了確??煽繂⒄?,再外加兩個 33 pf的接地電容。圖5 晶體振蕩電路3.3 復(fù)位電路一般的單片機需要外接電阻和電容構(gòu)成復(fù)位電路,但是

9、STC單片機內(nèi)部已經(jīng)集成了復(fù)位電路,可以不用。為了增強可靠性,在芯片外加一個RC電路構(gòu)成復(fù)位電路也可以。3.4 鍵盤電路設(shè)計 采用獨立式按鍵設(shè)計四個按鈕,都各自獨占一根IO線,但是采用插接件與最小系統(tǒng)連接。 圖6 鍵盤電路3.5 顯示接口設(shè)計本系統(tǒng)打算采用四聯(lián)共陽LED數(shù)碼管。3.5.1 四聯(lián)LED數(shù)碼管的結(jié)構(gòu)特征 四聯(lián)共陽LED數(shù)碼管包含四個數(shù)碼管,每個數(shù)碼管包括7段數(shù)字,加小數(shù)點共8段,簡稱8段數(shù)碼管。 其內(nèi)部電路如圖7所示,每個數(shù)碼管都有8個LED發(fā)光二極管管,每個二極管的N極作為1個段,8個二極管的P極連在一起,作為公共端。四個數(shù)碼管的所有相同的段都并接在一起,每個數(shù)字的公共端單獨引出

10、,共8個段和4個位,引出12根線。圖7 四聯(lián)數(shù)碼管及其內(nèi)部電路3.5.2 四聯(lián)LED數(shù)碼管的引腳測量采用數(shù)字萬用表的二極管測量檔,任意測量2個腳,看到燈亮為一個LED發(fā)光管,此時紅表筆所接的為陽極,黑表筆為陰極。紅表筆測量的陽極固定不動,用黑表筆探索出所有的陰極,并在草圖上記下8個段的名稱(a、b、c、d、e、f、g、h);然后再固定黑表筆在任何一個陰極不動,用紅表筆探索剩下的四個陽極,同時觀測陽極所代表的位數(shù)(分別是個、十、百、千)。測量結(jié)果如圖8所示。 圖8 3.6.3 LED數(shù)碼管的驅(qū)動電路根據(jù)LED數(shù)碼管的結(jié)構(gòu)分析,可以采用一個P口的8個輸出端驅(qū)動段碼,我們選擇P0。另外選擇P2口的低

11、四位控制數(shù)碼管的4個位選。為了便于大家理解,教材上按照8+4的方式設(shè)計電路,如下圖所示:上圖用P0口驅(qū)動段碼,P2口的低四位驅(qū)動位碼。其顯示規(guī)律非常容易推導(dǎo)。可是,實際上LED插頭是6+6的,為了方便插頭,并簡化PCB電路設(shè)計,按照就近原則設(shè)計電路圖如下:由于沒有按照教材的規(guī)律,數(shù)字碼表必須重新計算。3.7 傳感器接口設(shè)計 有許多傳感器輸出的信號為05V的直流電壓,所以需要與ADC端口連接,因為STC單片機的P1口同時具備ADC的功能,所以設(shè)計傳感器測量接口如下。 有部分傳感器輸出的是脈沖信號,我們需測量脈沖信號的頻率,為此需將信號接入T0或T1。圖中Freq表示頻率,采用網(wǎng)絡(luò)標(biāo)簽的方式接到單

12、片機的T0口。 3.8 通訊接口兼ISP下載端口 STC單片機是采用通訊接口來下載程序的,無論項目是否需要通訊功能,都要設(shè)計通訊接口。按芯片資料得知,P3.0和P3.1的特殊功能就是通訊,分別為RX和TX,加上GND和供電的Vcc,設(shè)計通訊接口如下:上圖中的通訊接口包括Vcc、Rxd、Txd和GND四根線。注意,Vcc是為了利用USB對單片機供電。4 項目實施 41繪制原理圖和PCB圖根據(jù)上述分析,某同學(xué)設(shè)計的最小系統(tǒng)電路原理圖和PCB如下圖所示。 注意:1)標(biāo)注作品名和作者名,2)盡量采用貼片元件或者改進的貼片,3)插座盡量靠近邊沿 另一位同學(xué)采用更加簡易的單片機系統(tǒng)設(shè)計了一個自動檢測系統(tǒng)如

13、下圖所示,該電路省略了電源電路,可以采用USB供電;因為省略了三極管驅(qū)動,數(shù)碼管亮度有限,需要設(shè)置強上拉。 4.2電路焊接和安裝實際制作時,考慮到小元件難以焊接,一般是先焊接小元件,然后安裝體積大的元件,順序如下: 先焊接貼片電阻、電容、三極管、指示燈和晶振; 后焊接DIP40和輸入輸出插座; 最后安裝芯片。4.3硬件調(diào)試 焊接好的電路可能會有短路和虛焊,首先要排除短路和虛焊,然后再通電測試,可按以下幾步開展調(diào)試: 短路測試。先測量 Vcc 與 GND 之間是否有顯著的短路,如有短路就必須排除短路,才能插電源。 否則容易導(dǎo)致電腦的USB供電燒壞;然后還要測量 線 與 線 之間是否短路。 通路測

14、試。參照原理圖測量 芯片引腳 與 插接件 之間是否通電,如果有斷路,可能導(dǎo)致電路 不能正常工作,但是一般不會燒壞芯片。 電源測試。先不插芯片,插上電源、測量所有的Vcc是否為+5V。如果電源不正常或者反接,可能會燒壞單片機芯片。要檢查 單片機的Vcc 與 GND 下載測試。插上芯片和ISP后通電,下載一個LED測試程序,看能否正常下載。如果不能正常下載,首先需要檢查 下載線接口 ,然后檢查 時鐘和復(fù)位 電路。如果電路沒有發(fā)現(xiàn)問題,還是不能下載,則需要考慮是否 更換芯片 。 數(shù)碼測試。如果能下載程序,說明單片機能正常工作,接上LED數(shù)碼管,看能否正常顯示。如果顯示不正常,說明 顯示接口 或 數(shù)碼

15、管 有問題(如果程序正確的話)。5總結(jié) 采用單片機設(shè)計了一個最小應(yīng)用系統(tǒng), 通過測試,該電路能正常下載和顯示。為后續(xù)的產(chǎn)品開發(fā)奠定了硬件基礎(chǔ)。預(yù)備項目2數(shù)碼管段碼測試程序設(shè)計0任務(wù)和要求已知單片機與LED數(shù)碼管的顯示電路如圖1所示。只知P0口驅(qū)動段碼,P2口驅(qū)動位碼,不知道具體連接。為此需要設(shè)計一個段碼測試程序,用于測試數(shù)碼管的段與P0口對應(yīng)的規(guī)律。具體要求如下:1) 按照從低位到高位的順序,每次只點亮數(shù)碼管的1個段,顯示1秒鐘,就關(guān)閉0.5秒鐘2) 到最高位以后,熄滅3秒鐘,從新開始下一輪循環(huán)。3) 記錄顯示規(guī)律,根據(jù)顯示規(guī)律,計算0-9的顯示碼表。 圖1.單片機與數(shù)碼管的接口電路 1.基本

16、原理1.1 程序流程經(jīng)典的單片機的程序流程圖如圖2所示。從圖中可以看出,單片機程序一般包含初始化程序、主程序和中斷程序三部分組成。根據(jù)程序所處的位置,得知:初始化程序 的特點是: 每次上電只能執(zhí)行一次 ;主 程 序 的特點是: 能夠無窮循環(huán),多次執(zhí)行都可以。中 斷 程序 的特點是: 沒有發(fā)生條件事件不會觸發(fā),只要滿足條件就立刻執(zhí)行的程序 。1.2 數(shù)碼管的結(jié)構(gòu)本系統(tǒng)采用的數(shù)碼管為8段共陽數(shù)碼管。其內(nèi)部電路如下圖所示,每個數(shù)碼管都有8個LED發(fā)光二極管管,每個二極管的N極作為1個段,8個二極管的P極連在一起,作為公共端。四個數(shù)碼管的所有相同的段都并接在一起,每個數(shù)字的公共端單獨引出,共8個段和4

17、個位,引出12根線。圖3.數(shù)碼管的內(nèi)部電路1.3 驅(qū)動位方法 從圖1可知,由于驅(qū)動位碼的三極管為PNP,單片機輸出低電平時,三極管導(dǎo)通,點亮對應(yīng)的1個數(shù)碼管。則驅(qū)動一個位的方法如表1所示。表1. 數(shù)碼管位碼驅(qū)動規(guī)律(0有效,*表示高四位為無關(guān)位,可以當(dāng)作1處理,也可以當(dāng)0)端口P2.7P2.6P2.5P2.4P2.3P2.2P2.1P2.0代碼反碼更直觀個位*11100xfe十位*2百位*4千位*8從上表可以看出:點亮個位數(shù)碼管的指令為: P2 = ; 點亮十位數(shù)碼管的指令為: P2 = ; 點亮百位數(shù)碼管的指令為: P2 = ; 點亮千位數(shù)碼管的指令為: P2 = ; 根據(jù)同樣的原理可以推知

18、,4位數(shù)碼管全點亮的指令為:P2 = 0 ;4位數(shù)碼管全熄滅的指令為:P2 = 0xff ;1.4 驅(qū)動某一段的方法數(shù)碼管的8個段引出8根線,直接跟單片機P0口的8個輸出端連接。要想點亮數(shù)碼管的某1段,就通過P0口輸出1個低電平。共有8種可能,詳細規(guī)律如表2所示。表2. 共數(shù)碼管段碼驅(qū)動1個段的規(guī)律(低電平有效)P0.7P0.6P0.5P0.4P0.3P0.2P0.1P0.0碼表反碼更直觀111111100xfe(<<0)11111101Oxfd(<<1)11111011Oxfb(<<2)11110111Oxf7(<<3)11101111Oxef

19、(<<4)11011111Oxdf(<<5)10111111Oxbf(<<6)01111111Ox7f(<<7)從上表可以看出,點亮最低1段的指令為:P0 = ;采用取反的方法可寫為:P0 = ;點亮最高1段的指令為:P0 = ;采用取反的方法可寫為:P0 = ;采用變量x表示任意段,則程序可以寫為: P0 = ;1.5 驅(qū)動LED顯示數(shù)字的一般規(guī)律如下圖所示,教材上的數(shù)碼管驅(qū)動電路是按從低到高的順序?qū)bcdefgh連接到P0口上的,所以可以按照表3來推導(dǎo)顯示碼表。圖4 標(biāo)準(zhǔn)的數(shù)碼管與單片機接口電路表3.按照教材設(shè)計的數(shù)碼管電路的顯示規(guī)律(注意

20、:共陽的數(shù)碼管0有效,共陰數(shù)碼管1有效)端口P0.7P0.6P0.5P0.4P0.3P0.2P0.1P0.0碼表842184218421對應(yīng)段hGFEDCBA數(shù)字00x3c數(shù)字1數(shù)字2數(shù)字3數(shù)字4數(shù)字5數(shù)字6看起來顯示指令中的代碼與要顯示的數(shù)字毫無規(guī)律,對于這種情況,可定義1個1 維數(shù)組來檢索, unsigned char table10= 0xC0, , , , , , , , , 如果要顯示一個數(shù),在可以采用查表法將顯示內(nèi)容送到端口,例如:如需要顯示1, 則程序為 P0= table1 ;如需要顯示x, 則程序為 P0= ;/注意x<10.備注:因為LED的引腳并不是按a-b-c的順

21、序排列的。為了簡化電路板的設(shè)計,我們自己設(shè)計的LED驅(qū)動電路采取了就近接線的方法,與教材不同,所以不能參考教材上現(xiàn)成的碼表,因此需要自己寫一個程序來測試LED顯示規(guī)律。通過觀察顯示規(guī)律,再計算碼表。3程序設(shè)計步驟 要測試LED數(shù)碼管與單片機P0口的連接,可采用Keil設(shè)計一個C程序,控制單片機的P2口全打開,同時在P0口按從低到高的順序輸出低電平,就可以通過觀測數(shù)碼管的顯示規(guī)律來確定數(shù)碼管的連接。3.1 建立工程 編寫程序代碼之前一定要做好以下幾件事情。 1)新建文件夾。新建一個用于存放整個項目文件的文件夾,可以用中文 段碼測試程序 。同時在項目文件夾內(nèi)部添加三個文件夾,分別是 output

22、、 List 和 source 。然后將源程序放在 source ;將編譯器自動產(chǎn)生的列表文件放在 List ;將編譯器產(chǎn)生的目標(biāo)代碼存放在 output 。 2)創(chuàng)建工程。打開Keil,創(chuàng)建1個工程,保存在新建的“段碼測試程序”文件夾,項目名稱為 seg_test。 3)創(chuàng)建文件。新建1個文件,一般來說,第一個主文件保存時最好命名為 main .c 4) 將main.c添加到工程中。3.2繪制程序流程,構(gòu)建程序框架本程序僅用于測試P0口與數(shù)碼管的連接關(guān)系,沒有初始化,也沒有中斷程序。根據(jù)任務(wù)要求,設(shè)計主程序流程和對應(yīng)的程序代碼如下圖所示:圖5 程序流程和對應(yīng)的代碼根基單片機C語言程序設(shè)計的基

23、礎(chǔ),代碼主要包含以下內(nèi)容:1) main函數(shù)main函數(shù)就是指主函數(shù)。主函數(shù)的結(jié)構(gòu)可以與程序流程一一對應(yīng)。主函數(shù)具有以下特點:a) 每一個單片機項目中,有且只有1個主函數(shù)。b) 主函數(shù)可以調(diào)用別的程序,但是任何程序不能調(diào)用主函數(shù)。c) 主函數(shù)是沒有參數(shù)也沒有返回值,d) 主函數(shù)是所有程序的開始,也就是說,初始化程序必須在main函數(shù)中首先調(diào)用e) 主函數(shù)中必須有一個無條件的循環(huán),也只能有一個無條件的循環(huán)。用于調(diào)用主程序。根據(jù)模塊化程序設(shè)計的基本原則,主程序只能調(diào)用子函數(shù),不可以在主程序中直接寫代碼。要想實現(xiàn)具體的功能,可以在無窮循環(huán)內(nèi)調(diào)用相關(guān)的子函數(shù)。2) 程序標(biāo)簽。這部分代碼是給程序員自己看

24、的,沒有運行代碼,可以不寫,但是優(yōu)秀的程序員一定會認真注解,舉例如下3) 包含頭文件。頭文件詳細描述了51單片機的硬件地址,我們不需要記住,只要包含就可以。Keil中沒有STC單片機的頭文件,可以借用兼容的51單片機頭文件代替, 也可以從STC的官方網(wǎng)站下載一個STC12C5A.H。包含頭文件的代碼如下: #include <stc12c5a.h> /包含STC單片機的頭文件4) 變量定義和函數(shù)定義。(開始可以空著,什么時候需要,什么時候補充)編譯程序會發(fā)現(xiàn),在main函數(shù)中調(diào)用了一個不存在的子函數(shù),編譯器找不到函數(shù)原型,會發(fā)出錯誤提示: 表示: 在main函數(shù)中調(diào)用的任何子函數(shù),

25、都需要在main函數(shù)之前定義一個子函數(shù)。5) 補充子函數(shù)定義函數(shù)定義一般在宏定義之后和main 函數(shù)之前,補充一個空白的segment_test()子函數(shù)之后,完整的代碼如下:到此為止,程序框架已經(jīng)建成??蚣艹绦蛲瓿梢院笠幾g是否出錯,編譯測試應(yīng)該是0錯誤,0警告。但是框架程序沒有任何功能,不用下載到單片機。3.3 繪制子程序的流程,編寫相關(guān)的函數(shù)33.1 編寫segment_test函數(shù)子函數(shù)segment_test()的作用是逐個循環(huán)點亮數(shù)碼管的段。其實就是控制P0口循環(huán)輸出低電平。為了同時測量所有的數(shù)碼管,P2口輸出低電平。其程序流程和程序代碼如下:void segment_test(v

26、oid)由于調(diào)用了一個不存在的函數(shù),編譯時會發(fā)現(xiàn)錯誤提示: 為此還在還需要在 segment test(void) 之前要定義并編寫一個延時子函數(shù)。3.32 編寫delay函數(shù)如果單片機采用12M的晶振,則每個機器周期需要的時間是 1us 。也就是說每運行一個簡單的指令需要的時間是 1us 。為此我們可以用運行空指令的方法延時。為了延時1ms,可以設(shè)計一個1000次的循環(huán),循環(huán)體內(nèi)執(zhí)行空指令。為了使延時參數(shù)可變,可以設(shè)計一個帶形式參數(shù)的子函數(shù)。調(diào)用時加入實際參數(shù),可以改變延時的長度。設(shè)計代碼如下:3.4 編譯和調(diào)試程序整個項目的程序代碼如下(程序前的注解略):編譯程序,編譯器會及時提示錯誤所在

27、,雙擊第一個錯誤提示,光標(biāo)會自動定位。常見的錯誤有:表示 括號附近有語法錯誤 。4. 試驗觀測數(shù)碼管顯示規(guī)律將程序下載到單片機,觀測顯示規(guī)律,將顯示規(guī)律的代碼填入下表,按照8421碼的規(guī)律計算碼表(特別注意:低電平有效,就是0亮燈,1滅燈.)表3. 自己設(shè)計的LED驅(qū)動電路段碼表P0口P0.7P0.6P0.5P0.4P0.3P0.2P0.1P0.0碼表BCD碼84218421顯示規(guī)律數(shù)字“0”數(shù)字“1”數(shù)字“2”數(shù)字“3”數(shù)字“4”數(shù)字“5”數(shù)字“6”數(shù)字“7”數(shù)字“8”數(shù)字“9”根據(jù)上表,可將碼表用C語言的數(shù)組表示為Led_table= , , , , , , , , , 6. 總結(jié)本項目分

28、析了單片機與4位數(shù)碼管接口電路,設(shè)計了1個用于8段LED數(shù)碼管的測試程序。該單片機程序控制P0口按從低到高的規(guī)律逐一輸出低電平,使得數(shù)碼管的段逐一點亮。觀測LED數(shù)碼管的顯示規(guī)律,并根據(jù)顯示規(guī)律按16進制,計算出出數(shù)碼管的顯示碼表。以后在應(yīng)用程序中,我們就可以采用查表的方法顯示數(shù)字了。本程序只能測試段碼,不知道位碼的規(guī)律,還需要設(shè)計一個位碼測試程序。 簡易參照本程序設(shè)計一個8子循環(huán)的程序,按從低位到高位的順序循環(huán)點亮數(shù)碼管的1位。找出顯示規(guī)律,為設(shè)計數(shù)碼管顯示程序奠定基礎(chǔ)。課堂練習(xí): 練習(xí)段碼程序的設(shè)計,要求在5分鐘內(nèi)完成。編寫程序時務(wù)必養(yǎng)成以下良好習(xí)慣:1) 程序正文之前一定要加標(biāo)簽注解。說

29、明程序名、程序功能作用、程序端口設(shè)置等。2) 變量定義放在宏定義之后,函數(shù)定義之前。3) 被調(diào)用的子程序(函數(shù))必須在主程序(函數(shù))之前定義,這樣就可以無需額外聲明。4) 變量和函數(shù)名稱都一定要采用英文命名,最好采用兩段式命名,表達真實的目的,如 定時器初始化程序定義為 timer_init(void);5) 每一行指令都要100%的注釋,便于多年以后你自己可以看懂程序。6) 嚴格按照程序流程編寫程序代碼,寫出的程序不能與程序流程無關(guān)。預(yù)備項目3數(shù)字碼表測試程序設(shè)計0任務(wù)和要求通過前面設(shè)計的段碼測試程序測試了數(shù)碼管的顯示規(guī)律,并根據(jù)顯示規(guī)律計算出數(shù)碼管的碼表。為了防止計算過程出錯。還需要設(shè)計一

30、個數(shù)字碼表測試程序。具體要求如下:1) 按照從0到9的順序,逐一顯示數(shù)字。2) 顯示1秒鐘,熄滅0.5秒鐘。到9以后,熄滅3秒鐘,從新開始下一輪循環(huán)。3) 觀察數(shù)字顯示是否正確,根據(jù)顯示結(jié)果修改碼表1.程序設(shè)計思路 本程序與段碼測試程序非常相似,可以采用復(fù)制前期項目再適當(dāng)修改的方法快速設(shè)計程序??砂慈缦虏襟E: 第1步:復(fù)制項目文件夾。在我的電腦中,找到段碼測試程序的文件夾,復(fù)制整個文件夾。然后將復(fù)制的文件夾重命名為 碼表測試程序 ,項目名稱修改為 碼表測試程序 ,同時刪除所有其它文件。再打開項目,增加程序功能注解。 第2步:修改子函數(shù)的名稱首先在主函數(shù)中修改調(diào)用函數(shù)的名稱。將segment_t

31、est( )修改為digit_test( )。然后修改子函數(shù)的定義,將segment_test修改為digit_test。至此,還沒有實質(zhì)性的修改,但是也要編譯程序,看看是否有錯。 第3步:修改子函數(shù)的內(nèi)容根據(jù)程序的任務(wù),需要循環(huán)顯示0到9的數(shù)字。首先,增加碼表定義,代碼為: unsigned char table= ;然后,修改子函數(shù)循環(huán)的長度為10,代碼為 for ( )最后,修改送段碼這一行為查表輸出段碼。代碼為:P0 = ;修改后的數(shù)碼測試程序的子函數(shù)代碼如下: 3. 觀測顯示結(jié)果 將程序編譯后下載到單片機,觀測數(shù)字顯示是否正確。4. 總結(jié)本項目在“段碼測試程序”的基礎(chǔ)上,設(shè)計了1個用

32、于測試數(shù)碼管數(shù)字碼表的程序。該程序控制P2口將數(shù)碼管的四個位全部點亮,并按從0到9的規(guī)律逐一查表將顯示內(nèi)容送到P0口,使得數(shù)碼管顯示從0-9的數(shù)字。測試結(jié)果表明,我們計算出出數(shù)碼管的顯示碼表完全正確。課堂練習(xí) 請在“段碼測試程序”的基礎(chǔ)上,設(shè)計1個用于測試數(shù)碼管數(shù)字碼表的程序(要求3分鐘內(nèi)完成)。預(yù)備項目4單片機數(shù)字鐘程序設(shè)計0任務(wù)和要求為了練習(xí)程序設(shè)計的基本思路,特別是LED顯示程序設(shè)計。請采用現(xiàn)有的單片機硬件系統(tǒng)設(shè)計一個數(shù)字鐘,基本要求如下:1) 顯示小時和分鐘,顯示格式為HH:MM,2) 秒鐘不顯示,但是每秒小數(shù)點閃爍1程序流程圖設(shè)計單片機系統(tǒng)是一個小巧靈活的計算機系統(tǒng),你可以根據(jù)自己的

33、需要設(shè)計程序,想讓它干什么它就會成為你想要的東西。設(shè)計程序一定要堅持 先繪制程序流程,后寫程序代碼 的原則。繪制程序流程的步驟如下:1.1劃分程序模塊 根據(jù)電路圖和數(shù)字鐘的要求,本程序分為以下幾個模塊 定時器初始化:設(shè)定timer0工作在定時方式1,并且50ms中斷。 拆字程序:將小時和分鐘拆開,單獨查表后送給顯示緩沖區(qū)。 顯示程序:驅(qū)動四聯(lián)數(shù)碼管掃描顯示 鍵盤程序:用于調(diào)節(jié)小時和分鐘 計時程序:每50ms計算一次時間, 20次以后算1秒鐘,每60秒加1分鐘,每60分鐘加1小時,每24小時歸零。1.2分析程序模塊的特點根據(jù)程序模塊的作用,可知定時器初始化程序只運行一次,可作為 初始化程序 ;拆

34、字程序、顯示程序和、鍵盤程序都可循環(huán)多次運行,應(yīng)放在 主程序 ;計時程序:50ms自動中斷后自動計算時間,可作為 。1.3繪制程序流程圖根據(jù)上述分析,繪制程序流程圖如下:圖4.1 數(shù)字鐘的程序流程圖 為了節(jié)約版面,中斷程序中的計算時間模塊沒有列出詳細的算法。3.2創(chuàng)建項目和C程序 第1步:創(chuàng)建新項目,項目名保存為 數(shù)字鐘 。 第2步:創(chuàng)建新文件,文件名保存為 main.c 。 第3步:將新的C程序加入新項目。 提示:如果之前有數(shù)字碼表測試程序,就復(fù)制整個項目,在原項目的基礎(chǔ)上修改,可節(jié)省很多時間哦。3.3 編寫程序構(gòu)架 根據(jù)程序流程圖,寫出初始化程序和主程序的框架代碼如下: 老師提示:每寫一段

35、程序都一定要編譯成功。達到完全沒有錯誤和警告。編譯過程可能會出現(xiàn)很多錯誤代碼,我們總是從第一個錯誤開始逐一排查。記得一定要看懂英文哦.調(diào)試成功以后一定會顯示如下代碼:3.4 編寫硬件驅(qū)動程序3.4.1定時器驅(qū)動程序定時器驅(qū)動程序包括程序主體timer.C和程序頭文件timer.h兩部分。在程序主體timer.c中應(yīng)包含定時器初始化和定時器中斷程序兩部分。 1)定時器初始化程序根據(jù)本項目的要求,可設(shè)定timer0工作在方式1,50ms中斷。根據(jù)單片機基本原理可知,需要對TMOD、THO、TL0三個寄存器初始化,還要對ET0、TR0、EA三個位進行初始化。三個寄存器的代碼可以自己手工計算,也可以采

36、用單片機小精靈自動設(shè)計程序代碼。TMOD寄存器的8個位所表示的意思一般人記不住,可上網(wǎng)查詢,, 根據(jù)計算,可寫出定時器初始化程序如下:根據(jù)下圖的含義,填寫TMOD每一個位的值:將代碼換算為16進制??傻肨MOD= 0x01;定時器工作在方式1,溢出上限為 65535 。定時器最小單位是1uS, 因此定時器初值= 15536 換算為16進制,可知TH0= 0x3C,TL0= 0xB0 ,2)定時中斷程序定時器timer0利用單片機內(nèi)部時鐘自動計數(shù),每到50ms就自動中斷,因此中斷程序需要累加20次才算1秒。每60秒算1分鐘,每60分鐘算1小時,每24小時循環(huán)歸零。實現(xiàn)上述算法的程序流程如下圖所示

37、。3.4.2拆字程序拆字程序的主要任務(wù)是將所有的顯示內(nèi)容拆分成獨立的四個位,并查表轉(zhuǎn)換成數(shù)碼管的顯示代碼,存放在顯示緩沖區(qū)內(nèi)。等待顯示程序調(diào)用。拆字子程序的程序流程如下圖所示,右邊是C51程序代碼。3.4.3顯示程序LED數(shù)碼管的顯示要采用動態(tài)顯示。顯示程序的作用就是將顯示緩沖區(qū)中的四個內(nèi)容(其實就是數(shù)組中的四個變量)輪流輸送到LED數(shù)碼管,并同時驅(qū)動對應(yīng)的位碼。每點亮一個數(shù)碼管都延時1ms,雖然是輪流點亮4個數(shù)碼管,但是利用人的視覺暫留效應(yīng),看起來就像同時點亮四個數(shù)碼管一樣。設(shè)計程序時可以按順序和循環(huán)兩種方法,下圖是順序結(jié)構(gòu)設(shè)計的顯示程序流程圖。課堂作業(yè):順序結(jié)構(gòu)的程序重復(fù)代碼太多,建議換成

38、循環(huán)結(jié)構(gòu)。本程序與硬件直接有關(guān),可將程序編譯后下載到單片機內(nèi)部,并點亮LED數(shù)碼管。4程序調(diào)試程序調(diào)試也要堅持“走一步看一步”的原則,每完成一小段程序,就要下載程序到單片機通電運行,觀測程序運行效果。千萬不能一口氣寫完所有的代碼,然后在程序的大海中去找錯誤。程序調(diào)試包括以下兩個部分。4.1 語法排錯編寫好的C語言代碼還需要通過編譯軟件轉(zhuǎn)換成機器可以識別的EXE文件或BIN文件。像Keil51等開發(fā)工具都提供了編譯的功能,按下編譯按鈕后,軟件首先會按照C語言的語法檢測程序中的錯誤,并自動定位到錯誤所在的行,同時用英文提示錯誤的原因。對錯誤逐個修改后,就可以生產(chǎn)可執(zhí)行的BIN代碼了,但是請注意:語

39、法錯誤不表示邏輯沒有錯誤。程序員還需要反復(fù)調(diào)試,發(fā)現(xiàn)程序中邏輯錯誤4.2 程序邏輯調(diào)試調(diào)試程序的邏輯時,要清楚程序的“數(shù)據(jù)流”,故意在程序中用特殊的數(shù)據(jù)代替變量,用于觀測效果。本程序的數(shù)據(jù)流向如下圖所示:根據(jù)數(shù)據(jù)流,設(shè)計程序調(diào)試步驟如下: 1)調(diào)試顯示程序。顯示程序的作用是將顯示緩沖去的數(shù)據(jù)動態(tài)顯示到數(shù)碼管上。顯示緩沖區(qū)的數(shù)據(jù)來源于拆字程序,為了單獨調(diào)試顯示程序,可屏蔽拆字程序,給定一個固定的顯示內(nèi)容(如1234)去測試顯示程序的效果。 2)調(diào)試拆字程序。拆字程序的作用是將變量hour和minute拆開輸送到disp_buffer4。可以設(shè)定2個固定的變量,如hour=12,minute=34

40、.然后觀測顯示效果。 3)調(diào)試中斷程序。觀測程序是否進入中斷,也可以在中斷程序中,故意按自己的規(guī)律改變變量。如每中斷一次故意增加minute,或者hour。也可以在秒程序處,故意調(diào)整minute。然程序的變化更顯著。5 時鐘測試 為了檢驗時鐘程序的準(zhǔn)確度,將程序下載到單片機后,運行一天,與電腦時鐘對比,觀測時間偏差,計算絕對誤差和相對誤差。6總結(jié) 本項目采用模塊化的程序設(shè)計了一個數(shù)字鐘。首先根據(jù)功能不同劃分了程序模塊,分析了每個模塊的特點,繪制了程序流程圖。然后根據(jù)程序流程圖構(gòu)建了程序框架。第二,根據(jù)每個定時器子程序的要求,計算了定時器相關(guān)寄存器的初始值,并寫出了定時器初始化程序的C51代碼。

41、第三,根據(jù)拆字程序、顯示程序和鍵盤程序的功能,繪制了子程序的程序流程,并按程序流程寫出了對應(yīng)的C51代碼。第四,根據(jù)時鐘程序的基本計算規(guī)律,設(shè)計了定時器中斷程序的程序流程,并寫出了C51程序代碼。最后,將時鐘運行一天,測試了時鐘程序的誤差,并根據(jù)誤差修正了程序,提供了時鐘程序的精度。但是,由于單片機的定時準(zhǔn)確性較差,導(dǎo)致誤差較大,建議采用實時時鐘芯片DS1032來提高計時的精度。課堂練習(xí):編寫本課的時鐘程序(15分鐘內(nèi)完成)。課后練習(xí):(1) 秒更新的時候閃爍小數(shù)點。 (2) 用按鍵調(diào)節(jié)時鐘,調(diào)小時的時候,小時應(yīng)該要閃爍;調(diào)節(jié)分鐘的時候,分鐘應(yīng)該閃爍。(3) 設(shè)定鬧鐘,并且根據(jù)需要,發(fā)出不同聲

42、音。預(yù)備項目5 獨立式鍵盤設(shè)計0設(shè)計任務(wù)和要求當(dāng)前很多電子產(chǎn)品都采用單片微型計算機設(shè)計,幾乎都需要按鍵,如電磁爐需要按鍵來“開關(guān)電源”,用“+”“-”鍵來調(diào)節(jié)炒菜的溫度,用“功能鍵”來切換工作模式。請同學(xué)們設(shè)計一個4個按鍵的小鍵盤,用于人與機器對話。如“+”“-”“功能切換”“確定”。1方案論證 常用的鍵盤有以下三種方案1 獨立式鍵盤。獨立式按鍵的每一個按鍵都獨占單片機的一根通用IO線,只有當(dāng)按鍵較少的時候,采用獨立式按鍵設(shè)計鍵盤。方案2 行列掃描式鍵盤。當(dāng)按鍵較多時,單片機的IO口有限,不能采用獨立式鍵盤設(shè)計。可用行列掃描式鍵盤。如4*4的鍵盤可以有16個按鍵。8*8的掃描鍵盤可以有64個按

43、鍵。方案3 ADC鍵盤。每個按鍵配置不同的分壓電阻,采用ADC電路測量按鍵輸出的電壓來判斷按鍵。該方案只占據(jù)1根IO線。 綜上所述,當(dāng)鍵盤的按鍵比較少時,可以采用獨立式按鍵,每個按鍵接單片機的一個IO口。該方案的電路和程序設(shè)計都比較簡單。1 獨立式鍵盤原理圖 如圖1左圖所示的是四個按鈕的獨立式原理圖。圖1.獨立式按鍵及其與單片機的接口從圖中可以看出,K1、K2、K3、K4都各自獨占單片機的一根IO線。理論上按鍵開關(guān)可以選擇任何一個端口。但是最好四根線都在同一個P口。上圖中四個按鍵分別接到 、 、 、 。同一個P口的還剩余4個IO線沒有與接任線連接,空著也無妨。2 獨立式鍵盤的工作原理沒有按鍵的

44、時候,對應(yīng)的線全部為高電平;按下相應(yīng)的鍵,對應(yīng)的線就為低電平,其它的線仍為高電平。不考慮兩個按鍵同時按下的情況,鍵值計算如下表:表1 鍵值表(請同學(xué)們填充完整)端口P3.7P3.6P3.5P3.4P3.3P3.2P3.1P3.0鍵值(H)BCD84218421·K10無關(guān)位無關(guān)位無關(guān)位無關(guān)位K20無關(guān)位無關(guān)位無關(guān)位無關(guān)位K30無關(guān)位無關(guān)位無關(guān)位無關(guān)位K40無關(guān)位無關(guān)位無關(guān)位無關(guān)位(提示:每個按鍵都是2進制代碼,對應(yīng)的四個IO線按8421碼組成一個16進制代碼,沒有接線的線是無關(guān)的位,可以為0,也可以為1)3 獨立式鍵盤的PCB采用altium designer 設(shè)計的PCB如圖2所示

45、。 圖2. 獨立式按鍵的PCB電路繪圖時注意以下要求1) 為了方便手工制版,所有線路都布在同一層??梢圆荚陧攲踊蛘叩讓?) 為了減少打孔的麻煩,所以元件采用貼片封裝。如果元件是直插的,也修改封裝為貼片樣式。3) 因為手工制版沒有絲印層,可以將一些字符修改到頂層。增加一些中文提示。在GND等重要線的旁邊加標(biāo)注。4) 學(xué)會拼版。這樣小的一個單元電路,不能單獨去曬感光板。為了節(jié)省材料,學(xué)會拼版。一塊感光板可以供10個人或者20人用。4.鍵盤調(diào)試方法。1)先測試按鍵的通斷。用萬用表測量按鍵輸出線與GND之間的電阻。沒有按鍵時,電阻無窮大。按鍵時,電阻應(yīng)為0。2)測量線與線之間是否短路。用萬用表測量相鄰

46、輸出線之間的電阻,應(yīng)為無窮大。3)試用。將按鍵插到單片機應(yīng)用系統(tǒng)上(如單片機設(shè)計的時鐘或曝光機等),每個按鍵的功能都能響應(yīng),如調(diào)節(jié)分鐘和秒鐘。6 結(jié)論 采用四個微動按鈕設(shè)計了一個獨立式鍵盤,通過測試,四個按鍵都能獨立控制。預(yù)備項目6 鍵盤驅(qū)動程序設(shè)計0 任務(wù)和要求 已知獨立式按鍵電路圖如下,四個按鈕各自獨占一根IO線,采用插接件與最小系統(tǒng)連接。請設(shè)計鍵盤電路的程序。1 基本原理要在讀鍵盤的時候屏蔽無關(guān)的低4位,C51的代碼為: key_value = P3& 0xf0 ; 按鍵則對應(yīng)的IO口接地,不考慮兩個按鍵同時按下的情況,鍵值計算如下表:表1 鍵值表(每個按鍵都是2進制代碼,對應(yīng)的

47、四個IO口按8421碼組成16進制代碼)端口P3.7P3.6P3.5P3.4P3.3P3.2P3.1P3.0鍵值端口值84218421·K11110*0xe0K21101*K31011*b*K40111*0x702.程序方案選擇鍵盤掃描一般采用低電平、等待釋放和按鍵響應(yīng)3種方方案低電平查詢就是看鍵盤有沒有按下,指令為:if (key1=0) do_key1( ); 由于程序運行很快,按鍵1ms程序會運行上千次, 會導(dǎo)致重復(fù)執(zhí)行按鍵程序 。如圖中的虛線所示,因此需要消除抖動。等待釋放就是按鍵時不響應(yīng),等待鍵盤釋放再執(zhí)行鍵盤指令:While(key1=0);/循環(huán)等待按鍵釋放Do_key

48、1( ); /釋放后執(zhí)行指令當(dāng)按鍵時間長的時候,等待時間太長,反應(yīng)太慢 按鍵響應(yīng)也叫查詢下降沿方式:程序不斷地掃描,但是記住最近的兩次鍵值。然后對比相鄰的兩次按鍵。如果是剛按下去,那么相鄰的前次就一定是沒按程序代碼復(fù)雜,但是具有 高效 、 快速 等特點,詳細代碼附在最后。對比三種方案,我們選擇查詢下降沿的按鍵響應(yīng)法方案。3.鍵盤驅(qū)動程序的模塊化設(shè)計鍵盤驅(qū)動程序可以包括程序主體keyb.c和keyb.h兩個文件。程序主體包含鍵盤掃描程序和鍵盤處理程序兩部分。鍵盤掃描程序負責(zé)判斷是否有鍵按下,鍵盤處理程序根據(jù)按鍵不同而執(zhí)行不同的功能。編寫查詢下降沿方式的鍵盤掃描程序注意以下幾點:1) 及時查詢按鍵

49、的端口,一般將按鍵程序放在主程序。但是如果主程序有太多的程序,為了保證鍵盤的實時性,可以將按鍵程序放在在定時中斷中。2) 不管按鍵是否有效,都及時保存本次按鍵 ,作為下一次按鍵的“上一次”記錄。3) 如果當(dāng)前沒有按鍵,可以及時退出,保證程序的時效性。4) 如果當(dāng)前有按鍵,還要判斷上一次按鍵。只有兩次相反,才進入按鍵處理程序。鍵盤處理可以采用if判斷語句和switch分支語句兩種方式。因為switch分支的方式程序邏輯清楚,建議采用分支方式。如果鍵盤處理程序比較簡單,可以放在一起。如果程序太長,可以單獨作一個子程序。鍵盤掃描程序流程圖如下鍵盤程序C51代碼如下:4結(jié)論: 采用掃描下降沿的方法為獨

50、立式按鍵設(shè)計了驅(qū)動程序。該程序代碼比較復(fù)雜,但是具有高效、快速等特點。下載試用,發(fā)現(xiàn)上述程序還存在以下缺點。1) 增加分鐘的時候,沒有判斷是否溢出 2) 減少分鐘的時候,沒有判斷是否為負數(shù) 3) 預(yù)備項目7 ADC驅(qū)動程序設(shè)計ADC是單片機測量輸入模擬電壓的重要方法,為此必須掌握單片機片內(nèi)ADC的應(yīng)用。教材上沒有教過如何使用STC單片機內(nèi)部集成的ADC,可以到宏晶公司網(wǎng)站下載芯片資料,在芯片資料中查找C程序源代碼,復(fù)制到項目C程序中,就可以用了。如果不想深究,后面的內(nèi)容就不用看了,仔細探究其實也很簡單。從供應(yīng)商提供的資料發(fā)現(xiàn),ADC程序代碼分包括 常量定義 、 ADC初始化 、 ADC中斷 等3部分。分別是:第一部分:為特殊功能

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論