C51读写AT24C04源代码及AT24C04测试程序

发布者:Amybaby最新更新时间:2023-06-25 来源: elecfans关键字:C51  读写AT24C04  测试程序 手机看文章 扫描二维码
随时随地手机看文章

一、C51读写AT24C04源代码

/*=============================================*/

/*;***********************************/


/*;起动24C01时序*/

void Start()

{

SCL=1;

SDA=1;

SDA=0;

SCL=0;

}


/*;************************************/

/*;停止24C01时序*/

void Stop()

{

SDA=0;

SCL=1;

SDA=1;

}

/*;**************************************/

/*;检测24C01的响应信号*/

bit ACK()

{

bit c;

SDA=1;

SCL=1;

c=SDA;

SCL=0;

return c;

}

/*;************************************/

/*;往24C01发一8位数据*/

void SendChar(unsigned char ch)

{

unsigned char i;

i=8;

do

{

SDA=(ch&0x80);

SCL=1;

SCL=0;

ch《《=1;

}while(--i!=0);

}

/*;**************************************/

/*;从24C01接收一8位数据*/

unsigned char RecChar()

{

unsigned char i,j;

i=8;

do

{

SCL=1;

j=(j《《1)|SDA;

SCL=0;

}while(--i!=0);

return j;

}

//;**************************************

/*;********************************/

/*;往24C01写一字节*/

void WriteChar(unsigned int addr,unsigned char ch)

{

unsigned char c;

c=((*((unsigned char *)&addr))《《1)&0x02;

Start();

SendChar(0xa0|c);

ACK();

SendChar(addr);

ACK();

SendChar(ch);

ACK();

Stop();

// for(addr=4;addr!=0;addr--)

for(ch=0xff;ch!=0;ch--) ;

}

//;**************************************

/*;********************************/

/*;往24C01写多字节*/

void WriteBuf(unsigned int addr,unsigned char idata *buf,unsigned char count)

{

unsigned char c;

c=((*((unsigned char *)&addr))《《1)&0x02;

Start();

SendChar(0xa0|c);

ACK();

SendChar(addr);

ACK();

do

{

SendChar(*buf++);

ACK();

if(count!=1)

{if(((++addr)&0x7)==0)

{

Stop();

for(c=0xff;c!=0;c--) ;

c=((*((unsigned char *)&addr))《《1)&0x02;

Start();

SendChar(0xa0|c);

ACK();

SendChar(addr);

ACK();

}

}

else

{

Stop();

for(c=0xff;c!=0;c--) ;

}

}while(--count!=0);

}

/*;**********************************/

/*;从24C01读一字节*/

/*;入口:R0中为要读出内容的地址*/

/*;出口:A中为读到的内容*/

unsigned char ReadChar(unsigned int addr)

{

unsigned char ch;

ch=((*((unsigned char *)&addr))《《1)&0x02;

Start();

SendChar(0xa0|ch);

ACK();

SendChar(addr);

ACK();

Start();

SendChar(0xa1|ch);

ACK();

ch=RecChar();

Stop();

return ch;

}

/**********************************/

/*至少读2字节*/

void ReadBuf(unsigned int addr,unsigned char idata *buf,unsigned char count)

{

unsigned char ch;

ch=((*((unsigned char *)&addr))《《1)&0x02;

Start();

SendChar(0xa0|ch);

ACK();

SendChar(addr);

ACK();

Start();

SendChar(0xa1|ch);

ACK();

count--;

do

{

*buf++=RecChar();

SDA=0;

SCL=1;

SCL=0;

SDA=1;

}while(--count!=0);

*buf=RecChar();

Stop();

}

二、AT24C04测试程序

/**************************************

主芯片 : STC12C5A60S2 (1T)

工作频率: 12.000MHz

**************************************/

#include “REG51.H”

#include “INTRINS.H”

typedef unsigned char BYTE;

typedef unsigned short WORD;

sbit SCL = P3^4; //AT24C04的时钟

sbit SDA = P3^5; //AT24C04的数据

BYTE BUF[16]; //数据缓存区

BYTE code TESTDATA[] =

{

0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,

0x88,0x99,0xAA,0xBB,0xCC,0xDD,0xEE,0xFF

};

void Delay5us();

void Delay5ms();

void AT24C04_Start();

void AT24C04_Stop();

void AT24C04_SendACK(bit ack);

bit AT24C04_RecvACK();

void AT24C04_SendByte(BYTE dat);

BYTE AT24C04_RecvByte();

void AT24C04_ReadPage();

void AT24C04_WritePage();

void main()

{

AT24C04_WritePage();

Delay5ms();

AT24C04_ReadPage();

while (1);

}

/**************************************

向AT24C04写1页(16字节)数据

将TESTDATA开始的16个测试数据写如设备的00~0F地址中

**************************************/

void AT24C04_WritePage()

{

BYTE i;

AT24C04_Start(); //起始信号

AT24C04_SendByte(0xa0); //发送设备地址+写信号

AT24C04_SendByte(0x00); //发送存储单元地址

for (i=0; i《16; i++)

{

AT24C04_SendByte(TESTDATA[i]);

}

AT24C04_Stop(); //停止信号

}

/**************************************

从AT24C04读取1页(16字节)数据

将设备的00~0F地址中的数据读出存放在DATA区的BUF中

**************************************/

void AT24C04_ReadPage()

{

BYTE i;

AT24C04_Start(); //起始信号

AT24C04_SendByte(0xa0); //发送设备地址+写信号

AT24C04_SendByte(0x00); //发送存储单元地址

AT24C04_Start(); //起始信号

AT24C04_SendByte(0xa1); //发送设备地址+读信号

for (i=0; i《16; i++)

{

BUF[i] = AT24C04_RecvByte();

if (i == 15)

{

AT24C04_SendACK(1); //最后一个数据需要会NAK

}

else

{

AT24C04_SendACK(0); //回应ACK

}

}

AT24C04_Stop(); //停止信号

}

/**************************************

延时5微秒(STC12C5A60S2@12M)

不同的工作环境,需要调整此函数

延时函数是使用1T的指令周期进行计算,与传统的12T的MCU不同

**************************************/

void Delay5us()

{

BYTE n = 4;

while (n--)

{

_nop_();

_nop_();

}

}

/**************************************

延时5毫秒(STC12C5A60S2@12M)

不同的工作环境,需要调整此函数

此延时函数是使用1T的指令周期进行计算,与传统的12T的MCU不同

**************************************/

void Delay5ms()

{

WORD n = 2500;

while (n--)

{

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

}

}

/**************************************

起始信号

**************************************/

void AT24C04_Start()

{

SDA = 1; //拉高数据线

SCL = 1; //拉高时钟线

Delay5us(); //延时

SDA = 0; //产生下降沿

Delay5us(); //延时

SCL = 0; //拉低时钟线

}

/**************************************

停止信号

**************************************/

void AT24C04_Stop()

{

SDA = 0; //拉低数据线

SCL = 1; //拉高时钟线

Delay5us(); //延时

SDA = 1; //产生上升沿

Delay5us(); //延时

}

/**************************************

发送应答信号

入口参数:ack (0:ACK 1:NAK)

**************************************/

void AT24C04_SendACK(bit ack)

{

SDA = ack; //写应答信号

SCL = 1; //拉高时钟线

Delay5us(); //延时

SCL = 0; //拉低时钟线

Delay5us(); //延时

}

/**************************************

接收应答信号

**************************************/

bit AT24C04_RecvACK()

{

SCL = 1; //拉高时钟线

Delay5us(); //延时

CY = SDA; //读应答信号

SCL = 0; //拉低时钟线

Delay5us(); //延时

return CY;

}

/**************************************

向IIC总线发送一个字节数据

**************************************/

void AT24C04_SendByte(BYTE dat)

{

BYTE i;

for (i=0; i《8; i++) //8位计数器

{

dat 《《= 1; //移出数据的最高位

SDA = CY; //送数据口

SCL = 1; //拉高时钟线

Delay5us(); //延时

SCL = 0; //拉低时钟线

Delay5us(); //延时

}

AT24C04_RecvACK();

}

/**************************************

从IIC总线接收一个字节数据

**************************************/

BYTE AT24C04_RecvByte()

{

BYTE i;

BYTE dat = 0;

SDA = 1; //使能内部上拉,准备读取数据

for (i=0; i《8; i++) //8位计数器

{

dat 《《= 1;

SCL = 1; //拉高时钟线

Delay5us(); //延时

dat |= SDA; //读数据

SCL = 0; //拉低时钟线

Delay5us(); //延时

}

return dat;

}


关键字:C51  读写AT24C04  测试程序 引用地址:C51读写AT24C04源代码及AT24C04测试程序

