本文主要是给I2C代码及自己做出来的视频给大家看;主要用AT24C02来检测是否能用;
下面是我写i2c显示的代码,我建了个头文件,方便具有i2c通信设备的使用,我现在做的mpu6050;也是直接调用这个程序就可以用了;
at24c连接图片那里是接了P2^0,1,自己改一下就好
at24c连接图片
单片机源码:
#ifndef __I2C_H__//头文件格式 #define __I2C_H__ #define uchar unsigned char #define uint unsigned int sbit sda=P2^2; sbit scl=P2^3; /*延时约5us函数*/ void delay() {;;} /*I2C1启动信号函数*/ void I2Cstart() { sda=1; delay(); scl=1; delay(); sda=0; delay(); } /*I2C停止信号函数*/ void I2Cstop() { sda=0; delay(); scl=1; delay(); sda=1; delay(); } /*I2C应答信号函数*/ void I2Crespons() { uchar i; scl=1; delay(); while((sda==1)&&(i<250)) //加个延时退出,防止没应答进入死循环 i++; scl=0; delay(); } /*I2C初始化信号函数*/ void I2Cinit() { sda=1; delay(); scl=1; delay(); } /*I2C向从机写一个字节信号函数*/ void I2Cwrite_byte(uchar date) { uchar i,temp; temp=date; for(i=0;i<8;i++) { temp=temp<<1; scl=0; delay(); sda=CY; //CY是进位标志 delay(); scl=1; delay(); } scl=0; delay(); sda=1; delay(); } /*I2C向从机读一个字节信号函数*/ uchar I2Cread_byte() { uchar i,k; scl=0; delay(); sda=1; delay(); for(i=0;i<8;i++) { scl=1; delay(); k=(k<<1)|sda; scl=0; delay(); } return k; } /*I2C向某个从机的某个地址写一个字节数据信号函数*/ void I2Cwrite_add(uchar salveaddress,uchar address,uchar date) { I2Cstart(); I2Cwrite_byte(salveaddress); //发送设备地址+写信号 I2Crespons(); I2Cwrite_byte(address); //发送存储单元地址 I2Crespons(); I2Cwrite_byte(date); //发送数据 I2Crespons(); I2Cstop(); } /*I2C向某个从机的某个地址读一个字节数据信号函数*/ uchar I2Cread_add(uchar salveaddress,uchar address) { uchar date; I2Cstart(); I2Cwrite_byte(salveaddress); //发送设备地址+写信号 I2Crespons(); I2Cwrite_byte(address); //发送存储单元地址 I2Crespons(); I2Cstart(); I2Cwrite_byte(salveaddress+1); //发送设备地址+读信号 I2Crespons(); date=I2Cread_byte(); //读取数据 I2Cstop(); return date; } #endif
全部资料51hei下载地址:
i2c头文件及用at24c02测试I2C通信.zip
(945.78 KB, 下载次数: 44)
|