實驗三簡易數(shù)字電壓表設計_第1頁
實驗三簡易數(shù)字電壓表設計_第2頁
實驗三簡易數(shù)字電壓表設計_第3頁
實驗三簡易數(shù)字電壓表設計_第4頁
實驗三簡易數(shù)字電壓表設計_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、電子系統(tǒng)實驗報告 實驗三 簡易數(shù)字電壓表設計 一、設計題目 采用C8051F360單片機最小系統(tǒng)設計一簡易數(shù)字電壓表,實現(xiàn)對02.4V直流電壓的測量,原理框圖如圖1所示。模擬輸入電壓通過一只1 k電位器產(chǎn)生,采用C8051F360 單片機內(nèi)部的A/D 轉換器將模擬電壓轉換成數(shù)字量后換算成電壓值,用十進制的形式在LCD上顯示。A/D 轉換的輸入模擬信號由實驗板PR3 電位器產(chǎn)生的03.3V 的直流電壓信號,用一根杜邦實驗線將J8 的03.3V 輸出插針與J7 口的P2.0 插針相連。注意A/D 轉換器模擬輸入電壓的范圍取決于其所選擇的參考電壓,如果A/D 轉換器選擇內(nèi)部參考電壓源,其模擬電壓的范

2、圍為02.4V,如果選擇外部電源作為參考電壓,則其模擬輸入電壓范圍為03.3V。測試時,A/D轉換器的模擬輸入信號可通過一個電位器產(chǎn)生。圖1 簡易數(shù)字電壓表實驗示意框圖二設計方案(1) 簡易數(shù)字電壓表設計程序流程圖如圖2所示。 圖2 簡易數(shù)字電壓表設計程序中A/D轉換和計時流程圖(2) 簡易數(shù)字電壓表實驗板連接圖如圖3所示。此外,還需用一根杜邦實驗線將J8 的03.3V 輸出插針與J7 口的P2.0 插針相連。 圖3簡易數(shù)字電壓表設計實驗板接線圖3、 詳細設計1.簡易數(shù)字電壓表設計相應C8051F360和LCD初始化程序 內(nèi)部振蕩器初始化: OscInit() I/O端口初始化: PortIo

3、Init() 外部數(shù)據(jù)存儲器接口初始化: XramInit() 定時器初始化: TimerInit() 中斷系統(tǒng)初始化: Int0Init() ADC0初始化: void ADC_Init() PCA初始化: Int0Init()2. 電壓轉換方式 將電壓轉換成十進制:AT=ADC0H*256+ADC0L;volt=AT*3.31/1024;voltage=volt*1000;for(i=0;i<4;i+)vi=voltage%10;voltage=voltage/10;3. LCD顯示接口的設計當時間到達設定值,即0.5s后,執(zhí)行以下程序將所測的電壓值在LCD屏幕上第三排顯示出來。Wr

4、iteCom(0x8C);WriteData(v3+0x30);WriteData(0x2e);WriteData(v2+0x30);WriteData(v1+0x30);WriteData(v0+0x30);4.實驗中AD轉換方式選用逐次逼近型,A/D轉換完成后得到10位數(shù)據(jù)分為高低字節(jié)存放在寄存器ADCOH和ADC0L中,此處選擇右對齊,轉換時針為2MHZ。5.選擇內(nèi)部參考電壓2.4伏為基準(在實際單片機調(diào)試中改為3.311伏),正端接P2.0,負端接地。四、測試結果 在0V3.3V中取十組測試數(shù)據(jù),每組間隔約為0.3V左右,實驗數(shù)據(jù)如表4-1所示V實際 (V) V顯示 (V) 相對誤差(

5、%) 簡易數(shù)字電壓表設計實驗數(shù)據(jù)由表1可知,10組數(shù)據(jù)中最大誤差的一組是:其余的誤差都不超過 ,并且大部分數(shù)據(jù)誤差都只有 左右,滿足小于0.01V的設計誤差要求,即本實驗的設計可以滿足實驗要求。五、心得體會 通過這次對簡易電壓表的設計,我對單片機的最小系統(tǒng)設計有了新的理解,對于硬件和軟件的配合也更熟練了。在這個實驗中LCD顯示模塊的CPLD部分由FPGA充當,芯片本身自帶程序,因而這個部分不需要再通過QUARTUS 軟件進行編程。在參考電壓選擇過程中發(fā)現(xiàn),單片機實際最大電壓并不是2.4v而是3.3v,則在轉換中將3.3V替換2.4V即可。六代碼附錄/*簡易數(shù)字電壓表*/#include <

6、;C8051F360.H>#define uchar unsigned char#define uint unsigned int#define WCOMADDR 0xC008 /寫命令寄存器的地址#define WDATADDR 0xC009 /寫數(shù)據(jù)寄存器的地址#define RCOMADDR 0xC00A /讀命令寄存器的地址#define RDATADDR 0xC00B /讀數(shù)據(jù)寄存器的地址#define KEYCS 0xC00Cuchar code hanzi = "簡易數(shù)字電壓表"uchar code keynum="鍵值"uchar

