首页 PCF8591驱动程序

PCF8591驱动程序

举报
开通vip

PCF8591驱动程序AD-DA转换PCF8591T芯片控制程序  并用74HC595和74HC164显示出来。 #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;                    ...

PCF8591驱动程序
AD-DA转换PCF8591T芯片控制程序  并用74HC595和74HC164显示出来。 #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)               *                        *功能:在指定的位置显示对的数字        其中164控制段,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驱动程序】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_977556
暂无简介~
格式:doc
大小:34KB
软件:Word
页数:0
分类:生活休闲
上传时间:2017-09-20
浏览量:24