这一章节的内容比较简单,大家反复细读学习《手把手教你学51单片机》文档第17章就会了解透彻这部分的知识。
1.简要解析概念和代码
我们知道PCF8591有4个通道是可以用来读取输入的电压值的。
那么宋老师写的“unsigned char GetADCValue(unsigned char chn)”就是选择读取其中一个通道输入的测量电压是多少V,受基准源影响,测量范围是0V~2.5V,函数返回值代表读出的电压值为0.01V的n倍左右,也就是返回值为150时,测得的输入电压大概为1.5V。大于2.5V的输入电压,返回值最高为255,也就是测量范围只支持到最高为2.5V。这个概念叫做A/D。
D/A则是选择通道需要输出的电压值,范围同样是只能输出0V~2.5V之间,宋老师写的“void SetDACOut(unsigned char val)”,参数val就是决定输出多少V的电压,参数为100时,PCF8591的AOUT引脚输出电压就是1.0V。
函数“void ValueToString(unsigned char *str, unsigned char val)”也比较实用,
我们一起把这三个函数封装成单独的文件,创建好“adc.c”和“adc.h”文件。
2.adc.c的代码
#include #include /* 读取当前的ADC转换值,chn-ADC通道号0~3 */ unsigned char GetADCValue(unsigned char chn) { unsigned char val; I2CStart(); if (!I2CWrite(0x48<<1)) //寻址PCF8591,如未应答,则停止操作并返回0 { I2CStop(); return 0; } I2CWrite(0x40|chn); //写入控制字节,选择转换通道 I2CStart(); I2CWrite((0x48<<1)|0x01); //寻址PCF8591,指定后续为读操作 I2CReadNAK_OR_ACK(0); //先空读一个字节,提供采样转换时间 val = I2CReadNAK_OR_ACK(1); //读取刚刚转换完的值 I2CStop(); return val; } /* 设置DAC输出值,val-设定值 */ void SetDACOut(unsigned char val) { I2CStart(); if (!I2CWrite(0x48<<1)) //寻址PCF8591,如未应答,则停止操作并返回 { I2CStop(); return; } I2CWrite(0x40); //写入控制字节 I2CWrite(val); //写入DA值 I2CStop(); } /* ADC转换值转为实际电压值的字符串形式,str-字符串指针,val-AD转换值 */ void ValueToString(unsigned char *str, unsigned char val) { //电压值=转换结果*2.5V/255,式中的25隐含了一位十进制小数 val = (val*25) / 255; str[0] = (val/10) + '0'; //整数位字符 str[1] = '.'; //小数点 str[2] = (val%10) + '0'; //小数位字符 str[3] = 'V'; //电压单位 str[4] = '