最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

PCF8591驱动程序

来源:动视网 责编:小OO 时间:2025-09-30 22:27:06
文档

PCF8591驱动程序

AD-DA转换PCF8591T芯片控制程序并用74HC595和74HC1显示出来。#include#include#defineucharunsignedchar#defineuintunsignedintsbitSCL=P2^0;sbitSDA=P2^1;bitack;uchara[3];ucharb[3];sbitSCK=P1^0;sbitDAT=P1^3;sbitG=P1^2;sbitRCK=P1^1;//把unsignedchar宏定义为ucharucharLed_code[10]
推荐度:
导读AD-DA转换PCF8591T芯片控制程序并用74HC595和74HC1显示出来。#include#include#defineucharunsignedchar#defineuintunsignedintsbitSCL=P2^0;sbitSDA=P2^1;bitack;uchara[3];ucharb[3];sbitSCK=P1^0;sbitDAT=P1^3;sbitG=P1^2;sbitRCK=P1^1;//把unsignedchar宏定义为ucharucharLed_code[10]
 AD-DA转换PCF8591T芯片控制程序

 并用74HC595和74HC1显示出来。

#include

#include

#define uchar unsigned char

#define uint unsigned int

sbit SCL=P2^0;

sbit SDA=P2^1;

bit ack;

uchar a[3];

uchar b[3];

sbit SCK=P1^0;

sbit DAT=P1^3;

sbit  G=P1^2;

sbit RCK=P1^1; 

                               //把unsigned char宏定义为uchar

uchar Led_code[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07, //数码管的0~F的所对应的段码

                    0x7F,0x6F};

//uchar Led_enbit[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //共阳数码管

