专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
51单片机AD转换结果怎么换成十进制数
2019-03-24 17:10
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
51单片机
16073
13
1439
官方手册上面说放在ADC_RES和ADC_RESL里面,得到结果需要怎么处理才能变成十进制数?
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
13条回答
xgliyouquan
2019-03-25 23:08
看过例子就明白了,以下例子来源于
《51单片机轻松入门-基于STC15W4K系列》
,完整工程请查看附件。
第9章(ADC).rar
(181.68 KB, 下载次数: 28)
2017-7-14 19:28 上传 点击文件名下载附件
#include "UART.H" // 包含IAP15W4K58S4寄存器定义文件
#define VCC 4.972 // 存放用万用表实测的单片机供电电压
unsigned int ADC_P11()
{
unsigned int i; // 用于软件延时程序
unsigned char status; // 用于判断AD转换结束的标志
unsigned int AD_Dat=0; // 10位AD转换值
unsigned char Tmp; // 临时变量用于将AD转换出来的2个字节合成一个字节
ADC_CONTR|=0x80; // 开AD转换电源,第一次使用时要打开内部模拟电源
for (i=0;i<10000;i++); // 适当延时等待AD转换供电稳定,一般延时1ms以内即可,为了缩短AD
// 调用时间,可把这2行剪切到主程序中去。
P1ASF|=0x02; // 选择P1.1作为AD转换通道,0x02= 0000 0010
ADC_CONTR=0xE1; // 选择P1.1作为AD转换通道,最高转换速度,清转换完成标志。
for (i=0;i<1000;i++); // 如果是多通道模拟量进行AD转换,则更换AD转换通道后要适当延时,
// 使输入电压稳定,延时量取20μs~200μs即可,与输入电压源的内阻有关,如果输入电压信号源的内
// 阻在10K以下,可不加延时,如果是单通道模拟量转换,则不需要更换AD转换通道,也不需要加延时。
ADC_CONTR|=0x08; // 启动 A/D 转换,ADC_START=1。
status=0;
while(status==0) // 等待AD转换结束。
{
status=ADC_CONTR&0x10; // 判断ADC_FLAG是否等于1,0x10=0001 0000B。
}
ADC_CONTR&=0xE7; // 将ADC_FLAG清0, 0xE7=1110 0111B,ADC_FLAG=0,ADC_START=0。
AD_Dat = ADC_RES; // 默认高字节高8位。
AD_Dat <<= 2;
Tmp = ADC_RESL; // 默认低字节低2位。
Tmp &= 0x03; // 屏蔽无关位
AD_Dat |= Tmp; // 高低字节拼接成一个10位数。
return AD_Dat;
}
void main(void)
{
float Vin; // 存放计算出来的外部输入电压
unsigned int ADvalue; // 存放AD转换返回的结果
UART_init(); // 串口初始化9600/22.1184MHz
printf("串口初始化完毕");
while(1)
{
ADvalue=ADC_P11(); // 采样P1.1口模拟输入电压
Vin=VCC*ADvalue/1023; // 注意是1023才正确
printf("%.3f ",Vin);
delay500ms();
} // 若不用串口显示,此行可设置断点仿真观察结果
}
加载中...
查看其它13个回答
一周热门
更多
>
相关问题
相关文章
基于51单片机的计算器设计
0个评论
51单片机300个proteus仿真实例下载
0个评论
51单片机 蜂鸣器
0个评论
51单片机驱动RC522模块
0个评论
基于51单片机的指纹密码锁
0个评论
AT89C51单片机制作简易密码锁
0个评论
51单片机汇编语言计数器
0个评论
51单片机精确延时设计
0个评论
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
#include "UART.H" // 包含IAP15W4K58S4寄存器定义文件
#define VCC 4.972 // 存放用万用表实测的单片机供电电压
unsigned int ADC_P11()
{
unsigned int i; // 用于软件延时程序
unsigned char status; // 用于判断AD转换结束的标志
unsigned int AD_Dat=0; // 10位AD转换值
unsigned char Tmp; // 临时变量用于将AD转换出来的2个字节合成一个字节
ADC_CONTR|=0x80; // 开AD转换电源,第一次使用时要打开内部模拟电源
for (i=0;i<10000;i++); // 适当延时等待AD转换供电稳定,一般延时1ms以内即可,为了缩短AD
// 调用时间,可把这2行剪切到主程序中去。
P1ASF|=0x02; // 选择P1.1作为AD转换通道,0x02= 0000 0010
ADC_CONTR=0xE1; // 选择P1.1作为AD转换通道,最高转换速度,清转换完成标志。
for (i=0;i<1000;i++); // 如果是多通道模拟量进行AD转换,则更换AD转换通道后要适当延时,
// 使输入电压稳定,延时量取20μs~200μs即可,与输入电压源的内阻有关,如果输入电压信号源的内
// 阻在10K以下,可不加延时,如果是单通道模拟量转换,则不需要更换AD转换通道,也不需要加延时。
ADC_CONTR|=0x08; // 启动 A/D 转换,ADC_START=1。
status=0;
while(status==0) // 等待AD转换结束。
{
status=ADC_CONTR&0x10; // 判断ADC_FLAG是否等于1,0x10=0001 0000B。
}
ADC_CONTR&=0xE7; // 将ADC_FLAG清0, 0xE7=1110 0111B,ADC_FLAG=0,ADC_START=0。
AD_Dat = ADC_RES; // 默认高字节高8位。
AD_Dat <<= 2;
Tmp = ADC_RESL; // 默认低字节低2位。
Tmp &= 0x03; // 屏蔽无关位
AD_Dat |= Tmp; // 高低字节拼接成一个10位数。
return AD_Dat;
}
void main(void)
{
float Vin; // 存放计算出来的外部输入电压
unsigned int ADvalue; // 存放AD转换返回的结果
UART_init(); // 串口初始化9600/22.1184MHz
printf("串口初始化完毕");
while(1)
{
ADvalue=ADC_P11(); // 采样P1.1口模拟输入电压
Vin=VCC*ADvalue/1023; // 注意是1023才正确
printf("%.3f ",Vin);
delay500ms();
} // 若不用串口显示,此行可设置断点仿真观察结果
}
一周热门 更多>