/********************************************************* 文件名称:I2C.C 主控芯片:STC89C52RC 晶振11.0592MHz 功能描述:单片机模拟I2C总线,操作E2PROM AT24C02芯片 函数名称: void Write(uchar address,uchar date); //向24c02的地址address中,写入一字节数据date uchar Read(uchar address); //从24c02的地址address中,读取一个字节数据 输入参数:参考函数名称 返 回 值:地址address中,读取的一个字节数据 备 注: 作者日期:田卫卫 / 2013年2月11日 版 本:V1.3 *********************************************************/ #include #include"I2C.h" void main() { uchar num; while (1) { num = Read(3); P1 = num; if (num<15) { num++; } else { num=0; } delayms(1000); Write(3,num); delayms(20); } }
/********************************************************* 文件名称:I2C.h 主控芯片:STC89C52RC 晶振11.0592MHz 功能描述:单片机模拟I2C总线,操作E2PROM AT24C02芯片 函数名称: void Write(uchar address,uchar date); //向24c02的地址address中,写入一字节数据date uchar Read(uchar address); //从24c02的地址address中,读取一个字节数据 输入参数:参考函数名称 返 回 值:地址address中,读取的一个字节数据 备 注: 作者日期:田卫卫 / 2013年2月11日 版 本:V1.3 *********************************************************/ #include #define uint unsigned int /*宏定义*/ #define uchar unsigned char /*宏定义*/ #define WRDADDS 0xa0 /*宏定义I2C器件地址,寻址写*/ #define RDDADDS 0xa1 /*宏定义I2C器件地址,寻址读*/ ***it SDA = P2^0; /*数据线*/ ***it SCL = P2^1; /*时钟线*/ void Write(uchar address,uchar date); /*向24c02的地址address中,写入一字节数据date*/ uchar Read(uchar address); /*从24c02的地址address中,读取一个字节数据(返回值)*/ void wr_byte(uchar date); /*I2C总线写一个字节(有参数)*/ uchar rd_byte(); /*I2C总线读一个字节(返回值)*/ void start(); /*启动I2C总线*/ void stop(); /*停止I2C总线*/ bit respons(); /*I2C总线应答信号检查*/ void delay(); /*延时微秒*/ void delayms(uint xms); /*延时毫秒*/ /*向24c02的地址address中,写入一字节数据date*/ void Write(uchar address,uchar date) { start(); //启动信号 wr_byte(WRDADDS); //I2C器件地址,寻址写 respons(); //应答信号 wr_byte(address); //选择单元地址 respons(); //应答信号 wr_byte(date); //写数据 respons(); //应答信号 stop(); //停止信号 } /*从24c02的地址address中读取一个字节数据*/ uchar Read(uchar address) { uchar temp; start(); //开始信号 wr_byte(WRDADDS); //I2C器件地址,寻址写 respons(); //应答信号 wr_byte(address); //选择单元地址 信号 respons(); //应答信号 start(); //重发启动信号 wr_byte(RDDADDS); //I2C器件地址,寻址读 respons(); //应答信号 temp = rd_byte(); //读数据(函数返回值)点亮流水灯 stop(); //停止信号 return temp; } /*启动I2C总线*/ void start() { SDA=1; delay(); SCL=1; delay(); SDA=0; delay(); SCL=0; delay(); } /*停止I2C总线*/ void stop() { SDA=0; delay(); SCL=1; delay(); SDA=1; delay(); } /*I2C总线应答信号检查*/ bit respons() { bit temp=0; SDA=1; delay(); SCL=1; delay(); temp = SDA; SCL=0; delay(); return temp; } /*I2C总线写一个字节*/ void wr_byte(uchar date) { uchar i; for(i=0;i<8;i++) { date=date<<1; SDA=CY; delay(); SCL=1; delay(); SCL=0; delay(); } } /*I2C总线读一个字节*/ uchar rd_byte() { uchar i,temp; for(i=0;i<8;i++) { SCL=1; delay(); temp=(temp<<1)|SDA; delay(); SCL=0; delay(); } return temp; } /*NOP延时函数*/ void delay() { _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); } /*延时函数*/ void delayms(uint xms) { uint i,j; for(i=0;i for(j=0;j<110;j++); }
|