uchar Led_enbit[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //数码管第0~7位所对应位选的代码

/*******************************************************

*函数:void delay(void)                                *

*功能:延时2ms                                           *

********************************************************/

void delay1(uchar x)   

{

    unsigned char a,b;

for(b=80;b>0;b--)

for(a=x;a>0;a--);

}           

     

/*******************************************************

*函数:void send_data(unchar Data)                        *            

*功能:发送一字节数据                                   *

*说明:数据的高位在前,低位在后。SCK上升沿写入一位       *                                         

********************************************************/

void send_data(uchar Data)

{

    uchar i;

for(i=0;i<8;i++)

    {

        SCK=0;

        DAT=Data&0x80;    //取数据的最高位

        SCK=1;

     Data=Data<<1; //数据左移一位

    }

}

/*******************************************************

*函数:void display(uchar num,uchar site)                *                        

*功能:在指定的位置显示对的数字        其中1控制段,595控制位                   *

*说明:num为要显示的数字,site为要显示在哪一位数码管在 *

       先发送段码后发送位码                             *                       

********************************************************/

void display(uchar num,uchar site)

{

    G=1;                           //禁止位选数据输出(高阻态)

    send_data(Led_code[num]);    //发送一位段码数据

    send_data(Led_enbit[site]);    //发送一位位码数据

    G=0;                        //允许位选数据输出

    RCK=0;                        //位选数据写入数据存储器

    _nop_();

    RCK=1;

    delay1(10);                     //延时2ms

}

/*******************************************************************

          I2c专用延时函数               

函数原型: void Delay_I2c();  

功能:    延时7US左右 

********************************************************************/

void Delay_I2c()

{

 uchar a,b;

for(a=1;a>0;a--)

for(b=1;b>0;b--);

}

/*******************************************************************

            总线函数初始化               

函数原型: void Init_I2c();  

功能:     启动I2C总线,即发送I2C起始条件.  

********************************************************************/

void Init_I2c()

{

    SCL=1;     //I2C  时钟 

    SDA=1;     //I2C  数据

}

/*******************************************************************

            起动总线函数               

函数原型: void  Start_I2c();  

功能:     启动I2C总线,即发送I2C起始条件.  

********************************************************************/

void Start_I2c()

{

  SDA=0;         /*发送起始条件的数据信号*/

  SCL=1;

  SDA=1;

  Delay_I2c();        /*起始条件建立时间大于4.7us,延时*/

  SDA=0; 

  Delay_I2c();       /*发送起始信号*/

             /* 起始条件锁定时间大于4μs*/

  SCL=0;       /*钳住I2C总线,准备发送或接收数据 */   

}

/*******************************************************************

                      结束总线函数               

函数原型: void  Stop_I2c();  

功能:     结束I2C总线,即发送I2C结束条件.  

********************************************************************/

void Stop_I2c()

{

   SDA=0;      /*发送结束条件的数据信号*/

   SCL=0;         /*发送结束条件的时钟信号*/

           

   SCL=1;      /*结束条件建立时间大于4μs*/

   Delay_I2c();

   SDA=1;      /*发送I2C总线结束信号*/

   Delay_I2c();

  

   SDA=0;

  

}

/********************************************************************

                     应答子函数

函数原型:  void Ack_I2c();

功能:      主控器进行应答信号(可以是应答或非应答信号,由位参数a决定)

********************************************************************/

void Ack_I2c()

{

  uchar i;

   SCL=0;

   SDA=1;

   SCL=1;

   SDA=0;

  Delay_I2c();

                   //*时钟低电平周期大于4μs

while((SDA==1) && (i<255))

    i++; 

   SCL=0;   

   SDA=1;                       //*清时钟线,钳住I2C总线以便继续接收

  

    

 

}

/********************************************************************

                     应答子函数

函数原型:  void N_Ack_I2c();

功能:      主控器进行应答信号(可以是应答或非应答信号,由位参数a决定)

********************************************************************/

void N_Ack_I2c()

{  

  SCL=0;

  SDA=0;

  SCL=1;

  SDA=1;

  Delay_I2c();

   SCL=0;

   SDA=0;

}

/*******************************************************************

                 字节数据发送函数               

函数原型: void  SendByte(UCHAR c);

功能:     将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对

          此状态位进行操作.(不应答或非应答都使ack=0)     

           发送数据正常,ack=1; ack=0表示被控器无应答或损坏。

********************************************************************/

void  Send_Byte(unsigned char  c)

{

  unsigned char  BitCnt;

 

           SCL=0;  //时钟线为低电平数据会变

for(BitCnt=0;BitCnt<8;BitCnt++) /*要传送的数据长度为8位*/

    {

     if(c&0x80)

         SDA=1;   /*判断发送位*/

       else  SDA=0;  

c=c<<1;

          Delay_I2c();

       SCL=1;               /*置时钟线为高,通知被控器开始接收数据位*/

      Delay_I2c();           /*保证时钟高电平周期大于4μs*/

       SCL=0;

       Delay_I2c();

    }

    SDA=1;                /*8位发送完后释放数据线,准备接收应答位*/

    Delay_I2c();

   if(SDA==1)ack=0;     

      else ack=1;        //*判断是否接收到应答信号

    SCL=0;

   Delay_I2c();

}

/*******************************************************************

                 读一字节数据接收函数               

函数原型: UCHAR  RcvByte();

功能:        用来接收从器件传来的数据,并判断总线错误(不发应答信号),

          发完后请用应答函数应答从机。  

********************************************************************/    

unsigned char Rcv_Byte()

{

  unsigned char dat;

  unsigned char  BitCnt;

      dat=0; 

      //SCL=0;     

      //Nop();

      SDA=1;

      Delay_I2c();

                             /*置数据线为输入方式*/

for(BitCnt=0;BitCnt<8;BitCnt++)

      {

                

        SCL=0;            /*置时钟线为低,准备接收数据位*/  

        Delay_I2c();

                           /*时钟低电平周期大于4.7μs*/

        SCL=1;             /*置时钟线为高使数据线上数据有效*/

        Delay_I2c();

dat=dat<<1;         // dat=(dat<<1)|SDA;//

       if(SDA==1)dat=dat+1;   /*读数据位,接收的数据位放入dat中 */

                            //强制加一,防止上卷,*/

       SCL=0;    

       Delay_I2c();

      }

      

      return(dat);

}

/*******************************************************************

                             

函数原型: AD_chli() 

//

功能:        

********************************************************************/ 

uchar AD_culi(char con)

{

  uint date;

  Start_I2c();

  Send_Byte(0x90);//发送器件地址

  Ack_I2c();

  Send_Byte(con);//控制方式为输出 ,通道0

  Ack_I2c();

  Start_I2c();

  Send_Byte(0x91);

  Ack_I2c();

  date=Rcv_Byte();

  N_Ack_I2c();

  Stop_I2c();

  return date;

}

/*******************************************************************

                             

函数原型: DA_chli() 

//

功能:        

********************************************************************/ 

void DA_culi(uchar con,uchar dat)

{

  Start_I2c();

  Send_Byte(0x90);

  Ack_I2c();

  Send_Byte(con);

  Ack_I2c();

  Send_Byte(dat);

  Ack_I2c();

  Stop_I2c();

}

void main()

{

  uchar shu=0;

  uint x,y;

  uchar we;

  Init_I2c();

 

  

while(1)

{     

  x=AD_culi(0x01);

  a[2]=x/100;

  a[1]=x%100/10;

  a[0]=x%10;

  

for(we=0;we<3;we++)

    {

     display(a[we],we);

    

    }  

    DA_culi(0x40,shu);

    shu++;

}     

  

 

}

文档

PCF8591驱动程序

AD-DA转换PCF8591T芯片控制程序并用74HC595和74HC1显示出来。#include#include#defineucharunsignedchar#defineuintunsignedintsbitSCL=P2^0;sbitSDA=P2^1;bitack;uchara[3];ucharb[3];sbitSCK=P1^0;sbitDAT=P1^3;sbitG=P1^2;sbitRCK=P1^1;//把unsignedchar宏定义为ucharucharLed_code[10]
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top