51单片机实验代码,c语言,IIC 通讯,实现了对 24c02 的 32 个字节数据写入,后读出并点亮 LED 灯, 写入方式:字节写入
时间: 2023-12-06 17:02:17 浏览: 71
好的,下面是一个示例代码,可以供您参考:
```c
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit SDA = P2^0; // SDA引脚
sbit SCL = P2^1; // SCL引脚
sbit LED = P1^0; // LED引脚
void Delay1ms(uint xms) // 延时函数
{
uint i, j;
for (i = xms; i > 0; i--)
{
for (j = 110; j > 0; j--);
}
}
void IIC_Start() // IIC起始信号
{
SDA = 1;
SCL = 1;
Delay1ms(1);
SDA = 0;
Delay1ms(1);
SCL = 0;
}
void IIC_Stop() // IIC停止信号
{
SDA = 0;
SCL = 1;
Delay1ms(1);
SDA = 1;
Delay1ms(1);
}
void IIC_Ack() // IIC发送应答信号
{
SDA = 0;
SCL = 1;
Delay1ms(1);
SCL = 0;
}
void IIC_Nack() // IIC发送非应答信号
{
SDA = 1;
SCL = 1;
Delay1ms(1);
SCL = 0;
}
void IIC_SendByte(uchar dat) // IIC发送一个字节
{
uchar i;
for (i = 0; i < 8; i++)
{
SDA = (dat & 0x80) >> 7;
dat <<= 1;
SCL = 1;
Delay1ms(1);
SCL = 0;
Delay1ms(1);
}
SDA = 1;
SCL = 1;
Delay1ms(1);
SCL = 0;
}
uchar IIC_ReadByte() // IIC读取一个字节
{
uchar i, dat = 0;
SDA = 1;
for (i = 0; i < 8; i++)
{
dat <<= 1;
SCL = 1;
Delay1ms(1);
dat |= SDA;
SCL = 0;
Delay1ms(1);
}
return dat;
}
void IIC_Write(uchar addr, uchar dat) // IIC写入一个字节
{
IIC_Start();
IIC_SendByte(0xA0);
IIC_SendByte(addr);
IIC_SendByte(dat);
IIC_Stop();
Delay1ms(5);
}
uchar IIC_Read(uchar addr) // IIC读取一个字节
{
uchar dat;
IIC_Start();
IIC_SendByte(0xA0);
IIC_SendByte(addr);
IIC_Start();
IIC_SendByte(0xA1);
dat = IIC_ReadByte();
IIC_Nack();
IIC_Stop();
Delay1ms(5);
return dat;
}
void main()
{
uchar i, dat;
for (i = 0; i < 32; i++) // 写入32个字节
{
IIC_Write(i, i+1); // 写入数据
}
for (i = 0; i < 32; i++) // 读取32个字节并点亮LED
{
dat = IIC_Read(i); // 读取数据
if (dat % 2 == 0) // 判断奇偶性
{
LED = 1;
}
else
{
LED = 0;
}
Delay1ms(500); // 延时0.5秒
}
}
```
在这个代码中,首先定义了SDA、SCL、LED三个引脚的控制,以及延时函数Delay1ms()。然后,实现了IIC总线的起始信号、停止信号、发送应答信号、发送非应答信号、发送一个字节、读取一个字节、写入一个字节、读取一个字节的函数。在主函数中,先使用循环写入32个字节数据,然后使用循环读取32个字节数据,并根据读取到的数据判断奇偶性,从而点亮或熄灭LED。
希望这个代码可以帮助您实现您的需求,如果您还有其他问题,可以随时提问哦!
阅读全文