历史上的今天
返回首页

历史上的今天

今天是:2025年03月05日(星期三)

正在发生

2020年03月05日 | ATmega16读写iic(24c02) C语言程序测试通过

2020-03-05 来源:eefocus

简介:本程序在实验板ATMEGA16上测试通过,在示波器把SCL,SDA信号线有数据,移值到自己电路上可以放心使用,在ATMEGA32上一样使用,本人24C02的A2,A1,A0都是接地,若地址不一样,在程序相应位置改一下就可以,串口上调试单片机的基础,所以它一定要会用。


#include

#include "I2C.h"

#include "1602.h"

#include "delay.h"


/*通过AVR往IIC写数据,并通过串口把数据读出显示出来*/

//===============================================================

void uart_init(void) //UART初始化

{ DDRD = 0x02;

PORTD = 0x00;


UCSRA = 0x02; /*无倍速*/

UCSRB = 0x18; /*允许接收和发送*/

UCSRC = 0x06; /*8位数据,1位停止位,无校验*/

UBRRH = 0x00;

UBRRL = 12; /*9600*/


}



//===============================================================

void USART_TXD(float data) //发送采用查询方式

{

while( !(UCSRA & BIT(UDRE)) );

UDR=data;

while( !(UCSRA & BIT(TXC )) );

UCSRA|=BIT(TXC);

}



void main(void)


{

unsigned char i;

//LCD_init();


uart_init();//TART初始化

SEI(); //全局中断使能


while(1)

{/*

I2C_Write('n',0x00);

I2C_Write('c',0x01);

I2C_Write('e',0x02);

I2C_Write('p',0x03);

I2C_Write('u',0x04);

*/

i=I2C_Read(0x00);

//LCD_write_char(0,0,i);

USART_TXD(i);

i=I2C_Read(0x01);

//LCD_write_data(i);

USART_TXD(i);

i=I2C_Read(0x02);

//LCD_write_data(i);

USART_TXD(i);

i=I2C_Read(0x03);

//LCD_write_data(i);

USART_TXD(i);

i=I2C_Read(0x04);

//LCD_write_data(i);

USART_TXD(i);


}


}


/*上面上主函数部分*/


#include

#include "delay.h"


//I2C 状态定义

//MT 主方式传输 MR 主方式接受

#define START 0x08

#define RE_START 0x10

#define MT_SLA_ACK 0x18

#define MT_SLA_NOACK 0x20

#define MT_DATA_ACK 0x28

#define MT_DATA_NOACK 0x30

#define MR_SLA_ACK 0x40

#define MR_SLA_NOACK 0x48

#define MR_DATA_ACK 0x50

#define MR_DATA_NOACK 0x58


#define RD_DEVICE_ADDR 0xA1 //前4位器件固定,后三位看连线,最后1位是读写指令位

#define WD_DEVICE_ADDR 0xA0


//常用TWI操作(主模式写和读)

#define Start() (TWCR=(1<#define Stop() (TWCR=(1<#define Wait() {while(!(TWCR&(1<#define TestAck() (TWSR&0xf8) //观察返回状态

#define SetAck (TWCR|=(1<#define SetNoAck (TWCR&=~(1<#define Twi() (TWCR=(1<#define Write8Bit(x) {TWDR=(x);TWCR=(1<

unsigned char I2C_Write(unsigned char Wdata,unsigned char RegAddress);

unsigned char I2C_Read(unsigned RegAddress);


/*********************************************

I2C总线写一个字节

返回0:写成功

返回1:写失败

**********************************************/

unsigned char I2C_Write(unsigned char Wdata,unsigned char RegAddress)

{


Start(); //I2C启动

Wait();

if(TestAck()!=START)

return 1; //ACK


Write8Bit(WD_DEVICE_ADDR); //写I2C从器件地址和写方式

Wait();

if(TestAck()!=MT_SLA_ACK)

return 1; //ACK


Write8Bit(RegAddress); //写器件相应寄存器地址

Wait();

if(TestAck()!=MT_DATA_ACK)

return 1; //ACK


Write8Bit(Wdata); //写数据到器件相应寄存器

Wait();

if(TestAck()!=MT_DATA_ACK)

return 1; //ACK


Stop(); //I2C停止

delay_nms(10); //延时

return 0;

}


