D/A A/D转换器及其单片机接口
六、D/A A/D转换器及其单片机接口
DA/AD原理图
(推荐以上的超链接!)



数据方向位
- 0 写
- 1 读
控制字节
-
低4位的前2位:
- 00:通道0
- 01:通道1
- 10:通道2
- 01:通道3
-
低4位的第3位:自动递增标志位
-
高4位的前2位:模拟输入编程
- 00:四个单端输入
- 01:三差分输入
- 10:单端差分混合
- 11:双差分输入
- 高4位的第3位:模拟输出启用标志位

PCF8591

代码理解
-
include<ic.h>
#include<ic.h> /* 总线初始化*/ void busInit(){ SCL = 1; _nop_(); SDA = 1; delay5us(); } /*起始信号*/ void start(){ SCL = 1; SDA = 1; /* 一个新的信号前总线的空闲时间要大于4.7us, 对于一个重复的初始信号要求建立的时间也要大于4.7us */ delay5us(); SDA = 0; /* 起始信号到第一个时钟脉冲负跳沿的时间间隔应大于4us */ delay4us(); SCL = 0; } /*终止信号*/ void stop(){ SCL = 0; SDA = 0; delay4us(); SCL = 1; delay4us(); SDA = 1; delay4us(); SDA = 0; } /*数据“0”*/ void Ack(){ /* SCL在高电平期间,SDA被器件拉为低电平表示应答 */ uchar i; SDA = 0; SCL = 1; delay4us(); while( (SDA == 1 ) && ( i < 255 ) ) i++; SCL = 0; delay4us(); } #if 0 /*数据“1”*/ void NoAck(){ SDA = 1; SCL = 1; delay4us(); SCL = 0; SCL = 0; } #endif /*检查应答函数 */ void cAck( void ) { uchar i=0; SCL=1; while((SDA==1)&&(i<255)) i++; F0=SDA; SCL=0; //函数结束,使SCL=0 } /*写入1字节数据函数*/ void SendByte(uchar temp){ uchar i,b; b=temp; for(i=0; i <8; i++){ // 8位数据长度 b= b<<1; //左移一位,准备下一发送位 SCL=0; delay4us(); SDA=CY; //发送数据最高位送到SDA delay4us(); SCL=1; //SCL↑送入 delay4us(); } SCL=0; delay4us(); SDA=1; //发送完后使SDA=1,等待应答 delay4us(); } /*读出1字节数据函数*/ uchar RcvByte(void){ uchar i,temp; SCL=0; delay4us(); SDA=1; //作输入先输出1 for(i=0; i <8; i++) { // 8位数据长度 SCL=1; //SCL↑数据输入到SDA delay4us(); temp = (temp<<1) | SDA; //读1位数据到最低位 SCL=0; //SCL=0,为SCL↑作准备 delay4us(); } delay4us(); return temp; //返回接收数据 } void delay4us(){ _nop_(); _nop_(); _nop_(); _nop_(); } void delay5us(){ _nop_();_nop_(); _nop_(); _nop_(); _nop_(); } -
ic.h
/*-------------------------------------------------------------------------- IC.H All rights reserved. --------------------------------------------------------------------------*/ #ifndef __IC_H__ #define __IC_H__ #include<reg52.h> #include<intrins.h> #define uchar unsigned char #define uint unsigned int sbit SCL = P3^6; sbit SDA = P3^4; sbit erflags=PSW^5; extern void busInit(); extern void start(); extern void stop(); extern void Ack(); extern void cAck( void ); extern void NoAck(); void SendByte(uchar temp); uchar RcvByte(void); extern void delay4us(); extern void delay5us(); #endif

浙公网安备 33010602011771号