C51编写的AT24C02详细的读写程序

合集下载

24C02读写C程序

24C02读写C程序

//选择性读操作,从 address 地址中读出 1 个字节 uchar Read24c02(uchar address) {
uchar ch; //伪写操作 Start(); Write8Bit(WriteDeviceAddress); //发送从器件地址,且方式为写。 while(TestAck()); Write8Bit(address); while(TestAck());
}
//从 24c02 中读出 8 个 bit uchar Read8Bit() {
unsigned char temp,rbyte=0; for(temp=8;temp!=0;temp--) {
SCL=1; rbyte=rbyte<<1; rbyte=rbyte|((unsigned char)(SDA)); SCL=0; } return(rbyte); }
#define WriteDeviceAddress 0xa0 #define ReadDeviceAddress 0xa1 sbit SCL=P2^7; sbit SDA=P2^6;
//定义器件在 IIC 总线中的地址,且方式为写 //定义器件在 IIC 总线中的地址,且方式为读
sbit P10=P1Stop();
//主机产
生停止信号 return(ch);
}
//本课试验写入一个字节到 24c02 并读出来
void main(void) // 主程序 {
uchar c1,c2; c1=Read24c02(0x02);
//从 24c02 中读出 1 个字节
Write24c02(0x88,0x03); c2=Read24c02(0x03); P3=c2;
24C02读写C程序

51单片机控制AT24c02进行读取的程序

51单片机控制AT24c02进行读取的程序
void Delay_us(uchar t)
{
while(--t);
}
//**********************/写入一个字节/******************************//
//********************/输入数据data和类型cmd_data/******************//
//**********************/30号汉字显示/******************************//
//************/输入30号汉字编号num3 显示的的行hang3列lie3/************//
//***************/对应使用字库 hanzi30[][30]/************************//
//小字体的asc码 ------------------LCD_asc_normal(字编号,行,列);共5行列步进6
//12点阵用"PCtoLCD2002"提取-------LCD_hanzi_12(字编号,行,列);基本共4行列步进10
//30点阵用"清华鹏远"提取----------LCD_hanzi_30(字编号,行,列);
Write_hanzi_30(i+2);
Set_R_C_5110(h+3,l);
Write_hanzi_30(i+3);
}
//**********************/16号asc码显示/******************************//
//************/输入16号asc编号num4 显示的的行hang4列lie4/************//

24c02读写程序大全

24c02读写程序大全

24c02读写程序大全2C总线的应用(24C02子程序)// 对24C02的读、写// extern void DelayMs(unsigned int);// extern void Read24c02(unsigned char *RamAddress,unsigned char Ro mAddress,unsigned char bytes);// extern void Write24c02(unsigned char *RamAddress,unsigned char Ro mAddress,unsigned char bytes);/***************************************************************************/#define WriteDeviceAddress 0xa0#define ReadDviceAddress 0xa1#include <reg52.h>#include <stdio.h>#include <absacc.h>/***************************************************************************/sbit SCL=P2^7;sbit SDA=P2^6;bit DOG;/***************************************************************************/void DelayMs(unsigned int number) {unsigned char temp;for(;number!=0;number--,DOG=!DOG) {for(temp=112;temp!=0;temp--) {}}}/***************************************************************************/void Start() {SDA=1;SCL=1;SDA=0;SCL=0;}/***************************************************************************/void Stop() {SCL=0;SDA=0;SDA=1;}/***************************************************************************/void Ack() {SDA=0;SCL=1;SCL=0;SDA=1;}/***************************************************************************/void NoAck() {SDA=1;SCL=1;SCL=0;}/***************************************************************************/bit TestAck() {bit ErrorBit;SDA=1;SCL=1;ErrorBit=SDA;SCL=0;return(ErrorBit);}/***************************************************************************/void Write8Bit(unsigned char input) {unsigned char temp;for(temp=8;temp!=0;temp--) {SDA=(bit)(input&0x80);SCL=1;SCL=0;input=input<<1;}}/***************************************************************************/void Write24c02(unsigned char *Wdata,unsigned char RomAddress,unsign ed char number) {Write8Bit(WriteDeviceAddress);TestAck();Write8Bit(RomAddress);TestAck();for(;number!=0;number--) {Write8Bit(*Wdata);TestAck();Wdata++;}Stop();DelayMs(10);}/***************************************************************************/ unsigned char Read8Bit() {unsigned char temp,rbyte=0;for(temp=8;temp!=0;temp--) {SCL=1;rbyte=rbyte<<1;rbyte=rbyte|((unsigned char)(SDA));SCL=0;}return(rbyte);}/***************************************************************************/void Read24c02(unsigned char *RamAddress,unsigned char RomAddress, unsigned char bytes) {//unsigned char temp,rbyte;Start();Write8Bit(WriteDeviceAddress);TestAck();Write8Bit(RomAddress);TestAck();Start();Write8Bit(ReadDviceAddress);TestAck();while(bytes!=1) {*RamAddress=Read8Bit();RamAddress++;bytes--;}*RamAddress=Read8Bit();NoAck();Stop();}[单片机应用]24c02的读写程序电子工匠发表于2007-1-4 22:33:07;---------------从24C02整组读数据RD_INI: LCALL DELAYRD_AREA: LCALL DELAYLCALL STARTLCALL DELAYLCALL WRITE ;24C02信息的读入LCALL DELAYLCALL ACKLCALL DELAYJC RD_AREAMOV R2, #8CLR P1.7 ;起始地址为00 ADDR_0: LCALL DELAYLCALL DELAYSETB P1.6LCALL DELAYLCALL DELAYCLR P1.6LCALL DELAYDJNZ R2, ADDR_0LCALL ACKLCALL DELAYJC RD_AREALCALL DELAYLCALL STARTMOV R0, #SAVE0MOV R3, #8 ;6个字节LCALL DELAYLCALL READLCALL DELAYLCALL ACKJC RD_AREARD_R_0: LCALL DELAYLCALL DELAYLCALL RD_INFOLCALL DELAYINC R0DJNZ R3, RD_R_1lcall ack_2lcall delayLCALL STOPRETrd_r_1: lcall ack_1sjmp rd_r_0;---------------向24C02整组写数据WR_INI: LCALL DELAYLCALL STARTLCALL DELAYLCALL WRITELCALL DELAYLCALL ACKLCALL DELAYJC WR_INICLR P1.7MOV R2, #8WR_W_0: LCALL DELAY ;写地址SETB P1.6LCALL DELAYLCALL DELAYCLR P1.6LCALL DELAYDJNZ R2, WR_W_0LCALL DELAYLCALL ACKLCALL DELAYJC WR_INIMOV R0, #SAVE0MOV R3, #8 ;6个字节WR_W_1: LCALL WR_INFOLCALL DELAYLCALL ACKLCALL DELAYJC WR_INIINC R0DJNZ R3, WR_W_1LCALL DELAYLCALL STOPRET;---------------24C02启动START: SETB P1.7SETB P1.6LCALL DELAYCLR P1.7LCALL DELAYCLR P1.6RET;---------------24C02读命令字;片选为"00";---------------------------- READ: MOV A, #10100001B MOV R2, #8RD1: RLC AMOV P1.7, CSETB P1.6LCALL DELAYCLR P1.6LCALL DELAYDJNZ R2, RD1RET;---------------24C02写命令字;片选为"00";---------------------------- WRITE: MOV A, #10100000B MOV R2, #8WR1: RLC AMOV P1.7, CSETB P1.6LCALL DELAYCLR P1.6CLR P1.7LCALL DELAYDJNZ R2, WR1RET;---------------24C02结束命令字STOP: CLR P1.7LCALL DELAYSETB P1.6LCALL DELAYSETB P1.7LCALL DELAYCLR P1.6RET;---------------24C02的应答信息ACK: SETB P1.7SETB P1.6LCALL DELAYmov a, p1MOV C, a.7LCALL DELAYCLR P1.6RETack_1: CLR P1.7 ;应答SETB P1.6lcall delayCLR P1.6lcall delaySETB P1.7lcall delayRETack_2: SETB P1.7 ;非应答SETB P1.6lcall delayCLR P1.6CLR P1.7lcall delayRET;---------------24C02的读;R0:数据的存储地址;-------------------------------- RD_INFO: SETB P1.7LCALL DELAYMOV R2, #8MOV R7, #0MOV A, #0RD_I_0: SETB P1.6LCALL DELAYMOV A, P1MOV C, A.7LCALL DELAYCLR P1.6MOV A, R7RLC AMOV R7, ALCALL DELAYDJNZ R2, RD_I_0MOV @R0, ARET;---------------24C02的写;R0:数据的写数据地址;-----------------------------------WR_INFO: MOV A, @R0MOV R2, #8WR_O_0: RLC AMOV P1.7, CLCALL DELAYSETB P1.6LCALL DELAYLCALL DELAYCLR P1.6LCALL DELAYDJNZ R2, WR_O_0RET24Cxx I2C EEPROM字节读写驱动程序,芯片A0-A1-A2要接GND(24C65接VCC,具体看DataSheet)。

