⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 24c02.c

📁 I2C总线芯片24C02在单片机上的应用,C语言源码,Keil uVision3工程文件,附原理图及说明学习文档 I2C总线协议 I2C总线协议是一种常见的电子元器件通信协议
💻 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 + -