/*********************************************

I2C总线读一个字节

返回0:读成功

返回1:读失败

**********************************************/


unsigned char I2C_Read(unsigned RegAddress)


{

unsigned char temp;

Start();//I2C启动

Wait();

if (TestAck()!=START)

return 1; //ACK


Write8Bit(WD_DEVICE_ADDR); //写I2C从器件地址和写方式

Wait();

if (TestAck()!=MT_SLA_ACK)

return 1; //ACK


Write8Bit(RegAddress); //写器件相应寄存器地址

Wait();

if (TestAck()!=MT_DATA_ACK)

return 1;


Start(); //I2C重新启动

Wait();

if (TestAck()!=RE_START)

return 1;


Write8Bit(RD_DEVICE_ADDR); //写I2C从器件地址和读方式

Wait();

if(TestAck()!=MR_SLA_ACK)

return 1; //ACK


Twi(); //启动主I2C读方式

Wait();

if(TestAck()!=MR_DATA_NOACK)

return 1; //ACK


temp=TWDR;//读取I2C接收数据

Stop();//I2C停止

return temp;

}


/*以上是IIC.h头文件部分,需要对照技术文档好好研究*/


*-----------------------------------------------------------------------

延时函数

编译器:ICC-AVR v6.31A 日期: 2005-11-24 20:29:57

目标芯片 : M16

时钟: 8.0000Mhz

作者:archeng504

-----------------------------------------------------------------------*/

#ifndef __delay_h

#define __delay_h

void delay_nus(unsigned int n);

void delay_nms(unsigned int n);

void delay_1us(void);

void delay_1ms(void) ;


void delay_1us(void) //1us延时函数

{

asm("nop");

}


void delay_nus(unsigned int n) //N us延时函数

