51单片机完整的IIC读取和发送C语言程序
时间: 2023-03-23 19:00:40 浏览: 139
51的IIC程序
以下是51单片机完整的IIC读取和发送C语言程序的示例代码:
```c
#include <reg52.h>
sbit SDA = P2^0; //定义SDA数据线引脚
sbit SCL = P2^1; //定义SCL时钟线引脚
void delay()
{
int i = 1000;
while(i--);
}
void IIC_Start()
{
SDA = 1;
SCL = 1;
delay();
SDA = 0;
delay();
SCL = 0;
}
void IIC_Stop()
{
SDA = 0;
SCL = 1;
delay();
SDA = 1;
delay();
}
void IIC_Ack()
{
SDA = 0;
delay();
SCL = 1;
delay();
SCL = 0;
delay();
SDA = 1;
}
void IIC_NAck()
{
SDA = 1;
delay();
SCL = 1;
delay();
SCL = 0;
delay();
}
unsigned char IIC_WriteByte(unsigned char dat)
{
unsigned char i;
for(i=0; i<8; i++)
{
SDA = dat & 0x80;
delay();
SCL = 1;
delay();
SCL = 0;
dat <<= 1;
}
delay();
SDA = 1;
delay();
SCL = 1;
delay();
i = SDA;
SCL = 0;
return i;
}
unsigned char IIC_ReadByte()
{
unsigned char i;
unsigned char dat = 0;
SDA = 1;
for(i=0; i<8; i++)
{
SCL = 1;
delay();
dat <<= 1;
dat |= SDA;
SCL = 0;
delay();
}
return dat;
}
void IIC_Init()
{
SDA = 1;
SCL = 1;
delay();
}
void main()
{
unsigned char dat;
IIC_Init();
IIC_Start();
IIC_WriteByte(0xA0);
IIC_Ack();
IIC_WriteByte(0x00);
IIC_Ack();
IIC_Stop();
IIC_Start();
IIC_WriteByte(0xA1);
IIC_Ack();
dat = IIC_ReadByte();
IIC_NAck();
IIC_Stop();
while(1);
}
```
这段代码实现了51单片机通过IIC总线读取和发送数据的功能。其中,IIC_Start()函数用于产生起始信号,IIC_Stop()函数用于产生停止信号,IIC_Ack()和IIC_NAck()函数分别用于产生应答和非应答信号,IIC_WriteByte()和IIC_ReadByte()函数分别用于发送和接收一个字节的数据。在main函数中,我们首先初始化IIC总线,然后发送一个写命令,接着发送一个要写入的地址,再停止总线,接着再发送一个读命令,最后接收一个字节的数据。
阅读全文