版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p> 課 程 設(shè) 計(jì)</p><p> 課程名稱 單片機(jī)原理及應(yīng)用 </p><p> 課題名稱 簡易數(shù)字電壓表 </p><p> 專 業(yè) 自動(dòng)化 </p><p> 班
2、 級(jí) </p><p> 學(xué) 號(hào) </p><p> 姓 名 </p><p> 指導(dǎo)教師
3、 </p><p> 2012年5月14日</p><p><b> 目 錄</b></p><p> ?一 系統(tǒng)總體方案選擇與說明1</p><p> 1.1 通道轉(zhuǎn)換部分設(shè)計(jì)1</p><p> 1.2 顯示部分設(shè)計(jì)1</p><p&g
4、t; ?二 系統(tǒng)結(jié)構(gòu)框圖與工作原理2</p><p> ?三 各單元硬件設(shè)計(jì)說明及計(jì)算方法3</p><p> 3.1 單片機(jī)的選擇及時(shí)鐘電路3</p><p> 3.2 LED顯示電路設(shè)計(jì)與器件選擇3</p><p> 3.3 A/D轉(zhuǎn)換模塊及轉(zhuǎn)化電路設(shè)計(jì)5</p><p> 3.3.1 A
5、DC0808簡介5</p><p> ?3.3.2 A/D轉(zhuǎn)換電路設(shè)計(jì)6</p><p> ?四 軟件設(shè)計(jì)與說明7</p><p> ?五 調(diào)試結(jié)果與必要的調(diào)試說明8</p><p> ?六 使用說明9</p><p> ?七 程序清單10</p><p><
6、;b> ?八 總結(jié)32</b></p><p> ?九 參考文獻(xiàn)33</p><p><b> ?十 附錄34</b></p><p> 電氣信息學(xué)院課程設(shè)計(jì)評(píng)分表36</p><p> 一 系統(tǒng)總體方案選擇與說明</p><p> 實(shí)現(xiàn)數(shù)字電壓表的方案
7、很多,目前廣泛采用的是時(shí)基于74系列邏輯器件,本設(shè)計(jì)將介紹基于單片機(jī)實(shí)現(xiàn)的方案。</p><p> 此設(shè)計(jì)包含兩個(gè)模塊,通道轉(zhuǎn)換和顯示部分。</p><p> 1.1 通道轉(zhuǎn)換部分設(shè)計(jì)</p><p> 方案一:考慮到ADC0809有8個(gè)模擬通道的輸入,可以實(shí)現(xiàn)接入其中任何一個(gè)通道的信號(hào)就顯示那個(gè)通道的電壓,如果有多路輸入就分時(shí)顯示,但是要花費(fèi)大量的指令周期。
8、</p><p> 方案二:利用手動(dòng)開關(guān)實(shí)現(xiàn)通道轉(zhuǎn)換。該方案可簡化控制程序,消減系統(tǒng)開銷。縮短反應(yīng)時(shí)間,不足之處在于操作麻煩。</p><p> 綜上所述:方案二只需增加一個(gè)鍵盤、成本低且易于實(shí)現(xiàn),所以選用該方案。由于單片機(jī)的許多輸入輸出口沒有用上,在一個(gè)簡易數(shù)字電壓表的基礎(chǔ)上,在沒有增加額外的硬件的情況下添加了時(shí)鐘顯示的功能,電壓表能測量0-5V的直流電壓,能連續(xù)、穩(wěn)定顯示所測電壓。
9、并且誤差值僅為0.01。</p><p> 1.2 顯示部分設(shè)計(jì)</p><p> 由于單片機(jī)的輸出口有限,所以本設(shè)計(jì)運(yùn)用了兩片74ls373來進(jìn)行信號(hào)所存,從而達(dá)到復(fù)用輸入輸出口的作用。</p><p> 二 系統(tǒng)結(jié)構(gòu)框圖與工作原理</p><p> 由于沒有用到串行通信,單片機(jī)使用時(shí)鐘基頻為12MHz的晶振,復(fù)位電路等外圍也是使用
10、早已成熟的方案。由于proteus沒有ADC0809的仿真模型,所以在仿真電路圖中用了一片ADC0808代替仿真,但在實(shí)際電路中 要用ADC0809做模數(shù)轉(zhuǎn)換模塊。</p><p> 由于ADC0809有8個(gè)測量通道,首先用鍵盤通過單片機(jī)傳控制ADC0809開啟其中一路信號(hào)通道。然后讓ADC0809進(jìn)行轉(zhuǎn)換,ADC0809會(huì)將0-5V電壓變換成0-28即0-256的數(shù)字量,電壓的模擬量也就轉(zhuǎn)換成了單片機(jī)可處理的
11、數(shù)字量。然后單片機(jī)進(jìn)行信號(hào)的處理,將該數(shù)字量還原出電壓值,最后通過數(shù)碼管進(jìn)行顯示。其中的鎖存器是為了減少顯示部分對單片機(jī)引腳硬件資源的占用。</p><p> 三 各單元硬件設(shè)計(jì)說明及計(jì)算方法</p><p> 硬件電路由5個(gè)部分組成,即單片機(jī)時(shí)鐘電路、復(fù)位電路、6位顯示器電路、A/D轉(zhuǎn)換電路和鍵盤及測量電路。</p><p> 3.1 單片機(jī)的選擇及時(shí)鐘電路
12、</p><p> 根據(jù)初步設(shè)計(jì)方案的分析,設(shè)計(jì)這樣一個(gè)簡單的應(yīng)用系統(tǒng),可以選擇帶有EPROM的單片機(jī),應(yīng)用程序直接存儲(chǔ)在片內(nèi),不用在外部擴(kuò)展程序存儲(chǔ)器,電路可以簡化。此電路選擇Atmel公司生產(chǎn)的AT89C51。AT89系列與MCS-51系列單片機(jī)相比有兩大優(yōu)勢:第一,片內(nèi)程序存儲(chǔ)器采用閃速存儲(chǔ)器,使程序的寫入更加方便;第二,提供了更小尺寸的芯片,使整個(gè)電路體積更小。它以較小的體積、良好的性價(jià)比倍受青睞。&l
13、t;/p><p> 單片機(jī)工作的時(shí)間基準(zhǔn)是由時(shí)鐘電路提供的。在單片機(jī)的XTAL1和XTAL2兩個(gè)管腳,接一只晶振及兩只電容就構(gòu)成了單片機(jī)的時(shí)鐘電路。</p><p> 電路中,電容C1和C2對震蕩電路有微調(diào)的作用,通常的取值范圍位(30+10)pF。石英晶體選擇6MHz或12MHz都可以,其結(jié)果只是機(jī)器周期時(shí)間不同,影響計(jì)數(shù)器的計(jì)數(shù)初值,此設(shè)計(jì)取12MHz。本設(shè)計(jì)使用的是CLOCK時(shí)鐘脈沖
14、觸發(fā)。</p><p> 3.2 LED顯示電路設(shè)計(jì)與器件選擇</p><p> 單片機(jī)應(yīng)用系統(tǒng)中,通常都需要進(jìn)行人機(jī)對話。這包括人對應(yīng)用系統(tǒng)的狀態(tài)干預(yù)與數(shù)據(jù)輸入,以及應(yīng)用系統(tǒng)向人們顯示運(yùn)行狀態(tài)與運(yùn)行結(jié)果。顯示器、鍵盤電路就是用來完成人機(jī)對話活動(dòng)的人機(jī)通道。</p><p> 圖3-2-1 LED顯示模塊</p><p> LED顯示
15、器的驅(qū)動(dòng)是一個(gè)非常重要的問題,由圖3-2-1可知,顯示電路由LED顯示器、段驅(qū)動(dòng)電路和位驅(qū)動(dòng)電路組成。</p><p> 在應(yīng)用系統(tǒng)中,設(shè)計(jì)要求不同,使用的LED顯示器的位數(shù)也不同,因此生產(chǎn)廠家就生產(chǎn)了多種位數(shù)、尺寸、型號(hào)不同的LED顯示器。在我們的設(shè)計(jì)中,選擇6位一體的共陰極時(shí)鐘型LED顯示器,采用動(dòng)態(tài)顯示方式。</p><p> 采用P1口作為LED的段碼輸出信號(hào),P3.0,P3.
16、1結(jié)合P1口作為位選和段選的控制信號(hào)。硬件電路的連接如圖3-2-2所示。</p><p> 圖3-2-2 LED顯示器接口電路原理</p><p> 該電路的工作原理:當(dāng)P0口輸出段碼信號(hào)的BCD碼后,輸出具有一定驅(qū)動(dòng)能力的七段字形碼,由于6-LED的段碼輸入管腳是并聯(lián)在一起的,所以每一位LED的段碼輸入管腳都能獲得這個(gè)段碼信號(hào)。若要控制在每一時(shí)刻只有一位LED被點(diǎn)亮,必須靠位碼信號(hào)控
17、制。P3.0為1則位選選通當(dāng)P1口某一位為0則該位數(shù)碼管點(diǎn)亮。如果P1口的位碼信號(hào)在每一時(shí)刻只有一位是“1”,其他位全為“0”,然后按時(shí)間順序改變輸出“1”的位置,控制在每一時(shí)刻只有一位LED被點(diǎn)亮,達(dá)到動(dòng)態(tài)顯示的目的。</p><p> 說明:第6位顯示轉(zhuǎn)換通道,0、1和2位顯示電壓表數(shù)值。</p><p> 3.3 A/D轉(zhuǎn)換模塊及轉(zhuǎn)化電路設(shè)計(jì)</p><p&g
18、t; A/D轉(zhuǎn)換器的功能是將模擬量轉(zhuǎn)換為與其大小成正比的數(shù)字量信號(hào)。能實(shí)現(xiàn)這種轉(zhuǎn)換的原理和方法很多,此設(shè)計(jì)采用ADC0808轉(zhuǎn)換器。ADC0808是一種逐次逼近型的8位A/D轉(zhuǎn)換器件,片內(nèi)有8路模擬開關(guān),可輸入8個(gè)模擬量,單極性,量程為0~+5V。</p><p> 3.3.1 ADC0808簡介</p><p> 1. ADC0808引腳功能</p><p>
19、; IN0~I(xiàn)N7:8路模擬量輸入。</p><p> ADDA、ADDB、ADDC:模擬量輸入通道地址選擇,其8位編碼分別對應(yīng)IN0~I(xiàn)N7.</p><p> ALE:地址鎖存允許,上升沿將通道選擇信號(hào)存入地址鎖存器。</p><p> START:ADC轉(zhuǎn)換啟動(dòng)信號(hào),正脈沖有效,引腳信號(hào)要求保持在200ns以上,其上升沿將內(nèi)部逐次逼近寄存器清零。<
20、;/p><p> EOC:轉(zhuǎn)換解釋信號(hào),可做為中斷請求信號(hào)或供CPU查詢。</p><p> CLK:時(shí)鐘輸入端,要求頻率范圍在10kHz~1.2MHz.</p><p> OE:允許輸出信號(hào)。</p><p> Vcc:芯片工作電壓。</p><p> VREF(+)、VREF(-):基準(zhǔn)參考電壓的正、負(fù)值。&
21、lt;/p><p> OUT1~OUT8:8路數(shù)字量輸出端。</p><p> 3.3.2 A/D轉(zhuǎn)換電路設(shè)計(jì)</p><p> 集成摸數(shù)轉(zhuǎn)換芯片ADC0808實(shí)現(xiàn)的A/D轉(zhuǎn)換電路被測信號(hào)由ADC0808模擬輸入端輸入,完成A/D轉(zhuǎn)換后送入單片機(jī),經(jīng)相應(yīng)處理后送出顯示。</p><p> 圖3-3-2ADC0808外圍電路圖</p&
22、gt;<p><b> 四 軟件設(shè)計(jì)與說明</b></p><p> 軟件的設(shè)計(jì)分成兩個(gè)部分,即電壓顯示部分和時(shí)鐘顯示部分。</p><p> 其中整個(gè)電壓的顯示都在show_adc0808() 這個(gè)數(shù)值顯示總調(diào)用函數(shù)里面,讀取電壓值的函數(shù)分別為read_adc0808_1()(讀取電壓數(shù)值整數(shù)部分)read_adc0808_2();read_ad
23、c0808_3() (讀取數(shù)值小數(shù)部分)。電壓值分三部分顯示disp_2(read_1)顯示整數(shù)部分disp_1(read_2);disp_0(read_3)顯示小數(shù)部分。在調(diào)用show_adc0808()時(shí)以上的函數(shù)都會(huì)被調(diào)用。</p><p> 在調(diào)用該函數(shù)后又調(diào)用一個(gè)show_key( )的函數(shù)來顯示對應(yīng)的按鍵,所以當(dāng)按下某個(gè)鍵后就會(huì)顯示該鍵名的通道值和該通道的電壓值。</p><p
24、> 五 調(diào)試結(jié)果與必要的調(diào)試說明</p><p> 本設(shè)計(jì)的調(diào)試需要proteus和keil兩個(gè)軟件。而且還要對這兩個(gè)軟件進(jìn)行相應(yīng)的設(shè)置,使proteus能和keil一起聯(lián)調(diào)。</p><p> 調(diào)試時(shí),在按下1-8號(hào)鍵時(shí)應(yīng)該顯示相應(yīng)的測量口電壓,在按下*號(hào)鍵時(shí)應(yīng)可以顯示時(shí)間,按下#然后按下9或0應(yīng)可以調(diào)整時(shí)間。</p><p> 在調(diào)試在調(diào)試時(shí)發(fā)現(xiàn)電
25、壓顯示值和輸入值不對應(yīng),只能測量到0.0的范圍值,后來發(fā)現(xiàn)在對ADC0808傳遞來的數(shù)字信號(hào)處理時(shí)把“%”號(hào)誤打成了“/”,經(jīng)過修改后,輸出顯示正常,能顯示出0.00范圍的值。</p><p> 還發(fā)現(xiàn)當(dāng)按下1-8號(hào)鍵時(shí)時(shí)鐘停止,也就是說測量電壓后時(shí)間就還是在測量前的時(shí)間。經(jīng)過單步調(diào)試后找出只要在測量電壓的相關(guān)代碼上開啟定時(shí)器并且僅在第一個(gè)循環(huán)置入初值就可以在測量電壓時(shí)時(shí)鐘繼續(xù)運(yùn)行。注意,千萬不可在顯示函數(shù)里置
26、入初值,由于顯示部分是一個(gè)速度很快的循環(huán),每個(gè)循環(huán)都置入初值那么時(shí)鐘也會(huì)停滯。</p><p> 圖5-1正常的電壓顯示圖</p><p><b> 六 使用說明</b></p><p> 這個(gè)設(shè)計(jì)包含了電壓顯示以及時(shí)鐘的功能,其操作簡便,只要按數(shù)字1-8數(shù)碼管就會(huì)顯示相應(yīng)的測量口以及對應(yīng)的電壓值。當(dāng)然,首先要在相應(yīng)的測量口接入電壓才會(huì)有
27、值輸出,否則輸出為零。</p><p> 該電壓表的輸出值誤差為0.01。在第一次使用時(shí)應(yīng)該對時(shí)間進(jìn)行調(diào)整,要對小時(shí)進(jìn)行調(diào)整請按下#號(hào)鍵然后按9(數(shù)值增加)0(數(shù)值減少),再按一下#號(hào)鍵可以對分鐘進(jìn)行調(diào)整,同理,再按一次#號(hào)鍵就可對秒鐘進(jìn)行調(diào)整。按下*號(hào)鍵后可以全部顯示所設(shè)的時(shí)間。設(shè)置完后請按*號(hào)鍵顯示時(shí)間。如下圖所示:</p><p> 該設(shè)計(jì)考慮了指令運(yùn)行時(shí)間,已經(jīng)對其進(jìn)行調(diào)整,但
28、是在運(yùn)行幾天后應(yīng)該對其時(shí)鐘進(jìn)行重新調(diào)整。在使用過程中要持續(xù)為單片機(jī)供電否則斷電后時(shí)鐘歸零又要重新調(diào)整時(shí)鐘。</p><p> 由于設(shè)計(jì)時(shí)間限制,還有些問題有待改善,比如人手很容易碰到#號(hào)鍵,可以改成按下*再按#號(hào)鍵才能調(diào)整時(shí)間。還有部分功能需要添加,比如當(dāng)測量電壓超過量程時(shí)可以報(bào)警等。</p><p><b> 七 程序清單</b></p><
29、p> #include <reg52.h></p><p> sbit BChoise=P3^0;//位選</p><p> sbit SChoise=P3^1;//段選</p><p> sbit ShowDot=P1^7;//顯示小數(shù)點(diǎn)</p><p> sbit ADD_Zero=P1^2;</p>
30、;<p> sbit RA_1=P3^5;//行</p><p> sbit RB_2=P3^6;</p><p> sbit RC_3=P3^7;</p><p> sbit RD_4=P2^7;</p><p> sbit C1_1=P3^2;//列</p><p> sbit C2_2=
31、P3^3;</p><p> sbit C3_3=P3^4;</p><p> int key=8;//初始顯示為第八個(gè)測量口,告知只有測量口8個(gè)</p><p> int count=0;//計(jì)數(shù),計(jì)滿20個(gè)50ms</p><p> int hour=0,minute=0,sec=0;</p><p>
32、; //ADC0808引腳定義</p><p> sbit ADD_A=P2^0;</p><p> sbit ADD_B=P2^1;</p><p> sbit ADD_C=P2^2;</p><p> sbit ALE=P2^3;//地址所存</p><p> sbit Start=P2^4;//開始轉(zhuǎn)
33、換</p><p> sbit OE=P2^5; //輸出允許</p><p> sbit EOC=P2^6;</p><p> int show_adc0808();//電壓顯示</p><p> int read_adc0808_1();//取整數(shù)部分</p><p> int read_adc08
34、08_2();//取小數(shù)部分</p><p> int read_adc0808_3();</p><p> void delay_us(unsigned int );//延遲函數(shù)</p><p> void disp_2( unsigned long num);</p><p> void disp_1( unsigned long
35、 num);</p><p> void disp_0( unsigned long num);//0.00顯示</p><p> int Scan_KeyDown();//掃鍵函數(shù)</p><p> int Scan_KeyDown_adjust_0();</p><p> int Scan_KeyDown_adjust_1();
36、</p><p> void show_key(int key);//鍵值顯示</p><p> void hour_show(int hour);//小時(shí)顯示</p><p> void minute_show(int minute);//分鐘顯示</p><p> void sec_show(int sec);//秒鐘顯示<
37、/p><p> unsigned int table[]={ //段選信號(hào)</p><p> 0x3f,0x06,0x5b,0x4f,</p><p> 0x66,0x6d,0x7d,0x07,</p><p> 0x7f,0x6f,0x77,0x7c,</p><p> 0x39,0x5e,0x79,0
38、x71,</p><p><b> 0x00};</b></p><p> unsigned int Btable[]={ //位選信號(hào)</p><p> 0xfe,0xfd,0xfb,0xf7,0xef,</p><p><b> 0xff};</b></p><p
39、> void main()</p><p><b> { </b></p><p> int key1=0,key2=0,key3=0,key4=0,adjust=1,on=1;</p><p> ALE=0; //初始化adc0808</p><p><b> Start=0;</
40、b></p><p><b> OE=0;</b></p><p><b> while(1)</b></p><p><b> { </b></p><p><b> EA=1;</b></p><p><b&
41、gt; key1=0;</b></p><p> key1=Scan_KeyDown(); //調(diào)用掃鍵函數(shù)</p><p> if((key1<=8)&&(key1>=1)) </p><p><b> { </b></p><p><b> while
42、(on)</b></p><p><b> {</b></p><p><b> EA=1;</b></p><p><b> ET1=1;</b></p><p><b> TR1=1;</b></p><p&g
43、t; TMOD=0x10;//定時(shí)T0方式1</p><p> TH1=(65536-37000)/256; //0x3C;</p><p> TL1=(65536-37000)%256; //0xB0;</p><p><b> on=0;</b></p><p><b> } <
44、;/b></p><p> show_adc0808();//電壓值顯示</p><p> show_key( key1); //顯示按鍵</p><p><b> }</b></p><p> /*@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/</p><p>
45、; else if((key1==9)||(key1==10)||(key1==11)||(key1==12))//時(shí)鐘狀態(tài)</p><p><b> {</b></p><p><b> on=1;</b></p><p><b> RD_4=1;</b></p><p
46、><b> EA=1;</b></p><p><b> EA=1;</b></p><p><b> ET1=1;</b></p><p><b> TR1=1;</b></p><p> TMOD=0x10;//定時(shí)T0方式1</
47、p><p> TH1=(65536-37000)/256; //0x3C;</p><p> TL1=(65536-37000)%256; //0xB0;</p><p> while((key1==10))</p><p><b> {</b></p><p> key1=Scan_K
48、eyDown();</p><p> hour_show(hour);</p><p> delay_us(1);</p><p> minute_show( minute);</p><p> delay_us(1);</p><p> sec_show( sec);</p><p>
49、; delay_us(1);</p><p><b> }</b></p><p> while((key1==12)) //時(shí)鐘調(diào)整</p><p><b> {</b></p><p><b> TR1=0;</b></p><p&g
50、t;<b> key2=0;</b></p><p> //delay_us(1);</p><p> key2=Scan_KeyDown_adjust_0();</p><p> if(key2==12)</p><p><b> adjust++;</b></p><
51、;p> if(adjust==4)</p><p> {adjust=1;</p><p><b> }</b></p><p><b> //小時(shí)調(diào)整</b></p><p> /***************************************/</p>
52、<p> while(adjust==1)</p><p><b> { </b></p><p> hour_show(hour);</p><p> delay_us(3);</p><p> key3=Scan_KeyDown_adjust_1();</p><p>
53、 if(key3==9)</p><p><b> {</b></p><p> delay_us(650);</p><p> key3=Scan_KeyDown_adjust_1();</p><p> if(key3==9)</p><p> { hour++; </p&g
54、t;<p> if(hour==24)</p><p><b> {</b></p><p><b> hour=0;</b></p><p><b> }</b></p><p><b> }</b></p><
55、;p><b> key3=0;</b></p><p><b> }</b></p><p> if(key3==11)</p><p><b> { </b></p><p> delay_us(650);</p><p> key
56、3=Scan_KeyDown_adjust_1();</p><p> if(key3==11)</p><p> { hour--; </p><p> if(hour==-1)</p><p><b> {</b></p><p><b> hour=23;</b&g
57、t;</p><p><b> }</b></p><p><b> } </b></p><p><b> key3=0; </b></p><p><b> }</b></p><p> key4=Scan_KeyDo
58、wn();</p><p> if(((key4<=8)&&(key4>=1))||(key4==10)||(key4==12))//跳出9,11號(hào)鍵</p><p> {key4=0; break;} </p><p><b> }</b></p><p> /***********
59、**********************************/</p><p><b> //分鐘調(diào)整</b></p><p> /***************************************/</p><p> while(adjust==2)</p><p><b> {
60、</b></p><p> minute_show(minute);</p><p> delay_us(3);</p><p> key3=Scan_KeyDown_adjust_1();</p><p> if(key3==9)</p><p><b> {</b>&l
61、t;/p><p> delay_us(650);</p><p> key3=Scan_KeyDown_adjust_1();</p><p> if(key3==9)</p><p><b> { </b></p><p><b> minute++;</b><
62、/p><p> if(minute==60)</p><p><b> {</b></p><p><b> minute=0;</b></p><p><b> }</b></p><p><b> }</b></p&
63、gt;<p><b> key3=0;</b></p><p><b> }</b></p><p> if(key3==11)</p><p><b> { </b></p><p> delay_us(650);</p><p&
64、gt; key3=Scan_KeyDown_adjust_1(); //!!</p><p> if(key3==11)</p><p><b> { </b></p><p> minute--; </p><p> if(minute==-1)</p><p><b>
65、 {</b></p><p> minute=59;</p><p><b> }</b></p><p><b> }</b></p><p><b> key3=0; </b></p><p><b> }</
66、b></p><p> key4=Scan_KeyDown();</p><p> if(((key4<=8)&&(key4>=1))||(key4==10)||(key4==12))//跳出9,11號(hào)鍵</p><p> {key4=0; break;} </p><p><b> }&l
67、t;/b></p><p> /*********************************************/ </p><p><b> //秒鐘調(diào)整</b></p><p> /***************************************/</p><p> while(
68、adjust==3)</p><p><b> { </b></p><p> sec_show(sec);</p><p> delay_us(3);</p><p> key3=Scan_KeyDown_adjust_1();</p><p> if(key3==9)</p&
69、gt;<p><b> { </b></p><p> delay_us(650);</p><p> key3=Scan_KeyDown_adjust_1();</p><p> if(key3==9)</p><p><b> { sec++; </b></p&g
70、t;<p> if(sec==60)</p><p><b> {</b></p><p><b> sec=0;</b></p><p><b> }</b></p><p><b> }</b></p><p
71、><b> key3=0; </b></p><p><b> }</b></p><p> if(key3==11)</p><p><b> { </b></p><p> delay_us(650);</p><p> key3=
72、Scan_KeyDown_adjust_1();</p><p> if(key3==11)</p><p><b> { sec--;</b></p><p> if(sec==-1)</p><p><b> {</b></p><p><b> se
73、c=59;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> key3=0;</b></p><p><b> }</b></p><p> key4
74、=Scan_KeyDown();</p><p> if(((key4<=8)&&(key4>=1))||(key4==10)||(key4==12))//跳出9,11號(hào)鍵</p><p> {key4=0; break;} </p><p><b> }</b></p><p> /
75、*********************************************/</p><p> if(((key2<=8)&&(key2>=1))||(key2==10))//跳出12號(hào)鍵</p><p><b> break; </b></p><p><b> }</b>
76、;</p><p><b> }</b></p><p> /*@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/</p><p><b> } </b></p><p><b> }</b></p><p> int show_ad
77、c0808() //數(shù)值顯示總調(diào)用</p><p> { int on=1;</p><p> int read_1=0,read_2=0,read_3=0;</p><p> read_1=read_adc0808_1(); //讀取數(shù)值整數(shù)部分</p><p> read_2=read_adc0808_2();
78、 //讀取數(shù)值小數(shù)部分</p><p> read_3=read_adc0808_3(); </p><p> disp_2(read_1);//顯示整數(shù)</p><p> delay_us(10);</p><p> disp_1(read_2); //顯示小數(shù)</p><p> delay_us
79、(10);</p><p> disp_0(read_3);</p><p> delay_us(10);</p><p><b> }</b></p><p> int read_adc0808_1() //整數(shù)讀取函數(shù)</p><p><b> {</b>
80、;</p><p><b> while(1)</b></p><p><b> {</b></p><p> if (EOC==0)</p><p><b> { </b></p><p><b> OE=1;</b>&
81、lt;/p><p> return ((P0+1)/51);</p><p><b> OE=0;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> } </b>
82、</p><p> int read_adc0808_2() //小數(shù)讀取函數(shù)</p><p><b> {</b></p><p> int num=0;</p><p><b> while(1)</b></p><p><b> {</b
83、></p><p> if (EOC==0)</p><p><b> { </b></p><p><b> OE=1;</b></p><p> //return ((((P0+1)%51)*10)/51);</p><p><b> num=P
84、0;</b></p><p> //num=189;</p><p> num=num%51;</p><p> num=num*10;</p><p> num=num/51;</p><p> return num;</p><p><b> OE=0;&l
85、t;/b></p><p><b> }</b></p><p><b> }</b></p><p><b> } </b></p><p> int read_adc0808_3() //小數(shù)讀取函數(shù)</p><p><
86、b> {</b></p><p> int num=0;</p><p><b> while(1)</b></p><p><b> {</b></p><p> if (EOC==0)</p><p><b> { </b&g
87、t;</p><p><b> OE=1;</b></p><p> //return ((((((P0+1)%51)*10)/51)*10)%51);</p><p><b> //P0=162;</b></p><p><b> num=P0;</b></p&
88、gt;<p> num=num%51;</p><p> num=num*10;</p><p> num=num%51;</p><p> num=num*10;</p><p> num=num/51;</p><p> return num;</p><p>&l
89、t;b> OE=0;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> } </b></p><p> void disp_2( unsigned long num) //整數(shù)顯示函數(shù)
90、</p><p><b> {</b></p><p> if(num>=0&&num<=9)</p><p><b> //顯示個(gè)位</b></p><p><b> {</b></p><p> SChoise=
91、0;</p><p> BChoise=0;</p><p> delay_us(1);</p><p> P1=table[16];</p><p> SChoise=1;</p><p> SChoise=0;</p><p> // P1=table[tmp[0]];<
92、/p><p> P1=table[num];</p><p> SChoise=1;</p><p> SChoise=0;</p><p><b> P1=0x0fb;</b></p><p> BChoise=1;</p><p> BChoise=0;<
93、/p><p> delay_us(3);</p><p><b> P1=0x00;</b></p><p> SChoise=1;</p><p> SChoise=0;</p><p><b> P1=0x0FF;</b></p><p>
94、 BChoise=1;</p><p> BChoise=0;</p><p> P1=table[16];</p><p> ShowDot=1;</p><p> SChoise=1;</p><p> SChoise=0;</p><p> P1=Btable[2];<
95、/p><p> BChoise=1;</p><p> BChoise=0;</p><p> delay_us(2);</p><p> P1=table[16];</p><p> SChoise=1;</p><p> SChoise=0;</p><p&g
96、t;<b> P1=0xFF;</b></p><p> BChoise=1;</p><p> BChoise=0;</p><p> delay_us(2);</p><p><b> }</b></p><p><b> }</b>
97、</p><p> void disp_1( unsigned long num) //小數(shù)顯示函數(shù)</p><p><b> {</b></p><p> if(num>=0&&num<=9)</p><p><b> {</b></p><
98、;p><b> //顯示十位</b></p><p> SChoise=0;</p><p> BChoise=0;</p><p> delay_us(1);</p><p> P1=table[16];</p><p> SChoise=1;</p><
99、p> SChoise=0;</p><p> // P1=table[tmp[1]];</p><p> P1=table[num];</p><p> SChoise=1;</p><p> SChoise=0;</p><p><b> P1=0x0fd;</b></p
100、><p> BChoise=1;</p><p> BChoise=0;</p><p> delay_us(3);</p><p><b> P1=0x00;</b></p><p> SChoise=1;</p><p> SChoise=0;</p>
101、;<p><b> P1=0x0FF;</b></p><p> BChoise=1;</p><p> BChoise=0;</p><p><b> }</b></p><p><b> }</b></p><p> voi
102、d disp_0( unsigned long num) //小數(shù)顯示函數(shù)</p><p><b> {</b></p><p><b> //顯示個(gè)位</b></p><p> if((num>=0)&&(num<=9))</p><p><b>
103、 {</b></p><p> SChoise=0;</p><p> BChoise=0;</p><p> delay_us(1);</p><p> P1=table[16];</p><p> SChoise=1;</p><p> SChoise=0;<
104、/p><p> //P1=table[tmp[0]];</p><p> P1=table[num];</p><p> SChoise=1;</p><p> SChoise=0;</p><p><b> P1=0x0fe;</b></p><p> BChoi
105、se=1;</p><p> BChoise=0;</p><p> delay_us(3);</p><p><b> P1=0x00;</b></p><p> SChoise=1;</p><p> SChoise=0;</p><p><b>
106、 P1=0x0FF;</b></p><p> BChoise=1;</p><p> BChoise=0;</p><p><b> }</b></p><p><b> }</b></p><p> void delay_us(unsigned in
107、t us) //延遲函數(shù)</p><p><b> {</b></p><p> unsigned int i;</p><p> unsigned int j;</p><p> for(i=0;i<us;i++)</p><p><b> {</b>
108、;</p><p> for(j=0;j<10;j++); </p><p> for(j=0;j<10;j++);</p><p><b> }</b></p><p><b> }</b></p><p> int Scan_KeyDown()
109、 //掃鍵函數(shù)</p><p><b> { </b></p><p> int rrr=0;</p><p> P3=0x0FF;//初始化P3口</p><p> RD_4=1;//初始化P2^7</p><p> delay_us(1);</p><p&g
110、t; P3=0x0E3;//列全零 </p><p> if((RA_1==0)&&(RB_2!=0)&&(RC_3!=0)&&(RD_4!=0))</p><p><b> rrr=1;</b></p><p> else if ((RA_1!=0)&&(
111、RB_2==0)&&(RC_3!=0)&&(RD_4!=0))</p><p><b> rrr=2;</b></p><p> else if((RA_1!=0)&&(RB_2!=0)&&(RC_3==0)&&(RD_4!=0))</p><p><b&
112、gt; rrr=3;</b></p><p> else if((RA_1!=0)&&(RB_2!=0)&&(RC_3!=0)&&(RD_4==0))</p><p><b> rrr=4;</b></p><p> else rrr=5;</p><p&
113、gt; if(rrr==1)</p><p><b> { </b></p><p><b> P3=0x0FF;</b></p><p><b> RA_1=0;</b></p><p> if((C1_1==0)&&(C2_2!=0)&&
114、amp;(C3_3!=0))</p><p> {key=1;ADD_C=0;ADD_B=0;ADD_A=0;}</p><p> if((C1_1!=0)&&(C2_2==0)&&(C3_3!=0))</p><p> {key=2;ADD_C=0;ADD_B=0;ADD_A=1;}</p><p&
115、gt; if((C1_1!=0)&&(C2_2!=0)&&(C3_3==0))</p><p> {key=3; ADD_C=0;ADD_B=1;ADD_A=0;}</p><p><b> }</b></p><p> delay_us(1);</p><p> if(r
116、rr==2)</p><p><b> { </b></p><p><b> P3=0x0FF;</b></p><p><b> RB_2=0;</b></p><p> if((C1_1==0)&&(C2_2!=0)&&(C3_3
117、!=0))</p><p> { key=4; ADD_C=0;ADD_B=1;ADD_A=1;}</p><p> if((C1_1!=0)&&(C2_2==0)&&(C3_3!=0))</p><p> {key=5; ADD_C=1;ADD_B=0;ADD_A=0;}</p><p&
118、gt; if((C1_1!=0)&&(C2_2!=0)&&(C3_3==0))</p><p> {key=6; ADD_C=1;ADD_B=0;ADD_A=1;} </p><p><b> }</b></p><p> delay_us(1);</p><p>
119、; if(rrr==3)</p><p><b> { </b></p><p><b> P3=0x0FF;</b></p><p><b> RC_3=0;</b></p><p> if((C1_1==0)&&(C2_2!=0)&&am
120、p;(C3_3!=0))</p><p> {key=7; ADD_C=1;ADD_B=1;ADD_A=0;}</p><p> if((C1_1!=0)&&(C2_2==0)&&(C3_3!=0))</p><p> {key=8;ADD_C=1;ADD_B=1;ADD_A=1;}</p><
121、p> if((C1_1!=0)&&(C2_2!=0)&&(C3_3==0))</p><p><b> key=9;</b></p><p><b> }</b></p><p> delay_us(1); </p><p> if(rrr==4)&
122、lt;/p><p><b> { </b></p><p><b> P3=0x0FF;</b></p><p><b> RD_4=0;</b></p><p> if((C1_1==0)&&(C2_2!=0)&&(C3_3!=0))&l
123、t;/p><p><b> key=10;</b></p><p> if((C1_1!=0)&&(C2_2==0)&&(C3_3!=0))</p><p><b> key=11;</b></p><p> if((C1_1!=0)&&(C2_2
124、!=0)&&(C3_3==0))</p><p><b> key=12;</b></p><p><b> } else </b></p><p><b> {</b></p><p><b> ALE=0;</b></
125、p><p><b> ALE=1;</b></p><p><b> ALE=0;</b></p><p><b> Start=0;</b></p><p> delay_us(1);</p><p> Start=~Start;</p&g
126、t;<p> delay_us(2);</p><p> Start=~Start;</p><p><b> }</b></p><p> return key;</p><p><b> }</b></p><p> /*###########
127、###########################*/</p><p> int Scan_KeyDown_adjust_0()</p><p><b> {</b></p><p> int key_0=0;</p><p> int rrr=0;</p><p> P3=0x0F
128、F;//初始化P3口</p><p> RD_4=1;//初始化P2^7</p><p> delay_us(1);</p><p> P3=0x0E3;//列全零 </p><p> if((RA_1==0)&&(RB_2!=0)&&(RC_3!=0)&&(RD_4!
129、=0))</p><p><b> rrr=1;</b></p><p> else if ((RA_1!=0)&&(RB_2==0)&&(RC_3!=0)&&(RD_4!=0))</p><p><b> rrr=2;</b></p><p>
130、 else if((RA_1!=0)&&(RB_2!=0)&&(RC_3==0)&&(RD_4!=0))</p><p><b> rrr=3;</b></p><p> else if((RA_1!=0)&&(RB_2!=0)&&(RC_3!=0)&&(RD_4=
131、=0))</p><p><b> rrr=4;</b></p><p> else rrr=5;</p><p> if(rrr==1)</p><p><b> { </b></p><p><b> P3=0x0FF;</b></
132、p><p><b> RA_1=0;</b></p><p> if((C1_1==0)&&(C2_2!=0)&&(C3_3!=0))</p><p> {key_0=1;}</p><p> if((C1_1!=0)&&(C2_2==0)&&(C3_3
133、!=0))</p><p> {key_0=2;}</p><p> if((C1_1!=0)&&(C2_2!=0)&&(C3_3==0))</p><p> {key_0=3;}</p><p><b> }</b></p><p> delay_us(
134、1);</p><p> if(rrr==2)</p><p><b> { </b></p><p><b> P3=0x0FF;</b></p><p><b> RB_2=0;</b></p><p> if((C1_1==0)&
135、;&(C2_2!=0)&&(C3_3!=0))</p><p> { key_0=4; }</p><p> if((C1_1!=0)&&(C2_2==0)&&(C3_3!=0))</p><p> {key_0=5; }</p><p> if((C1_1!=0)&&
136、amp;(C2_2!=0)&&(C3_3==0))</p><p> {key_0=6; } </p><p><b> }</b></p><p> delay_us(1);</p><p> if(rrr==3)</p><p><b> { <
137、;/b></p><p><b> P3=0x0FF;</b></p><p><b> RC_3=0;</b></p><p> if((C1_1==0)&&(C2_2!=0)&&(C3_3!=0))</p><p> {key_0=7; }</
138、p><p> if((C1_1!=0)&&(C2_2==0)&&(C3_3!=0))</p><p> {key_0=8; }</p><p> if((C1_1!=0)&&(C2_2!=0)&&(C3_3==0))</p><p><b> key_0=9;<
139、;/b></p><p><b> }</b></p><p> delay_us(1); </p><p> if(rrr==4)</p><p><b> { </b></p><p><b> P3=0x0FF;</b><
140、/p><p><b> RD_4=0;</b></p><p> if((C1_1==0)&&(C2_2!=0)&&(C3_3!=0))</p><p><b> key_0=10;</b></p><p> if((C1_1!=0)&&(C2_2
141、==0)&&(C3_3!=0))</p><p><b> key_0=11;</b></p><p> if((C1_1!=0)&&(C2_2!=0)&&(C3_3==0))</p><p><b> key_0=12;</b></p><p>
142、;<b> }</b></p><p> return key_0;</p><p><b> }</b></p><p> int Scan_KeyDown_adjust_1()</p><p><b> {</b></p><p> in
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)字電壓表課程設(shè)計(jì)
- 數(shù)字電壓表課程設(shè)計(jì)
- 數(shù)字電壓表課程設(shè)計(jì)
- 數(shù)字電壓表課程設(shè)計(jì)
- 數(shù)字電壓表課程設(shè)計(jì)
- 數(shù)字電壓表課程設(shè)計(jì)
- 數(shù)字電壓表課程設(shè)計(jì)
- 數(shù)字電壓表課程設(shè)計(jì)
- 數(shù)字電壓表課程設(shè)計(jì)
- 數(shù)字電壓表設(shè)計(jì)-課程設(shè)計(jì)
- 課程設(shè)計(jì)---數(shù)字電壓表設(shè)計(jì)
- 數(shù)字電壓表設(shè)計(jì)課程設(shè)計(jì)
- 數(shù)字電壓表設(shè)計(jì)-課程設(shè)計(jì)
- 簡易數(shù)字電壓表課程設(shè)計(jì)
- 數(shù)字電壓表課程設(shè)計(jì) (2)
- 數(shù)字電壓表課程設(shè)計(jì).doc
- 數(shù)字電壓表課程設(shè)計(jì)報(bào)告
- 數(shù)字電壓表的課程設(shè)計(jì)
- 數(shù)字電壓表課程設(shè)計(jì).doc
- 課程設(shè)計(jì)報(bào)告--數(shù)字電壓表
評(píng)論
0/150
提交評(píng)論