

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p><b> 智能儀器課程設計</b></p><p><b> 班 級:</b></p><p><b> 姓 名:</b></p><p><b> 學 號:</b></p><p><b> 目錄&
2、lt;/b></p><p><b> 一.實驗目的:3</b></p><p><b> 二.實驗要求:3</b></p><p><b> 三.硬件原理3</b></p><p> ?。保畣纹瑱C最小系統(tǒng):3</p><p><
3、;b> ?。玻當?shù)碼管4</b></p><p> ?。?數(shù)碼管功能使用:4</p><p><b> ?。?數(shù)碼管說明4</b></p><p><b> ?。硵?shù)碼管原理圖5</b></p><p><b> ?。?LED燈5</b></p&g
4、t;<p><b> 4.矩陣按鍵6</b></p><p> 1.矩陣鍵盤的功能使用6</p><p> 2.矩陣鍵盤的結(jié)構(gòu)與工作原理6</p><p> ?。?DA/AD轉(zhuǎn)換 PCF85916</p><p><b> ?。叮甀2C總線7</b></p>
5、;<p> ?。保甀2C總線基本結(jié)構(gòu):8</p><p> 2.雙向傳輸?shù)慕涌谔匦?</p><p><b> ?。常當?shù)據(jù)的傳送9</b></p><p> 4.I2C總線的數(shù)據(jù)傳送格式:9</p><p> ?。?總線競爭的仲裁:10</p><p><b>
6、; ?。叮畱妙I(lǐng)域10</b></p><p><b> 四.軟件原理10</b></p><p> ?。保蹋牛膭討B(tài)顯示10</p><p><b> ?。保@示原理10</b></p><p><b> ?。玻I盤12</b></p>
7、<p> ?。保I盤掃描原理12</p><p> 2.鍵盤掃描子程序12</p><p><b> 五.設計心得14</b></p><p><b> 六.參考文獻14</b></p><p><b> 七.附錄15</b></p>
8、<p><b> ?。保绦?5</b></p><p><b> 原理圖24</b></p><p><b> PCB25</b></p><p><b> 波形發(fā)生器</b></p><p><b> 一.實驗目的:&
9、lt;/b></p><p> 掌握動態(tài)LED顯示及鍵盤設計原理,對智能儀器中最基本的輸入輸出設備具有感性認識</p><p> 熟練掌握HC6800開發(fā)板的使用</p><p> 通過一個相當對完整的程序編程,能夠?qū)纹瑱C知識和智能儀器的設計融會貫通,同時掌握對智能儀器的軟硬件構(gòu)成及硬件軟化方法。</p><p><b&g
10、t; 二.實驗要求:</b></p><p><b> 顯示亮度大致均勻。</b></p><p><b> 按鍵需去抖</b></p><p> 運行程序首先顯示以下內(nèi)容:HELLO</p><p> 通過按鍵顯示相應的波形,通過DA輸出。</p><p&
11、gt; 輸出波形時,數(shù)碼管顯示頻率,發(fā)光管指示波形種類。</p><p><b> 編寫實驗報告。</b></p><p><b> 三.硬件原理 </b></p><p> ?。保畣纹瑱C最小系統(tǒng):</p><p> cpu 為STC89系列增強型8位單片機,頻率高達80MHz,可工作于6C
12、lock,32I/O,3定時器,內(nèi)置WDT、EEPROM。支持ISP,ESD。晶振采用12M/11.0592(可更換)。</p><p><b> ?。玻當?shù)碼管</b></p><p> ?。?數(shù)碼管功能使用: </p><p> 有2 組四位動態(tài)數(shù)碼管和1個一位靜態(tài)數(shù)碼管。當使用四位動態(tài)數(shù)碼管時,用8位排線將J12與單片機的I/O口腳相連,
13、當使用一位靜態(tài)數(shù)碼管時,有兩種連接方式:1.用8P排線將JP3與單片機的I/O口腳相連,實現(xiàn)用單片機I/O腳直接控制數(shù)碼管。2.用8P排線將JP2與JP3相連,然后將JP12用短路冒全部短接,此時為單片機控制74HC595,,7HC595再控制數(shù)碼管的動態(tài)掃描。</p><p><b> ?。?數(shù)碼管說明</b></p><p> 數(shù)碼管實際上是由7個發(fā)光管組成的8
14、字形構(gòu)成的,加上小數(shù)點就是8個,動態(tài)掃描顯示接口是單片機中應用最為廣泛的一種顯示方式。其接口電路是把所有顯示器的8個筆劃a-h同名端連在一起,而每一個顯示器的公共極COM是各自獨立地接受I/O口線控制。CPU向各字段輸出口送出字形碼時,所有顯示器均接收到相同的字形碼,但究竟是那個顯示器亮,取決于COM端所以就可以自行決定何時顯示哪一位了。所謂動態(tài)掃描就是指我們采用分時的方法,輪流控制各個顯示器的COM端,使各個顯示器輪流點亮。每位顯示器
15、的點亮時間是極為短暫的(約1ms),但由于人的視覺暫留現(xiàn)象及發(fā)光二極管的余暉效應,盡管實際上各位顯示器并非同時點亮,但只要掃描的速度足夠快,給人的印象就是一組穩(wěn)定的顯示數(shù)據(jù),不會有閃爍感。</p><p><b> ?。硵?shù)碼管原理圖</b></p><p><b> 3.LED燈</b></p><p> JP1為8路
16、LED燈的接口,使用此功能時,將JP1與JP8-JP11中任何接口相連,即可實現(xiàn)單片機控制8路LED。</p><p><b> 原理圖</b></p><p><b> ?。矗仃嚢存I</b></p><p> 1.矩陣鍵盤的功能使用</p><p> JP4為矩陣鍵盤的接口,p10—P13
17、為行,p14-p16為列。使用8P排線把JP4與JP8-JP11中任何接口相連,實現(xiàn)矩陣鍵盤的功能。</p><p> 2.矩陣鍵盤的結(jié)構(gòu)與工作原理</p><p> 當鍵盤中按鍵數(shù)量較多時為了減少I/O口德占用,通常將按鍵排列成矩陣形式。在矩陣鍵盤中,每條水平線和垂直線在交叉處不直接連通,而是通過一個按鍵加以連接。這樣一個端口就可以構(gòu)成4*4個按鍵,比直接將端口線用于鍵盤多出了一倍,
18、而且線數(shù)越多,區(qū)別越明顯,在需要的鍵數(shù)較多時,采用矩陣法來做鍵盤是合理的。矩陣式的鍵盤顯然比直接法復雜一些,識別也要復雜一些。</p><p><b> 原理圖:</b></p><p> ?。?DA/AD轉(zhuǎn)換 PCF8591</p><p> Pcf8591使用I2C與單片機通信,P2.1(SDA)串行數(shù)據(jù)線,P2.0(SCL)串行時鐘
19、線。AD0和AD1是兩路模擬輸入,改變AD0和AD1位置的電位器,實現(xiàn)了兩路模擬輸入,在數(shù)碼管中可以看到數(shù)值變化。當PCF8591數(shù)模端口數(shù)據(jù)變化時,DA位置的LED亮度隨之改變。</p><p> PCF8591T介紹:</p><p> PCF8591是Philips生產(chǎn)的8位分辨率D/A、A/D轉(zhuǎn)換集成芯片,有4路模擬輸入,1路模擬輸出,一個I2CBUS接口,3個給硬件編程的腳。
20、通過I2C總線與處理器通信,其價格低廉,接口簡單,轉(zhuǎn)換控制容易等優(yōu)點,在單片機應用系統(tǒng)中得到了廣泛的應用。</p><p> AIN0-AIN3:模擬輸出(A/D轉(zhuǎn)換)</p><p> AOUT:模擬輸出(D/A轉(zhuǎn)換)</p><p> A0-A2:硬件設備地址</p><p><b> GND:電源負極地</b&g
21、t;</p><p> VREF:參考電壓輸入</p><p> EXT:振蕩器輸入時,內(nèi)部/外部的切換開關(guān)</p><p> OSC:振蕩器輸入/輸出</p><p> SCL:I2C BUS時鐘輸入</p><p> SDA:I2CBUS 數(shù)據(jù)輸入輸出</p><p> AGND
22、:模擬地,模擬信號和基準電源的參考地</p><p><b> 原理圖:</b></p><p><b> ?。叮甀2C總線</b></p><p> I2c總線是一種基于IC器件之間連接的二線制總線。它通過SDA(串行數(shù)據(jù)線)及SCL(串行時鐘線)兩根線在連到總線上的器件之間傳送信息,并根據(jù)地址識別每個器件:不管是單
23、片機,存儲器,LCD驅(qū)動器還是鍵盤接口。</p><p> ?。保甀2C總線基本結(jié)構(gòu):</p><p> 采用I2C總線標準的單片機IC器件,其內(nèi)部結(jié)構(gòu)不僅有I2C接口電路,而且將內(nèi)部各單元電路電路按功能劃分為若干相對獨立的模塊,通過軟件尋址實現(xiàn)片選,減少了器件片選的連接。CPU不僅能通過指令將某個功能單元電路掛靠摘離總線,還可對該單元的工作狀況進行檢測,從而實現(xiàn)對硬件系統(tǒng)的既簡單又靈活
24、的擴展與控制。</p><p> I2C總線接口電路原理圖:</p><p> 2.雙向傳輸?shù)慕涌谔匦?lt;/p><p> 傳統(tǒng)的單片機串行接口的發(fā)送和接收一般都各用一條線,如MCS51系列的TXD和RXD。而I2C總線則根據(jù)器件的功能通過軟件程序使其可工作于發(fā)送接收方式。當某個器件向總線上發(fā)送信息時,它就是發(fā)送器(也稱主器件),而當其從總線上接收信息時,又成為
25、接收器(也叫從器件)。主器件用于啟動總線上傳送數(shù)據(jù)并產(chǎn)生時鐘,以開放送的器件,此時,任何被尋址的器件均本人為是從器件。I2C總線的控制完全由掛接在總線上的主器件送出的地址和數(shù)據(jù)決定。在在總線上,既沒有中心機,也沒有優(yōu)先機。</p><p> 總線上主和從(即發(fā)送和接收)的關(guān)系不是一成不變的,而是取決于此時數(shù)據(jù)傳送的方向。SDA和SCL均為雙向輸入輸出線,通過上拉電阻接正電源。當總線空閑時,兩根線都是高電平。;連
26、接總線的器件的輸出級必須是集電極或漏極開路,以具有“線”與功能。I2C總線的數(shù)據(jù)數(shù)據(jù)傳送速率在標準工作方式下為100kbit/S,在快速方式下,最高傳送速率可達400kbit/s.</p><p> 在實際應用中,一般只有單片機能夠發(fā)送CLK,因此,只有單片機能夠作為主器件,其余I2C器件均為從器件。多單片機系統(tǒng)通常很少應用。</p><p> I2C總線上的時鐘信號在I2C總線上傳送
27、信息時的時間同步信號是由掛接在SCL時鐘器件的邏輯與完成的。SCl線上由高電平到低電平的跳變將影響這些器件,一旦某個器件的SCl線跳變?yōu)榈碗娖?,使SCL上的所有器件進入低電平期。此時低電平周期短的器件的時鐘由低至高的跳變不能影響SCL線的狀態(tài),于是這些器件將進入高電平等待的狀態(tài),當所有器件的時鐘信號都跳變?yōu)楦唠娖綍r,低電平期結(jié)束。SCL線被釋放SCL 線被釋放返回高電平,即所有的器件都同時開始它們的高電平期。其后,第一個結(jié)束高電平期的器
28、件又將 SCL 線拉成低電平。這樣就在 SCL 線上產(chǎn)生一個同步時鐘??梢姡瑫r鐘低電平時間由時鐘低電平 期最長的器件確定,而時鐘高電平時間由時鐘高電平期最短的器件確定。 </p><p><b> ?。常當?shù)據(jù)的傳送 </b></p><p> 在數(shù)據(jù)傳送過程中,必須確認數(shù)據(jù)傳送的開始和結(jié)束。在 I2C 總線技術(shù)規(guī) 范中,開始和結(jié)束信號(也稱啟動和停止信號)的定義如
29、圖 所示。</p><p> 當時鐘線 SCL 為高電平時,數(shù)據(jù)線 SDA 由高電平跳變?yōu)榈碗娖蕉x為"開始"信號;當 SCL 線為高電平時,SDA 線發(fā)生低電平到高電平的跳變?yōu)?quot;結(jié)束"信號。開始和結(jié)束信號都是由主器件產(chǎn)生。在開 始信號以后,總線即被認為處于忙狀態(tài);在結(jié)束信號以后的一段時間內(nèi),總線被認為是空 </p><p><b>
30、閑的。</b></p><p> ?。?I2C總線的數(shù)據(jù)傳送格式:</p><p> 在I2C總線開始信號后,送出的第一個字節(jié)數(shù)據(jù)是用來選擇器件地址的,其中前七位為地址碼,第八位為方向位,方向位為0表示發(fā)送,即主器件把信息寫到所選擇的從器件;方向位為1表示主器件將從從器件讀信息。開始信號后,系統(tǒng)中的各個器件將自己的地址和主器件送到總線上的地址進行比較,如果與主器件發(fā)送到總線上
31、的地址一致,則該器件即為被主器件尋址的器件,其接收信息還是發(fā)送信息則由第八位確定。</p><p> 在I2C總線上每次傳送的數(shù)據(jù)字節(jié)數(shù)不限,但每一個字節(jié)必須為8位,而且每個傳送的字節(jié)后面必須跟一個認可位,也叫應答位。</p><p><b> 數(shù)據(jù)的傳送過程:</b></p><p> 每次都是先傳最高位通常從器件在接收到每個字節(jié)后都會
32、做出響應,即釋放SCL線返回高電平,準備接受下一個數(shù)據(jù)字節(jié),主器件可繼續(xù)傳送。如果從器件正在處理一個實時事件而不能接收數(shù)據(jù)時,(例如正在處理一個內(nèi)部中斷,在這個中斷處理完之前就不能接受I2C總線上的數(shù)據(jù)字節(jié))可以使時鐘SCl線保持低電平,從器件必須使SDA保持高電平,此時主器件產(chǎn)生1個結(jié)束信號,使傳送異常結(jié)束,迫使主器件處于等待狀態(tài)。當從器件處理完畢時,釋放SCL線,主器件繼續(xù)傳送。</p><p> 當主器件
33、發(fā)送完一個字節(jié)的數(shù)據(jù)時,接著發(fā)出對應于SCL線上的一個時鐘(ACK)認可位,在此時鐘內(nèi)主器件釋放SDA線一個字節(jié)傳送結(jié)束,而從器件的響應信號將SDA線拉成低調(diào)平,使SDA在該時鐘的高電平期間為穩(wěn)定的低電平。從器件的響應信號結(jié)束后,SDA線返回高電平,進入下一個傳送周期。</p><p> ?。?總線競爭的仲裁:</p><p> 總線上可能掛接有多個器件,有時會發(fā)生兩個或多個主器件想同時
34、占用總線的情況,例如:多單片機系統(tǒng)中,可能在某一時刻有兩個單片機要同時向總線發(fā)送數(shù)據(jù),這種情況叫總線競爭。I2C總線具有多主控能力,可對發(fā)生在SDA線上的總線競爭進行仲裁,其仲裁原則是:當多個主器件同時想占用總線時,如果某個主器件發(fā)送高低阿平,而另一個主器件發(fā)送低電平,則發(fā)送電平與此時SDA總線電平不符合的那個器件將自動關(guān)閉其輸出級。總線競爭的仲裁是在兩個層次上進行的。首先是地址位的比較,從而確保了競爭仲裁的可靠性。由于利用I2C總線上
35、的信息進行仲裁,因此不會造成信息的丟失。</p><p><b> ?。叮畱妙I(lǐng)域</b></p><p> I2C總線接口器件目前在視頻處理,移動通信,等領(lǐng)域采用I2C總線接口器件已經(jīng)比較普遍。另外,通用的I2C總線接口器件,如帶I2C總線的單片機,RAM,ROM,A/D,D/A,LCD驅(qū)動器等器件,也越來越多的應用于計算機及自動控制系統(tǒng)中。</p>
36、<p><b> 四.軟件原理</b></p><p><b> ?。保蹋牛膭討B(tài)顯示</b></p><p><b> ?。保@示原理</b></p><p> ?。蹋牛牡撵o態(tài)顯示雖然有編程容易,管理簡單等優(yōu)點,但靜態(tài)顯示所要占用的IO口資源很多,所以在顯示的LED較多的情況下,一般
37、采用動態(tài)顯示方式。</p><p> 數(shù)碼管實際上是由7個發(fā)光管組成的8字形構(gòu)成的,加上小數(shù)點就是8個,動態(tài)掃描顯示接口是單片機中應用最為廣泛的一種顯示方式。其接口電路是把所有顯示器的8個筆劃a-h同名端連在一起,而每一個顯示器的公共極COM是各自獨立地接受I/O口線控制。CPU向各字段輸出口送出字形碼時,所有顯示器均接收到相同的字形碼,但究竟是那個顯示器亮,取決于COM端所以就可以自行決定何時顯示哪一位了。所
38、謂動態(tài)掃描就是指我們采用分時的方法,輪流控制各個顯示器的COM端,使各個顯示器輪流點亮。每位顯示器的點亮時間是極為短暫的(約1ms),但由于人的視覺暫留現(xiàn)象及發(fā)光二極管的余暉效應,盡管實際上各位顯示器并非同時點亮,但只要掃描的速度足夠快,給人的印象就是一組穩(wěn)定的顯示數(shù)據(jù),不會有閃爍感</p><p><b> 顯示子程序:</b></p><p> #includ
39、e <reg51.h> </p><p> #include <intrins.h></p><p> sbit LS138A = P2^2; //定義138譯碼器的輸入A腳由P2.2控制 </p><p> sbit LS138B = P2^3; //定義138譯碼器的輸入腳B由P2.3控制</p><
40、p> sbit LS138C = P2^4; //定義138譯碼器的輸入腳C由P2.4控制</p><p> void delay(unsigned int i); //函數(shù)聲名</p><p> char DelayCNT;</p><p> //此表為 LED 的字模, 共陰數(shù)碼管 0-9 - </p><p>
41、; unsigned char code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; </p><p><b> main()</b></p><p><b> { </b></p><p> unsigned in
42、t i,LedNumVal=1 ;</p><p> unsigned int LedOut[10];</p><p> DelayCNT=0;</p><p> while(1) //進入循環(huán)狀態(tài)</p><p><b> { </b></p><p> if(++DelayCNT
43、>=50)</p><p><b> {</b></p><p> DelayCNT=0; //延時計數(shù) 每掃描一次加一次</p><p> ++LedNumVal; //每隔50個掃描周期加一次</p><p><b> }</b></p><
44、p> LedOut[0]=Disp_Tab[LedNumVal%10000/1000];</p><p> LedOut[1]=Disp_Tab[LedNumVal%1000/100]|0x80;</p><p> LedOut[2]=Disp_Tab[LedNumVal%100/10];</p><p> LedOut[3]=Disp_Tab[Led
45、NumVal%10];</p><p> LedOut[4]=Disp_Tab[LedNumVal%10000/1000]; //千位</p><p> LedOut[5]=Disp_Tab[LedNumVal%1000/100]|0x80; //百位帶小數(shù)點</p><p> LedOut[6]=Disp_Tab[LedNumVal%100/10];
46、 //十位</p><p> LedOut[7]=Disp_Tab[LedNumVal%10]; //個位 </p><p> for( i=0; i<9; i++) //實現(xiàn)8位動態(tài)掃描循環(huán)</p><p> { P0 = LedOut[i]; //將字模送到P0口顯示</p><p>
47、; switch(i) { </p><p> case 0:LS138A=0; LS138B=0; LS138C=0; break; </p><p> case 1:LS138A=1; LS138B=0; LS138C=0; break; </p><p> case 2:LS138A
48、=0; LS138B=1; LS138C=0; break; </p><p> case 3:LS138A=1; LS138B=1; LS138C=0; break; </p><p> case 4:LS138A=0; LS138B=0; LS138C=1; break;</p><p> case 5:LS138A=1; LS138B=0; LS1
49、38C=1; break;</p><p> case 6:LS138A=0; LS138B=1; LS138C=1; break;</p><p> case 7:LS138A=1; LS138B=1; LS138C=1; break;</p><p><b> }</b></p><p> delay(
50、150);</p><p><b> }</b></p><p><b> } </b></p><p><b> }</b></p><p> void delay(unsigned int i)</p><p><b> {
51、</b></p><p><b> char j;</b></p><p> for(i; i > 0; i--)</p><p> for(j = 200; j > 0; j--);</p><p><b> }</b></p><p>&l
52、t;b> 2.鍵盤</b></p><p><b> ?。保I盤掃描原理</b></p><p> 在鍵盤中按鍵數(shù)量較多時,為了減少I/O口的占用,通常將按鍵排列成矩陣形式。在矩陣式鍵盤中,每條水平線和垂直線在交叉處不直接連通,而是通過一個按鍵加以連接。這樣,一個端口就可以構(gòu)成4*4=16個按鍵,比之直接將端口線用于鍵盤多出了一倍,而且線數(shù)越多,
53、區(qū)別越明顯,比如再多加一條線就可以構(gòu)成20鍵的鍵盤,而直接用端口線則只能多出一鍵。由此可見,在需要的鍵數(shù)比較多時,采用矩陣法來做鍵盤是合理的。</p><p> 矩陣式結(jié)構(gòu)的鍵盤顯然比直接法要復雜一些,識別也要復雜一些,列線通過電阻接正電源,并將行線所接的單片機的I/O口作為輸出端,而列線所接的I/O口則作為輸入。這樣,當按鍵沒有按下時,所有的輸入端都是高電平,代表無鍵按下。行線輸出是低電平,一旦有鍵按下,則輸
54、入線就會被拉低,這樣,通過讀入輸入線的狀態(tài)就可得知是否有鍵按下了。</p><p><b> 2.鍵盤掃描子程序</b></p><p> #include <reg51.h></p><p> #include <intrins.h></p><p> #define uchar uns
55、igned char</p><p> #define uint unsigned int</p><p> uchar dis_buf; //顯示緩存</p><p> uchar temp;</p><p> uchar key; //鍵順序嗎</p>&l
56、t;p> void delay0(uchar x); //x*0.14MS</p><p> #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};</p><p> unsigned char code LED7Code[] = {~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7
57、D,~0x07,~0x7F,~0x6F,~0x77,~0x7C,~0x39,~0x5E,~0x79,~0x71};</p><p> void delay(uchar x)</p><p> { uchar j;</p><p> while((x--)!=0)</p><p> { for(j=0;j<125;j++)<
58、;/p><p><b> {;}</b></p><p><b> }</b></p><p><b> }</b></p><p> void keyscan(void)</p><p> { temp = 0;</p><
59、;p> P1=0xF0; //高四位輸入 行為高電平 列為低電平</p><p><b> delay(1);</b></p><p> temp=P1; //讀P1口 </p><p> temp=temp&0xF0; //屏蔽低四位</p
60、><p> temp=~((temp>>4)|0xF0); </p><p> if(temp==1) // p1.4 被拉低</p><p><b> key=0;</b></p><p> else if(temp==2) // p1.5 被拉低</p><p>&
61、lt;b> key=1;</b></p><p> else if(temp==4) // p1.6 被拉低</p><p><b> key=2;</b></p><p> else if(temp==8) // p1.7 被拉低</p><p><b> key=3;&l
62、t;/b></p><p><b> else</b></p><p><b> key=16;</b></p><p> P1=0x0F; //低四位輸入 列為高電平 行為低電平</p><p><b> delay(1);</b>
63、;</p><p> temp=P1; //讀P1口 </p><p> temp=temp&0x0F;</p><p> temp=~(temp|0xF0);</p><p> if(temp==2) // p1.1 被拉低</p><p> ke
64、y=key+0;</p><p> else if(temp==4) // p1.2 被拉低</p><p> key=key+4;</p><p> else if(temp==8)// p1.3 被拉低</p><p> key=key+8;</p><p><b> else<
65、/b></p><p><b> key=16; </b></p><p> dis_buf = key; //鍵值入顯示緩存</p><p> dis_buf = dis_buf & 0x0f;</p><p><b> }</b></p&g
66、t;<p> void keydown(void)</p><p><b> { </b></p><p><b> P1=0xF0;</b></p><p> if(P1!=0xF0) //判斷按鍵是否按下 如果按鈕按下 會拉低P1其中的一個端口</p><p><
67、;b> {</b></p><p> keyscan(); //調(diào)用按鍵掃描程序</p><p><b> }</b></p><p><b> }</b></p><p><b> main()</b></p><p>&
68、lt;b> {</b></p><p> P0=0xFF; //置P0口</p><p> P1=0xFF; //置P1口 </p><p> delay(10); //延時</p><p><b&g
69、t; while(1)</b></p><p><b> { </b></p><p> keydown(); //調(diào)用按鍵判斷檢測程序</p><p> P0 = LED7Code[dis_buf%16]&0x7f; //LED7 0x7f為小數(shù)點 共陰和共陽此處也是不一樣; %16表示輸出16進制&l
70、t;/p><p><b> }</b></p><p><b> } </b></p><p><b> 五.設計心得</b></p><p> 通過這次課程設計,加深了對知識的理解,也非常的清楚的認識了這門課程的重要性,也意識到了自己在程序設計方面的薄弱性。希望在以后
71、的學習和工作中能進一部的加強自己專業(yè)素質(zhì)和實踐動手能力,并在單片機程序設計語言方面要實現(xiàn)從匯編語言到 C 語言的跳轉(zhuǎn)。</p><p><b> 六.參考文獻</b></p><p> ?。保w新民,王祁 智能儀器設計基礎(chǔ)。哈爾濱工業(yè)大學出版社</p><p><b> 七.附錄</b></p><
72、;p><b> ?。保绦?lt;/b></p><p> #include <reg51.h></p><p> #include <intrins.h></p><p> #define _Nop() _nop_() /*定義空指令*/ </p><p
73、> #define uchar unsigned char</p><p> #define uint unsigned int</p><p> uchar code saw_tab[]={ //每隔數(shù)字8,采取一次</p><p> 0xc0,0xbc,0xb8,0xb4,0xb0,0xac,0xa8,0xa4,0xa0,0x9c,0x98,
74、0x94,</p><p> 0x90,0x8c,0x88,0x84,0x80,0x7c,0x78,0x74,0x70,0x6c,0x68,0x64,0x60,0x5c,0x58,0x54,0x50,0x4c,0x48,0x44,0x40,0x3c,0x38,0x34,0x30,0x2c,0x28,0x24,0x20,0x1c,0x18,</p><p> 0x14,0x10,0x0c
75、,0x08,0x04,0x00};</p><p> uchar code maichong_tab[]={255,255,255,255,255,2550,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,
76、0,0,0,0,0,</p><p> 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0
77、, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,};</p><p> uchar dis_buf; //顯示緩存</p><p> uchar temp;
78、</p><p> uchar key,flag=0; //鍵順序嗎</p><p> void delay0(uchar x); //x*0.14MS</p><p> #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};</p><p&g
79、t; sbit LS138A = P2^2; //定義138譯碼器的輸入A腳由P2.2控制 </p><p> sbit LS138B = P2^3; //定義138譯碼器的輸入腳B由P2.3控制</p><p> sbit LS138C = P2^4; //定義138譯碼器的輸入腳C由P2.4控制</p><p> void delay9(u
80、nsigned int i); //函數(shù)聲名</p><p> char DelayCNT;</p><p> //此表為 LED 的字模, 共陰數(shù)碼管 0-9 - </p><p> unsigned char code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
81、,0x40}; </p><p> unsigned char code Disp_Tab1[] = {0x76,0x79,0x38,0x38,0x3f};</p><p> bit ack; /*應答標志位*/</p><p> sbit SCL=P2^1; //I2C 時鐘 </p>&l
82、t;p> sbit SDA=P2^0; //I2C 數(shù)據(jù) </p><p> void Start_I2c()</p><p><b> {</b></p><p> SDA=1; /*發(fā)送起始條件的數(shù)據(jù)信號*/</p><p><b> _Nop();&l
83、t;/b></p><p><b> SCL=1;</b></p><p> _Nop(); /*起始條件建立時間大于4.7us,延時*/</p><p><b> _Nop();</b></p><p><b> _Nop();</b></p
84、><p><b> _Nop();</b></p><p> _Nop(); </p><p> SDA=0; /*發(fā)送起始信號*/</p><p> _Nop(); /* 起始條件鎖定時間大于4μs*/</p><p><b> _Nop();
85、</b></p><p><b> _Nop();</b></p><p><b> _Nop();</b></p><p> _Nop(); </p><p> SCL=0; /*鉗住I2C總線,準備發(fā)送或接收數(shù)據(jù) */</p><p
86、><b> _Nop();</b></p><p><b> _Nop();</b></p><p><b> }</b></p><p> void Stop_I2c()</p><p><b> {</b></p><
87、;p> SDA=0; /*發(fā)送結(jié)束條件的數(shù)據(jù)信號*/</p><p> _Nop(); /*發(fā)送結(jié)束條件的時鐘信號*/</p><p> SCL=1; /*結(jié)束條件建立時間大于4μs*/</p><p><b> _Nop();</b></p><p><b>
88、_Nop();</b></p><p><b> _Nop();</b></p><p><b> _Nop();</b></p><p><b> _Nop();</b></p><p> SDA=1; /*發(fā)送I2C總線結(jié)束信號*/</p
89、><p><b> _Nop();</b></p><p><b> _Nop();</b></p><p><b> _Nop();</b></p><p><b> _Nop();</b></p><p><b>
90、 }</b></p><p> void SendByte(unsigned char c)</p><p><b> {</b></p><p> unsigned char BitCnt;</p><p> for(BitCnt=0;BitCnt<8;BitCnt++) /*要傳送
91、的數(shù)據(jù)長度為8位*/</p><p><b> {</b></p><p> if((c<<BitCnt)&0x80)SDA=1; /*判斷發(fā)送位*/</p><p> else SDA=0; </p><p><b> _Nop();</b
92、></p><p> SCL=1; /*置時鐘線為高,通知被控器開始接收數(shù)據(jù)位*/</p><p><b> _Nop(); </b></p><p> _Nop(); /*保證時鐘高電平周期大于4μs*/</p><p><b> _Nop()
93、;</b></p><p><b> _Nop();</b></p><p> _Nop(); </p><p><b> SCL=0; </b></p><p><b> }</b></p><p><b>
94、; _Nop();</b></p><p><b> _Nop();</b></p><p> SDA=1; /*8位發(fā)送完后釋放數(shù)據(jù)線,準備接收應答位*/</p><p><b> _Nop();</b></p><p> _Nop(); &
95、lt;/p><p><b> SCL=1;</b></p><p><b> _Nop();</b></p><p><b> _Nop();</b></p><p><b> _Nop();</b></p><p> if(
96、SDA==1)ack=0; </p><p> else ack=1; /*判斷是否接收到應答信號*/</p><p><b> SCL=0;</b></p><p><b> _Nop();</b></p><p><b> _Nop();</b>
97、;</p><p><b> }</b></p><p> unsigned char RcvByte()</p><p><b> {</b></p><p> unsigned char retc;</p><p> unsigned char BitC
98、nt;</p><p><b> retc=0; </b></p><p> SDA=1; /*置數(shù)據(jù)線為輸入方式*/</p><p> for(BitCnt=0;BitCnt<8;BitCnt++)</p><p><b> {</b><
99、/p><p> _Nop(); </p><p> SCL=0; /*置時鐘線為低,準備接收數(shù)據(jù)位*/</p><p><b> _Nop();</b></p><p> _Nop(); /*時鐘低電平周期大于4.7μs*/<
100、/p><p><b> _Nop();</b></p><p><b> _Nop();</b></p><p><b> _Nop();</b></p><p> SCL=1; /*置時鐘線為高使數(shù)據(jù)線上數(shù)據(jù)有效*/</p>
101、<p><b> _Nop();</b></p><p><b> _Nop();</b></p><p> retc=retc<<1;</p><p> if(SDA==1)retc=retc+1; /*讀數(shù)據(jù)位,接收的數(shù)據(jù)位放入retc中 */</p><p>
102、<b> _Nop();</b></p><p><b> _Nop(); </b></p><p><b> }</b></p><p> SCL=0; </p><p><b> _Nop();</b></p><p
103、><b> _Nop();</b></p><p> return(retc);</p><p><b> }</b></p><p> void Ack_I2c(bit a)</p><p><b> {</b></p><p> i
104、f(a==0)SDA=0; /*在此發(fā)出應答或非應答信號 */</p><p> else SDA=1;</p><p><b> _Nop();</b></p><p><b> _Nop();</b></p><p> _Nop(); </p&g
105、t;<p><b> SCL=1;</b></p><p><b> _Nop();</b></p><p> _Nop(); /*時鐘低電平周期大于4μs*/</p><p><b> _Nop();</b></p><
106、p><b> _Nop();</b></p><p><b> _Nop(); </b></p><p> SCL=0; /*清時鐘線,鉗住I2C總線以便繼續(xù)接收*/</p><p><b> _Nop();</b></p><
107、;p> _Nop(); </p><p><b> }</b></p><p> void delay9(unsigned int i)</p><p><b> {</b></p><p><b> char j;</b></p><
108、p> for(i; i > 0; i--)</p><p> for(j = 200; j > 0; j--);</p><p><b> }</b></p><p> bit DACconversion(unsigned char sla,unsigned char c, unsigned char Val)<
109、;/p><p><b> {</b></p><p> Start_I2c(); //啟動總線</p><p> SendByte(sla); //發(fā)送器件地址</p><p> if(ack==0)return(0);</p><p> Se
110、ndByte(c); //發(fā)送控制字節(jié)</p><p> if(ack==0)return(0);</p><p> SendByte(Val); //發(fā)送DAC的數(shù)值 </p><p> if(ack==0)return(0);</p><p> Stop_I2c();
111、 //結(jié)束總線</p><p> return(1);</p><p><b> }</b></p><p> void delay(uint x)</p><p> { uchar j;</p><p> while((x--)!=0)</p><p
112、> { for(j=0;j<125;j++)</p><p><b> {;}</b></p><p><b> }</b></p><p><b> }</b></p><p> void keyscan(void)</p><p&
113、gt; { temp = 0;</p><p> P1=0xF0; //高四位輸入 行為高電平 列為低電平</p><p><b> delay(1);</b></p><p> temp=P1; //讀P1口 </p><p> temp
114、=temp&0xF0; //屏蔽低四位</p><p> temp=~((temp>>4)|0xF0); </p><p> if(temp==1) // p1.4 被拉低</p><p><b> key=0;</b></p><p> else if(temp==2) /
115、/ p1.5 被拉低</p><p><b> key=1;</b></p><p> else if(temp==4) // p1.6 被拉低</p><p><b> key=2;</b></p><p> else if(temp==8) // p1.7 被拉低</p&g
116、t;<p><b> key=3;</b></p><p><b> else</b></p><p><b> key=16;</b></p><p> P1=0x0F; //低四位輸入 列為高電平 行為低電平</p><p&
117、gt;<b> delay(1);</b></p><p> temp=P1; //讀P1口 </p><p> temp=temp&0x0F;</p><p> temp=~(temp|0xF0);</p><p> if(temp==2) // p1
118、.1 被拉低</p><p> key=key+0;</p><p> else if(temp==4) // p1.2 被拉低</p><p> key=key+4;</p><p> else if(temp==8)// p1.3 被拉低</p><p> key=key+8;</p&g
119、t;<p><b> else</b></p><p><b> key=16; </b></p><p> dis_buf = key; //鍵值入顯示緩存</p><p> dis_buf = dis_buf & 0x0f;</p><p&g
120、t;<b> }</b></p><p> void keydown(void)</p><p><b> { </b></p><p><b> P1=0xF0;</b></p><p> if(P1!=0xF0) //判斷按鍵是否按下 如果按鈕按下 會拉低P
121、1其中的一個端口</p><p><b> {</b></p><p> keyscan(); //調(diào)用按鍵掃描程序</p><p><b> }</b></p><p><b> }</b></p><p> void delay5(uns
122、igned int time)</p><p><b> {</b></p><p> for(time;time>0;time--);</p><p><b> }</b></p><p> void bmain()</p><p> {uint h=50;
123、</p><p> P0=0xFF; //置P0口</p><p> P1=0xFF; //置P1口 </p><p> delay(10); //延時</p><p> while(h--)</p><
124、p><b> { </b></p><p> unsigned int i;</p><p> unsigned int LedOut[10];</p><p> LedOut[0]=Disp_Tab[key%10000/1000];</p><p> LedOut[1]=Disp_Tab[key%1
125、000/100]|0x80;</p><p> LedOut[2]=Disp_Tab[key%100/10];</p><p> LedOut[3]=Disp_Tab[key%10];</p><p> LedOut[4]=Disp_Tab[key%10000/1000]; //千位</p><p> LedOut[5]=Dis
126、p_Tab[key%1000/100]|0x80; //百位帶小數(shù)點</p><p> LedOut[6]=Disp_Tab[key%100/10]; //十位</p><p> LedOut[7]=Disp_Tab[key%10]; //個位 </p><p> for( i=0; i<9; i++) //實現(xiàn)8位
127、動態(tài)掃描循環(huán)</p><p><b> { </b></p><p> P0 = LedOut[i]; //將字模送到P0口顯示</p><p> switch(i) //使用switch 語句控制位選</p><p><b> { </b></p><
128、p> case 0:LS138A=0; LS138B=0; LS138C=0; break; </p><p> case 1:LS138A=1; LS138B=0; LS138C=0; break; </p><p> case 2:LS138A=0; LS138B=1; LS138C=0; break; </p>
129、<p> case 3:LS138A=1; LS138B=1; LS138C=0; break; </p><p> case 4:LS138A=0; LS138B=0; LS138C=1; break;</p><p> case 5:LS138A=1; LS138B=0; LS138C=1; break;</p><p> case 6
130、:LS138A=0; LS138B=1; LS138C=1; break;</p><p> case 7:LS138A=1; LS138B=1; LS138C=1; break;</p><p><b> }</b></p><p> delay9(150);</p><p><b> }<
131、/b></p><p><b> }</b></p><p><b> } </b></p><p> void saw()</p><p><b> {</b></p><p> long int l;</p>&l
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 智能儀器課程設計--波形發(fā)生器的設計
- 虛擬儀器課程設計---任意波形發(fā)生器
- 波形發(fā)生器課程設計
- 課程設計——波形發(fā)生器
- 波形發(fā)生器課程設計
- 課程設計——波形發(fā)生器
- 課程設計-波形發(fā)生器
- 波形發(fā)生器課程設計
- 波形發(fā)生器課程設計
- 課程設計--波形發(fā)生器設計
- 課程設計--函數(shù)波形發(fā)生器
- vlsi波形發(fā)生器課程設計
- 波形發(fā)生器課程設計報告
- 波形發(fā)生器課程設計報告
- 波形發(fā)生器課程設計報告
- 簡易波形發(fā)生器課程設計
- 波形發(fā)生器的設計課程設計
- eda課程設計--任意波形發(fā)生器
- 綜合課程設計--簡易波形發(fā)生器
- 微機課程設計報告-波形發(fā)生器
評論
0/150
提交評論