通过仿真实现对存储器AT24C04读写操作,通过数码管或LED灯状态来显示
原理图
实验结果图
实验部分代码结构:
//24C04.c
- //-----------------------------------------------------------------
- // 名称: AT24C04读/写驱动程序
- //-----------------------------------------------------------------
- #define INT8U unsigned char
- #define INT16U unsigned int
- #include <reg51.h>
- #include <intrins.h>
- #include <stdio.h>
- #include <stdlib.h>
- sbit SCL = P1^0; //串行时钟线
- sbit SDA = P1^1; //串行数据线
- #include "I2C.h" //IIC总线通用宏及函数
- //-----------------------------------------------------------------
- //AT24C04所调用的外部相关函数
- extern void Show_HEX(INT8U dat); //16进制格式显示字节
- extern void PutStr(INT8U *s); //串口输出字符串
- extern void delay_ms(INT16U); //延时函数
- extern INT16U r; //换行控制变量
- //-----------------------------------------------------------------
- // 向任意指定的地址写入一字节数据
- // 器件地址码字节格式 (其中E2,E1为片选位,A8为块地址位)
- // 位: B7 B6 B5 B4 B3 B2 B1 B0
- // 值: 1 0 1 0 E2 E1 A8 RW
- //-----------------------------------------------------------------
- void Random_Write(INT8U Dev_Addr,INT16U mem_addr,INT8U dat)
- {
- }
- //-----------------------------------------------------------------
- // 从任意地址读取一字节数据
- //-----------------------------------------------------------------
- INT8U Random_Read(INT8U Dev_Addr,INT16U mem_addr)
- {
- }
- //-----------------------------------------------------------------
- // 从指定地址开始连续顺序读取N节数据
- //-----------------------------------------------------------------
- void Sequential_Read(INT8U Dev_Addr,INT16U mem_addr,INT16U N)
- {
- }
复制代码 //IC.h
- //-----------------------------------------------------------------
- // 名称: IIC总线通用宏及函数
- //-----------------------------------------------------------------
- #define NOP4() { _nop_();_nop_();_nop_();_nop_(); }
- //总线启动 -------------------------------------------------------
- #define IIC_Start() \
- { SDA = 1; NOP4(); SCL = 1; NOP4(); SDA = 0; NOP4(); SCL = 0; }
- //总线停止 -------------------------------------------------------
- #define IIC_Stop() \
- { SDA = 0; NOP4(); SCL = 1; NOP4(); SDA = 1; NOP4(); }
- //-----------------------------------------------------------------
- //以下3个有关应答的宏定义均生成第9个时钟脉冲,读取应答或发送应答/非应答
- //1.主机读从机应答 -----------------------------------------------
- //(SDA = 1设为输入,准备读取应答位,要使用该位作出处理时引用F0)
- #define IIC_Rd_Ack() \
- { SDA = 1; NOP4(); SCL = 1; NOP4(); F0 = !SDA; NOP4(); SCL = 0; }
- //2.主机发送应答位 -----------------------------------------------
- #define IIC_Ack() \
- { SDA = 0; NOP4(); SCL = 1; NOP4(); SCL = 0; NOP4(); SDA = 1; }
- //3.主机发送非应答位 -------------------------------------------
- #define IIC_NAck() \
- { SDA = 1; NOP4(); SCL = 1; NOP4(); SCL = 0; NOP4(); SDA = 0; }
- //-----------------------------------------------------------------
- // 主机向IIC总线写一字节
- //-----------------------------------------------------------------
- bit IIC_WriteByte(INT8U dat)
- {
- }
- //-----------------------------------------------------------------
- // 主机从IIC总线读一字节
- //-----------------------------------------------------------------
- INT8U IIC_ReadByte()
- {
- }
复制代码 主程序main.c
- //-----------------------------------------------------------------
- // 名称: I2C接口存储器AT24C04读写与显示(4片)
- //-----------------------------------------------------------------
- // 说明: 按下K1-K4按键时,前两个分别向第1,2片AT24C04中写入400个随机字节
- // 后2个按键分别写第3,4片AT24C04,先写入200个0x01,再写入200个0x02
- // 写入后接着读取并显示.(400个字节的地址范围: 0x0000~0x018F)
- //
- //-----------------------------------------------------------------
- #define INT8U unsigned char
- #define INT16U unsigned int
- #include <reg51.h>
- #include <intrins.h>
- #include <stdio.h>
- #include <stdlib.h>
- sbit K1 = P3^3; //四个操作按键定义
- sbit K2 = P3^4;
- sbit K3 = P3^5;
- sbit K4 = P3^6;
- INT16U r = 0; //满20个字节换行控制变量
- //AT24C04相关函数
- extern void Random_Write(INT8U Dev_Addr,INT16U mem_addr,INT8U dat);
- extern INT8U Random_Read(INT8U Dev_Addr,INT16U mem_addr);
- extern void Sequential_Read(INT8U Dev_Addr,INT16U mem_addr,INT16U N);
- //-----------------------------------------------------------------
- // 延时函数
- //-----------------------------------------------------------------
- void delay_ms(INT16U x) {INT8U t; while(x--) for(t = 0; t<120; t++);}
- //-----------------------------------------------------------------
- // 向串口发送1字节
- //-----------------------------------------------------------------
- void PutChar(INT8U c) { SBUF = c; while( TI == 0 ); TI = 0;}
- //-----------------------------------------------------------------
- // 向串口发送字符串
- //-----------------------------------------------------------------
- void PutStr(INT8U *s) { while(*s) PutChar(*s++); }
- //-----------------------------------------------------------------
- // sprintf对%2X格式支持不稳定,编译时有时可以输出正确结果,有时则不正常
- // sprintf(s,"%02X ",(INT8U)Random_Read(0xA0,i)); PutStr(s);
- // 故改用下面的函数实现十六进制形式显示所读取的字节
- //-----------------------------------------------------------------
- void Show_HEX(INT8U dat)
- {
- }
- //-----------------------------------------------------------------
- // 主程序
- //-----------------------------------------------------------------
- void main()
- {
- INT16U i; char s[] = "NO.X\r\n";
- INT8U n = 0, ChipNo = 0;
- //串口配置
- SCON = 0x40; TMOD = 0x20; PCON = 0;
- TH1 = 0xFD; TL0 = 0xFD;
- TI = 0; TR1 = 1;
- srand(30); //随机种子
- PutStr("\r\n>>> Press K1~K4, Write/Read No.1~4 AT24C04...\r\n ");
- while(1)
- { if ((P3 & 0xF0) != 0xF0) //P3端口高4位按键状态检测
- {
- } else { delay_ms(10); continue; }
- PutStr("\r\n\r\n>>> Write IIC, Waiting.........\r\n\r\n ");
- //提示当前读取的AT24C04芯片号1~4(由0~3加1得到)
- s[3] = ChipNo + '1'; PutStr(s);
- switch (ChipNo)
- { case 0: case 1: //K1,K2分别向第1,2片写入400个随机字节
- case 2: case 3: //K3,K4分别写第3,4片,写入200个0x01,0x02
- }
- PutStr("\r\n\r\n>>> Reading From IIC...........\r\n\r\n");
- r = 0; //满20个字节换行显示控制变量归0
- //从指定的AT24C04中读取400字节并发送串口显示,下面两种读取方法中,
- //随机寻址单字节读取共400字节将明显慢于顺序连续读取400字节
- }
- }
复制代码 完整代码
IC.zip
(2.71 KB, 下载次数: 110)
|