📄 24c02.c
字号:
#include <reg52.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <absacc.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
sbit at24c02_scl=P1^6;
sbit at24c02_sda=P1^7;
void delay(uchar delay_temp);//长延时
void delaym(uchar delaym_temp);//短延时
void sta(void);//启动IIC总线
void stop(void);//停止IIC总线数据传送
//void mack(void);//发送应答位
void mnack(void);//发送非应答位
uchar cack(void);//应答位检查
void wrbyt(uchar date_24c02);//向SDA线上发送一个数据字节
uchar rdbyt(void);//从SDA线上读取一个数据字节
uint ii;
uchar temp_1;
main(void)
{
start: for(ii=0;ii<256;ii++)//写入0x55
{
sta();
wrbyt(0xa0);//写24C02
if(cack()!=0)break;
wrbyt((uchar)ii);//地址
if(cack()!=0)break;
wrbyt(0x55);//写数据
if(cack()!=0)break;
stop();
delay(20);//停止到启动信号之间需要延时
}
for(ii=0;ii<256;ii++)//读出并校验0x55
{
sta();
wrbyt(0xa0);
if(cack()!=0)break;
wrbyt((uchar)ii);//地址
if(cack()!=0)break;
sta();
wrbyt(0xa1);//读24C02
if(cack()!=0)break;
temp_1=rdbyt();//在仿真环境中执行到下一步观察temp_1的值
if(temp_1!=0x55)break;
mnack();
stop();
delay(20);
}
goto start;
}
void delay(uchar delay_temp)//延时子程序
{
uchar i,j;
for(i=0;i<delay_temp;i++)
{
for(j=0;j<255;j++);
}
}
void delaym(uchar delaym_temp)//延时子程序
{
uchar i;
for(i=0;i<delaym_temp;i++);
}
void sta(void)//启动IIC总线
{
at24c02_sda=1;
at24c02_scl=1;
delaym(1);
at24c02_sda=0;
delaym(1);
at24c02_scl=0;
}
void stop(void)//停止IIC总线数据传送
{
at24c02_sda=0;
at24c02_scl=1;
delaym(1);
at24c02_sda=1;
delaym(1);
at24c02_scl=0;
}
/*
void mack(void)//发送应答位
{
at24c02_sda=0;
at24c02_scl=1;
delaym(1);
at24c02_scl=0;
at24c02_sda=1;
}
*/
uchar cack(void)//应答位检查
{
uchar i;
i=0x00;
at24c02_sda=1;
at24c02_scl=1;
if(at24c02_sda==1)i=0xff;
at24c02_scl=0;
return i;
}
void mnack(void)//发送非应答位
{
at24c02_sda=1;
at24c02_scl=1;
delaym(1);
at24c02_scl=0;
at24c02_sda=0;
}
void wrbyt(uchar date_w24)//向SDA线上发送一个数据字节
{
uchar i,j;
j=0x80;
for(i=0;i<8;i++)
{
if((date_w24&j)==0)
{
at24c02_sda=0;
at24c02_scl=1;
delaym(1);
at24c02_scl=0;
}
else
{
at24c02_sda=1;
at24c02_scl=1;
delaym(1);
at24c02_scl=0;
at24c02_sda=0;
}
j=j>>1;
}
}
uchar rdbyt(void)//从SDA线上读取一个数据字节
{
uchar i,j;
j=0x00;
for(i=0;i<8;i++)
{
at24c02_sda=1;
at24c02_scl=1;
if(at24c02_sda==0)
{
j=j&0xfe;
}
else
{
j=j|0x01;
}
if(i!=7)j=j<<1;
at24c02_scl=0;
}
return j;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -