AD/DA原理
相关电路
通过pcf8591芯片实现ad转换。板子上ad采集主要采集滑动变阻器的电压值和与光敏电阻串联电阻的电压值。ad为8位精度,采集电压0-5V对应的值为0-255。根据需要可以对读取的值进行调整。
da也通过pcf8591输出,对应引脚在外部引出,在20PIN中19位。da为8位精度输出,输出0-255对应电压0-5V。
pcf8591与单片机的通讯协议是iic。iic相关原理这里不细说。简单说就是主器件发送指令,从器件应答。一般主器件先发送地址,从器件相应后,主器件继续发送命令或数据。
pcf8591器件地址
在板子上A2,A1,A0统统接地,都是,最后一位决定是读还是写操作。
代码解释
修改代码
要操作pcf8591就要把iic协议搞明白,赛点资源包里面给的iic.c源文件是基于51写的,15单片机比51单片机快8-12倍,可以将延迟提高10倍,当然本人经过多次验证,不改延迟也可以实现功能。
AD自写代码
AD
unsigned char readad(unsigned char add)
{
unsigned char temp;
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(add);
IIC_WaitAck();
IIC_Stop();
IIC_Start();
IIC_SendByte(0x91);
IIC_WaitAck();
temp=IIC_RecByte();
IIC_Stop();
return temp;
}
在读取ad值得时候我们选择最简单得单通道对应就行,如果要读光敏电阻对应的,命令就是0x01,要读滑动变阻器,命令就是0x03。这里的命令相当于选ad采集的通道(地址)。
代码里先单片机发出0x90这个地址,意味着写指令,pcf8591接收到后发回应答信号,单片机再要读取pcf8591相应通道的地址。之后重新来,单片机发出0x91这个地址,意味着读数据,pcf8591接收到后发回应答信号,单片机接收pcf8591发送的数据,结束。
DA
在da输出时,命令为0x40。
void writedac(unsigned char dat)
{
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(0x40);
IIC_WaitAck();
IIC_SendByte(dat);
IIC_WaitAck();
IIC_Stop();
}
可以使用万用表测量da输出电压。
驱动程序已给出,主函数里调用获取ad采集的电压值再显示在数码管上就不再贴出来了,和以前的程序类似。
注意:程序中读取滑动变阻器后延迟时间过短又读取光敏电阻可能会数据错乱,两个会正好相反。ad和da同时进行会造成da输出电压不正常,可以在readad函数中将IIC_SendByte(add);改为IIC_SendByte(add|0x40);,原因可自行想想。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)