版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p> 課 程 設 計</p><p> 課程名稱 單片機原理及應用 </p><p> 課題名稱 簡易數(shù)字電壓表 </p><p> 專 業(yè) 自動化 </p><p> 班
2、 級 </p><p> 學 號 </p><p> 姓 名 </p><p> 指導教師
3、 </p><p> 2012年5月14日</p><p><b> 目 錄</b></p><p> ?一 系統(tǒng)總體方案選擇與說明1</p><p> 1.1 通道轉換部分設計1</p><p> 1.2 顯示部分設計1</p><p&g
4、t; ?二 系統(tǒng)結構框圖與工作原理2</p><p> ?三 各單元硬件設計說明及計算方法3</p><p> 3.1 單片機的選擇及時鐘電路3</p><p> 3.2 LED顯示電路設計與器件選擇3</p><p> 3.3 A/D轉換模塊及轉化電路設計5</p><p> 3.3.1 A
5、DC0808簡介5</p><p> ?3.3.2 A/D轉換電路設計6</p><p> ?四 軟件設計與說明7</p><p> ?五 調試結果與必要的調試說明8</p><p> ?六 使用說明9</p><p> ?七 程序清單10</p><p><
6、;b> ?八 總結32</b></p><p> ?九 參考文獻33</p><p><b> ?十 附錄34</b></p><p> 電氣信息學院課程設計評分表36</p><p> 一 系統(tǒng)總體方案選擇與說明</p><p> 實現(xiàn)數(shù)字電壓表的方案
7、很多,目前廣泛采用的是時基于74系列邏輯器件,本設計將介紹基于單片機實現(xiàn)的方案。</p><p> 此設計包含兩個模塊,通道轉換和顯示部分。</p><p> 1.1 通道轉換部分設計</p><p> 方案一:考慮到ADC0809有8個模擬通道的輸入,可以實現(xiàn)接入其中任何一個通道的信號就顯示那個通道的電壓,如果有多路輸入就分時顯示,但是要花費大量的指令周期。
8、</p><p> 方案二:利用手動開關實現(xiàn)通道轉換。該方案可簡化控制程序,消減系統(tǒng)開銷。縮短反應時間,不足之處在于操作麻煩。</p><p> 綜上所述:方案二只需增加一個鍵盤、成本低且易于實現(xiàn),所以選用該方案。由于單片機的許多輸入輸出口沒有用上,在一個簡易數(shù)字電壓表的基礎上,在沒有增加額外的硬件的情況下添加了時鐘顯示的功能,電壓表能測量0-5V的直流電壓,能連續(xù)、穩(wěn)定顯示所測電壓。
9、并且誤差值僅為0.01。</p><p> 1.2 顯示部分設計</p><p> 由于單片機的輸出口有限,所以本設計運用了兩片74ls373來進行信號所存,從而達到復用輸入輸出口的作用。</p><p> 二 系統(tǒng)結構框圖與工作原理</p><p> 由于沒有用到串行通信,單片機使用時鐘基頻為12MHz的晶振,復位電路等外圍也是使用
10、早已成熟的方案。由于proteus沒有ADC0809的仿真模型,所以在仿真電路圖中用了一片ADC0808代替仿真,但在實際電路中 要用ADC0809做模數(shù)轉換模塊。</p><p> 由于ADC0809有8個測量通道,首先用鍵盤通過單片機傳控制ADC0809開啟其中一路信號通道。然后讓ADC0809進行轉換,ADC0809會將0-5V電壓變換成0-28即0-256的數(shù)字量,電壓的模擬量也就轉換成了單片機可處理的
11、數(shù)字量。然后單片機進行信號的處理,將該數(shù)字量還原出電壓值,最后通過數(shù)碼管進行顯示。其中的鎖存器是為了減少顯示部分對單片機引腳硬件資源的占用。</p><p> 三 各單元硬件設計說明及計算方法</p><p> 硬件電路由5個部分組成,即單片機時鐘電路、復位電路、6位顯示器電路、A/D轉換電路和鍵盤及測量電路。</p><p> 3.1 單片機的選擇及時鐘電路
12、</p><p> 根據(jù)初步設計方案的分析,設計這樣一個簡單的應用系統(tǒng),可以選擇帶有EPROM的單片機,應用程序直接存儲在片內,不用在外部擴展程序存儲器,電路可以簡化。此電路選擇Atmel公司生產(chǎn)的AT89C51。AT89系列與MCS-51系列單片機相比有兩大優(yōu)勢:第一,片內程序存儲器采用閃速存儲器,使程序的寫入更加方便;第二,提供了更小尺寸的芯片,使整個電路體積更小。它以較小的體積、良好的性價比倍受青睞。&l
13、t;/p><p> 單片機工作的時間基準是由時鐘電路提供的。在單片機的XTAL1和XTAL2兩個管腳,接一只晶振及兩只電容就構成了單片機的時鐘電路。</p><p> 電路中,電容C1和C2對震蕩電路有微調的作用,通常的取值范圍位(30+10)pF。石英晶體選擇6MHz或12MHz都可以,其結果只是機器周期時間不同,影響計數(shù)器的計數(shù)初值,此設計取12MHz。本設計使用的是CLOCK時鐘脈沖
14、觸發(fā)。</p><p> 3.2 LED顯示電路設計與器件選擇</p><p> 單片機應用系統(tǒng)中,通常都需要進行人機對話。這包括人對應用系統(tǒng)的狀態(tài)干預與數(shù)據(jù)輸入,以及應用系統(tǒng)向人們顯示運行狀態(tài)與運行結果。顯示器、鍵盤電路就是用來完成人機對話活動的人機通道。</p><p> 圖3-2-1 LED顯示模塊</p><p> LED顯示
15、器的驅動是一個非常重要的問題,由圖3-2-1可知,顯示電路由LED顯示器、段驅動電路和位驅動電路組成。</p><p> 在應用系統(tǒng)中,設計要求不同,使用的LED顯示器的位數(shù)也不同,因此生產(chǎn)廠家就生產(chǎn)了多種位數(shù)、尺寸、型號不同的LED顯示器。在我們的設計中,選擇6位一體的共陰極時鐘型LED顯示器,采用動態(tài)顯示方式。</p><p> 采用P1口作為LED的段碼輸出信號,P3.0,P3.
16、1結合P1口作為位選和段選的控制信號。硬件電路的連接如圖3-2-2所示。</p><p> 圖3-2-2 LED顯示器接口電路原理</p><p> 該電路的工作原理:當P0口輸出段碼信號的BCD碼后,輸出具有一定驅動能力的七段字形碼,由于6-LED的段碼輸入管腳是并聯(lián)在一起的,所以每一位LED的段碼輸入管腳都能獲得這個段碼信號。若要控制在每一時刻只有一位LED被點亮,必須靠位碼信號控
17、制。P3.0為1則位選選通當P1口某一位為0則該位數(shù)碼管點亮。如果P1口的位碼信號在每一時刻只有一位是“1”,其他位全為“0”,然后按時間順序改變輸出“1”的位置,控制在每一時刻只有一位LED被點亮,達到動態(tài)顯示的目的。</p><p> 說明:第6位顯示轉換通道,0、1和2位顯示電壓表數(shù)值。</p><p> 3.3 A/D轉換模塊及轉化電路設計</p><p&g
18、t; A/D轉換器的功能是將模擬量轉換為與其大小成正比的數(shù)字量信號。能實現(xiàn)這種轉換的原理和方法很多,此設計采用ADC0808轉換器。ADC0808是一種逐次逼近型的8位A/D轉換器件,片內有8路模擬開關,可輸入8個模擬量,單極性,量程為0~+5V。</p><p> 3.3.1 ADC0808簡介</p><p> 1. ADC0808引腳功能</p><p>
19、; IN0~IN7:8路模擬量輸入。</p><p> ADDA、ADDB、ADDC:模擬量輸入通道地址選擇,其8位編碼分別對應IN0~IN7.</p><p> ALE:地址鎖存允許,上升沿將通道選擇信號存入地址鎖存器。</p><p> START:ADC轉換啟動信號,正脈沖有效,引腳信號要求保持在200ns以上,其上升沿將內部逐次逼近寄存器清零。<
20、;/p><p> EOC:轉換解釋信號,可做為中斷請求信號或供CPU查詢。</p><p> CLK:時鐘輸入端,要求頻率范圍在10kHz~1.2MHz.</p><p> OE:允許輸出信號。</p><p> Vcc:芯片工作電壓。</p><p> VREF(+)、VREF(-):基準參考電壓的正、負值。&
21、lt;/p><p> OUT1~OUT8:8路數(shù)字量輸出端。</p><p> 3.3.2 A/D轉換電路設計</p><p> 集成摸數(shù)轉換芯片ADC0808實現(xiàn)的A/D轉換電路被測信號由ADC0808模擬輸入端輸入,完成A/D轉換后送入單片機,經(jīng)相應處理后送出顯示。</p><p> 圖3-3-2ADC0808外圍電路圖</p&
22、gt;<p><b> 四 軟件設計與說明</b></p><p> 軟件的設計分成兩個部分,即電壓顯示部分和時鐘顯示部分。</p><p> 其中整個電壓的顯示都在show_adc0808() 這個數(shù)值顯示總調用函數(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ù)部分。在調用show_adc0808()時以上的函數(shù)都會被調用。</p><p> 在調用該函數(shù)后又調用一個show_key( )的函數(shù)來顯示對應的按鍵,所以當按下某個鍵后就會顯示該鍵名的通道值和該通道的電壓值。</p><p
24、> 五 調試結果與必要的調試說明</p><p> 本設計的調試需要proteus和keil兩個軟件。而且還要對這兩個軟件進行相應的設置,使proteus能和keil一起聯(lián)調。</p><p> 調試時,在按下1-8號鍵時應該顯示相應的測量口電壓,在按下*號鍵時應可以顯示時間,按下#然后按下9或0應可以調整時間。</p><p> 在調試在調試時發(fā)現(xiàn)電
25、壓顯示值和輸入值不對應,只能測量到0.0的范圍值,后來發(fā)現(xiàn)在對ADC0808傳遞來的數(shù)字信號處理時把“%”號誤打成了“/”,經(jīng)過修改后,輸出顯示正常,能顯示出0.00范圍的值。</p><p> 還發(fā)現(xiàn)當按下1-8號鍵時時鐘停止,也就是說測量電壓后時間就還是在測量前的時間。經(jīng)過單步調試后找出只要在測量電壓的相關代碼上開啟定時器并且僅在第一個循環(huán)置入初值就可以在測量電壓時時鐘繼續(xù)運行。注意,千萬不可在顯示函數(shù)里置
26、入初值,由于顯示部分是一個速度很快的循環(huán),每個循環(huán)都置入初值那么時鐘也會停滯。</p><p> 圖5-1正常的電壓顯示圖</p><p><b> 六 使用說明</b></p><p> 這個設計包含了電壓顯示以及時鐘的功能,其操作簡便,只要按數(shù)字1-8數(shù)碼管就會顯示相應的測量口以及對應的電壓值。當然,首先要在相應的測量口接入電壓才會有
27、值輸出,否則輸出為零。</p><p> 該電壓表的輸出值誤差為0.01。在第一次使用時應該對時間進行調整,要對小時進行調整請按下#號鍵然后按9(數(shù)值增加)0(數(shù)值減少),再按一下#號鍵可以對分鐘進行調整,同理,再按一次#號鍵就可對秒鐘進行調整。按下*號鍵后可以全部顯示所設的時間。設置完后請按*號鍵顯示時間。如下圖所示:</p><p> 該設計考慮了指令運行時間,已經(jīng)對其進行調整,但
28、是在運行幾天后應該對其時鐘進行重新調整。在使用過程中要持續(xù)為單片機供電否則斷電后時鐘歸零又要重新調整時鐘。</p><p> 由于設計時間限制,還有些問題有待改善,比如人手很容易碰到#號鍵,可以改成按下*再按#號鍵才能調整時間。還有部分功能需要添加,比如當測量電壓超過量程時可以報警等。</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ù)點</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;//初始顯示為第八個測量口,告知只有測量口8個</p><p> int count=0;//計數(shù),計滿20個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;//開始轉
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);//小時顯示</p><p> void minute_show(int minute);//分鐘顯示</p><p> void sec_show(int sec);//秒鐘顯示<
37、/p><p> unsigned int table[]={ //段選信號</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[]={ //位選信號</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(); //調用掃鍵函數(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;//定時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))//時鐘狀態(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;//定時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)) //時鐘調整</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> //小時調整</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號鍵</p><p> {key4=0; break;} </p><p><b> }</b></p><p> /***********
59、**********************************/</p><p><b> //分鐘調整</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號鍵</p><p> {key4=0; break;} </p><p><b> }&l
67、t;/b></p><p> /*********************************************/ </p><p><b> //秒鐘調整</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號鍵</p><p> {key4=0; break;} </p><p><b> }</b></p><p> /
75、*********************************************/</p><p> if(((key2<=8)&&(key2>=1))||(key2==10))//跳出12號鍵</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ù)值顯示總調用</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> //顯示個位</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> //顯示個位</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)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)字電壓表課程設計
- 數(shù)字電壓表課程設計
- 數(shù)字電壓表課程設計
- 數(shù)字電壓表課程設計
- 數(shù)字電壓表課程設計
- 數(shù)字電壓表課程設計
- 數(shù)字電壓表課程設計
- 數(shù)字電壓表課程設計
- 數(shù)字電壓表課程設計
- 數(shù)字電壓表設計-課程設計
- 課程設計---數(shù)字電壓表設計
- 數(shù)字電壓表設計課程設計
- 數(shù)字電壓表設計-課程設計
- 簡易數(shù)字電壓表課程設計
- 數(shù)字電壓表課程設計 (2)
- 數(shù)字電壓表課程設計.doc
- 數(shù)字電壓表課程設計報告
- 數(shù)字電壓表的課程設計
- 數(shù)字電壓表課程設計.doc
- 課程設計報告--數(shù)字電壓表
評論
0/150
提交評論