I2C总线存储器读写实验:单片机通过I2C总线向24C02存储器写入设定数据(如AAH),然后读出该数据并在8个LED灯上显示,用一个按键控制此过程。 具体过程为:单片机上电复位后,8个LED灯全亮,按动“单脉冲开关”后,单片机通过I2C总线向24C02存储器写入设定的1个字节数据(如55H),然后读出该数据并在8个LED灯上显示,显示结果保持一段时间后(如2秒,可用延时程序实现),再回到8个LED灯全亮的状态。再次按动“单脉冲开关”后,重复上述过程。注:写入数据后注意加入1ms以上的延时按如下方式接线:EA 接 +5VP2.7 --- P2.0 接 L7 --- L0,驱动8个LED灯P3.2接 单脉冲开关24C02芯片的SCL接 P1.424C02芯片的SDA接 P1.5
时间: 2023-06-17 16:02:18 浏览: 76
这个实验需要连接单片机、24C02存储器、8个LED灯和一个单脉冲开关。接线如下:
- EA引脚连接到+5V,表示使用内部ROM;
- P2.0引脚连接到24C02的SCL引脚,表示I2C总线的时钟线;
- L7~L0引脚连接到8个LED灯的阳极;
- P3.2引脚连接到8个LED灯的阴极;
- 24C02的SDA引脚连接到单片机的P1.5引脚,表示I2C总线的数据线;
- 24C02的SCL引脚连接到单片机的P1.4引脚,表示I2C总线的时钟线;
- 单脉冲开关的一端连接到单片机的任意一个GPIO引脚(如P0.0),另一端连接到GND。
具体的程序实现可以参考以下代码:
```c
#include <reg51.h>
#define I2C_SCL P2_0
#define I2C_SDA P1_5
#define LED_PORT P2
#define LED_ON 0
#define LED_OFF 1
#define KEY P0_0
void delay(unsigned int t) {
while (t--) {
/* 空循环 */
}
}
void i2c_start() {
I2C_SDA = 1;
I2C_SCL = 1;
delay(1);
I2C_SDA = 0;
delay(1);
I2C_SCL = 0;
}
void i2c_stop() {
I2C_SDA = 0;
I2C_SCL = 1;
delay(1);
I2C_SDA = 1;
delay(1);
}
bit i2c_write_byte(unsigned char dat) {
unsigned char i, ack;
for (i = 0; i < 8; i++) {
if (dat & 0x80) {
I2C_SDA = 1;
} else {
I2C_SDA = 0;
}
dat <<= 1;
I2C_SCL = 1;
delay(1);
I2C_SCL = 0;
}
I2C_SDA = 1;
I2C_SCL = 1;
delay(1);
ack = I2C_SDA;
I2C_SCL = 0;
return ack;
}
unsigned char i2c_read_byte() {
unsigned char i, dat;
I2C_SDA = 1;
for (i = 0; i < 8; i++) {
dat <<= 1;
I2C_SCL = 1;
delay(1);
if (I2C_SDA) {
dat |= 0x01;
}
I2C_SCL = 0;
}
return dat;
}
void led_init() {
LED_PORT = 0xFF;
}
void led_display(unsigned char dat) {
LED_PORT = ~(dat & 0xFF);
}
void main() {
unsigned char buf;
led_init();
while (1) {
while (KEY); /* 等待按键按下 */
delay(1000); /* 消抖延时 */
i2c_start();
i2c_write_byte(0xA0); /* 发送写器件地址 */
i2c_write_byte(0x00); /* 发送写地址 */
i2c_write_byte(0x55); /* 发送数据 */
i2c_stop();
delay(10); /* 等待写操作完成 */
i2c_start();
i2c_write_byte(0xA0); /* 发送写器件地址 */
i2c_write_byte(0x00); /* 发送读地址 */
i2c_start();
i2c_write_byte(0xA1); /* 发送读器件地址 */
buf = i2c_read_byte(); /* 读取数据 */
i2c_stop();
led_display(buf); /* 在LED上显示数据 */
delay(2000); /* 延时2秒 */
led_display(0xFF); /* 关闭LED */
}
}
```
程序中的i2c_start、i2c_stop、i2c_write_byte、i2c_read_byte函数是I2C总线的基本操作函数,用于发送起始位、停止位、写数据、读数据等操作。led_init、led_display函数是LED灯的初始化和显示函数,用于控制LED灯亮灭。main函数中的while循环用于不断读取按键状态,当按键按下时执行I2C读写操作,并在LED上显示数据。
阅读全文