我最近也在弄STC的单片机,看了下代码,觉得以下这段似乎有点问题
for(i=0;i<10;i++)
{
tp=0;
ADC_RES=0;
ADC_RESL=0; //低两位清零
ADC_CONTR|=0x08; //启动AD转换
while(!tp) //判断AD转换是否完成
{
tp=0x10;
tp&=ADC_CONTR;
}
ADC_CONTR&=0xe7;
ad_average_result=ADC_RES;
q=q+ad_average_result;
}
你的意图是想做10次转换,然后取平均值作为最终结果吧, while(!tp) 就是说转换完成后将转换完成标志位清零接着再取出转换后的数,可是转换未完成的话就跳出while直接执行后面的语句了吧,不过这个就是有问题应该也不会导致完全没结果输出,也就是结果有问题的话灯应该也会亮的,还有是否确定模拟信号输入口是否和寄存器设置所选的一致,P1ASF这个寄存器我也找不到说明
// 定义与 ADC 有关的特殊功能寄存器
sfr P1_ASF = 0x9d; //A/D转换功能允许寄存器
sfr ADC_CONTR = 0xbc; //A/D转换控制寄存器
sfr ADC_RES = 0xbd; //A/D转换结果寄存器
sfr ADC_RESL = 0xbe; //A/D转换结果寄存器
uint8 get_AD(uint8 channel)
{
ADC_RES = 0;
P1 |= (0x01 << channel); //要设置为 A/D 转换的P1x 口,先设为高
P1_ASF &= (~(0x01 << channel));//设置 A/D 转换输入脚
ADC_CONTR =0xa8 | channel; // 选择 A/D 当前通道
while (!(ADC_CONTR & 0x10)) // 等待A/D 转换结束
{
}
ADC_CONTR &= 0xF7; //1111,0111 令 ADC_START = 0, 关闭A/D 转换,
return (((unint16)ADC_RES)<<2 | (0xfc & ADC_RESL); // 返回 A/D 转换结果
}
你有看宏晶STC12C5A60S2的资料吗?
我记得上面好像是这样写的,
对于ADC转换控制寄存器的 *** 作,
尽量不要使用|,
而是直接赋值,
你可以写成:
ADC_CONTR=0x80|channel;等等
另外请在启动ADC转换前,
写上:
ADC_RES=0;
修改后再试一下。
应当能成功了。
以上就是关于求解STC 12C5A60S2的编程问题,本人初次涉及单片机,对编程不太了解,编了个AD转化的小程序,求高手看下!全部的内容,包括:求解STC 12C5A60S2的编程问题,本人初次涉及单片机,对编程不太了解,编了个AD转化的小程序,求高手看下!、STC12C5A06S2单片机的10位AD转换C语言程序,有哪位大侠会编写的,教教可以吗、这段STC12C5A60S2单片机的AD转换C程序有什么错误等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)