基于STC12C56系列单片机的AD转换C程序
扫描二维码
随时随地手机看文章
/****************
STC12c56 AD转换
入口参数:通道数(0,1,2,3,4,5,6,7)
返回值: AD转换结果
*****************/
#include<reg51.h>
sfr ADC_CONTR=0xc5; //AD转换寄存器
sfr ADC_DATA=0xc6; //AD转换结果寄存器,为10位
sfr P1M0=0x91;
sfr P1M1=0x92;
/***************************
微秒延时函数
********************************/
void delay_us(unsigned int i)//延时 如果需要高精度延时 请嵌入汇编
{
unsigned char a;
if (i == 0)
{
return ;
}
for (a = 1; a < i; a++)
{
;
}
}
/***************************
毫秒延时函数
********************************/
void delay_ms(int num)
{
int x,y;
for(y=0;y<num;y++)
{
for(x = 0;x <5000;x)
x++;
}
}
/*********************
入口参数:通道数(0,1,2,3,4,5,6,7)
返回值: AD转换结果
**************************/
unsigned char AD(unsigned char Channel)
{
unsigned char ADResult;
ADC_CONTR|=0x80; //开AD转换电源
delay_ms(1); //延时1ms
switch(Channel)
{
case 0:
P1M0|=0x01;P1M1|=0x01; //设置开漏
ADC_CONTR=0xe0; //选择AD转换通道
break;
case 1:
P1M0|=0x02;P1M1|=0x02;
ADC_CONTR=0xe1;
break;
case 2:
P1M0|=0x04;P1M1|=0x04;
ADC_CONTR=0xe2;
break;
case 3:
P1M0|=0x08;P1M1|=0x08;
ADC_CONTR=0xe3;
break;
case 4:
P1M0|=0x10;P1M1|=0x10;
ADC_CONTR=0xe4;
break;
case 5:
P1M0|=0x20;P1M1|=0x20;
ADC_CONTR=0xe5;
break;
case 6:
P1M0|=0x40;P1M1|=0x40;
ADC_CONTR=0xe6;
break;
case 7:
P1M0|=0x80;P1M1|=0x80;
ADC_CONTR=0xe7;
break;
}
delay_us(100);
ADC_DATA=0x00;
ADC_CONTR|=0x08; //启动AD转换
delay_us(200); //等待转换完成
ADC_CONTR&=0xe7; //清0 ADC_FLAG,ADC_START 位,停止AD转换
ADResult=ADC_DATA; //保存转换结果
switch(Channel)
{
case 0:
P1M0&=0xfe;P1M1&=0xfe; //设置普通IO
break;
case 1:
P1M0&=0xfd;P1M1&=0xfd;
break;
case 2:
P1M0&=0xfb;P1M1&=0xfb;
break;
case 3:
P1M0&=0xf7;P1M1&=0xf7;
break;
case 4:
P1M0&=0xef;P1M1&=0xef;
break;
case 5:
P1M0&=0xdf;P1M1&=0xdf;
break;
case 6:
P1M0&=0xbf;P1M1&=0xbf;
break;
case 7:
P1M0&=0x7f;P1M1&=0x7f;
break;
}
return ADResult;
}