高级会员
- 积分
- 594
- 金钱
- 594
- 注册时间
- 2014-4-3
- 在线时间
- 74 小时
|
发表于 2016-3-21 20:30:01
|
显示全部楼层
以下内容来源于《51单片机轻松入门-基于STC15W4K系列》第9章
功能:将AD转换结果发计算机显示。
#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();
} // 若不用串口显示,此行可设置断点仿真观察结果
}
|
|