本帖最后由 zhth1979 于 2022-1-7 11:31 编辑
前两天发了求助帖,但没有什么找到这方面的例程 ,自己摸索写了一段三通道轮询方式检测ADC的值,好像不正确,请大家指点!单片机型号:STC8H3K32S2
#include "AD.h"
unsigned char ad_flag=1;
unsigned char ad_result=0;
int ad_show1=0;
int ad_show2=0;
unsigned char ADC_Conv(unsigned char channel)
{
// unsigned char ad_result=0;
P1M1 = 0x07; P1M0 = 0x00; //设置 P1.0 P1.1 P1.2 为 ADC 输入口
ADC_SetChannel(channel); //1.选通道
P_SW2|=0X80;
ADCTIM=0X3F; //设置ADC内部时序
P_SW2&=0X7F;
ADCCFG=0X0F; //设置ADC时钟为系统时钟/2/16
ADC_CONTR = 0x80 | channel; ADC_CONTR|=0X40; //启动AD转换
_nop_();
_nop_();
while(!(ADC_CONTR&0x20)); //查询ADC完成标志
ADC_CONTR &=~0X20; //清完成标志
ad_result=(ADC_RES<<8)|ADC_RESL; //读取ADC结果
_nop_();
_nop_();
return ad_result;
}
void Timer0Init()
{
TMOD &= 0XF0; //设置定时器模式
TMOD |=0X01; //设置定时器16位不可重装载模式
TH0=0XFC; //设置定时初值
TL0=0X18; //设置定时初值
TF0=0; //清除TF0标志
ET0=1; //定时器0的中断开关
TR0=1; //定时器0开始计时
}
void timer0_ISR() interrupt 1
{
static unsigned int timer0Cnt;
timer0Cnt++;
if(timer0Cnt>=1000)
{
timer0Cnt=0;
ad_flag=1;
}
TR0=0;
TH0=0XFC;
TL0=0X18;
TR0=1;
}
void adc()
{
unsigned int ad_0,ad_1,ad_2;
unsigned char channel=0;
Timer0Init();
EA=1;
if(ad_flag==1)
{
ad_flag=0;
ad_0=ADC_Conv(0);
ad_1=ADC_Conv(1);
ad_2=ADC_Conv(2);
ad_show1 = ad_0- ad_1; //压力传感器差分值
ad_show2 = ad_2/4096*2.5; //测量电池电压
}
}
主函数再调用 adc(); ad_show1和ad_show2两个值。
|