love欧迪先生 love欧迪先生
关注数: 15 粉丝数: 126 发帖数: 5,326 关注贴吧数: 11
大神看下电压表程序,AD转换 数码管波动大,有影子,显示效果不好。 #include "reg51.h" #include "intrins.h" #define FOSC 11059200L // 晶振 #define BAUD 9600 typedef unsigned char BYTE; typedef unsigned int WORD; /*Declare SFR associated with the ADC */ sfr ADC_CONTR = 0xBC; //ADC control register sfr ADC_RES = 0xBD; //ADC high 8-bit result register sfr ADC_LOW2 = 0xBE; //ADC low 2-bit result register sfr P1ASF = 0x9D; //P1 secondary function control register /*Define ADC operation const for ADC_CONTR*/ #define ADC_POWER 0x80 //ADC power control bit #define ADC_FLAG 0x10 //ADC complete flag #define ADC_START 0x08 //ADC start control bit #define ADC_SPEEDLL 0x00 //420 clocks #define ADC_SPEEDL 0x20 //280 clocks #define ADC_SPEEDH 0x40 //140 clocks #define ADC_SPEEDHH 0x60 //70 clocks sbit DCOUT=P2^5; sbit AD=P1^0; sbit fmq=P2^1; sbit key=P2^3; sbit A1=P3^6; sbit A2=P3^7; sbit A3=P3^5; sbit A4=P3^4; unsigned int t; unsigned char code TAB[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; void InitUart(); void InitADC(); void SendData(BYTE dat); WORD GetADCResult(BYTE ch); void Delay(WORD n); void ShowResult(BYTE ch); void SendNUM(WORD dat); void SendString(char *s); unsigned char n= 0; void delayms(WORD xms) { WORD i,j; for(i=xms;i>0;i--) //i=xms即延时约xms毫秒 for(j=110;j>0;j--); } void display(BYTE dis,BYTE dat) { P0=0; if(dis==1){A2=0;A3=0;A4=0;A1=1;} if(dis==2){A1=0;A3=0;A4=0;A2=1;} if(dis==3){A1=0;A2=0;A4=0;A3=1;} if(dis==4){A1=0;A2=0;A3=0;A4=1;} P0=TAB[dat]; delayms(1); } void main() {char Flag;//定义按键标志位 InitUart(); InitADC(); while (1)//按键切换浓度、电压。 { if(key==0) { while(key==0); Flag=~Flag; } if(Flag) { t=1; } else { t=2; } if(DCOUT==0) { fmq=~fmq; //蜂鸣器 delayms(1); } ShowResult(0); //Show Channel0 } } /*---------------------------- Send ADC result to UART ----------------------------*/ void ShowResult(BYTE ch) { SendNUM(GetADCResult(ch)); //Show ADC high 8-bit result } /*---------------------------- Get ADC result ----------------------------*/ WORD GetADCResult(BYTE ch) { WORD dat; float tmp; ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START; _nop_(); //Must wait before inquiry _nop_(); _nop_(); _nop_(); while (!(ADC_CONTR & ADC_FLAG));//Wait complete flag ADC_CONTR &= ~ADC_FLAG; //Close ADC tmp=(float)ADC_RES/255; dat= tmp*5000*t; return dat; //Return ADC result } /*---------------------------- Initial UART ----------------------------*/ void InitUart() { SCON = 0x5a; //8 bit data ,no parity bit TMOD = 0x20; //T1 as 8-bit auto reload TH1 = TL1 = -(FOSC/12/32/BAUD); //Set Uart baudrate TR1 = 1; //T1 start running } /*---------------------------- Initial ADC sfr ----------------------------*/ void InitADC() { P1ASF = 0x01; //Open 8 channels ADC function ADC_RES = 0; //Clear previous result ADC_CONTR = ADC_POWER | ADC_SPEEDLL; Delay(5); //ADC power-on and delay } /*---------------------------- Send one byte data to PC Input: dat (UART data) Output:- ----------------------------*/ void SendData(BYTE dat) { while (!TI); //Wait for the previous data is sent TI = 0; //Clear TI flag SBUF = dat; //Send current data } /*---------------------------- Software delay function ----------------------------*/ void Delay(WORD n) { WORD x; while (n--) { x = 5000; while (x--); } } void SendNUM(WORD dat) { BYTE tmp; tmp=dat/1000; //SendData(tmp+0x30); display(1,tmp);delayms(4); tmp=dat%1000/100; //SendData(tmp+0x30); display(2,tmp);delayms(8); tmp=dat%100/10; //SendData(tmp+0x30); display(3,tmp);delayms(4); tmp=dat%10; //SendData(tmp+0x30); display(4,tmp); delayms(4); } /*---------------------------- Send a string to UART Input: s (address of string) Output:None ----------------------------*/ void SendString(char *s) { while (*s) //Check the end of the string { SendData(*s++); //Send current char and increment string ptr } }
1 下一页