7、code keyc="次數(shù)"uint time=0;float volt;uint v4;uint AT,voltage;uchar keyn,keycode;void OscInit(); /內(nèi)部振蕩器初始化void PortIoInit(); /I/O端口初始化void XramInit(); /外部數(shù)據(jù)存儲器接口初始化void PcaInit(); /PCA初始化(設置看門狗定時器的工作狀態(tài))void InitDevice(); /內(nèi)部資源初始化void CheckLcd();/檢查LCD是否空閑子程序void WriteCom(uchar n);/Lcd寫指令子程序

8、void WriteData(uchar m);/Lcd寫數(shù)據(jù)子程序void InsitiLcd();/Lcd初始化子程序void DispHan( uchar code *a,uchar m,uchar k);/顯示漢字子程序void TimerInit(); /定時器初始化void InterruptsInit(); /中斷系統(tǒng)初始化void ADC_init(); /ADC0初始化 詳見書本P144void Int0Init(); /外部中斷初始化void main() uchar i;InitDevice();/F360初始化 InsitiLcd();/LCD模塊初始化ADC_init

9、();DispHan(hanzi,0x90,0x0e);/顯示“鍵盤顯示測試程序”AD0BUSY=1; while(1)if(TF0=1)TF0=0;TL0=0xf0;TH0=0xd8; /重置時間常數(shù)10mstime+;if(time >=49)time = 0;AT=ADC0H*256+ADC0L;volt=AT*0.003234;voltage=volt*1000;for(i=0;i<4;i+)vi=voltage%10;voltage=voltage/10;WriteCom(0x8d);WriteData(v3+0x30);WriteData(0x2e);WriteData

10、(v2+0x30);WriteData(v1+0x30);WriteData(v0+0x30);TR0=1;AD0BUSY=1; void ReadKey() interrupt 0uchar xdata *addr;uchar c1,c2;addr=KEYCS;keycode=*addr;keycode&=0x0F;keyn+;DispHan(keynum,0x88,0x04);WriteCom(0x8b);if(keycode<10)WriteData(0x30);WriteData(keycode+0x30);elsec1=keycode%10;c2=keycode/=10

11、;WriteData(c2+0x30);WriteData(c1+0x30);DispHan(keyc,0x98,0x04);WriteCom(0x9b);if(keyn=10)keyn=0;WriteData(keyn+0x30);void Int0Init()EA=1;IT01CF=0x05;EX0=1;IT0=1;void OscInit(void)/內(nèi)部振蕩器初始化SFRPAGE=0x0f;/選擇特殊功能寄存器頁地址OSCICL=OSCICL+4;OSCICN=0xc2;/允許內(nèi)部振蕩器,頻率除2作為SYSCLK=12MHzCLKSEL=0x00;/選擇內(nèi)部振蕩器SFRPAGE=0x0

12、0;void ADC_init()ADC0CF=0x28; / 選擇內(nèi)部參考電壓2.4V為基準ADC0CN=0x80; /正端接P2.0AMX0P=0x08; /負端接地AMX0N=0x1F; /右對齊,轉換時針為2MHZREF0CN=0x08; /寫AD0BUSY啟動A/D轉換器void TimerInit()TMOD=0x01;TH0=0xd8;TL0=0xf0;TR0=1;void InterruptsInit(void)EA=1;ET0=1;EX0=1;PX0=1;IE0=0;void PortIoInit(void)/I/O口初始化 SFRPAGE=0x0f;P0MDIN=0xe7;

13、/P0.3、P0.4模擬量輸入P0MDOUT=0x83;/P0.0、P0.1、P0.7推拉式輸出P0SKIP=0xf9;/P0.1、P0.2被交叉開關跳過P1MDIN=0xff;/P1設置為數(shù)字量輸入P1MDOUT=0xff;/P1設置為推拉式輸出P1SKIP=0xff;/P1被交叉開關跳過/P2MDIN=0xff;/P2設置為數(shù)字量輸入/P2MDOUT=0xff;/P2設置為推拉式輸出/P2SKIP=0xff;P3MDIN=0xff;/P3設置為數(shù)字量輸入P3MDOUT=0xff;/P3設置為推拉式輸出P3SKIP=0xff;P4MDOUT=0xff;/P4.5設為OC輸出,其余推拉式輸出X

14、BR0=0x01;/使能UARTXBR1=0xC0;/禁止弱上拉,交叉開關允許SFRPAGE=0x00;return;void XramInit(void)/外部數(shù)據(jù)儲存器初始化SFRPAGE=0x0f;EMI0CF=0x07;/引腳復用方式SFRPAGE=0x00;return;void PcaInit(void)/PCA初始化PCA0CN=0x40;/允許PCA計數(shù)器/定時器PCA0MD=0x00;/禁止看門狗定時器return;void InitDevice(void)OscInit();PortIoInit();XramInit();/SmbInit();/UartInit();ADC

15、_init();TimerInit();InterruptsInit();Int0Init();PcaInit();return;void CheckLcd() uchar temp = 0x00; uchar xdata *addr; while (1) addr=RCOMADDR;temp=*addr;temp &= 0x80; if(temp = 0x00)break; void WriteCom(uchar n) uchar xdata *addr;CheckLcd();addr=WCOMADDR;*addr=n; void WriteData(uchar m) uchar xdata *addr;CheckLcd();addr=WDATADDR;*addr = m; void InsitiLcd() WriteCom(0x30); /設為基本指令集WriteCom(0x01); /清屏 WriteCom(0x0c); /開整體顯示 void DispHan( uchar code *a,uchar

溫馨提示

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

評論

0/150

提交評論