C51编写的AT24C02详细的读写程序

C51编写的AT24C02详细的读写程序

C51_AT24C02读写程序:/*void start() //开始信号void stop() //停止信号void Ack() //发确认信号void NoAck() //发无确认信号void init()//初始化信号,拉高SDA和SCL两条总线bit write_byte(uchar date)//写一字节,将date 写入AT24C02 中uchar read_byte()//读一字节,从AT24C02 中读一字节bit busy() //应答查询,stop()后,启动A T24C02内部写周期,启动查询//初始化EEPROM子程序内容为0XFF,nPage(0~31)void Init_Flash(uchar nPage) //8 bytes/1 page init 0xFFvoid write_add(uchar address,uchar date)//向AT24C02 中写数据//从AT24C02中给定的地址nAddr起,将存放在以指针nContent开头的存储空间中的nLen 个字节数据,连续写入AT24C02void write_flash(uchar *nContent,uchar nAddr, uchar nLen)uchar read_add(uchar address)//从AT24C02 中读出数据//从AT24C02中给定的地址nAddr起,读取nLen个字节数据存放在以指针nContent开头的存储空间。

void read_flash(uchar *nContent,uchar nAddr, uchar nLen)*//*单片机P2口接74HC138(三八译码器)P2.3--74HC138:/EI、P2.2--74HC138:A2、P2.1--74HC138:A1、P2.0--74HC138:A0译码器输出Y0,Y1、Y2、Y3、Y4、Y5、Y6、Y7均低电平有效,分别选通1~8个数码管。

AT24C02存储器的读写及显示

AT24C02存储器的读写及显示

天津职业技术师范大学课程设计AT24C02存储器的读写及显示自动化与电气工程学院测控0702关蓓蓓(6 号)宋三虎(22号)王成坤(25号)一、设计任务:通过对EEPROM器件AT24C02的读写用LM016来显示↓流程图二、程序设计:#include<reg51.h>#include<absacc.h>#define REG0 XBYTE[0x0000]#define REG1 XBYTE[0x0001]#define REG2 XBYTE[0x0002]#define REG3 XBYTE[0x0003]Unsigned char busyflag;unsigned char dat,datn;unsigned char word1[16]={"This programm"};unsigned char word2[16]={"by SongSanhu"};code unsigned char word3[16]={"!"};codeunsignedcharword4[16]={"***************!"};code unsigned char word5[16]={"Wellcome To!"};code unsigned char word6[16]={"proteus Tool!"}; sbit P10=P1^0;sbit P11=P1^1;sbit P12=P1^2;sbit P13=P1^3;sbit P14=P1^4;sbit P15=P1^5;sbit P16=P1^6;sbit P17=P1^7;#define unchar unsigned char#define uint unsigned int#include <reg51.h>#include "intrins.h"sbit Scl=P3^4;sbit Sda=P3^5;void Start(void){Sda=1;Scl=1;_nop_();_nop_();_nop_();_nop_(); Sda=0;_nop_();_nop_();_nop_();_nop_();}void Stop(void) {Sda=0;Scl=1;_nop_(); _nop_();_nop_();_nop_(); Sda=1;_nop_();_nop_();_nop_();_nop_();}void Ack(void) {Sda=0;_nop_();_nop_();_nop_();_nop_();Scl=1;_nop_();_nop_();_nop_();_nop_();Scl=0;}void NoAck(void) {Sda=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();Scl=0;}void Send(unsigned Data) {unsigned BitCounter=8; unsigned temp;do{temp=Data;Scl=0;_nop_();_nop_();_nop_();_nop_();if((temp&0x80)==0x80) Sda=1;Sda=0;Scl=1;temp=Data<<1;Data=temp; BitCounter--;}while(BitCounter);Scl=0;}uchar; Read(void){unsigned temp=0; unsigned temp1=0; unsigned BitCounter=8; Sda=1;do{Scl=0;_nop_();_nop_();_nop_();_nop_();Scl=1;_nop_();_nop_();_nop_();_nop_();if(Sda)temp=temp|0x01;elsetemp=temp&0xfe;if(BitCounter-1){temp1=temp<<1;temp=temp1;}BitCounter--;}while(BitCounter);return(temp);}void WrToROM(unsigned Data[],unsigned Address,unsigned Num) {Unsigned char i;unsigned *PData;PData=Data;Send(0xa0);Ack();Send(Address);Ack();for(i=0;i<Num;i++){Send(*(PData+i));Ack();}Stop();}void RdFromROM(unsigned Data[],unsigned Address,unsigned Num){int i=0;unsigned *PData;PData=Data;for(i=0;i<Num;i++){Start();Send(0xa0);Send(Address+i);Ack();Start();Send(0xa1);Ack();*(PData+i)=Read();Scl=0;NoAck();Stop();}}void busy(){do{busyflag=REG1;}while(busyflag);}void wrc(unsigned char wcon) {busy();REG0=wcon;}void wrd(unsigned char wdat) {busy();REG2=wdat;}void rdd(){busy();dat=REG3;}void lcdint(){wrc(0x38);wrc(0x01);wrc(0x06);wrc(0x0c);void wrn(unsigned char word[]) {unsigned char i;for(i=0;i<16;i++){wrd(word[i]);}}void main(){unsigned char i;lcdint();wrc(0x80);wrn(word1);wrc(0xc0);wrn(word2);while(1){if(P10==0)for(i=0;i<16;i++)word1[i]='d';WrToROM(word1,0x00,16); wrc(0x80);wrn(word1);}if(P11==0){RdFromROM(word2,0x00,16); WrToROM(word2,0x80,16); wrc(0x80);wrn(word1);wrc(0xc0);wrn(word2);}if(P12==0){wrc(0x80);wrn(word3);wrc(0xc0);}if(P13==0) {wrc(0x80); wrn(word5); wrc(0xc0); wrn(word6); }if(P14==0) {wrc(0x80); wrn(word3); wrc(0xc0); wrn(word4); }if(P15==0) {wrc(0x80); wrn(word5); wrc(0xc0);}if(P16==0){wrc(0x80);wrn(word3);wrc(0xc0);wrn(word4);}if(P17==0){wrc(0x80);wrn(word5);wrc(0xc0);wrn(word6);}}}三、硬件电路设计:四、总结:学习protues、keil软件,掌握绘制原理,对AT24C02存储器的读写编辑有了更多的理解,通过对存储器的读写以及输出完成老师给我们的任务。

24c02读写程序大全

24c02读写程序大全
SETB SDA24
CLR SCLK24
CALL START24;启动
MOV A,#0A0H
CALL SHIFT8;移位
CALL ACK;响应
POP ACC
>SETB;应答毕,SDA置1
>RET
>程序中多处调用了DELAY子程序(仅两条NOP指令),这是为了满足I2C总线上数据传
送速率的要求,只有当SDA数据线上的数据稳定下来之后才能进行读写(即SCL线发出正
脉冲)。另外,在读最后一数据字节时,置应答信号为“1”,表示读操作即将完成。
>
>下面是本人编写的源程序,已经调试成功,下载就可以使用,程序编写的不是很规范
>ACALL SUBS
>MORE: ACALL SUBR
>MOV@R1,A
>INCR1
>DJNZ R7,MORE
>CLR
>ACALL DELAY
>SETB
>ACALL DELAY
>SETB;送停止信号
>RET
>SUBR: MOVR0,#08H ;接受单字节子程序
>LOOP2: SETB
>ACALL DELAY
TT2:MOV30H,A
MOVCA,@A+DPTR
CLR;开数码管
MOVP0,A;送显示
MOVA,30H
INCA
MOVB,A
MOVA,#00H
LCALLWT24
AJMP$
TAB:DB28H,7EH,0A2H,62H,74H,61H,21H,7AH,20H,60H
RD24: PUSH ACC;读24C02子程序。

24c02读写程序

24c02读写程序
}
//===================================================================//
//==========================================================
i=readx(); stop();
delay1(10);
return(i);
}
void x24c02_write(uchar address,uchar info)
{
EA=0;
start(); writex(0xa0);
clock(); writex(address);
clock(); writex(info);
clock(); stop();
EA=1;
delay1(50);
}
//====================================================================//
main (){
}
uchar readx()
{
uchar i,j,k=0;
scl=0; flash(); sda=1;
for (i=0;i<8;i++){
flash(); scl=1; flash();
if (sda==1) j=1;
else j=0;
uchar x24c02_read(uchar address); //从24c02的地址address中读取一个字节数据
void x24c02_write(uchar address,uchar info);

AT24C02EEPROM读写程序

AT24C02EEPROM读写程序

;--------------------------------------------------------------------------------------------------------------------- ;本程序是针对AT89S52单片机编制的EEPROM读写程序(2013.8.4测试通过);本程序在4MHZ、12MHZ和24MHZ分别测试通过;AT24C02的A0、A1、A2均接GND,设备地址高7位为(1010)000;WP接GND,充许对EEPROM正常读写;本程序仅作学习交流之用。

;--------------------------------------------------------------------------------------------------------------------- SCl equ P2.0 ;SCL接A T89S52的P2.0端口,作为EEPROM的串行输入时钟SDA equ P2.1 ;SDA接AT89S52的P2.1端口,作为主机与EEPROM之间信息串行传输总线WRITEDATA equ 08H;拟写入EEPROM的数据在主机中的存贮单元地址READDATA equ 09H ;从EEPROM读取的数据存放到主机存贮单元地址EPROMADDRESS equ 0AH;拟随机读写EEPROM的存贮单元地址;------------------------------------------------ORG 00HLJMP MAIN;------------------------------------------------ORG 50HMAIN: MOV SP,#20H;防止堆栈影响已用内存数据;以下为写EEPROM过程mov EPROMADDRESS,#09H;该地址可以随意输入(00H~FFH),但读和写的地址须相同MOV WRITEDA TA,#01010010B;该数字可以随意输入,并将读和写的数据进行比较;如读数正确则按将读出数据在P1口输出,可在P1口各位分别接LED灯直观显示出来。

C51对24c02的读写

C51对24c02的读写

bit IIC_Gets(unsigned char SlaveAddr,unsigned char SubAddr,unsigned char size,unsigned char *dat) //读操作 { SlaveAddr&=0xfe; IIC_Start(); IIC_Write(SlaveAddr); unsigned char IIC_Read() if( IIC_GetAck()) {IIC_Stop(); return 1; } //读数据 IIC_Write(SubAddr); { if( IIC_GetAck()) {IIC_Stop(); return 1;} unsigned char dat; IIC_Start(); unsigned char t=8; SlaveAddr|=0x01; IIC_SDA=1; //将其拉高,使之处于输 IIC_Write(SlaveAddr); 状态 if(IIC_GetAck()) {IIC_Stop(); return 1;} do for(;;) { { IIC_SCL=1; *dat++=IIC_Read(); IIC_Delay(); if(--size==0) dat<<=1; {IIC_PutAck(1); if(IIC_SDA) dat++; break; IIC_SCL=0; } IIC_Delay(); IIC_PutAck(0); }while(--t!=0); } return dat; IIC_Stop(); } return 0;}
C51对24C02的读写
2C总线相关介绍 I
1、SDA和SCL都是双向线路,都通过一个电流源或上拉 电阻连接到正的电源电压。 2、当总线空闲时,这两条线都是高电平 ,连接到总线的器件 输出级必须是漏极开路或集电极开路才能执行线与的功能。 连到总线上的任一器件输出的低电平,都将使总线的信号 变低,即各器件的SDA及SCL都是线“与”关系。 3、 IIC总线进行数据传送时,时钟信号为高电平期间,数 据线上的数据必须保持稳定,只有在时钟线(SCL)上的信 号为低电平期间,数据线上的高电平或低电平状态才允许 变化。

24C02读写C语言程序

24C02读写C语言程序
24C02读写C语言程序-下面是本人编写的源程
2010-09-01 10:08
>下面是本人编写的源程序,已经调试成功,下载就可以使用,程序编写的不是很规范
,希望各位读者批评指正!!!
>/***********************************************************
> for(i=0;i<n;i++)//写入8字节数据
> {
> SendData(s);
> Test_Ack();
> if(flag==0) return(0);
> }
> I2C_Stop();
> return(1);
>}
>/*************************************************************
> SCL=0;
> delay();
> SDA=0;
> delay();
>}
>/********************************************************
>**名称:Test_Ack()
>**功能:检测应答位
>*********************************************************/
>void Ack()
>{
> SDA=0;
> delay();
> SCL=1;
> delay();

[精品]24c02的连续读写

[精品]24c02的连续读写

24c02的连续读写/**********************************************24c02驱动程序SDA=P3^6;SCL=P3^7;可以写一个字节,写一串字符(以'\n'作为结束标志)可以读一个字节,读一串字符(以'\n'作为结束标志)**********************************************/#include <reg51.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int#define W24C02 0xA0 //存储器的写地址#define R24C02 0xA1 //存储器的读地址/********************/sbit SDA=P3^6; //AT24C02串行数据5脚sbit SCL=P3^7; //AT24C02串行时钟6脚void start_24c02(); //开始void stop_24c02(); //停止void response_24c02(bit); //应答void write_8bit(uchar); //写8位void write_byte(uchar,uchar); //写一字节void write_list(uchar, uchar *); //写*指向的数据(以'\n'作结束)uchar read_8bit(); //读8位uchar read_byte(uchar); //从某一地址读1字节void read_list(uchar,uchar *); //从某一地址开始连续读,存到*所指位置/********************开始,在读\写前调用********************/void start_24c02(){SDA=1;_nop_();_nop_();SCL=1;_nop_();_nop_();SDA=0;_nop_();_nop_();}/********************结束,在读\写完后调用********************/void stop_24c02(){SDA=0;_nop_();_nop_();SCL=1;_nop_();_nop_();SDA=1;_nop_();_nop_();}/********************应答当单片机写时,ack=1,为等待24c02的应答信号当单片机读时,ack=0,为向24c02发送应答信号********************/void respons_24c02(bit ack) //ak为1则单片机接收24c02的应答信号;ak为0则24c02接收单片机的应答信号{uchar i=0;SDA=ack;while(i<250&&SDA==1)i++;SCL=1;_nop_();_nop_();SCL=0;_nop_();SDA=1;}/********************向24c02写入一字节(8位)的数据********************/void write_8bit(uchar dat) {uchar i;SCL=0;for(i=0;i<8;i++){dat=dat<<1;SDA=CY;SCL=1;_nop_();_nop_();SCL=0;_nop_();_nop_();}}/********************从24c02读取一字节(8位)的数据********************/ uchar read_8bit(){uchar i,k;for(i=0;i<8;i++){SCL=1;_nop_();_nop_();k=(k<<1)|SDA;SCL=0;_nop_();_nop_();}return k;}/********************向地址addr写入数据dat********************/void write_byte(uchar addr,uchar dat){start_24c02();write_8bit(W24C02);respons_24c02(1);write_8bit(addr);respons_24c02(1);write_8bit(dat);respons_24c02(1);stop_24c02();}/********************从地址addr形如连续写入list中的数据,以'\n'为结束标志********************/void write_list(uchar addr, uchar *list) {uchar i=0;start_24c02();write_8bit(W24C02);respons_24c02(1);write_8bit(addr);respons_24c02(1);do{if(i==0||i%8!=0) //判断是否到了页的边缘{write_8bit(list[i]);respons_24c02(1);}else{stop_24c02(); //写完一页,则进入启动内部写周期do{start_24c02();write_8bit(W24C02);SDA=1;//delay(2);}while(SDA==1); //等待24c02完成写周期发出的应答信号,从而继续下一个读写操作SCL=1;_nop_();_nop_();SCL=0; //应答write_8bit(i);respons_24c02(1);write_8bit(list[i]);respons_24c02(1);}}while(list[i++]!='\n');stop_24c02();}/********************从addr中读取一字节数据返回dat********************/uchar read_byte(uchar addr){uchar dat;start_24c02();write_8bit(W24C02);respons_24c02(1);write_8bit(addr);respons_24c02(1);start_24c02();write_8bit(R24C02);respons_24c02(1);dat=read_8bit(); //读取一字节后若发送停止指令,则结束并返回datstop_24c02();return dat;}/********************从地址addr开始连续读取数据,并存入list中以'\n'为结束********************/void read_list(uchar addr,uchar *list){uchar i=0;start_24c02();write_8bit(W24C02);respons_24c02(1);write_8bit(addr);respons_24c02(1);start_24c02();write_8bit(R24C02);respons_24c02(1);do{list[i]=read_8bit(); //读取1字节后,若其不为结束标志,则发送应答信号,继续读下一个if(list[i]!='\n')respons_24c02(0);}while(list[i++]!='\n');stop_24c02();}。

c51写的24c02的读写程序

c51写的24c02的读写程序
#define WriteDeviceAddress 0xa0
#define ReadDviceAddress 0xa1
/***************************************************************************/
sbit SCL=P1^4;
sbit SDA=P1^3;
sbit DOG=P3^7;
/***************************************************************************/
void DelayMs(unsigned int number) {
unsigned char temp;
bit TestAck() {
bit ErrorBit;
SDA=1;
SCL=1;
ErrorBit=SDA;
SCL=0;
return(ErrorBit);
}
/***************************************************************************/
RamAddress++;
bytes--;
}
*RamAddress=Read8Bit();
NoAck();
Stop();
}
/***************************************************************************/
}
/***************************************************************************/

AT24C01~AT24C256通用读写程序(C51)

AT24C01~AT24C256通用读写程序(C51)

//AT24C01~AT24C256通用读写程序(C51)//转载一个AT24C01~AT24C256读写通用程序(只做了少许改动),附件里面有关于AT24系列读写资料!希望对大家有所帮助,共同进步!/* 以下为AT24C01~AT24C256的读写程序,各人可根据自己的需要应用。

在buf1中填入需要写入的内容,buf2的大小可根据需要定义。

addr可根据使用的芯片选择,可从任何位置读写,只要在该芯片的范围内。

enumer=AT***,根据使用的芯片赋值。

各函数中的形式参数不需改变。

本程序只要在调用的程序中定义实际参数即可,下述各子程序不必改动。

*/#include <reg52.h>#include <intrins.h>#define ERROR 10 //允许ERROR的最大次数sbit SDA=P3^0;sbit SCL=P3^1;enum eepromtype {AT2401,AT2402,AT2404,AT2408,AT2416,AT2432,AT2464,AT24128,AT24256};/*器件的型号*/enum eepromtype enumer; //定义一个枚举变量unsigned char code buf1 []={1,3,5,7,9,10,11,12,13,15}; /* 发送缓冲区*/unsigned char buf2 [10]; /* 接收缓冲区*//* 一个通用的24C01-24C256共9种EEPROM的字节读写操作程序,此程序有五个入口条件,分别为读写数据缓冲区指针,进行读写的字节数,EEPROM首址,EEPROM控制字节,以及EEPROM类型。

此程序结构性良好,具有极好的容错性,程序机器码也不多:DataBuff为读写数据输入/输出缓冲区的首址Length 为要读写数据的字节数量Addr 为EEPROM的片内地址AT24256为0~32767Control 为EEPROM的控制字节,具体形式为(1)(0)(1)(0)(A2)(A1)(A0)(R/W),其中R/W=1,表示读操作,R/W=0为写操作,A2,A1,A0为EEPROM的页选或片选地址;enumer为枚举变量,需为AT2401至AT24256中的一种,分别对应AT24C01至AT24C256;函数返回值为一个位变量,若返回1表示此次操作失效,0表示操作成功;ERROR为允许最大次数,若出现ERRORCOUNT次操作失效后,则函数中止操作,并返回1SDA和SCL由用户自定义,这里暂定义为P3^0和P3^1; *//*对于1K位,2K位,4K位,8K位,16K位芯片采用一个8位长的字节地址码,对于32K位以上的采用2个8位长的字节地址码直接寻址,而4K位,8K位,16K位配合页面地址来寻址*//* -----AT24C01~AT24C256 的读写程序------*/bit RW24xx(unsigned char *DataBuff,unsigned char Length,unsigned int Addr,unsigned char Control,enum eepromtype enumer){ void Delay(unsigned char DelayCount); /* 延时*/void Start(void); /* 启动总线*/void Stop(void); /* 停止IIC总线*/bit RecAck(void); /* 检查应答位*/void NoAck(void); /* 不对IIC总线产生应答*/void Ack(void); /* 对IIC总线产生应答*/unsigned char Receive(void); /* 从IIC总线上读数据子程序*/void Send(unsigned char sendbyte); /* 向IIC总线写数据*/unsigned char data j,i=ERROR;bit errorflag=1; /* 出错标志*/while(i--){ Start(); /* 启动总线*/Send(Control & 0xfe); /* 向IIC总线写数据,器件地址*/if(RecAck()) continue; /* 如写不正确结束本次循环*/if(enumer > AT2416){ Send((unsigned char)(Addr >> 8));//把整型数据转换为字符型数据:弃高取低,只取低8位.如果容量大于32K位,使用16位地址寻址,写入高八位地址if(RecAck()) continue;}Send((unsigned char)Addr); /* 向IIC总线写数据*/if(RecAck()) continue; /* 如写正确结束本次循环*/if(!(Control & 0x01)) //判断是读器件还是写器件{ j=Length;errorflag=0; /* 清错误特征位*/while(j--){ Send(*DataBuff++); /* 向IIC总线写数据*/if(!RecAck()) continue; /* 如写正确结束本次循环*/errorflag=1;break;}if(errorflag==1) continue;break;}else{ Start(); /* 启动总线*/Send(Control); /* 向IIC总线写数据*/if(RecAck()) continue;//器件没应答结束本次本层循环while(--Length) /* 字节长为0结束*/{ *DataBuff ++= Receive();Ack(); /* 对IIC总线产生应答*/}*DataBuff=Receive(); /* 读最后一个字节*/NoAck(); /* 不对IIC总线产生应答*/errorflag=0;break;}}Stop(); /* 停止IIC总线*/if(!(Control & 0x01)){ Delay(255); Delay(255); Delay(255); Delay(255);}return(errorflag);}/* * * * * 以下是对IIC总线的操作子程序* * * * *//* * * * * * 启动总线* * * * */void Start(void){ SCL=0; /* SCL处于高电平时,SDA从高电平转向低电平表示*/ SDA=1; /* 一个"开始"状态,该状态必须在其他命令之前执行*/ SCL=1;_nop_(); _nop_(); _nop_();SDA=0;_nop_(); _nop_(); _nop_(); _nop_();SCL=0;SDA=1;}/* * * * * 停止IIC总线* * * * */void Stop(void){ SCL=0; /*SCL处于高电平时,SDA从低电平转向高电平*/ SDA=0; /*表示一个"停止"状态,该状态终止所有通讯*/SCL=1;_nop_(); _nop_(); _nop_(); /* 空操作*/SDA=1;_nop_(); _nop_(); _nop_();SCL=0;}/* * * * * 检查应答位* * * * */bit RecAck(void){ SCL=0;SDA=1;SCL=1;_nop_(); _nop_(); _nop_(); _nop_();CY=SDA; /* 因为返回值总是放在CY中的*/SCL=0;return(CY);}/* * * * *对IIC总线产生应答* * * * */void Ack(void){ SDA=0; /* EEPROM通过在收到每个地址或数据之后, */SCL=1; /* 置SDA低电平的方式确认表示收到读SDA口状态*/ _nop_(); _nop_(); _nop_(); _nop_();SCL=0;_nop_();SDA=1;}/* * * * * * * * * 不对IIC总线产生应答* * * * */void NoAck(void){ SDA=1;SCL=1;_nop_(); _nop_(); _nop_(); _nop_();SCL=0;}/* * * * * * * * * 向IIC总线写数据* * * * */void Send(unsigned char sendbyte){ unsigned char data j=8;for(;j>0;j--){ SCL=0;sendbyte <<= 1; /* 使CY=sendbyte^7; */SDA=CY; /* CY 进位标志位*/SCL=1;}SCL=0;}/* * * * * * * * * 从IIC总线上读数据子程序* * * * */ unsigned char Receive(void){ register receivebyte,i=8;SCL=0;while(i--){ SCL=1;receivebyte = (receivebyte <<1 ) | SDA;SCL=0;}return(receivebyte);}/* * * * * * * * 一个简单延时程序* * * * * * * * * * * * */ void Delay(unsigned char DelayCount){ while(DelayCount--);}/* -----AT24C01~AT24C256 的读写程序------*/void main(){ unsigned char Control,*p1,*p2;unsigned char Length;unsigned int addr ; /* 24Cxx片内地址*/p1=buf1;p2=buf2;addr=0; /* 片内地址AT24C256为0~32767 */Length=8; /* 读写长度*/enumer=AT24256; /* 读写AT24C256 */Control=0xa0; /* 写操作*/RW24xx(p1,Length,addr,Control,enumer); /* 写*/Control=0xa1; /* 读操作*/RW24xx(p2,Length,addr,Control,enumer); /* 读*/}。

24c02读写程序

24c02读写程序

E2PROM芯片24C02的读写程序一、实验目的:给24C02的内部RAM写入一组数据,数据从24C02内部RAM的01h开始存放。

然后再把这组数据读出来,检验写入与读出就是否正确。

在这里我们给24C02中写入0、1、2的段码,然后把它读出来,送到数码管显示。

二、理论知识准备:上面两个实验主要学习的就是利用单片机的串口进行通讯,本实验要介绍的就是基于I2C 总线的串行通讯方法,下面我们先介绍一下I2C总线的相关理论知识。

(一)、I2C总线概念I2C总线就是一种双向二线制总线,它的结构简单,可靠性与抗干扰性能好。

目前很多公司都推出了基于I2C总线的外围器件,例如我们学习板上的24C02芯片,就就是一个带有I2C总线接口的E2PROM存储器,具有掉电记忆的功能,方便进行数据的长期保存。

(二)、I2C总线结构I2C总线结构很简单,只有两条线,包括一条数据线(SDA)与一条串行时钟线(SCL)。

具有I2C 接口的器件可以通过这两根线接到总线上,进行相互之间的信息传递。

连接到总线的器件具有不同的地址,CPU根据不同的地址进行识别,从而实现对硬件系统简单灵活的控制。

一个典型的I2C总线应用系统的组成结构如下图所示(假设图中的微控制器、LCD驱动、E2PROM、ADC各器件都就是具有I2C总线接口的器件):我们知道单片机串行通讯的发送与接收一般都各用一条线TXD与RXD,而I2C总线的数据线既可以发送也可以接受,工作方式可以通过软件设置。

所以,I2C总线结构的硬件结构非常简洁。

当某器件向总线上发送信息时,它就就是发送器,而当其从总线上接收信息时,又成为接收器。

(三)、I2C总线上的数据传送下面我们瞧瞧I2C总线就是如何进行数据传送的。

我们知道,在一根数据线上传送数据时必须一位一位的进行,所以我们首先研究位传送。

1、位传输I2C总线每传送一位数据必须有一个时钟脉冲。

被传送的数据在时钟SCL的高电平期间保持稳定,只有在SCL低电平期间才能够改变,示意图如下图所示,在标准模式下,高低电平宽度必须不小于4、7us。

最好的24C02储存开机次数实验 读写程序

最好的24C02储存开机次数实验 读写程序

24C02储存开机次数实验24C02是2K字节的串行EEPROM, 内部含有256个8位字节,该器件通过总线操作,并有专门的写保护功能。

串行EEPROM简称I2C总线式串行器件。

串行器件不仅占用很少的资源和I/O 线,而且体积大大缩小,同时具有工作电源宽、抗干扰能力强、功耗低、数据不易丢失和支持在线编程等特点。

I2C总线是一种用于IC器件之间连接的二线制总线。

它通过SDA(串行数据线)及SCL(串行时钟线)两根线在连到总线上的器件之间传送信息,并根据地址识别每个器件:不管是单片机、存储器、LCD驱动器还是键盘接口。

我们通过一个实验来了解24C02的读写操作过程:该实验功能是单片机复位一次,自动从24C02中读取数据,然后加1,最终数码管中的数据就是开机的次数,具有一定的实用意义。

相关原理:程序运行的照片:接线方法:1、接8位数码管的数据线。

将数码管部份的数据口 JP5接到CPU部份的P0口JP51.2、接8位数码管的显示位线。

将数码管部份的显示位口 JP8接到CPU部份的P2口JP52.3、用一根2PIN数据线一端插入CPU部份JP53(P3口)的P3.6,P3.7另外一端插入24C02部份的控制端JP38。

烧写后用手按复位键可以看到数码管每按一下加一。

程序流程图:汇编语言参考程序: SDA24 EQU P3.7 SCLK24 EQU P3.6 ORG 0000HAJMP MAINORG 0080HMAIN:CLR P3.7 ;打开写保护MOV DPTR,#TABMOV A,#00H ;读地址LCALL RD24CJNE A,#10,TTTT: JNC TT1AJMP TT2TT1: MOV A,#00TT2: MOV 30H,AMOVC A,@A+DPTRCLR P2.6 ;开数码管MOV P0,A ;送显示MOV A,30HINC AMOV B,AMOV A,#00HLCALL WT24AJMP $TAB: DB 28H,7EH,0A2H,62H,74H,61H,21H,7AH,20H,60HRD24: PUSH ACC ;读24C02子程序。

51单片机IIC总线操作及24c02指定地址的读写

51单片机IIC总线操作及24c02指定地址的读写

51单片机IIC总线操作及24c02指定地址的读写(单片机用STC89C58RD+)//24c02数据读写操作。

程序实现每一秒钟往24c02的指定地址内写入数据(既每一秒钟保存一次当前值)。

//共计时100秒,计时同步显示到数码管上,同时由8个led灯指示十位数的编码值。

//两个按键:单片机上电后按key6按键读取上次关机时存储到24c02内的数据,接着此数据继续计时显示。

//按key5按键计时停止。

#include <STC89C5xRC.H>#include<intrins.h>#define uchar unsigned char#define sda P20 //24c02数据接到P2.0口#define scl P21 //24c02时钟接到P2.1口//sbit sda=P2^0;//sbit scl=P2^1;sbit key6=P3^7;sbit key5=P3^6;uchar cont=0;uchar write=0; //标志位uchar code table[]={0x28,0xeb,0x32,0xa2,0xe1,0xa4,0x24,0xea,0x20,0xa0};void delay(){_nop_();_nop_();_nop_();}void delay1(uchar x){uchar a,b;for(a=x;a>0;a--)for(b=100;b>0;b--);}/***以下为24c02的IIC总线操作及读写数据的通用程序,IIC总线部分的程序可以用在其他IIC器件中参考郭天祥新概念51c语言***/void start() //开始{sda=1;delay();scl=1;delay();sda=0;delay();}void stop() //停止{sda=0;delay();scl=1;delay();sda=1;delay();}void respons() //应答{uchar i;scl=1;delay();while((sda==1)&&(i<250))i++;scl=0;delay();}void init(){sda=1;delay();scl=1;delay();}void write_byte(uchar date){uchar i,temp;temp=date;for(i=0;i<8;i++){temp=temp<<1;scl=0;delay();sda=CY;delay();scl=1;delay();// scl=0;// delay();}scl=0;delay();sda=1;delay();}uchar read_byte(){uchar i,k;scl=0;delay();sda=1;delay();for(i=0;i<8;i++){scl=1;delay();k=(k<<1)|sda;scl=0;delay();}return k;}void write_add(uchar address,uchar date) //24c02任一地址写入数据{start();write_byte(0xa0);respons();write_byte(address);respons();write_byte(date);respons();stop();}uchar read_add(uchar address) //24c02任一地址读取数据{uchar date;start();write_byte(0xa0);respons();write_byte(address);respons();start();write_byte(0xa1);respons();date=read_byte();stop();return date;}/***以上为24c02的IIC总线操作及读写数据的通用程序,IIC总线部分的程序可以用在其他IIC器件中参考郭天祥新概念51c语言***/void display(uchar shi,uchar ge) //显示子程序,P0口为数码管段{P0=table[shi];P27=0;delay1(5);P27=1;P0=table[ge];P26=0;delay1(5);P26=1;P1=table[shi]; //led指示灯按十位数变化相应亮灭}void main(){uchar keyscan;init();cont=read_add(36);if(cont==100)cont=0;TMOD=0X01; //ding shi qi gong zuo zai fang shi 1.EA=1;ET0=1;TH0=(65536-50000)/256;TL0=(65536-50000)%256;TR0=1; //启动定时器0P3=P3|0xfc; //11111100 置位按键位,p3口除p3.0和p3.1外接有6个按键keyscan=P3;switch(keyscan|0x03){case 0x7f: //如果key6被按下{while(key5!=0){display(cont/10,cont%10); //分解为十位数和个位数if(write==1){write=0;write_add(36,cont); //每1s写入数据cont到36地址处(地址0~255可任选)}}break;}case 0xbf: //如果key5被按下{while(key6!=0){TR0=0; //停止定时器read_add(36); //读取36号地址处数据静态显示display(cont/10,cont%10);}break;}}}void timer0() interrupt 1{uchar temp;TH0=(65536-50000)/256; //50ms中断初值,晶振12MHzTL0=(65536-50000)%256;temp++;if(temp==20) //temp每中断20次为1s(50ms*20=1000ms=1s){temp=0;cont++; //每1s时间到cont加一write=1; //到1s时标志位置一,开始往24c02里写入数据if(cont==100)cont=0; //100s时间到从00重新开始计时}}。

24C02(IIC)读写操作

24C02(IIC)读写操作

1. AT24C02写操作首先我们来看一下写AT24C02。

一般步骤是:1) 发送起始信号2) 发送写器件地址3) 等待应答4) 发送要写入的24C02 的地址5) 等待应答6) 发送要写入的数据7) 等待应答8) 发送数据结束发送结束信号具体程序如下:/****************************************************************************** ** 函数名: AT24Cxx_WriteOneByte* 函数功能: 24c02写一个字节地址数据* 输入: addr dt* 输出: 无********************************************/void AT24Cxx_WriteOneByte(u16 addr,u8 dt){I2C_Start();if(EE_TYPE>AT24C16){I2C_Send_Byte(0xA0);I2C_Wait_Ack();I2C_Send_Byte(addr>>8); //发送数据地址高位}else{I2C_Send_Byte(0xA0+((addr/256)<<1));//器件地址+数据地址}I2C_Wait_Ack();I2C_Send_Byte(addr%256);//双字节是数据地址低位//单字节是数据地址低位I2C_Wait_Ack();I2C_Send_Byte(dt);I2C_Wait_Ack();I2C_Stop();delay_ms(10);}2. AT24C02读操作那么读取AT24C02 的步骤是:1)发送起始信号2) 发送写器件地址3) 等待应答4) 发送要读取的AT24C02 的地址5) 等待应答6) 再发送其实信号7) 发送读器件地址8) 等待应答9) 接收数据10) 如果没有接收完数据,发送应答11) 接收数据12) 直到接收完数据,发送非应答13) 发送结束信号/****************************************************************************** ** 函数名: AT24Cxx_ReadOneByte* 函数功能: 24c02读一个字节地址数据* 输入: addr* 输出: 返回值temp*****************************************************************************/ u8 AT24Cxx_ReadOneByte(u16 addr){u8 temp=0;I2C_Start();if(EE_TYPE>AT24C16){I2C_Send_Byte(0xA0);I2C_Wait_Ack();I2C_Send_Byte(addr>>8); //发送数据地址高位}else{I2C_Send_Byte(0xA0+((addr/256)<<1));//器件地址+数据地址}I2C_Wait_Ack();I2C_Send_Byte(addr%256);//双字节是数据地址低位//单字节是数据地址低位I2C_Wait_Ack();I2C_Start();I2C_Send_Byte(0xA1);I2C_Wait_Ack();temp=I2C_Read_Byte(0); // 0 代表NAC I2C_NAck();I2C_Stop();return temp;}。

51单片机读写24c02多组数据

51单片机读写24c02多组数据
功能:将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
此状态位进行操作.(不应答或非应答都使ack=0假)
发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
------------------------------------------------------------------*/
结束总线
------------------------------------------------*/
void Stop_I2c()
{
SDA=0; //发送结束条件的数据信号
_Nop(); //发送结束条件的时钟信号
SCL=1; //结束条件建立时间大于4μ
_Nop();
_Nop();
_Nop();
0x77,0x7c,0x39,0x5e,0x79,0x71};//显示段码值0~F
unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码
int c,num,h,i,j;
SCL=1; //置时钟线为高,通知被控器开始接收数据位
_Nop();
_Nop(); //保证时钟高电平周期大于4μ
_Nop();
_Nop();
_Nop();
SCL=0;
}
_Nop();
_Nop();
SDA=1; //8位发送完后释放数据线,准备接收应答位
_Nop();
_Nop();
SCL=1;
_Nop();
Stop_I2c(); //结束总线
return(1);
}

AT24C02连读连写流水灯测试存储设备C51原创的。。免费下载已通过

AT24C02连读连写流水灯测试存储设备C51原创的。。免费下载已通过

AT24C02连读连写流水灯测试存储设备C51原创的。

免费下载已通过* 时序,还是时序在模拟时序时不能出错* 写一个字节数据是A T24C02自动才生一个应答,我们只要检测到就行。

然后发送下一字节* 读一个字节后我们要写另一个应答通知A T24C02,。

它接收我们的信号才会发下一个字节,不然我们不能进行连读******************************************************************/#include<C51.H>#include<INTRINS.H>#include<CLIB.H>// P1为流水灯。

实验用来显示数据是否能够正常读写//实验板上A0 A1 A2 全部接地而且SDA SCL没有接上拉电阻#define SDA P2_0#define SCL P2_1#define W_slave 0XA0#define R_slave 0xa1typedef unsigned char uchar ;typedef unsigned int uint ;bit ack=0;uchar code str_1[]={0x01,0x02,0x03,0x30,0x35,0x36,0x37,0x38,0x39,0x30};uchar get_str_1[8];/*******************************************AT24C02初始化*******************************************/void AT24C02_Init(void);/******************************************** AT24C02 起动*********************************************/static void AT24C02_Start();/******************************************** AT24C02 停止* __nop_()为一个单指令周期*11.0592MHZ一个单指令周期为1.08us********************************************/static void AT24C02_End() ;/****************************************** 写应答******************************************/static void AT24C02_Write_ACK() ;/**************************************** 读应答****************************************/static void AT24C02_Read_ACK();/****************************************发送一个字节****************************************/static void AT24C02_Send_Char(uchar ch);/****************************************接送一个字节****************************************/static uchar AT24C02_Get_Char();/****************************************AT24C02延时****************************************/static void flash(void) ;/**************************************** 发关一个字节*****************************************/static void AT24C02_Write_One(uchar address,uchar dat);/*****************************************接收一个字节*****************************************/static uchar AT24C02_Read_One(uchar address);/*****************************************连续写N个字节*****************************************/void AT24C02_Write_Str(uchar address,uchar * str,uchar num);/****************************************************** 连读N个字节*****************************************************/void AT24C02_Read_Str(uchar address,uchar *str,uchar num);/****************************************MAIN()******************************* ***************/void main(void){// uchar tample=0x00;uchar x=0;// uchar *_str;A T24C02_Init();// AT24C02_Write_One(0x20,0xa0); //test .... 写后立即读写需要时间延时,我这里用最小的1ms能够,比// delay1ms(1); //这更小的还没有进行测试,但是没有延时读取失败。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C51_AT24C02读写程序:/*void start() //开始信号void stop() //停止信号void Ack() //发确认信号void NoAck() //发无确认信号void init()//初始化信号,拉高SDA和SCL两条总线bit write_byte(uchar date)//写一字节,将date 写入AT24C02 中uchar read_byte()//读一字节,从AT24C02 中读一字节bit busy() //应答查询,stop()后,启动A T24C02内部写周期,启动查询//初始化EEPROM子程序内容为0XFF,nPage(0~31)void Init_Flash(uchar nPage) //8 bytes/1 page init 0xFFvoid write_add(uchar address,uchar date)//向AT24C02 中写数据//从AT24C02中给定的地址nAddr起,将存放在以指针nContent开头的存储空间中的nLen 个字节数据,连续写入AT24C02void write_flash(uchar *nContent,uchar nAddr, uchar nLen)uchar read_add(uchar address)//从AT24C02 中读出数据//从AT24C02中给定的地址nAddr起,读取nLen个字节数据存放在以指针nContent开头的存储空间。

void read_flash(uchar *nContent,uchar nAddr, uchar nLen)*//*单片机P2口接74HC138(三八译码器)P2.3--74HC138:/EI、P2.2--74HC138:A2、P2.1--74HC138:A1、P2.0--74HC138:A0译码器输出Y0,Y1、Y2、Y3、Y4、Y5、Y6、Y7均低电平有效,分别选通1~8个数码管。

包括2个四位一体数码管LG3641BH,共2x4=8个数码管。

数码管数据口为P0口。

数码管为共阳4位一体数码管。

功能:译码器输出为1——8个数码管的段选信号,轮流选择1——8数码管。

void display(uchar *nContent,uchar nLen)功能:在8段数码管上显示nLen个字符,这些字符存储在指针nContent开头的往下的内容中。

显示原理:1、送出要显示的段数2、P2译码,选择要显示的位3、延时1——2ms,时间不能太长,否则会闪烁,也不能太短,否则会很暗。

4、取消段选,消隐!若要显示多段,重复以上4步!*/#include <reg51.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intsbit L8 =P1^7;sbit P2_3 =P2^3; // 74HC138--/EIsbit P2_2 =P2^2; // 74HC138--A2 sbit P2_1 =P2^1; // 74HC138--A1 sbit P2_0 =P2^0; // 74HC138--A0 uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; // 共阳数码管0——Fsbit sda=P1^2;sbit scl=P1^0;uchar a;void delay()//延时函数{ ;; }void start() //开始信号{sda=1;_nop_();scl=1;_nop_();sda=0;_nop_();}void stop() //停止信号{sda=0;_nop_();scl=1;_nop_();sda=1;_nop_();}void Ack() //发确认信号{scl = 0;_nop_();sda = 0;_nop_();scl = 1;_nop_();scl = 0;_nop_();}void NoAck() //发无确认信号{scl = 0;_nop_();sda = 1;_nop_();scl = 1;_nop_();scl = 0;_nop_();}//void respons() //应答,在数据传输8位后,等待或者发送一个应答信号//{//uchar i;//scl=0;//_nop_();//sda=1;//_nop_();//scl=1; //scl 拉高,准备读数据//delay();//while((sda==1)&&(i<250))i++; //读数据//scl=0; //scl 拉低,数据读完毕,(必须)//delay();////}void init()//初始化信号,拉高SDA和SCL两条总线{sda=1;scl=1;}bit write_byte(uchar date)//写一字节,将date 写入AT24C02 中{uchar i;scl=0;for(i=0;i<8;i++){date=date<<1;sda=CY; //将要写入的数据送入SDAscl=1; //scl 拉高,准备写数据_nop_();scl=0; //scl 拉低,写数据完毕_nop_();}sda = 1; //应答时序中,该线必须为高_nop_();scl = 1; //scl 拉高,准备读数据_nop_();CY = sda; //将sda 中的数据读出scl = 0; //scl 拉低,数据读完毕(必须)return(CY);}uchar read_byte()//读一字节,从AT24C02 中读一字节{uchar i,k;for(i=0;i<8;i++){sda=1;_nop_();scl=1; //scl 拉高,准备读数据_nop_();k=(k<<1)|sda; //将sda 中的数据读出scl=0; //scl 拉低,数据读完毕(必须)_nop_();}return k;}//void delay2(uchar x)//延时,放在写入与读出之间//{//uchar a,b;//for(a=x;a>0;a--)//for(b=100;b>0;b--);//}bit busy() //应答查询,stop()后,启动A T24C02内部写周期,启动查询{start();CY=write_byte(0xa0);return(CY);}//初始化EEPROM子程序内容为0XFF,nPage(0~31)void Init_Flash(uchar nPage) //8 bytes/1 page init 0xFF{uchar nLen;uchar Addr;nLen=8;Addr=8*nPage;start();write_byte(0xa0);write_byte(Addr);for(;nLen!=0;nLen--){write_byte(0xff);}stop();}void write_add(uchar address,uchar date)//向AT24C02 中写数据{start();write_byte(0xa0);//respons();write_byte(address);//respons();write_byte(date);//respons();stop();}//从AT24C02中给定的地址nAddr起,将存放在以指针nContent开头的存储空间中的nLen 个字节数据,连续写入AT24C02void write_flash(uchar *nContent,uchar nAddr, uchar nLen){uchar i,temp;uchar Addr;Addr = nAddr;start();write_byte(0xa0);write_byte(Addr);for(i=0;i<nLen;i++){if(Addr%8==0){stop();while(busy());start();write_byte(0xa0);write_byte(Addr);}temp=*nContent;write_byte(temp);nContent++;Addr++;}stop();}uchar read_add(uchar address)//从AT24C02 中读出数据{uchar date;start();write_byte(0xa0);//respons();write_byte(address);//respons();start();write_byte(0xa1);//respons();date=read_byte();NoAck();stop();return date;}//从AT24C02中给定的地址nAddr起,读取nLen个字节数据存放在以指针nContent开头的存储空间。

void read_flash(uchar *nContent,uchar nAddr, uchar nLen){uchar Addr;Addr = nAddr;start();write_byte(0xa0);write_byte(Addr);start();write_byte(0xa1);while(--nLen){*nContent=read_byte();nContent++;Ack(); //发确认信号}*nContent=read_byte();NoAck(); //无确认信号stop(); //发停止信号}/*-------------------------------------------------------------功能:延时x*0.14ms------------------------------------------------------------*/void delay1(unsigned char x) //x*0.14MS{unsigned char i;while(x--){for (i = 0; i<13; i++) {}}}/**********************************************************//*-------------------------------------------------------------功能:在8段数码管上显示nLen个字符,这些字符存储在指针nContent开头的往下的内容中。

相关文档
最新文档