什么ADC也不说清楚 |
#include ”stc15w4k.h" #include <stdio.h> // 为使用KEIL自带的库函数printf而加入 加入串口可以在PC端实时查看电压数据 unsigned int ADC_P11() // ADC转换函数 { 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; } mian函数下 float Vin; // 存放计算出来的外部输入电压 unsigned int ADvalue; // 存放AD转换返回的结果 ADvalue=ADC_P11(); // 采样P1.1口模拟输入电压 电瓶正极电压 Vin=VCC*ADvalue/1023; // 注意是1023才正确 printf("%.3f ",Vin); //输出电压显示。 |
能自己马上发现错误并改正,真厉害! |