課程設(shè)計的全部內(nèi)容打包下載:
課程設(shè)計—數(shù)字電壓表.rar
(528.24 KB, 下載次數(shù): 151)
2016-9-9 19:54 上傳
點擊文件名下載附件
一、設(shè)計任務(wù)及要求: 設(shè)計任務(wù): 設(shè)計一個數(shù)字電壓表。 要 求: 1.0-5V輸入; 2.用4個數(shù)碼管顯示;有小數(shù)點的顯示;顯示小數(shù)后三位數(shù),如0.001;只顯示最后結(jié)果,不要顯示中間結(jié)果。 3. 要求精度達(dá)到1%,超出量程警告提示。 4. 可以多檔切換。
指導(dǎo)教師簽名:
2017年1月3日
| 二、指導(dǎo)教師評語:
指導(dǎo)教師簽名:
2017年1月 3 日
| |
目錄
1 設(shè)計目的 2 設(shè)計思路 3 設(shè)計過程 3.1方案論證 3.2電路設(shè)計 3.2.1 硬件部分 (1)單片機(jī)控制模塊設(shè)計 (2)AD轉(zhuǎn)換模塊設(shè)計 (3)量程自動轉(zhuǎn)換模塊 (4)LED顯示模塊 (5)報警模塊 3.2.2 軟件部分 (1)主程序設(shè)計 (2)A/D轉(zhuǎn)換程序設(shè)計 4電路仿真與結(jié)果分析 4.1電路仿真 4.2結(jié)果分析 5設(shè)計體會 參考文獻(xiàn) 附件 完整電路 源代碼
數(shù)字電壓表的設(shè)計 1 設(shè)計目的(1)熟悉數(shù)字電壓表的基本工作原理和與一般的模擬電壓表相比,數(shù)字電壓表具有的優(yōu)點。 (2)掌握A/D 的使用和單片機(jī)整個開發(fā)過程。 (3)了解積分式和逐次逼近式AD轉(zhuǎn)換器各自的特點。 2 設(shè)計思路利用AD轉(zhuǎn)換器對輸入電壓進(jìn)行采集并傳輸給單片機(jī),讓其進(jìn)行數(shù)據(jù)的處理。通過單片機(jī)與數(shù)碼管的連接,最終顯示在數(shù)碼管上。并用軟件編程的方式檢測輸入信號的大小來實現(xiàn)數(shù)字電壓表的量程自動轉(zhuǎn)換功能。 3 設(shè)計過程第一部分:單片機(jī)控制模塊?刂浦行奈⒖刂破鞑捎玫氖茿T89C52 單片機(jī),其對于多量程電路的測量有著不可比擬的性價比,而且操作簡單,特別是與ADC0808 構(gòu)成的電壓采集電路,反映時間短,能夠有效地將模擬電壓數(shù)據(jù)在LED 上顯示出來。 第二部分:AD轉(zhuǎn)換模塊。A/D 轉(zhuǎn)換電路用來將量程轉(zhuǎn)換電路輸入的直流電壓信號轉(zhuǎn)成數(shù)字電壓信號,以供主控制器進(jìn)行數(shù)據(jù)處理。采用一片ADC0808,它是采樣分辨率為8 位的、以逐次逼近原理進(jìn)行!獢(shù)轉(zhuǎn)換的器件。 第三部分:量程自動轉(zhuǎn)換模塊。通過對輸入電壓的測量,利用軟件編程的方式來實現(xiàn)量程的自動轉(zhuǎn)換。 第四部分;LED顯示模塊。數(shù)碼管顯示電路以顯示4位的方式來顯示數(shù)字電壓表測量的直流電壓值。 第五部分:報警模塊。當(dāng)輸入的直流電壓超過最大量程時,數(shù)字電壓表報警以示警告。 3.1方案論證利用AD轉(zhuǎn)換器對輸入電壓進(jìn)行采集并傳輸給單片機(jī),讓其進(jìn)行數(shù)據(jù)的處理。通過單片機(jī)與數(shù)碼管的連接,將輸入的直流電壓顯示在數(shù)碼管上。利用軟件編程的方式檢測輸入信號的大小來實現(xiàn)數(shù)字電壓表的量程自動轉(zhuǎn)換功能。在允許的誤差范圍內(nèi)實現(xiàn)了數(shù)字電壓表的設(shè)計要求,完成了數(shù)字電壓表的全部設(shè)計。 3.2電路設(shè)計3.2.1 硬件部分 (1) 單片機(jī)控制模塊設(shè)計 單片機(jī)控制模塊的作用是為控制各單元電路的運(yùn)行并完成數(shù)據(jù)的換算或處理,主要由單片機(jī)、時鐘電路、復(fù)位電路組成。 ① 時鐘電路 單片機(jī)工作的時間基準(zhǔn)是由時鐘電路提供的,在單片機(jī)的XTAL1和XYAL2兩個管腳接一只晶振及兩只電容就構(gòu)成了單片機(jī)的時鐘電路,電路中電容器C1和C2對振蕩頻率有微調(diào)作用,通常取(30±10pF)石英晶體選擇11.0592MHz。時鐘電路如圖1所示。 圖1 時鐘電路 ② 復(fù)位電路 單片機(jī)的RST管腳為主機(jī)提供了一個外部復(fù)位信號輸入口。復(fù)位信號是高電平有效,高電平有效的持續(xù)時間為2個機(jī)器周期以上。單片機(jī)的復(fù)位方式為上電復(fù)位方式。復(fù)位電路如圖2所示。 圖2 復(fù)位電路 (2)AD轉(zhuǎn)換模塊設(shè)計 逐次逼近型A/D轉(zhuǎn)換器ADC0808屬于直接型A/D轉(zhuǎn)換器,它能把輸入的模擬電壓直接轉(zhuǎn)換為輸出的數(shù)字代碼,而不需要經(jīng)過中間變量。 ① ADC0808簡介 ADC0808精度為8位,CMOS器件,不僅包括一個8位的逐次逼近型的ADC部分,而且還提供一個8通道的模擬多路開關(guān)和通道尋址邏輯,因而有理由把它作為簡單的“數(shù)據(jù)采集系統(tǒng)”。利用它可直接輸入8個單端的模擬信號分時進(jìn)行A/D轉(zhuǎn)換,在多點巡回檢測和過程控制、運(yùn)動控制中應(yīng)用十分廣泛。 ②外部引腳圖及引腳功能 ADC0808的外部引腳如圖3所示。
圖3 ADC0808外部引腳圖 IN0~I(xiàn)N7:8路模擬量輸入。A、B、C:3位地址輸入,2個地址輸入端的不同組合選擇八路模擬量輸入。 ALE:地址鎖存啟動信號,在ALE的上升沿,將A、B、C上的通道地址鎖存到內(nèi)部的地址鎖存器。 D0~D7:八位數(shù)據(jù)輸出線,A/D轉(zhuǎn)換結(jié)果由這8根線傳送給單片機(jī)。 OE:允許輸出信號。當(dāng)OE=1時,即為高電平,允許輸出鎖存器輸出數(shù)據(jù)。 START:啟動信號輸入端,START為正脈沖,其上升沿清除ADC0808的內(nèi)部的各寄存器,其下降沿啟動A/D開始轉(zhuǎn)換。 EOC:轉(zhuǎn)換完成信號,當(dāng)EOC上升為高電平時,表明內(nèi)部A/D轉(zhuǎn)換已完成。 ③AD轉(zhuǎn)換模塊設(shè)計 集成摸數(shù)轉(zhuǎn)換芯片ADC0808實現(xiàn)的A/D轉(zhuǎn)換電路如圖4所示,被測信號由ADC0808模擬輸入端輸入,完成A/D轉(zhuǎn)換后送入單片機(jī),經(jīng)相應(yīng)處理后送出顯示。 圖4 AD轉(zhuǎn)換電路 (3)量程自動轉(zhuǎn)換模塊 利用軟件編程的方式,通過對輸入電壓判斷其大小來確定電壓表的當(dāng)前量程,進(jìn)而實現(xiàn)電壓表的量程自動切換。量程自動轉(zhuǎn)換模塊如圖5所示。量程分為3個檔:當(dāng)s1亮?xí)r為1V-5V;當(dāng)s2亮?xí)r為0.1—1V;當(dāng)s3亮?xí)r為0—0.1V。 圖5 量程自動轉(zhuǎn)換模塊 (4)LED顯示模塊 LED顯示模塊用來顯示數(shù)字電壓表測量的直流電壓值。LED顯示模塊如圖6所示。 圖6 LED顯示模塊 (5) 報警模塊 利用一個電壓比較器和一個蜂鳴器的連接來實現(xiàn)報警模塊的設(shè)計。當(dāng)輸入的直流電壓大于最大量程(5V)時,蜂鳴器響起即報警。報警模塊如圖7所示。 圖7 報警模塊 3.2.2 軟件部分 (1)主程序設(shè)計
主程序主要負(fù)責(zé)初始化工作:設(shè)置定時器、寄存器的初值,啟動A/D轉(zhuǎn)換,讀取轉(zhuǎn)換結(jié)果,處理量程轉(zhuǎn)換響應(yīng),控制液晶實時顯示等,主流程圖如圖8所示。 圖8 主程序流程圖 (2)A/D轉(zhuǎn)換程序設(shè)計 A/D轉(zhuǎn)換程序的功能是采集數(shù)據(jù),在整個系統(tǒng)設(shè)計中占有很高的地位。當(dāng)系統(tǒng)設(shè)置好后,單片機(jī)掃描轉(zhuǎn)換結(jié)束管腳P3^2的輸入電平狀態(tài),當(dāng)輸入為高電平則轉(zhuǎn)換完成,將轉(zhuǎn)換的數(shù)值轉(zhuǎn)換并顯示輸出。若輸入為低電平,則繼續(xù)掃描。AD轉(zhuǎn)換程序流程圖如圖9所示。
圖9 A/D轉(zhuǎn)換程序流程圖 程序如下: OE=0; ST=0; ST=1; ST=0;//啟動轉(zhuǎn)換 while(EOC==0); //等待轉(zhuǎn)換結(jié)果 OE=1; //允許輸出 sum=data; 4電路仿真與結(jié)果分析電路的仿真和結(jié)果分析 4.1電路仿真輸入電壓為0.8V時的仿真電路如圖10所示 圖10 輸入電壓為0.8V時的仿真電路 4.2結(jié)果分析(1)當(dāng)輸入直流電壓(input)大于5V時,電壓表只能顯示5.000V的電壓,此時s1亮。電壓大于5V時數(shù)碼管顯示如圖11所示。 圖11 電壓大于5V時數(shù)碼管顯示
(2)當(dāng)輸入直流電壓(input)在1V~5V時,s1亮。在誤差允許的范圍內(nèi)輸出相對精確的電壓值。電壓在1V~5V時數(shù)碼管顯示如圖12所示。 圖12電壓在1V~5V時數(shù)碼管顯示 (3) 當(dāng)輸入直流電壓(input)在0.1V~1V時,s2亮。在誤差允許的范圍內(nèi)輸出相對精確的電壓值。電壓在0.1V~1V時數(shù)碼管顯示如圖13所示。 圖13 電壓在0.1V~1V時數(shù)碼管顯示 (4) 當(dāng)輸入直流電壓(input)在0V~0.1V時,s3亮。在誤差允許的范圍內(nèi)輸出相對精確的電壓值。電壓在0V~0.1V時數(shù)碼管顯示如圖14所示。
圖14 電壓在0V~0.1V時數(shù)碼管顯示
5設(shè)計體會通過這次對數(shù)字電壓表的設(shè)計與制作,我們了解了單片機(jī)整個開發(fā)過程,熟知和掌握了AT89C51,ADC0809,CD4066,運(yùn)放等芯片的作用及其使用。雖然在制作過程中出現(xiàn)了問題,但是通過不斷實踐和查找資料,積極地思考問題、發(fā)現(xiàn)問題,最終解決了。無論從硬件還是軟件方面,都提高了我們的動手和動腦能力。整個過程中,不但擴(kuò)展了我們的知識面,而且也不斷在挖掘我們的潛力,為我們今后的學(xué)習(xí)奠定扎實的基礎(chǔ)。也許在這幾天的制作中,我學(xué)的知識比課本上的還多、還難。在這次制作中,我更加看到了我對課本知識不熟,思想不夠開闊等不足的地方,希望在以后的學(xué)習(xí)與實踐中多看課本,多思考來彌補(bǔ)自己的不足。 參考文獻(xiàn)(至少5篇)[1] 徐愛鈞.智能化測量控制儀表原理 [M].北京航空航天大學(xué)出版社.2004 [2] 吳金戌,沈慶陽,郭庭吉.8051單片機(jī)實踐與應(yīng)用[M].北京清華大學(xué)出版社.2002 [3] 張毅剛,彭喜元,彭宇.《單片機(jī)原理及應(yīng)用》第二版[M].北京高等教育出版社.2010.5 [4] 汪德彪.MCS-51單片機(jī)原理及接口技術(shù)[M]. 第1版.北京電子工業(yè)出版社.2003 [5] 沙占友.新型數(shù)字電壓表原理與應(yīng)用[M].北京機(jī)械工業(yè)出版社.2006 附件完整電路
源代碼:
- #include
- #define uchar unsigned char
- #define uint unsigned int
- #define data P1
- sbit ST=P3^0;
- sbit OE=P3^1;
- sbit EOC=P3^2;
- sbit CLK=P3^3;
- sbit S1=P3^4;
- sbit S2=P3^5;
- sbit S3=P3^6;
- ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- ucharcodetable1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xdf} ;
- uint sum;
- uchar getdata;
- uchar num[4];
- void delay(uint ms)
- {
- uchar i;
- while(ms--)
- for(i=0;i<120;i++);
- }
-
- void Display_Result()
- {
- P2=0xfe;//千位
- P0=table1[num[3]];
- delay(5);
- P2=0xfd;//百位
- P0=table[num[2]];
- delay(5);
- P2=0xfb;//十位
- P0=table[num[1]];
- delay(5);
- P2=0xf7;//個位
- P0=table[num[0]];
- delay(5);
- }
- void init()
- {
- EA=1;
- TMOD=0x01;
- TH0=(65536-150)/256;
- TL0=(65536-150)%256;
- ET0=1;
- TR0=1;
- S1=0;
- S2=0;
- S3=1;
- }
-
- void main()
- {
- init();
- while(1)
- {
- OE=0;
- ST=0;
- ST=1;
- ST=0;//啟動轉(zhuǎn)換
- while(EOC==0); //等待轉(zhuǎn)換結(jié)果
- OE=1; //允許輸出
- sum=data;
- if(data<5)
- {
- S1=0;
- S2=0;
- S3=1;
- sum=sum*1.0/255*5000;
- num[0]=sum%10;
- num[1]=sum/10;
- num[2]=sum/100;
- num[3]=sum/1000;
- Display_Result();//顯示A/D轉(zhuǎn)換結(jié)果
- }
- else if (data<51)
- {
- S1=0;
- S2=1;
- S3=0;
- sum=sum*1.0/255*5000;
- num[0]=sum%10;
- num[1]=sum/10%10;
- num[2]=sum/100;
- num[3]=sum/1000;
- Display_Result();//顯示A/D轉(zhuǎn)換結(jié)果
- }
- else if (data<256)
- {
- S1=1;
- S2=0;
- S3=0;
- sum=sum*1.0/255*5000;
- num[0]=sum%10;
- num[1]=sum/10%10;
- num[2]=sum/100%10;
- num[3]=sum/1000;
- Display_Result();//顯示A/D轉(zhuǎn)換結(jié)果
- }
- }
- }
- void Timer0() interrupt 1
- {
- TH0=(65536-150)/256;
- TL0=(65536-150)%256;
- CLK=~CLK;//ADC0809時鐘信號
- }
復(fù)制代碼
|