本次设计利用AT89C51作为主控,利用74HC573作为数码管驱动芯片,数码管为六位共阴数码管,利用独立按键进行用户交互,实现温度/电压二者之间的转换,利用8位LED进行状态显示,利用IIC驱动PCF8591进行ADC获取数值和DAC模拟输出,通过NTC热敏电阻的特性,转换成温度值,利用ADC转换进行电压输入和模拟输出实现测量电压越高,输出电压越高。
一、硬件设计
1、PCF8591
PCF8591是一个单片集成、单独供电、低功耗、8-bit CMOS数据获取器件。PCF8591具有4个模拟输入、1个模拟输出和1个串行I²C总线接口。PCF8591的3个地址引脚A0, A1和A2可用于硬件地址编程,允许在同个I2C总线上接入8个PCF8591器件,而无需额外的硬件。在PCF8591器件上输入输出的地址、控制和数据信号都是通过双线双向I2C总线以串行的方式进行传输。相比较与ADC0808,ADC0804,PCF8591具有节省IO口,转换稳定等特性,且PCF8591有四个ADC输入,一个DAC输出口,针对本次设计的要求是完美符合的。如下
2、74HC573驱动数码管
74HC573是拥有八路输出的透明锁存器,输出为三态门,是一种高性能硅栅CMOS器件,是一种锁存芯片,74HC573一般用于扩展单片机的IO口,一般情况下驱动一个6位数码管需要大于8+6=14个IO口,但是在利用74HC573的情况下只需要8+2=10个IO口,足足节省了4个IO口。
二、软件设计
1、IIC驱动PCF8591
(1)IIC协议驱动代码
IIC驱动代码具有一般的通用性,通过IIC的读写时序可以得出以下代码,这里不过多演示IIC协议原理。
#include "delay.h"
#include "iic.h"
void delay_5us()
{
unsigned char i;
i = 12;
while (--i);
}
//金丝草;使用iic通讯方案1
//方案1:每个函数结束后未释放SDA线,且SCL=1; STOP信号均为高。起始前面处理一下
//方案2:每个函数结束后释放SDA线,且SCL=0;STOP信号均为高。后面信号处理一下。
//本次采用方案1
//1、