stc12le5204ad 为8位AD
//烧写程序时,一定要选用外部晶振(烧写软件默认为内部晶振(5M~6M)),不然还会影响ADC
//烧写时,有时候写不进去,尝试断开地线,然后接上上电
#include<reg51.h>
#include<intrins.h>
sfr P1M1 =0x91;
sfr P1M0 =0x92;
sfr ADC_CONTR = 0xBC;
sfr ADC_RES =0xBD;
sfr P1ASF =0x9D;
sfr AUXR=0x8e;
#define ADC_POWER 0x80
#define ADC_FLAG 0x10
#define ADC_START 0x08
#define ADC_SPEEDLL 0x00
#define ADC_SPEEDL 0x20
#define ADC_SPEEDH 0x40 //这个速度,读出的数据噪声很大
#define ADC_SPEEDHH 0x60
unsigned char ch,loop_n;
unsigned int adc_value;
void serial_initial(void);
void send_UART(unsigned char i);
void UART_Interrupt_Receive(void);
void delay(unsigned char n);
void initADC(void);
void print_uint(unsigned int num);
void Long_delay(unsigned char s);
void main()
{
Long_delay(5);//防止pc运行串口驱动时,与本程序自行向pc发送数据产生冲突,从而产生的混乱
loop_n=0;
adc_value=0;
serial_initial();
initADC();
IE|=0xA0;//开启AD中断与总中断
ADC_CONTR =0x88;
ch=0;
while(1)
{
/* if((ADC_CONTR&0xef)!=0) //使用查询方式测AD值
{
adc_value=ADC_RES;
print_uint(adc_value);
ch++;
if(ch>1)
ch=0;
ADC_CONTR =0x88|ch;
ADC_RES=0;
} */
Long_delay(5);
}
}
void serial_initial(void) // 使用独立波特率发生器作为波特率发生器
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
AUXR &= 0xBF; //定时器1时钟为Fosc/12,即12T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xFD; //设定定时初值
TH1 = 0xFD; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
}
void send_UART(unsigned char i)
{
ES=0; // 关串口中断
TI=0; // 清零串口发送完成中断请求标志
SBUF=i;
while(TI==0); // 等待发送完成
TI=0; // 清零串口发送完成中断请求标志
//ES=1; // 允许串口中断
}
void print_uint(unsigned int num)
{
unsigned char w5,w4,w3,w2,w1;
w5=num/10000;
w4=num%10000/1000;
w3=num%1000/100;
w2=num%100/10;
w1=num%10;
send_UART('0'+w5);
send_UART('0'+w4);
send_UART('0'+w3);
send_UART('0'+w2);
send_UART('0'+w1);
send_UART(' ');
}
void delay(unsigned char n)
{
unsigned char x;
while(n--)
{
x=100;
while(x--);
}
}
void initADC()
{
ch=0;
P1M1=0x03; //P10、P11作AD输入
P1M0=0x00;
P1ASF=0x03;
ADC_RES=0;
ADC_CONTR=0x88;//0x88,P10; 0x89,P11
delay(2);
}
void adc_isr() interrupt 5
{
adc_value+=ADC_RES;
loop_n++;
if(loop_n>4) //5次取平均数
{
adc_value=adc_value/5;
print_uint(adc_value);
Long_delay(5);
ch++;
if(ch>1)
{
ch=0;
send_UART('*');
}
loop_n=0;
adc_value=0;
}
ADC_CONTR =0x88|ch;
ADC_RES=0;
}
void Long_delay(unsigned char s)
{
unsigned char i,j,k;
for(k=0;k<s;k++)
for(i=0;i<255;i++)
for(j=0;j<255;j++)
;
}
完整资料打包: