| 
 
| #include<reg52.h> #define uchar unsigned char
 #define slavewriteaddr 0x90  //定义从机写控制字节
 #define slavereadaddr 0x91   //定义从机读控制字节
 typedef unsigned char uint8
 ;uint8 date;
 sbit SDA=P2^0;               //定义I2C通信的数据线
 sbit SCL=P2^1;               //定义I2C通信的时钟线
 sbit DS1302=P2^4;            //定义DS1302的复位引脚
 void delay(uchar x)     //延时xms函数
 {
 uchar i,j;
 for(i=x;i>0;i--)
 for(j=110;j>0;j--);
 }
 void init_ser()        //串口初始化,设置通信速率9600
 {
 TMOD=0x20;
 SCON=0x50;
 TH1=0xfd;
 TL1=0xfd;
 TR1=1;
 ET1=0;
 }
 void I2C_start()       //I2C起始信号
 {
 SCL=1;
 delay(1);
 SDA=1;
 delay(1);
 SDA=0;
 delay(1);
 SCL=0;
 }
 void I2C_init()       //I2C初始化信号
 {
 SDA=1;
 delay(1);
 SCL=1;
 delay(1);
 }
 void I2C_stop()       //I2C结束信号
 {
 SDA=0;
 delay(1);
 SCL=1;
 delay(1);
 SDA=1;
 delay(1);
 SCL=0;
 delay(1);
 }
 uint8 I2C_writebyte(uint8 y)      //I2C写(发送)一个字节,y为待发送的字节数据
 {
 uchar i;
 for(i=0;i<8;i++)
 {
 SCL=0;
 delay(1);
 if(bit(y&0x80))
 SDA|=0x01;
 else
 SDA&=0xfe;
 delay(1);
 SCL=1;
 delay(1);
 y<<=1;
 }
 SDA=1;
 delay(1);
 SCL=1;
 delay(1);
 SDA=0;
 delay(1);
 SCL=0;
 delay(1);
 
 }
 uchar I2C_readbyte()            //I2C读(接收)一个字节 ,y用于储存读到的字节数据
 {
 uchar i;
 uint8 y;
 for(i=0;i<8;i++)
 {
 SDA=1;                            //释放数据总线
 SCL=0;
 y<<=1;
 if(SDA)
 y|=0x01;
 delay(1);
 SCL=1;
 }
 return y;
 SCL=0;
 delay(1);
 SDA=1;
 delay(1);
 SCL=1;
 delay(1);
 SCL=0;
 delay(1);
 
 }
 uchar readtype(uchar addr)          //I2C从PCF8591的某个通道读取数据
 {
 I2C_start();
 I2C_writebyte(slavewriteaddr);
 delay(1);
 I2C_writebyte(addr);
 delay(1);
 I2C_start();
 I2C_writebyte(slavereadaddr);
 delay(1);
 date=I2C_readbyte();
 I2C_stop();
 return date;
 }
 void UART_send(uint8 date)            //I2C从PCF8591读到的数据发送到串口缓存
 {
 SBUF=date;
 while(!TI);
 TI=0;
 }
 void main()                           //主函数
 {
 I2C_init();
 init_ser();
 DS1302=0;
 while(1)
 {
 readtype(0x42);                       //从PCF8591通道2读取数据,并设置串口输出使能和单通道输入
 UART_send(date);
 delay(100);
 }
 }
 
 各位大虾,好
 我做串口调试时,用的PCF8591怎么读取的数据一直是ff?请大神们帮我解答下,万分感谢
 | 
 |