📄 i2c.c
字号:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#include<LCD_1602.h>
sbit sda=P3^5;
sbit sck=P3^4;
void sda_0() {sda=0;;;;;;}
void sda_1() {sda=1;;;;;;}
void sck_0() {sck=0;;;;;;}
void sck_1() {sck=1;;;;;;}
void delay(uint z) //延时子程序
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void initial() //初始化子程序
{
sda_1();
sck_1();
}
void start() //开始子程序
{
sda_1();
sck_1();
sda_0();
sck_0(); //钳住I2C总线准备发送数据
}
void stop() //停止子程序
{
sda_0();
sck_1();
sda_1();
}
void response() //判断是否收到对方的响应信号,
{ //没有收到则在规定时间内默认对方收到数据
uchar i=0;
sck_1();
while((sda==1)&&(i<250))i++;
sck_0(); //钳住I2C总线
}
void ack(bit byte)
{
if(byte==0) sda_0();
else sda_1();
sck_1(); //使数据有效
sck_0(); //钳住I2C总线
}
void send_byte(uchar data1) //写数据子程序
{
uchar i;
for(i=0;i<8;i++)
{
data1=data1<<1;
sck_0(); //时钟线为低电平时,数据线才能改变
sda=CY; {;;;;;;;;;;} //注意不同晶振频率的延时长短
sck_1(); //时钟线为高电平时,数据必须稳定
}
sck_0();
sda_1(); //释放数据线
response();//等待对方响应
}
uchar read_byte() //读数据子程序
{
uchar i,temp=0;
sck_0();
sda_1(); //使数据线为输入方式
for(i=0;i<8;i++)
{
sck_1(); //使时钟线为高电平,数据有效
temp=(temp<<1)|sda; {;;;;;} //注意不同晶振频率的延时长短
sck_0(); //钳住I2C总线
}
return temp;
}
void write_address(uchar sla,uchar data1)
{
start();
send_byte(sla); //i2c地址
send_byte(data1); //数据
stop();
}
void sendstring(uchar sla,uchar suad,uchar *p,uchar num)
{
uchar i;
start();
send_byte(sla); //器件地址
send_byte(suad); //器件子地址
for(i=0;i<num;i++,p++)
{
send_byte(*p); //发送数据
delay(1);
}
stop();
}
uchar read_address(uchar sla)
{ //向24C02任意地址读任意数据子程序
uchar data1;
start();
send_byte(sla); //先发送地址+写方向
start(); //接着又开始
send_byte(sla+1); //改变方向
data1=read_byte();
ack(1); //发送非应答信号
stop(); //结束
return data1;
}
void readstring(uchar sla,uchar suad,uchar *s,uchar num)
{
uchar i,table[32];
table[0]=*s;
start();
send_byte(sla); //先发送地址+写方向
send_byte(suad); //读24C02哪一地址的数据
start(); //接着又开始
send_byte(sla+1); //改变方向
for(i=0;i<num-1;i++)
{
// *s=read_byte(); //为什么指针最多加12就自动结束?
table[i]=read_byte();
ack(0); //发送应答信号
// s++;
delay(1);
}
*s=read_byte();
ack(1); //发送应非答信号
stop(); //结束
}
void main()
{
uchar temp,sla,suad,i,num,data1,*p;
uchar code team[32]={0x00,0x10,0x20,0x30,0x40,0x50,0x60,0x70,
0x80,0x90,0xa0,0xb0,0xc0,0xd0,0xe0,0xf0,
0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f};
initial();
initial_1602();
sla=0x40;data1=0x64;
write_address(sla,data1); //向无子地址器件发送数据
delay(100); //需要延时一段时间
sla=0x40;
temp=read_address(sla); //向无子地址器件读取数据
display_1602(1,2,0,temp);
delay(100); //需要延时一段时间
sla=0xa0;suad=0x00;p=team; num=32;
sendstring(sla,suad,p,num); //向有子地址器件发送多字节数据
delay(100); //需要延时一段时间
sla=0xa0;suad=0x90;p=&temp;num=32;
readstring(sla,suad,p,num); //向有子地址器件读取多字节数据
p=&temp;
display_1602(0,1,9,'H');
for(i=0;i<32;i++,p++)
{
display_HEX1602(1,1,7,*p); //显示16进制数
delay(500);
}
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -