基于51单片机的24C64驱动程序

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
函数名: void at24c64_rd(void *dat, uint address, uint cont) 说明: 读数据操作(主机读到数据存放指针, 读数据首地址, 读数据个数) ** 对 24c64 进行连续读操作时候地址指针在整个数据内(8K 字节内)自加 /*?????????????????在使用 32k 以下存储器时候只发送一次地 址???????????????????????????????????*/ /*************************************************************************** *****************/ void at24c64_rd(void *dat, uint address, uint cont);
return ACK; }
/*************************************************************************** ****************
函数名: uchar i2c_rcvbyte(uchar ack_chack) 说明: 接收数据 ack_chack= 1: 发送应答信号, 0: 不发送应答信号
uchar i = 10; while (i--); } /*************************************************************************** **************** 延时 5us **************************************************************************** *****************/ void delay_5us() { uchar i = 5; while(i--); } /*************************************************************************** **************** 延时 10ms
/* 拉低时钟线以备用 */
byt <<= 1; } delay_5us(); /* 在第 9 个周期响应 ACK,读 24c64 发送出的应答信号 ACK 拉 SDA */ I2C_SDA = 1; delay_5us();
I2C_SCL = 1; delay_5us(); ACK = I2C_SDA; /* 读应答信号 */ I2C_SCL = 0;
/* 函数声明 */
/*************************************************************************** ****************
函数名: void at24C64_wr(void *dat, uint address, uint cont) 说明: 发送数据: (数据指针, 存放数据首地址, 数据个数)
#endif
/************************24c64.c******************************************** **************************
作者: 李雪川 时间: 2009-7-30 说明: 24c64 存储芯片使用,I2C 通讯协议 版本: V1 注意: **************************************************************************** *****************/
基于 51 单片机的 24C64 驱动程序 2010-04-01 11:34/************************************************************************** ************************
** 文 件 名:Compile.h ** 作 者: 李雪川 版本: v01 编写日期: 2009-7-24 完成日期: 2009-7-24 ** 功能描述: 编译类型关键词定义 ** 修改时间:2010-4-1 **************************************************************************** *************************/ #ifndef _COMPILE_ #define _COMPILE_H
/* 24C64.C */
#include"24c64.h"
bit ACK = 1; /* 应答标志 */
/*************************************************************************** ****************
延时 10us **************************************************************************** *****************/ void delay_10us() {
uchar i, temp = 0;
delay_5us(); I2C_SDA = 1;
/* 确保延时 */ /* 读数据时候先拉高 SDA 电平 */
for (i = 0; i < 8; i++) {
uchar i;
for (i = 0; i < 8; i++) {
delay_5us(); /* 确保延时 */ if (byt & 0x80) {
I2C_SDA = 1; } else {
I2C_SDA = 0; }
delay_5us(); I2C_SCL = 1; delay_5us(); I2C_SCL = 0;
/*************************************************************************** ****************
函数名: void i2c_stop() 说明: I2C 停止信号 **************************************************************************** ****************/
#define uchar unsigned char #define uint unsigned short int
#define uint8 unsigned char #define uint16 unsigned long int
#define BYTE unsigned char #define UINT8 unsigned char #define UINT16 unsigned long int
**************************************************************************** *****************/
void delay_10ms() {
uchar i = 100, j = 124; while (i--) {
函数名: bit i2c_sentbyte(uchar byt) 说明: 发送数据,还回 1: 发送成功 0;发送失败 **************************************************************************** *****源自文库**********/ bit i2c_sentbyte(uchar byt) {
/*************************************************************************** *****************/
void at24c64_wr(void *dat, uint address, uint cont);
/*************************************************************************** ****************
** 对 24c64 写操作时候地址指针子在单页内自加 24c64 共有 8K 空间,256 页,每页 32 个地址,每次最多可连续对也写入 32 个数据
/*?????????????????在使用 32k 以下存储器时候只发送一次地 址???????????????????????????????????*/
作者: 李雪川 时间: 2009-7-30 说明: 24c64 存储芯片使用,I2C 通讯协议 版本: V1 注意: **************************************************************************** *****************/
#define int8 char #define int16 long int
#define INT8 char #define INT16 long int
#endif
/***************************24c64.h***************************************** **************************
delay_10us(); I2C_SCL = 1; delay_10us(); I2C_SDA = 1; delay_10us(); if (I2C_SCL & I2C_SDA) /* 确保为高电平 */ {
I2C_SDA = 0; /* 启动 I2C 总线 */ delay_10us(); I2C_SCL = 0; /* 拉低时钟线以备用 */ delay_10us(); return 1; } else { return 0; } }
void i2c_stop() {
delay_10us(); I2C_SDA = 0; delay_10us(); I2C_SCL = 1; delay_10us(); I2C_SDA = 1; }
/*************************************************************************** ****************
for (j = 124; j > 0; j--); } }
/*************************************************************************** ****************
函数名: bit i2c_start() 说明: 启动成功返回 1, 启动失败还回 0 **************************************************************************** ****************/ bit i2c_start() {
/* 24C64.H */
#ifndef _24C64_H #define _24C64_H
#include"reg52.h" #include"compile.h" #include"intrins.h"
sbit I2C_SDA = P3^2; sbit I2C_SCL = P3^3;
extern bit ACK; /* 应答标志 */
** 发送主机发送应答信号后 SDA 为低电平,此时接收数据要重新拉高 SDA 电平 **************************************************************************** ****************/ uchar i2c_rcvbyte(uchar ack_chack) {
相关文档
最新文档