您的位置 首页 传感器

测验AVR的TWI写24c02芯片的简略函数

//文件名:I2C.h//描述:声明读写24c02以及初始化TWI的全局函数#defineucharunsignedchar#defineuintunsignedintvoidI2C_I…

//文件名:”I2C.h”

//描绘:声明读写24c02以及初始化TWI的大局函数

#define uchar unsigned char
#define uint unsigned int
void I2C_Inti(void);
void Write_24c02(uchar add,uchar data);
uchar Read_24c02(uchar add);

//文件名:”I2C.c”

//描绘:界说关于24c02以及TWI的相关函数

#include
#include
#include”I2C.h”

#define TW_START 0X08
#define TW_REP_START 0X10
#define TW_MT_SLA_ACK 0X18
#define TW_MT_SLA_nACK 0X20
#define TW_MT_DATA_ACK 0X28
#define TW_MT_DATA_nACK 0X30
#define TW_MT_LOST 0X38
#define TW_MR_LOST 0X38
#define TW_MR_SLA_ACK 0X40
#define TW_MR_SLA_nACK 0X48
#define TW_MR_DATA_ACK 0X50
#define TW_MR_DATA_nACK 0X58

//函数名;I2C_Inti
//输入:无
//输出:无
//描绘:初始化AVR的TWI端口

void I2C_Inti(void)
{
TWBR=10;
TWSR=0X00;
TWAR=0X00;
DDRC=0X80;
PORTC=0XFF;
}

//函数名;I2C_Start
//输入:无
//输出:成功回来1,失利回来0
//描绘:TWI开端(或重复开端)函数

uchar I2C_Start(void)
{
TWCR=BIT(TWINT)|BIT(TWSTA)|BIT(TWEN);
while(!(TWCR&BIT(TWINT)));
if((TWSR&0XF8)==TW_START)//开端TWI成功
{
return 1;
}
if((TWSR&0XF8)==TW_REP_START) //再次开端TWI成功
{
return 1;
}
return 0;
}

//函数名;I2C_Stop
//输入:无
//输出:无
//描绘:TWI完毕函数

void I2C_Stop(void)
{
TWCR=BIT(TWINT)|BIT(TWEN)|BIT(TWSTO);
}

//函数名;Write_I2C
//输入:待写的地址或数据
//输出:有应对回来1,无应对回来0
//描绘:主机写

uchar Write_I2C(uchar data)
{
uchar ack=1;
TWDR=data;
TWCR=BIT(TWINT)|BIT(TWEN);
while(!(TWCR&BIT(TWINT)));
if((TWSR&0XF8)==TW_MT_SLA_ACK) //发送芯片地址(写)成功,有应对
{
return ack;
}
if((TWSR&0XF8)==TW_MT_DATA_ACK) //发送数据成功,有应对
{
return ack;
}
if((TWSR&0XF8)==TW_MR_SLA_ACK) //发送芯片地址(读)成功,有应对
{
return ack;
}
return 0;
}

//函数名;Read_I2C
//输入:是否应对,1–发送应对,0–不发送应对
//输出:读数据成功回来读出的一个字节数据,失利回来0
//描绘:主机读

uchar Read_I2C(uchar ack)
{
if(ack)
{
TWCR=BIT(TWINT)|BIT(TWEN)|BIT(TWEA);
while(!(TWCR&BIT(TWINT)));
if((TWSR&0XF8)==TW_MR_DATA_ACK)
{
return(TWDR);
}
}
else
{
TWCR=BIT(TWINT)|BIT(TWEN);
while(!(TWCR&BIT(TWINT)));
if((TWSR&0XF8)==TW_MR_DATA_nACK)
{
return(TWDR);
}
}
return 0;
}

//函数名;Read_24c02
//输入:存储地址add
//输出:回来读出的一个字节数据
//描绘:主机读24c02指定地址

uchar Read_24c02(uchar add)
{
uchar data;
I2C_Start();
Write_I2C(0XAE);
Write_I2C(add);
I2C_Start();
Write_I2C(0XAF);
data=Read_I2C(0);
I2C_Stop();
return data;
}

//函数名;Write_24c02
//输入:存储地址add,待写的数据data
//输出:无
//描绘:主机写24c02指定地址一个字节的数据

void Write_24c02(uchar add,uchar data)
{
I2C_Start();
Write_I2C(0XAE);
Write_I2C(add);
Write_I2C(data);
I2C_Stop();
}

//文件名:”main.c”

//描绘:测验读写24c02的函数,使用数码管显现

#include
#include
#include”I2C.h”

#define ON_138 PORTC|=BIT(PC7) //使能74138
#define OFF_138 PORTC&=~BIT(PC7)

const uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //显现的段码值
uchar buffer[]={0,0,0}; //寄存待显现的数据的段码

//函数名;Send_Buffer
//输入:待数码管显现的数据
//输出:无
//描绘:将显现的数据译码

void Send_Buffer(uchar data)
{
buffer[0]=table[data/100];
data=data0;
buffer[1]=table[data/10];
data=data;
buffer[2]=table[data];
}

//函数名;Display
//输入:待显现的方位和段码值,site–[0,2]
//输出:无
//描绘:在指定方位显现指定数据

void Display(uchar site,uchar data)
{
if(site==0)
{
PORTA=0X00;
PORTB=data;
}
if(site==1)
{
PORTA=0X01;
PORTB=data;
}
if(site==2)
{
PORTA=0X02;
PORTB=data;
}
}

//函数名;delay_ms
//输入:无
//输出:无
//描绘:延时1ms

void delay_ms(uint ms)
{
uint i,j;
for(i=0;i for(j=0;j<564;j++);
}

void main()
{
uchar temp;
I2C_Inti();
DDRA=0XFF;
PORTA=0X00;
DDRB=0XFF;
PORTB=0X00;
ON_138;
temp=Read_24c02(0x08); //读地址为0x08的存储数据
Send_Buffer(temp);
temp++;
Write_24c02(0x08,temp); // 写temp到存储地址0x08
while(1)
{
Display(0,buffer[0]);
delay_ms(3);
Display(1,buffer[1]);
delay_ms(3);
Display(2,buffer[2]);
delay_ms(3);
}
}

附图:

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/chuanganqi/264406.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部