24c02.c

来自「I2C总线芯片24C02在单片机上的应用,C语言源码,Keil uVision3」· C语言 代码 · 共 174 行

C
174
字号
#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 + =
减小字号Ctrl + -
显示快捷键?