|
①使用STC15F2K60S2單片機板設(shè)計一個數(shù)字電壓表,只能采用單片機內(nèi)部ADC實現(xiàn);
②要求能夠測量直流電壓范圍為0~4.55V,測量誤差小于0.005V,測量結(jié)果保留三位小數(shù)點;
③電壓表具有自動超量程報警功能,當(dāng)測量電壓超過4.55V時驅(qū)動蜂鳴器報警,電壓小于4.55V時自動關(guān)閉蜂鳴器;
④電壓測量校準(zhǔn)與測評以考試當(dāng)天手上的萬用表為準(zhǔn),顯示器件自選,要求使用內(nèi)部基準(zhǔn)電壓作為參考電壓;
⑤采集結(jié)果通過USB轉(zhuǎn)串口線上傳至PC機,顯示格式為:“N路電壓:X.XXXV”;
⑥串口傳輸波特率為57600,晶振采用內(nèi)部22.1184M,復(fù)位引腳不能當(dāng)做I/O使用;
⑦電壓表具有自動休眠功能,每當(dāng)啟動15秒鐘后自動進入休眠模式,喚醒后繼續(xù)正常工作。
單片機源程序如下:
- #include"STC15F2K60S2.h" //頭文件
- #include"JLX12864G-086S-ZK.h" //頭文件
- #include"ADC.h" //頭文件
- #include <stdio.h> //printf函數(shù)使用到的頭文件
- float VCC; //供電電壓
- unsigned int a; //測量第九通道ADC數(shù)字量
- float Va; //第九通道電壓值
- char temp[16];
- void UART_int() //串口初始化函數(shù)
- {
- TMOD|=0x20;//T1工作于方式2,8位自動重裝模式
- TH1=TL1=256-22118400/57600/384;//TH1:重裝值9600波特率,晶振11.0592MHz ;
- TR1=1;
- AUXR=0x00;//使用定時器1產(chǎn)生波特率,S1ST2=0
- SCON=0x50;//SCON:模式1,8-bit UART,使能接收
- TI=1;
- }
- void main()
- {
- float Vin,V_temp=0;
- unsigned char i;
- InitADC();
- UART_int();
- initial_lcd();
- clear_screen();
- display_GB2312_string(1,1,"數(shù)字電壓表的設(shè)計");
- display_GB2312_string(3,1,"電壓:");
- while(1)
- {
- //測量第九通道電壓值(內(nèi)部參考電壓)
- P1ASF=0x00;
- VCC=(1.24612/ADC_Read(ADC_CH0))*1023;//內(nèi)部參考電壓為1.23611V(1.27),通過反推求出VCC
-
- P1ASF=0xFF;
- // for(i=0;i<30;i++)V_temp=V_temp+VCC/1023*ADC_Read(ADC_CH0);
- // Vin=V_temp/30;//求平均值 校準(zhǔn)精度用的
- // V_temp=0;
- Vin=VCC/1023*ADC_Read(ADC_CH0);
- sprintf(temp,"%.3fV",Vin);
- display_GB2312_string(3,41,temp);
- if(Vin>4.55)P34=!P34;
- else {P34=1;}
- printf("0路電壓:%.3fV\n",Vin);
- }
- }
復(fù)制代碼- #include"STC15F2K60S2.h" //頭文件
- #include <stdio.h> //printf函數(shù)使用到的頭文件
- //ADC控制位定義ADC_CONTR
- #define ADC_POWER 0x80 //ADC電源控制位
- #define ADC_FLAG 0x10 //ADC轉(zhuǎn)換完成標(biāo)記
- #define ADC_START 0x08 //ADC開始轉(zhuǎn)換標(biāo)記
- #define ADC_SPEEDLL 0x00 //ADC轉(zhuǎn)換速率540時鐘
- #define ADC_SPEEDL 0x20 //ADC轉(zhuǎn)換速率360時鐘
- #define ADC_SPEEDH 0x40 //ADC轉(zhuǎn)換速率180時鐘
- #define ADC_SPEEDHH 0x60 //ADC轉(zhuǎn)換速率90時鐘
- #define ADC_CH0 0x00 //轉(zhuǎn)換通道P1.0
- #define ADC_CH1 0x01 //轉(zhuǎn)換通道P1.1
- #define ADC_CH2 0x02 //轉(zhuǎn)換通道P1.2
- #define ADC_CH3 0x03 //轉(zhuǎn)換通道P1.3
- #define ADC_CH4 0x04 //轉(zhuǎn)換通道P1.4
- #define ADC_CH5 0x05 //轉(zhuǎn)換通道P1.5
- #define ADC_CH6 0x06 //轉(zhuǎn)換通道P1.6
- #define ADC_CH7 0x07 //轉(zhuǎn)換通道P1.7
- //ADC端口模擬功能設(shè)置P1ASF
- #define P1ASF_0 0x01 //設(shè)置P1.0口為ADC端口
- #define P1ASF_1 0x02 //設(shè)置P1.1口為ADC端口
- #define P1ASF_2 0x04 //設(shè)置P1.2口為ADC端口
- #define P1ASF_3 0x08 //設(shè)置P1.3口為ADC端口
- #define P1ASF_4 0x10 //設(shè)置P1.4口為ADC端口
- #define P1ASF_5 0x20 //設(shè)置P1.5口為ADC端口
- #define P1ASF_6 0x40 //設(shè)置P1.6口為ADC端口
- #define P1ASF_7 0x80 //設(shè)置P1.7口為ADC端口
- float VCC; //供電電壓
- void delay_nus(unsigned int t){while(t--);}//微秒延時函數(shù)
- void delay_nms(unsigned int t) //毫秒延時函數(shù)
- {
- unsigned int a;
- while(t--)for(a=0;a<80;a++);
- }
- void InitADC()
- {
- P1ASF=0xFF;//打開P1.0~P1.7作為模擬輸入通道
- ADC_CONTR=ADC_POWER|ADC_SPEEDLL;
- delay_nms(1); //延時1mS
- }
- unsigned int ADC_Read(unsigned char ADC_CH)//ADC采樣初始化函數(shù)
- {
- unsigned int AD_Dat;
- ADC_CONTR|=ADC_POWER|ADC_SPEEDLL|ADC_CH|ADC_START;//配置ADC控制寄存器 //打開電源、最高速度、選擇通道
- delay_nus(100); //延時100uS
- while((ADC_CONTR&ADC_FLAG)==0); //等待轉(zhuǎn)換結(jié)束0x10=0001 0000
- ADC_CONTR &=~ADC_FLAG; //清除轉(zhuǎn)換結(jié)束ADC_FLAG
- AD_Dat=(ADC_RES<<2)+(ADC_RESL&0x03); //把數(shù)據(jù)整合成10位數(shù),并做計算
- ADC_CONTR=0x00; //實踐證明要添加這句代碼才能進行多路電壓采集
- return AD_Dat; //返回電壓數(shù)字量
- }
復(fù)制代碼
所有程序51hei提供下載:
數(shù)字電壓表.rar
(95.97 KB, 下載次數(shù): 154)
2020-7-25 10:48 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|