D/A A/D转换器及其单片机接口

六、D/A A/D转换器及其单片机接口

DA/AD原理图

(推荐以上的超链接!)

PCF8591管脚功能

数据方向位

  • 0 写
  • 1 读

控制字节

  • 低4位的前2位:

    • 00:通道0
    • 01:通道1
    • 10:通道2
    • 01:通道3
  • 低4位的第3位:自动递增标志位

  • 高4位的前2位:模拟输入编程

    • 00:四个单端输入
    • 01:三差分输入
    • 10:单端差分混合
    • 11:双差分输入

  • 高4位的第3位:模拟输出启用标志位

PCF8591

代码理解

  1. 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_();
    }
    
    
  2. 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
    
posted @ 2021-09-04 01:41  六月琳  阅读(42)  评论(0)    收藏  举报