📄 89s51+24c02.txt
字号:
/************************************************************************************/
/* 程序名:AT24C02的读取操作 */
/* */
/* 晶振:11.0592M CPU型号:AT89S52 */
/* */
/* */
/* 功能描述: 对单个AT24C02进行读和写的操作 */
/* */
/* */
/************************************************************************************/
#include<reg52.h>
#define _TH0_TL0_ (65536 - 50000)
#define HI (_TH0_TL0_ / 256) //给高8位赋值
#define LO (_TH0_TL0_ % 256) //给低8位赋值
#define M 20 //(1000/50)1秒要50个中断的累计
#define TRUE 1
#define FALSE 0
#define Delay_TIME 60 /*经实验,不要小于50!否则可能造成时序混乱*/
sbit P2_4 = P2 ^ 4;
sbit P2_6 = P2 ^ 6;
unsigned char Seg_tab[] = {0x41, 0xf5, 0x29, 0x31, 0x95, 0x13, 0x03, 0x75, 0x01, 0x11,0x05,0x83,0x4b,0xa1,0x0b,0x0f};//0-f数字
unsigned char a;
unsigned char tmp=7;
sbit SCL = P1 ^ 0;
sbit SDA = P1 ^ 1;
/********** Function Definition 函数定义 ************/
void delay(unsigned int t) /*延时函数*/
{
while(t!=0)
t--;
}
void I2C_Start(void)
{
/*启动I2C总线的函数,当SCL为高电平时使SDA产生一个负跳变*/
SDA=1;
SCL=1;
delay(Delay_TIME);
SDA=0;
delay(Delay_TIME);
SCL=0;
delay(Delay_TIME);
}
void I2C_Stop(void)
{
/*终止I2C总线,当SCL为高电平时使SDA产生一个正跳变*/
SDA=0;
SCL=1;
delay(Delay_TIME);
SDA=1;
delay(Delay_TIME);
SCL=0;
delay(Delay_TIME);
}
void SEND_0(void) /* SEND ACK */
{
/*发送0,在SCL为高电平时使SDA信号为低*/
SDA=0;
SCL=1;
delay(Delay_TIME);
SCL=0;
delay(Delay_TIME);
}
void SEND_1(void)
{
/*发送1,在SCL为高电平时使SDA信号为高*/
SDA=1;
SCL=1;
delay(Delay_TIME);
SCL=0;
delay(Delay_TIME);
}
bit Check_Acknowledge(void)
{
/*发送完一个字节后检验设备的应答信号*/
SDA=1;
SCL=1;
delay(Delay_TIME/2);
F0=SDA;
delay(Delay_TIME/2);
SCL=0;
delay(Delay_TIME);
if(F0==1){
return FALSE;
}
return TRUE;
}
void WriteI2CByte(unsigned char b)reentrant
{
/*向I2C总线写一个字节*/
unsigned char i;
for(i=0;i<8;i++)
if((b<<i)&0x80)
SEND_1();
else
SEND_0();
}
unsigned char ReadI2CByte(void)reentrant
{
/*从I2C总线读一个字节*/
unsigned char b=0,i;
for(i=0;i<8;i++)
{
SDA=1; /*释放总线*/
SCL=1; /*接受数据*/
delay(10);
F0=SDA;
delay(10);
SCL=0;
if(F0==1)
{
b=b<<1;
b=b|0x01;
}
else
b=b<<1;
}
return b;
}
/**********以下为读写24c02的函数******************************/
void Write_One_Byte(unsigned char addr,unsigned char thedata)
{
bit acktemp=1;
/*write a byte to mem*/
I2C_Start();
WriteI2CByte(0xa0);
acktemp=Check_Acknowledge();
WriteI2CByte(addr); /*address*/
acktemp=Check_Acknowledge();
WriteI2CByte(thedata); /*thedata*/
acktemp=Check_Acknowledge();
I2C_Stop();
}
/*************************************************************/
char Read_One_Byte(unsigned char addr)
{
bit acktemp=1;
unsigned char mydata;
/*read a byte from mem*/
I2C_Start();
WriteI2CByte(0xa0);
acktemp=Check_Acknowledge();
WriteI2CByte(addr);/*address*/
acktemp=Check_Acknowledge();
I2C_Start();
WriteI2CByte(0xa1);
acktemp=Check_Acknowledge();
mydata=ReadI2CByte();
acktemp=Check_Acknowledge();
return mydata;
I2C_Stop();
}
//调用方式如下:
//Write_One_Byte(0x10,0x04);
//k=Read_One_Byte(0x10);
/*****************************************************************************/
void IsrTimer0(void) interrupt 1 using 1 //定时器0中断服务程序
{
TR0 = 0; //以下调整出栈入栈的时间误差
TL0 += (_TH0_TL0_ + 9) % 256;
TH0 += (_TH0_TL0_ + 9) / 256 + (char)CY;
TR0 = 1;
// P1=tmp;
P2_4 = 0x00;
P0 = Seg_tab[tmp/10]; //将得到的A值赋值给P1口。
delay(1000);
delay(1000);
delay(1000);
P2_4 = 0x01;
P2_6 = 0x00;
P0 = Seg_tab[tmp%10];
delay(1000);
delay(1000);
delay(1000);
P2_6 = 0x01;
}
/******************************************************************************/
/******************************************************************************/
void main(void)
{
// P2 = 0xff;
TMOD = 0x21; //设置模式1 定时器0 工作方式0
TH0 = HI; //给TH0,TL0赋初始值
TL0 = LO;
TR0 = 1; //启动定时器0
ET0 = 1; //定时器中断开
// EA = 1; //总中断开
// TMOD = 0x20; //在11.0592M下,设置波特率9600,方式1
TL1 = 0xfd;
TH1 = 0xfd;
SCON = 0Xd8;
PCON = 0X00;
TR1 = 1;
EA = 1; //总中断开
while(1)
{
while(RI == 0);//等待接受完毕
RI = 0;
a = SBUF;
Write_One_Byte(0x04,a);//往2402的0X04地址写如数值0X07
tmp = Read_One_Byte(0x04);//将读出来的数值给tmp
SBUF = a;//将A中的值发到PC上去
while(TI == 0);
TI = 0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -