C编写的ATC详细的读写程序

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

C51_A T24C02读写程序: /*
voidstart()//开始信号
voidstop()//停止信号
voidAck()//发确认信号
voidNoAck()//发无确认信号
voidinit()//初始化信号,拉高SDA和SCL两条总线
bitwrite_byte(uchardate)//写一字节,将date写入AT24C02中
ucharread_byte()//读一字节,从AT24C02中读一字节
bitbusy()//应答查询,stop()后,启动AT24C02内部写周期,启动查询
//初始化EEPROM子程序内容为0XFF,nPage(0~31)
voidInit_Flash(ucharnPage)//8bytes/1pageinit0xFF
voidwrite_add(ucharaddress,uchardate)//向AT24C02中写数据
//从AT24C02中给定的地址nAddr起,将存放在以指针nContent开头的存储空间中的nLen个字节数据,连续写入AT24C02
voidwrite_flash(uchar*nContent,ucharnAddr,ucharnLen)
ucharread_add(ucharaddress)//从AT24C02中读出数据
//从AT24C02中给定的地址nAddr起,读取nLen个字节数据存放在以指针nContent 开头的存储空间。

voidread_flash(uchar*nContent,ucharnAddr,ucharnLen)
*/
/*
单片机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数码管。

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

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

4、取消段选,消隐!
若要显示多段,重复以上4步!
*/
#include<reg51.h>
#include<intrins.h>
#defineucharunsignedchar
#defineuintunsignedint
sbitL8=P1^7;
sbitP2_3=P2^3; //74HC138--/EI
sbitP2_2=P2^2; //74HC138--A2 sbitP2_1=P2^1; //74HC138--A1 sbitP2_0=P2^0; //74HC138--A0 ucharcodetable[]={
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e
}; //共阳数码管0——F
sbitsda=P1^2;
sbitscl=P1^0;
uchara;
voiddelay()//延时函数
{;;}
voidstart()//开始信号
{
sda=1;
_nop_();
scl=1;
_nop_();
sda=0;
_nop_();
}
voidstop()//停止信号
{
sda=0;
_nop_();
scl=1;
_nop_();
sda=1;
_nop_();
}
voidAck()//发确认信号{
scl=0;
_nop_();
sda=0;
_nop_();
scl=1;
_nop_();
scl=0;
_nop_();
}
voidNoAck()//发无确认信号{
scl=0;
_nop_();
sda=1;
_nop_();
scl=1;
_nop_();
scl=0;
_nop_();
}
//voidrespons()//应答,在数据传输8位后,等待或者发送一个应答信号//{
//uchari;
//scl=0;
//_nop_();
//sda=1;
//_nop_();
//scl=1;//scl拉高,准备读数据
//delay();
//while((sda==1)&&(i<250))i++;//读数据
//scl=0;//scl拉低,数据读完毕,(必须)
//delay();
//
//}
voidinit()//初始化信号,拉高SDA和SCL两条总线
{
sda=1;
scl=1;
}
bitwrite_byte(uchardate)//写一字节,将date写入AT24C02中{
uchari;
scl=0;
for(i=0;i<8;i++)
{
date=date<<1;
sda=CY;//将要写入的数据送入SDA
scl=1;//scl拉高,准备写数据
_nop_();
scl=0;//scl拉低,写数据完毕
_nop_();
}
sda=1;//应答时序中,该线必须为高
_nop_();
scl=1;//scl拉高,准备读数据
_nop_();
CY=sda;//将sda中的数据读出
scl=0;//scl拉低,数据读完毕(必须)
return(CY);
}
ucharread_byte()//读一字节,从AT24C02中读一字节{
uchari,k;
for(i=0;i<8;i++)
{
sda=1;
_nop_();
scl=1;//scl拉高,准备读数据
_nop_();
k=(k<<1)|sda;//将sda中的数据读出
scl=0;//scl拉低,数据读完毕(必须)
_nop_();
}
returnk;
}
//voiddelay2(ucharx)//延时,放在写入与读出之间//{
//uchara,b;
//for(a=x;a>0;a--)
//for(b=100;b>0;b--);
//}
bitbusy()//应答查询,stop()后,启动AT24C02内部写周期,启动查询{
start();
CY=write_byte(0xa0);
return(CY);
}
//初始化EEPROM子程序内容为0XFF,nPage(0~31)
voidInit_Flash(ucharnPage)//8bytes/1pageinit0xFF
{
ucharnLen;
ucharAddr;
nLen=8;
Addr=8*nPage;
start();
write_byte(0xa0);
write_byte(Addr);
for(;nLen!=0;nLen--)
{
write_byte(0xff);
}
stop();
}
voidwrite_add(ucharaddress,uchardate)//向AT24C02中写数据
{
start();
write_byte(0xa0);
//respons();
write_byte(address);
//respons();
write_byte(date);
//respons();
stop();
}
//从AT24C02中给定的地址nAddr起,将存放在以指针nContent开头的存储空间中的nLen个字节数据,连续写入AT24C02
voidwrite_flash(uchar*nContent,ucharnAddr,ucharnLen)
{
uchari,temp;
ucharAddr;
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();
}
ucharread_add(ucharaddress)//从AT24C02中读出数据{
uchardate;
start();
write_byte(0xa0);
//respons();
write_byte(address);
//respons();
start();
write_byte(0xa1);
//respons();
date=read_byte();
NoAck();
stop();
returndate;
}
//从AT24C02中给定的地址nAddr起,读取nLen个字节数据存放在以指针nContent 开头的存储空间。

voidread_flash(uchar*nContent,ucharnAddr,ucharnLen)
{
ucharAddr;
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
------------------------------------------------------------*/ voiddelay1(unsignedcharx)//x*0.14MS
{
unsignedchari;
while(x--)
{
for(i=0;i<13;i++){}
}
}
/**********************************************************/
/*------------------------------------------------------------- 功能:在8段数码管上显示nLen个字符,这些字符存储在指针nContent 开头的往下的内容中。

------------------------------------------------------------*/ voiddisplay(uchar*nContent,ucharnLen)
{
uchartemp;
uchari;
if(nLen>8)//最多显示8段
{
nLen=8;
}
for(i=0;i<nLen;i++)
{
temp=*nContent;
nContent++;
P0=table[temp];
P2=P2&0xf0|i;//译中74HC138:Yi(i=0,1,...7),选中第i+1个数码管delay1(10); //延时
P2=P2|0x0f;//取消位选,消隐
}
}
/*-------------------------------------------------------------
主程序
功能:实现存储器EEPROMAT24C02的数据读写操作
------------------------------------------------------------*/ voidmain()
{
uchardat[16]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15},i;
ucharout1[16]=0;
ucharout2;
P0=0xff;
P1=0xff;
P2=0xff;
P3=0xff;
init();//初始化AT24C02
Init_Flash(0);//将第31页初始化为0xFF
while(busy());
// write_add(23,0x5);//在23地址处写入数据0x5;
write_flash(dat,23,16);//在23地址处连续写入数组dat[16]数据; // delay2(100);
while(busy());
// out2=read_add(23);//读出地址为23处的数据,存储到数组read_flash(out1,23,16);//读出地址为23起的16个数据,存储到数组out1[16]
while(1)
{
display(out1,8);//显示out1前8个数字
// display(out1+8,8);//显示out1后8个数字
}
}。

相关文档
最新文档