|
- #include<reg51.h>
- #include<intrins.h>
- #include "STC_NEW_8051.H"
-
- #define uchar unsigned char
- #define uint unsigned int
- //以下選擇 ADC 轉(zhuǎn)換速率,只能選擇其中一種
- // SPEED1 SPEED0 A/D轉(zhuǎn)換所需時(shí)間
- //#define AD_SPEED 0x60 // 0110,0000 1 1 70 個(gè)時(shí)鐘周期轉(zhuǎn)換一次,
- // CPU工作頻率21MHz時(shí) A/D轉(zhuǎn)換速度約 300KHz
- //#define AD_SPEED 0x40 //0100,0000 1 0 140 個(gè)時(shí)鐘周期轉(zhuǎn)換一次
- //#define AD_SPEED 0x20 //0010,0000 0 1 280 個(gè)時(shí)鐘周期轉(zhuǎn)換一次
- #define AD_SPEED 0x00 //0000,0000 0 0 420 個(gè)時(shí)鐘周期轉(zhuǎn)換一次
- code unsigned char digit[]={'0','1','2','3','4','5','6','7','8','9' };
-
- /******************************************************************/
- /* 定義端口 */
- /******************************************************************/
-
- sbit rs=P1^0; //顯示數(shù)據(jù)端口P2
- sbit rw=P1^1;
- sbit en=P1^2;
-
- /******************************************************************/
- /* 函數(shù)聲明 */
- /******************************************************************/
- void write_order(uchar order);
-
- void write_date(uchar date);
- void write_address(uchar x);
- unsigned int get_AD_result_10F(unsigned char channel);
-
- //延時(shí)
- void delay(uchar m)
- {
- uchar i=100;
- while(m--)
- {
- while(i--);
- }
- }
-
- /******************************************************************/
- /* 寫命令 */
- /******************************************************************/
- void write_order(uchar order)
- {
- rs=0;
- P2=order;
- delay(4);
- en=1;
- delay(4);
- en=0;
- }
- /******************************************************************/
- /* 寫數(shù)據(jù) */
- /******************************************************************/
- void write_data(uchar date)
- {
- rs=1;
- P2=date;
- delay(4);
- en=1;
- delay(4);
- en=0;
- }
- /******************************************************************/
- /* 寫地址 */
- /******************************************************************/
- void write_address(uchar x)
- {
- write_order(0x80+x);
- }
- /******************************************************************/
- /* 1602 初始化 */
- /******************************************************************/
- void init_lcd()
- {
- rw=0;
- en=0;
- write_order(0x38);
- write_order(0x0c);
- write_order(0x06);
- write_order(0x01);
- }
-
- /******************************************************************/
- /* 主函數(shù) */
- /******************************************************************/
- void main()
- {
- unsigned char ADC_result ;
- unsigned long int gg ;
- uchar g,s,b ;
- P1ASF = 0x80; //1000 0000選擇P1^7作為模擬輸入口
-
-
- //ADRJ = AUXR1^2:
- // 0: 10 位A/D 轉(zhuǎn)換結(jié)果的高8 位放在ADC_RES 寄存器, 低2 位放在ADC_RESL 寄存器
- // 1: 10 位A/D 轉(zhuǎn)換結(jié)果的最高2 位放在ADC_RES 寄存器的低2 位, 低8 位放在
- AUXR1 &= ~0x04; //0000,0100, 令 ADRJ=0
- ADC_CONTR |= 0x80; //1000,0000 打開 A/D 轉(zhuǎn)換電源
- delay(10);
- init_lcd(); //lcd初始化
- delay(15);
-
- while(1)
- { /*
- ADC_result = get_AD_result_10F(7); //P1.7為 A/D 當(dāng)前通道, 接電壓源進(jìn)行測(cè)量
- gg=(unsigned long int)((unsigned long int)ADC_result*465)/256; //“470”根據(jù)實(shí)際情況而定
- b=(gg%1000)/100;
- s=(gg%100)/10;
- g=gg%10;
- write_address(0x40);
- write_data(digit[b]);
- write_data('.');
- write_data(digit[s]);
- write_data(digit[g]); */
- ADC_result = get_AD_result_10F(7); //P1.7為 A/D 當(dāng)前通道, 接電壓源進(jìn)行測(cè)量
- gg=(unsigned long int)((unsigned long int)ADC_result*485)/256; //“470”根據(jù)實(shí)際情況而定
- b=(gg%1000)/100;
- s=(gg%100)/10;
- g=gg%10;
- if(g>=5){
- s++;
- if(s==10)
- {
- s=0;
- b++;
- }
-
- }
-
- write_address(0x40);
- write_data(digit[b]);
- write_data('.');
- write_data(digit[s]);
-
-
-
- }
-
- }
- /****************************************************************************/
- /* 10位AD帶均值濾波轉(zhuǎn)換 */
- /*****************************************************************************/
- unsigned int get_AD_result_10F(unsigned char channel)
- {
- unsigned char AD_finished=0; //存儲(chǔ) A/D 轉(zhuǎn)換標(biāo)志
- unsigned int out=0;
- unsigned int N=40;
- unsigned int sum=0;
- unsigned char m;
- ADC_RES = 0;
- ADC_RESL = 0;
- channel &= 0x07; //0000,0111 清0高5位
- ADC_CONTR = AD_SPEED;
- _nop_();
- ADC_CONTR |= channel; //選擇 A/D 當(dāng)前通道
- _nop_();
- ADC_CONTR |= 0x80; //啟動(dòng) A/D 電源
- delay(1); //使輸入電壓達(dá)到穩(wěn)定
- for(m=0;m<N;m++)
- { //均值濾波
- ADC_CONTR |= 0x08; //0000,1000 令 ADCS = 1, 啟動(dòng)A/D轉(zhuǎn)換,
- AD_finished = 0;
- while (AD_finished ==0 ) //等待A/D轉(zhuǎn)換結(jié)束
- {
- AD_finished = (ADC_CONTR & 0x10); //0001,0000 測(cè)試A/D轉(zhuǎn)換結(jié)束否
- }
- ADC_CONTR &= 0xE7; //1110,0111 清 ADC_FLAG 位, 關(guān)閉A/D轉(zhuǎn)換,
- out= ADC_RES;
- // out=(out<<2)+(ADC_RESL&0xfc);
- sum=sum+out;
- } //帶均值濾波
- return (sum/N); //返回 A/D 高 8 位轉(zhuǎn)換結(jié)果
- }
復(fù)制代碼
頭文件:
- /**************************************************************************
- STC_NEW_8051.H
- ************************************************************************/
- sfr P1ASF = 0x9D; //P1 analog special function
- sfr AUXR = 0x8E; //Auxiliary Register T0x12 T1x12 UART_M0x6 BRTR S2SMOD BRTx12 EXTRAM S1BRS 0000,0000
- //-----------------------------------
- sfr AUXR1 = 0xA2; //Auxiliary Register 1 - PCA_P4 SPI_P4 S2_P4 GF2 ADRJ - DPS 0000,0000
- sfr ADC_CONTR = 0xBC; //A/D 轉(zhuǎn)換控制寄存器 ADC_POWER SPEED1 SPEED0 ADC_FLAG ADC_START CHS2 CHS1 CHS0 0000,0000
- sfr ADC_RES = 0xBD; //A/D 轉(zhuǎn)換結(jié)果高8位 ADCV.9 ADCV.8 ADCV.7 ADCV.6 ADCV.5 ADCV.4 ADCV.3 ADCV.2 0000,0000
- sfr ADC_RESL = 0xBE; //A/D 轉(zhuǎn)換結(jié)果低2位 ADCV.1 ADCV.0 0000,0000
- sfr BRT = 0x9C; //S2 Baud-Rate Timer 0000,0000
-
復(fù)制代碼
|
|