1、AT24C02 读写驱动(C51) 作者:yeyu 日期:2007-06-21字体大小: 小 中 大/* 功 能: AT24C02 读写实验。* 硬件条件:1.CPU 型号:AT89S52* 2.晶振:12.0000MHz* 3.用跳线帽短接 SCL_P3.6* 4.用跳线帽短接 SDA_P3.7* 5.用跳线帽短接 BEEP_P1.3* 作 者: POWER* 日 期: 2006 年 12 月 12 号* 斯凯科技主页:* 斯凯科技论坛: “reg52.h“ / 包含头文件 /* 与编译器无关的数据类型定义 */*/typedef unsigned char uint8; / 无符号 8 位
2、整型变量typedef signed char int8; / 有符号 8 位整型变量typedef unsigned short uint16; / 无符号 16 位整型变量typedef signed short int16; / 有符号 16 位整型变量typedef unsigned int uint32; / 无符号 32 位整型变量typedef signed int int32; / 有符号 32 位整型变量typedef float fp32; / 单精度浮点数(32 位长度)typedef double fp64; / 双精度浮点数(64 位长度)/*/sbit P1_3 =
3、 P1 3; / 定义位变量#define BEEP_ON() (P1_3=0) / 定义“BEEP_ON()“为 P1.3 输出低电平,控制蜂鸣器蜂鸣#define BEEP_OFF() (P1_3=1) / 定义“BEEP_OFF()“为 P1.3 输出高电平,控制蜂鸣器不蜂鸣/* 定义器件在 I2C 总线中的地址 */#define AT24C02_WriteDeviceAddress 0xa0#define AT24C02_ReadDeviceAddress 0xa1/* 定义位变量 */sbit SCL=P36; / I2C 总线的时钟信号sbit SDA=P37; / I2C 总线
4、的数据信号#define TRUE 1#define FALSE 0#define I2C_DelayTime 60 / 不要小于 50,否则可能造成时序混乱/* 函数名称:Delay()* 功 能:软件延时* 入口参数:count 延时参数,值越大,延时越长* 出口参数:无*/void Delay(uint16 count)uint8 i; while(-count != 0) for(i = 0; i 125; i+); / “;“ 表示空语句,CPU 空转。 / i 从 0 加到 125,在 12M 晶体下 CPU大概耗时 1 毫秒/* 函数名称:I2C_Delay()* 功 能: I2
5、C 总线软件延时* 入口参数:count 延时参数,值越大,延时越长* 出口参数:无*/void I2C_Delay(uint16 count)while(count!=0) count-;/* 函数名称:I2C_Start()* 功 能:启动 I2C 总线* 入口参数:无* 出口参数:无*/void I2C_Start(void)SDA=1; SCL=1; I2C_Delay(I2C_DelayTime);SDA=0; I2C_Delay(I2C_DelayTime);SCL=0;I2C_Delay(I2C_DelayTime);/* 函数名称:I2C_Stop()* 功 能:终止 I2C
6、总线* 入口参数:无* 出口参数:无*/void I2C_Stop(void)SDA=0;SCL=1;I2C_Delay(I2C_DelayTime);SDA=1;I2C_Delay(I2C_DelayTime);SCL=0;I2C_Delay(I2C_DelayTime);/* 函数名称:I2C_Send_Bit_0()* 功 能:发送比特 0* 入口参数:无* 出口参数:无*/void I2C_Send_Bit_0(void)SDA=0;SCL=1;I2C_Delay(I2C_DelayTime);SCL=0;I2C_Delay(I2C_DelayTime);/* 函数名称:I2C_Sen
7、d_Bit_1()* 功 能:发送比特 1* 入口参数:无* 出口参数:无*/void I2C_Send_Bit_1(void)SDA=1;SCL=1;I2C_Delay(I2C_DelayTime);SCL=0;I2C_Delay(I2C_DelayTime);/* 函数名称:I2C_Check_Ack()* 功 能:发送完一个字节后检验设备的应答信号* 入口参数:无* 出口参数:返回值为 True,成功* 返回值为 False,失败*/bit I2C_Check_Ack(void)SDA=1;SCL=1;I2C_Delay(I2C_DelayTime/2);F0=SDA;I2C_Delay
8、(I2C_DelayTime/2);SCL=0;I2C_Delay(I2C_DelayTime);if(F0=1) return FALSE;return TRUE;/* 函数名称:I2C_Write8Bit()* 功 能:向 I2C 总线写入 8bit 数据* 入口参数:I2C_data 将要写入 I2C 总线的 8bit 数据 * 出口参数:无*/void I2C_Write8Bit(uint8 I2C_data)reentrantuint8 i;for(i=0;i8;i+)if(I2C_datai)elseI2C_Send_Bit_0();/* 函数名称:I2C_Read8Bit()*
9、功 能:从 I2C 总线接收 8bit 数据* 入口参数:无* 出口参数:返回值为从 I2C 总线上接收到的 8bit 数据*/uint8 I2C_Read8Bit(void)reentrantuint8 I2C_data=0,i;for(i=0;i8;i+)SDA=1; SCL=1; I2C_Delay(10);F0=SDA;I2C_Delay(10);SCL=0;if(F0=1)I2C_data=I2C_data1;I2C_data=I2C_data|0x01;elseI2C_data=I2C_data1;return I2C_data;/* 函数名称:AT24C02_Write1Byte
10、()* 功 能:向 AT24C02 指定地址上写入 1 字节数据* 入口参数:AT24C02_Address AT24C02 内的地址* AT24C02_1Byte 将要写入 AT24C02 的 1 字节数据* 出口参数:无*/void AT24C02_Write1Byte(uint8 AT24C02_Address,uint8 AT24C02_1Byte)bit AckTemp=1;I2C_Start();I2C_Write8Bit(AT24C02_WriteDeviceAddress);AckTemp=I2C_Check_Ack();I2C_Write8Bit(AT24C02_Addres
11、s); AckTemp=I2C_Check_Ack();I2C_Write8Bit(AT24C02_1Byte); AckTemp=I2C_Check_Ack();I2C_Stop();/* 函数名称:AT24C02_Read1Byte()* 功 能:从 AT24C02 指定地址上读出 1 字节数据* 入口参数:AT24C02_Address AT24C02 内的地址* 出口参数:从 AT24C02 指定地址上读出的 1 字节数据*/uint8 AT24C02_Read1Byte(uint8 AT24C02_Address) bit AckTemp=1;uint8 AT24C02_1Byte;
12、I2C_Start();I2C_Write8Bit(AT24C02_WriteDeviceAddress);AckTemp=I2C_Check_Ack();I2C_Write8Bit(AT24C02_Address);AckTemp=I2C_Check_Ack();I2C_Start();I2C_Write8Bit(AT24C02_ReadDeviceAddress);AckTemp=I2C_Check_Ack();AT24C02_1Byte=I2C_Read8Bit();AckTemp=I2C_Check_Ack();I2C_Stop();return AT24C02_1Byte;/* 函数
13、名称:main()* 功 能:写一字节数据 0xaa 到 AT24C02 的地址 0x02 并读回校验,若校验通过,则蜂鸣器响一声;否则,* 蜂鸣器连续报警。*/ void main (void) BEEP_OFF(); / 蜂鸣器不蜂鸣AT24C02_Write1Byte(0x02,0xaa); / 向 AT24C02 的地址 0x02 写入 0xaaif(AT24C02_Read1Byte(0x02)=0xaa) / 从 AT24C02的地址 0x02 读出数据,判断是否等于 0xaa / 若相等,则蜂鸣器响一声 BEEP_ON(); Delay(300);BEEP_OFF();else / 若不相等,则蜂鸣器连续报警while(1)BEEP_ON();Delay(100);BEEP_OFF();Delay(100);while(1);