本帖最后由 明天及以后 于 2011-1-6 22:04 编辑
我用STC12C5201AD写一个检测电压的程序,结果一直在检测是否转换成功的while循环里,成了死循环。帮我分析一下,哪里没有做到位,谢谢!
#include"D:\Program Files\keil\C51\INC\**\STC12C52.h"
sfr P1ASF=0x9d;
sfr ADC_RES=0xbd;
#define AD_POWER 0x80;
#define SPEED 0x00;
#define AD_FLAG 0x10;
#define AD_START 0x08;
#define AD_CH2 0x04;
#define AD_CH1 0x02;
#define AD_CH0 0x01;
unsigned int a=0,b=0,c=0;
unsigned int ad_p17=0,ad_p16=0,d=0;
void start(); //上电初始化
void delay10(unsigned x);//延时子程序
void AD(unsigned char channel);//AD转换子程序
void main()
{
start(); //上电初始化
AD(6);
if(ad_p16>ad_p17)
{P37=0;P10=1;}
else
{P37=1;P10=0;}
if(ad_p16==ad_p17)
{P37=0;P10=0;}
}
void start() //上电初始化
{
//设置P3口
P3M1=0x00;
P3M0=0x00;
//设置P1口
P1M1=0xc0; //P1.6、P1.7为开漏,输入模式
P1M0=0xc0; //P1.6、P1.7为开漏,输入模式
//先让充电放电控制无效,指示灯全亮
P33=1;
P34=1;
P37=0;
P10=0;
P11=0;
P12=0;
P15=1;
P30=1;
P31=1;
//设置AD
P1ASF=0xc0; //选择P1.6、P1.7位模拟输入通道
}
void delay10(unsigned int x)
{
for(b=x;b>0;b--)
{
for(c=6000;c>0;c--);
}
//return;
}
void AD(unsigned char channel)
{
unsigned char AD_finished=0;
ADC_RES = 0;
ADC_CONTR=0x60; //70个时钟转换一次
delay10(100);
ADC_CONTR|=channel; //选择 A/D 当前通道为P1.6
delay10(100);
ADC_CONTR|=0x80; //启动 A/D 电源
delay10(100); //使输入电压达到稳定
ADC_CONTR|=0x08; //0000,1000 令 ADCS = 1, 启动A/D转换,
while(AD_finished==0) //等待A/D转换结束
{
AD_finished=ADC_CONTR&0x10; //0001,0000 测试A/D转换结束否
}
P12=0;
ADC_CONTR&= 0xE7; //1110,0111 清 ADC_FLAG 位, 关闭A/D转换,
if(channel=6)
ad_p16=ADC_RES;
if(channel=7)
ad_p17=ADC_RES;
//return (ADC_RES); //返回 A/D 高 8 位转换结果
}
上面的程序执行到“while(AD_finished==0) //等待A/D转换结束”就成了死循环。请各位大侠分析了。谢谢! |