上一篇:keil c51是如何启动c程序的
下一篇:采用LPC938的高精度数控直流电流源的方案设计

推荐阅读最新更新时间:2024-11-12 10:17

51单片机读写max186的c51程序
//ad转换子程序 //返回的是12位的int型数据 //max186通道ch0对应的是0,它是max186第1脚 //max186通道ch1对应的是1,它是max186第2脚 //max186通道ch2对应的是2,它是max186第3脚 //max186通道ch3对应的是3,它是max186第4脚 //max186通道ch4对应的是4,它是max186第5脚 //max186通道ch5对应的是5,它是max186第6脚 //max186通道ch6对应的是6,它是max186第7脚 //max186通道ch7对应的是7,它是max186第8脚 //比如:int ch3; // ch3=ad186(3); //ch3就是从max
[单片机]
51单片机<font color='red'>读写</font>max186的<font color='red'>c51</font>程序
C51 中断接收 查询发送
C51 中断接收 查询发送 #include REGX51.H volatile unsigned char rx_data; volatile bit rx_flag = 0; void dalay_1ms(unsigned short n) { unsigned short i,j; for(i=0; i n; i++) { for(j=60000; j 0; j--); } } void send_char(unsigned char ch) { SBUF = ch; while(!TI); T
[单片机]
51study实例-C51闹铃程序
#include atmelat89x52.h #include string.h #define comdir P3_2 #define wirespeaker P1_3 #define wiret0 T0 #define wiret1 T1 #define adr_delay1s 0x1086 #define adr_print10ms 0x1000 #define adr_print80ms 0x101A #define adr_screen_black 0x10BA #define adr_screen_clear 0x10CD #define adr_key_search 0X10EB #define adr_sou
[单片机]
AD7705应用 C51源程序
源程序有很多不妥之处:1、程序中电压结果换算不好,没用 % 取余方法 2、没有对最小精度进行换,方法是2.5/65535=38.14uV,然后用T_Voltage*38.14uV。另有问题请指出;希望大家能共享自己的原创,谢谢!游客说AD7710源程序与此差不多,不知是否能帮得上忙。 #include reg52.h #include absacc.h #include intrins.h #include math.h sbit Number_BIT0 = P2^7; sbit Number_BIT1 = P2^6; sbit Number_BIT2 = P2^5; sbit Number_BIT3 = P2^4; sb
[单片机]
#C51串口通讯4-#一串数据#中断即时解析用户自定义协议(握手接收应答)
前言 提示: 1.上一章测试一种方法:简单协议下利用串口中断实时接收数据并校验后进行解析。 2.实际项目开发时,主机下发命令后,从机首先进行握手确认,数据错误情况下要进行相应回应(如错误指令)。 3.本章继续丰富开发,增加主从应答机制 提示:以下是本篇文章正文内容,下面案例可供参考 一、场景 示例: 主机下发命令,从机中断解析并应答,主函数处理事件 二、编程实现 1.自定义协议 如: ##主机类型定义命令类型(查询,设置,器件控制等等) 以控制数码管显示0x01为例 ##从机握手应答: a.数据正确回复:BB66BB8000 b.和校验错误回复:BB66BB8100 c.异或校验错误回复:BB66BB820
[单片机]
#<font color='red'>C51</font>串口通讯4-#一串数据#中断即时解析用户自定义协议(握手接收应答)
跑马灯实验用汇编语言和C51语言做出的不同效果
当前开发单片机应用系统程序主要应用汇编语言和C51语言,采用汇编语言编写可直接操纵系统的硬件资源,能编写出高效运行的程序代码,程序运行速度快。而采用C51语言编写可改善程序的可读性和可移植性,利于产品的更新换代,大大加快了单片机应用程序的开发速度。下面通过一个简单的实验--跑马灯实验来分析一下这两种语言的差别。用AT89C5l实现的跑马灯实验的原理图如xia 图所示。 跑马灯实验的原理图用汇编语言编写程序来实现,程序如下: ORG 0 000H LJP START//转入主程序 ORG 0040H START:MOV SP,#60H//设置 堆栈指针 OV A,# 0 F EH / /送A 11111110 ROTATE =
[单片机]
跑马灯实验用汇编语言和<font color='red'>C51</font>语言做出的不同效果
Keil C51大端模式与版本选择导致的仿真器Code size limit:2k
调了半天的磁石电话程序, 由于一些原因导致了调试进度慢, 发现问题的不及时: 1. keil MDK的版本问题, 使用C8051调试器调试时, 会弹出窗口说仿真模式, code只能小于2K的限制. 但是使用download可以下载烧入. 最后发现是我和谐的时候版本选择问题, 开始还以为是4.6版本太高级了. 实际上是由于使用破解程序时, 将默认的 standard 改成了 professional. 可能是破解的问题, 毕竟是专业版, 哪有那么容易. 罪过罪过. 2. 在进行类型转换时, 要注意Keil C51 的大小端模式, Keil 的端模式为大端模式, 也就是高字节存储在低地址, 低位字节存储在高地址. 所以在进行
[单片机]
C51红外解码程序
这是一个简单的红外解码程序,是针对9ms起始码和4.5ms结束码的红外信号晶振用的是11.0592M的 #i nclude at89x52.h #i nclude stdio.h sfr p0=0x80; sfr p3=0xb0; sbit p32=p3^2; unsigned char dm,i,j,k; unsigned char data a ;//定义4个数组,用来存储代码 void ds0_9ms(void) { unsigned char j,k; for(j=18;j 0;j--) for(k=20;k 0;k--) ; } void ds1ms(void) { unsigned char i,j; for(i
[单片机]