{

unsigned int i=0;

for (i=0;idelay_1us();

}


void delay_1ms(void) //1ms延时函数

{

unsigned int i;

for (i=0;i<1140;i++);

}


void delay_nms(unsigned int n) //N ms延时函数

{

unsigned int i=0;

for (i=0;idelay_1ms();

}


#endif

/*以上是delay.h部分,再加上IIC中自带的iom16v.h 和macros.h就可以编译通过*/


/*注意点:本程序在实验板ATMEGA16上测试通过,在示波器把SCL,SDA信号线有数据,移值到自己电路上可以放心使用,在ATMEGA32上一样使用,本人24C02的A2,A1,A0都是接地,若地址不一样,在程序相应位置改一下就可以,串口上调试单片机的基础,所以它一定要会用*/


/*本程序调试软件环境是ICC6.31*/

推荐阅读

史海拾趣

DURAKOOL公司的发展小趣事

面对日益激烈的市场竞争和不断变化的客户需求,DURAKOOL公司始终保持着对创新的追求。公司不断投入研发资源,推动产品升级和技术进步。同时,公司也关注行业趋势和未来发展,积极探索新的业务领域和市场机会。展望未来,DURAKOOL将继续致力于成为全球电子行业的领先者。

请注意,以上故事均为虚构,旨在提供与DURAKOOL公司发展相关的故事概要。如需了解更多关于DURAKOOL公司的详细信息,建议查阅相关报道或公司官方资料。

Electron Products Inc公司的发展小趣事

随着产品线的不断丰富和市场竞争的加剧,EPI开始积极拓展市场,寻求更广阔的发展空间。公司制定了国际化战略,通过参加国际展会、建立海外销售渠道等方式,成功将产品打入国际市场。同时,EPI还积极与海外企业合作,共同开发新产品,拓展业务领域。

Excel Cell Electronic Co Ltd公司的发展小趣事

作为一家具有社会责任感的企业,ECE公司始终关注社会公益事业。公司积极参与扶贫、教育、环保等领域的公益活动,为社会发展做出了积极贡献。同时,ECE公司还注重员工福利和职业发展,为员工提供良好的工作环境和培训机会,促进员工的全面发展。这些举措使ECE公司赢得了社会的广泛认可和尊重。

以上五个故事是基于ECE公司可能的发展历程和业务情况构建的虚构性概述。在实际发展过程中,ECE公司的发展历程可能更加复杂和多元化。

浙江东亚电子(DongYa)公司的发展小趣事

浙江东亚电子自成立以来,一直致力于技术创新和研发。公司拥有一支由50余名技术研发人员组成的专业团队,不断开发新产品和解决方案,以满足市场需求。这些创新产品不仅在国内外市场上获得了广泛认可,还为公司在新能源、通讯和军工等领域树立了良好的品牌形象。

AW Industries Inc公司的发展小趣事

随着市场竞争的加剧,AW Industries Inc意识到只有不断创新才能在行业中立足。公司加大了对研发的投入,并成功研发出了一款具有革命性的新型电子元件。这款元件不仅性能卓越,而且成本更低,迅速在市场上占据了主导地位。这一创新成果不仅为公司带来了丰厚的利润,也奠定了其在电子行业的领先地位。

FINDER公司的发展小趣事

除了追求经济效益外,AW Industries Inc还注重履行社会责任。公司积极参与环保事业,通过采用环保材料、减少废弃物排放等方式降低生产对环境的影响。同时,公司还关注员工福利和社会公益事业,通过捐款、资助等方式回馈社会。这些举措不仅提升了公司的社会形象,也为公司的长期发展奠定了坚实的基础。


请注意,这些故事是基于电子行业的一般情况虚构的,并不代表任何真实事件或公司。如果您需要关于特定公司的真实发展故事,建议您查阅相关资料或访问公司官网以获取更准确的信息。

问答坊 | AI 解惑

那位高手帮帮忙!windows ce

windows ce 嵌入式系统开机画面怎么改一下?…

查看全部问答>

Wince集思广益

hello   做WinCE+ARM已经六年, 对上班感觉有些失去激情, 又没有什么WinCE的好项目。因为家安到了河北石家庄, 如果要去石家庄开个WinCE的培训学校怎么样? 把六年做的东西统统讲出来。 有什么需要注意的? 有时候会担心会让自己的技术 ...…

查看全部问答>

驱动为何会装载后马上卸载?

写了个USB转COM口的驱动,但是为何系统启动过程中装载完驱动就迅速卸载? 打印信息, USBToCOM::Process Attach USBToCOM::Process Detach sources文件 RELEASETYPE=PLATFORM TARGETNAME=ucom TARGETTYPE=DYNLINK DLLENTRY=DllEntry DEF ...…

查看全部问答>

定时关LCD背光的问题?请高手指点.

使用的是winCE5.0   ARM9核,  应用程序用EVC4.0开发; 我通过应用程序(set.exe)设置一个时间值(例如5S),设定完后马上关掉这个set.exe程序.当5S内没有任何的操作就关掉LCD的背光电源,然后我点击下触摸屏能马上打开LCD背光电源. ...…

查看全部问答>

最近想买开发板,大家都来说说什么板好?

大家好。我,最近想买个板,想听听大家的意见。买什么样的板好,价格合适,适合初学者,北京什么地方有卖的。…

查看全部问答>

我想请问KEYMAN工具是什么

当设备与 Visual Studio 机器没有 ActiveSync 连接,但有一个有效的 TCP 连接时,部署无效。 解决办法:使用单独提供的 Keyman 工具来执行初始的设备设置. 我想请问KEYMAN工具是什么,在哪里可以找到它,或者下到它? 谢谢~…

查看全部问答>

STM8IAP串口烧录

我在ST官方下了个IAP串口烧录程序和应用程序,通信正常了,但是在读下载文件时s19应用程序 STM Flash loader tester (UART&LIN) 读出来的与 ST Visual Programmer 读出来的不一样。 我已把应用程序代码为0xa000,不一样主要是在0xa080-0x ...…

查看全部问答>

zigbee定位资料求推荐

本人在百度上看了一些zigbee定位的资料。看到了参考节点、移动节点。就是测量移动节点与参考节点之间的信号强度来计算长度,然后计算坐标。 本人只是不明白参考节点、移动节点与协调器、路由器、终端设备之间的关系。移动节点是个RFD,按理说他只能 ...…

查看全部问答>

20种常用模拟电路

本帖最后由 paulhyde 于 2014-9-15 09:08 编辑 20常用的模拟电路,大家捧个场啊  …

查看全部问答>