📄 24cxx.c
字号:
/*实验名称:读写AT24C02实验
功能:用串口发送指令读出或写入00-7FH单无的内容,显示结果在LCD上显示
读出(16进制数):AA 地址
写入(16进制数):BB 地址 内容
作者:http://www.mcuyjf.com.cn
05-02-01
*/
#include <reg51.h>
#define Uchar unsigned char
#define Uint unsigned int
#define SomeNOP(); _nop_();_nop_();_nop_();
//定义变量
Uchar recip,recsum,myflag,recdata[2]; //接收指针,接收个数,用户标志,接收存放数组
sbit readbit = myflag^0; //读EEPROM标志
sbit writebit = myflag^1; //写EEPROM标志
sbit rs232okbit = myflag^2; //接收完一拍完整的指令
/*I2C要用到的口线定意*/
sbit SDA = P2^7;
sbit SCL = P2^6;
/*控制的口线定意*/
//LCD口线的定义
sbit E = P3^5;
sbit RW = P3^6;
sbit RS = P3^7;
//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;
TH0=0xfc;
TL0=0x67;
if(rs232okbit==1)
{
rs232okbit=0;
if(readbit==1)
{
readbit=0;
temp=X24_Read(recdata[0]);
}
}
}
void main(void)
{
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -