📄 24cxx.c.bak
字号:
/*实验名称:读写AT24C02实验
功能:用串口发送指令读出或写入00-7FH单无的内容,显示结果在LCD上显示
读出(16进制数):AA 地址
写入(16进制数):BB 地址 内容
作者:http://www.mcuprog.com
05-02-01
*/
#include <reg51.h>
#include <intrins.h>
#define Uchar unsigned char
#define Uint unsigned int
#define SomeNOP(); _nop_();_nop_();_nop_();
//定义变量
Uchar recip,recsum,recdata[2]; //接收指针,接收个数,用户标志,接收存放数组
Uchar bdata myflag;
sbit readbit = myflag^0; //读EEPROM标志
sbit writebit = myflag^1; //写EEPROM标志
sbit rs232okbit = myflag^2; //接收完一拍完整的指令
/*I2C要用到的口线定意*/
sbit SDA = P2^7;
sbit SCL = P2^6;
/*控制的口线定意*/
sbit E=P2^2;
sbit RW=P2^1;
sbit RS=P2^0;
sbit LEDLOCK=P3^2;
//LCD驱动要用到的一些子程序
//-------------------------------------
void Delay(unsigned int t) // delay 40us
{
for(;t!=0;t--) ;
}
//=============================================
void SendCommandByte(unsigned char ch)
{
RS=0;
RW=0;
P0=ch;
E=1;
Delay(1);
E=0;
Delay(100); //delay 40us
}
//-------------------------------------------------------
void SendDataByte(unsigned char ch)
{ RS=1;
RW=0;
P0=ch;
E=1;
Delay(1);
E=0;
Delay(100); //delay 40us
}
//-------------------------------------------------
void InitLcd()
{SendCommandByte(0x30);
SendCommandByte(0x30);
SendCommandByte(0x30);
SendCommandByte(0x38); //设置工作方式
SendCommandByte(0x0c); //显示状态设置
SendCommandByte(0x01); //清屏
SendCommandByte(0x06); //输入方式设置
}
/*----------------------I2C要用到的一些子程序---------------------------------*/
/***********************以下为一些用到的子程序*********************************/
/*延时子程序*/
void Delay_1ms(Uchar time)
{
Uchar j;
while(time--)
{
for(j=163;j!=0;j--)
{;}
}
}
/*I2C的起动程序*/
void I2CStart(void)
{
SDA = 1;
SomeNOP();
SCL = 1;
SomeNOP();
SDA = 0;
SomeNOP();
SCL = 0;
SomeNOP();
}
/*I2C的停止程序*/
void I2CStop(void)
{
SDA = 0;
SomeNOP();
SCL = 1;
SomeNOP();
SDA = 1;
SomeNOP();
}
void ACK(void) //Acknowledge信号
{
SDA = 0;
SomeNOP();
SCL = 1;
SomeNOP();
SCL = 0;
SomeNOP();
}
void NACK(void) //没有Acknowledge信号
{
SDA = 1;
SomeNOP();
SCL = 1;
SomeNOP();
SCL = 0;
SomeNOP();
}
void AutoACK(void) //在一定的时间内自动确定ACK的信号//
{
Uchar i = 0;
SCL = 1;
SomeNOP();
while((SDA == 1)&&(i<255))i++;
SCL = 0;
SomeNOP();
}
/*I2C写数据程序(向数据线上写一个BYTE)*/
void Writex(Uchar j)
{
Uchar i,temp;
temp = j;
for (i=0;i<8;i++) //串行移位,先送高位,再送低位//
{
temp =temp<<1;
SCL = 0;
SomeNOP();
SDA = CY;
SomeNOP();
SCL = 1;
SomeNOP();
}
SCL = 0;
SomeNOP();
SDA = 1;
SomeNOP();
}
/*I2C读数据程序(从数据线上读出一个BYTE)返回值为读出的数据(BYTE型)*/
Uchar Readx(void)
{
Uchar i,j,k=0;
SCL = 0;
SomeNOP();
SDA = 1;
for (i=0;i<8;i++) // 串行移位,先读出高位,后读出低位//
{
SomeNOP();
SCL = 1;
SomeNOP();
if(SDA ==1) j=1;
else j=0;
k =(k<<1)|j;
SCL = 0;
}
SomeNOP();
return(k); //返回读出的值//
}
//******************以下为对24CXX系列的读写程序******************************//
//*************24CXX的device address 为写0A0H,读为0A1H*********************//
/*某个地址写数据*/
void X24_Write(Uchar Addresslow,Uchar Write_date)
{
I2CStart();
Writex(0xA0);
AutoACK();
Writex(Addresslow);
AutoACK();
Writex(Write_date);
AutoACK();
I2CStop();
Delay_1ms(10);
}
/*对某个地址读操作,函数值为读出的数据*/
Uchar X24_Read(Uchar Addresslow)
{
Uchar i;
I2CStart();
Writex(0xA0);
AutoACK();
Writex(Addresslow);
AutoACK();
I2CStart();
Writex(0xA1);
AutoACK();
i =Readx();
//ACK(); //注意:这里不能有ACK应答信号//
I2CStop();
Delay_1ms(0);
return(i);
}
//以下为串行口中断程序,用于接收串行数据
void rs232(void) interrupt 4
{
if(RI==1)
{
RI=0;
if(SBUF==0xaa)
{
recsum=0x01;
readbit=1;
recip=0x00;
}
else
{
if(SBUF==0xbb)
{
recsum=0x02;
writebit=1;
recip=0x00;
}
else
{
recdata[recip]=SBUF;
recip++;
recsum--;
if(recsum==0x00){rs232okbit=1;}
}
}
}
}
//以下为定时器中断程序,
void time0(void) interrupt 1
{
Uchar temp,k;
TH0=0xfc;
TL0=0x67;
if(rs232okbit==1)
{
rs232okbit=0;
if(readbit==1)
{
readbit=0;
temp=X24_Read(recdata[0]);
SendCommandByte(0x87);
k=(recdata[0]>>4)&0x0f;
if(k<0x0a){k=k+0x30;}
else{k=k+0x37;}
SendDataByte(k);
k=recdata[0]&0x0f;
if(k<0x0a){k=k+0x30;}
else{k=k+0x37;}
SendDataByte(k);
SendCommandByte(0xC7);
k=(temp>>4)&0x0f;
if(k<0x0a){k=k+0x30;}
else{k=k+0x37;}
SendDataByte(k);
k=temp&0x0f;
if(k<0x0a){k=k+0x30;}
else{k=k+0x37;}
SendDataByte(k);
}
if(writebit==1)
{
writebit=0;
SendCommandByte(0x87);
k=(recdata[0]>>4)&0x0f;
if(k<0x0a){k=k+0x30;}
else{k=k+0x37;}
SendDataByte(k);
k=recdata[0]&0x0f;
if(k<0x0a){k=k+0x30;}
else{k=k+0x37;}
SendDataByte(k);
SendCommandByte(0xC7);
k=(recdata[1]>>4)&0x0f;
if(k<0x0a){k=k+0x30;}
else{k=k+0x37;}
SendDataByte(k);
k=recdata[1]&0x0f;
if(k<0x0a){k=k+0x30;}
else{k=k+0x37;}
SendDataByte(k);
X24_Write(recdata[0],recdata[1]);
}
}
}
void main(void)
{
InitLcd();
SendCommandByte(0x80);
Delay(2);
SendDataByte('A');
SendDataByte('D');
SendDataByte('D');
SendDataByte('R');
SendDataByte('E');
SendDataByte(':');
SendCommandByte(0xC0);
Delay(2);
SendDataByte('M');
SendDataByte('E');
SendDataByte('M');
SendDataByte('O');
SendDataByte('R');
SendDataByte('Y');
SendDataByte(':');
TH0=0xfc;
TL0=0x67;
TH1=0xfd;
TL1=0xfd;
TMOD=0x21;
SCON=0x50;
TR0=1;TR1=1;
IE=0x92;
REN=1;
readbit=1;
rs232okbit=1;
while(1)
{}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -