求解STC 12C5A60S2的编程问题,本人初次涉及单片机,对编程不太了解,编了个AD转化的小程序,求高手看下!

求解STC 12C5A60S2的编程问题,本人初次涉及单片机,对编程不太了解,编了个AD转化的小程序,求高手看下!,第1张

我最近也在弄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程序有什么错误等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9445711.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存