下面程序更简洁一些,并有详细注释,可不作任何修改直接用于IAP15F2K61S2单片机,内容来源于《51单片机轻松入门-基于STC15W4K系列》
9.2.2、实例代码 例9.1 IAP15W4K58S4单片机A/D转换程序,查询方式,测量结果电压值发送到计算机串口助手显示,波特率9600/22.1184MHz,电路如图1-13所示。当使用配套实验板时,需要将跳线帽“AD/串口2”插接到AD处。 #include"UART.H" // 包含IAP15W4K58S4寄存器定义文件 #define VCC 4.970 // 存放用万用表实测的单片机供电电压 unsigned int ADC_P11() { unsigned int i; // 用于软件延时程序 unsigned char status; // 用于判断A/D转换结束的标志 unsigned int AD_Dat=0; //10位A/D转换值 unsigned char Tmp; // 临时变量用于将A/D转换出来的2个字节合成一个字节 ADC_CONTR|=0x80; // 开ADC转换器电源,第一次使用时要打开内部模拟电源 for (i=0;i<10000;i++); // 适当延时等待ADC转换供电稳定,一般延时1ms以内即可,为了缩短 // A/D调用时间,可把这2行剪切到主程序中去。 P1ASF|=0x02; // 选择P1.1作为ADC转换通道,0x02= 0000 0010 ADC_CONTR=0xE1; // 选择P1.1作为ADC转换通道,最高转换速度,清转换完成标志。 for (i=0;i<1000;i++); // 如果是多通道模拟量进行A/D转换,则更换A/D转换通道后要适当延时, // 使输入电压稳定,延时量取20μs~200μs即可,与输入电压源的内阻有关,如果输入电压信号源的内 // 阻在10K以下,可不加延时,如果是单通道模拟量转换,则不需要更换A/D转换通道,也不需要加延时。 ADC_CONTR|=0x08; // 启动 A/D 转换,ADC_START=1。 status=0; while(status==0) // 等待A/D转换结束。 { 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; // 存放A/D转换返回的结果 UART_init(); // 串口初始化9600/22.1184MHz printf("串口初始化完毕"); while(1) { ADvalue=ADC_P11(); // 采样P1.1口模拟输入电压 Vin=VCC*ADvalue/1023; // 注意是1023才正确 printf("%.3f ",Vin); delay500ms(); } // 若不用串口显示,此行可设置断点仿真观察结果 } 实验测试数据如表9-5所示,表中的“参考基准电压”和“输入电压(V)”是使用四位半数字万用表VC86E测量获得的结果, ADC的输入信号是来自10K的可调电位器。 表9-5 单片机内部ADC实验结果数据表
|