推荐帖子

问问价格,
谁能做程序和SD卡的ID号码绑定加我msn,或者给我发邮件,lwt5671@hotmail.com,,,很想实现这个功能,说不是用做商用,估计没有人相信,那就花钱买吧,,看我能掏起不,呵呵,老斩也没有消息了?问问价格,如果是自己玩,那就算了,这没什么好玩的。LZ的话已经说的很清楚了,商用。呵呵,商用商用。。。谁卖?这年代屈打成招的多的事了,,,我也认了,,,SD卡的ID得不到吗?如果能得到还有什么可做的?qq:16976440guopeixin@126.com我看来这样只能加
abc1681681 嵌入式系统
利用STM32F4“黑进”硬盘驱动无刷电机--EEWORLD大学堂
利用STM32F4“黑进”硬盘驱动无刷电机:https://training.eeworld.com.cn/course/2086“黑”一个运行在4500RPM的旧硬盘驱动无刷电机,且不适用速率控制电路。一切操作都由STM32F407VGT6实现。STM32F7是STM32F4的升级版。希望能从F4的诸多设计中,给你带来F7的设计灵感。利用STM32F4“黑进”硬盘驱动无刷电机--EEWORLD大学堂看看
chenyy 单片机
电池低压产品的漏电流和耐压测试
电池低压产品的漏电流和耐压测试像手环,手机,耳机这种电池供电的产品。充电是DC5V。如何用漏电流测试仪和耐压测试仪进行漏电流和耐压的测试?怎么接线?AC模式1.电源适配器输入短路,输出短路,耐压测试仪红色线夹子接输入短路处,黑色线夹子接电源输出短路处2.网电源输入短路,耐压测试仪红色夹子接输入短路处,黑色线夹子接被测
QWE4562009 测试/测量
msp430定时计算
msp430能不能精确到0.1ms?msp430定时计算可以哥们~那怎么设置倍频回复沙发MFLIANG的帖子
wacsysys 微控制器 MCU
准备上PXA310,请大家推荐几个好的代理商以及回答一些相关问题
嘿嘿,准备上PXA310,请大家推荐几个好的代理商以及回答一些相关问题一、大家有什么好的代理商介绍?二、要和marvell签署协议需要具备什么条件?谢谢。呵呵准备上PXA310,请大家推荐几个好的代理商以及回答一些相关问题yun没哟人知道?最大的代理就是安富利了,我不太清楚深圳那边有哪些代理,北京这边我打过交道的就是安富利和文晔科技了,代理嘛,都那样,他们只起到一个上传下达的作用,有问题还是要找marvell原厂的支持。签NDA不需要太苛刻的条件吧,一般公司都能正常签署看来你
bg8sck 嵌入式系统
咨询永宏PLC外部中断不正常的原因
大家好!   我因为项目特性要求,需要使用外部中断。为了先行掌握中断的方法。我试着编了个外部中断应用程序。可以运行时不能如愿。机型是10MC.程序如下:在设置I/O组态时将X1设为正缘中断。外部接线是:+24V——S/S,-24V通过行程开关与X1连接。同时给PLC以~220V交流电。    主单元区:|------------------------------------------T132000在副单元区:|---------LIBX1+i|---------
eeleader-mcu 工控电子
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved