ATMEGA16读写iic(24c02) C语言程序 测试通过

发布者:平安心境最新更新时间:2015-03-11 来源: 51hei关键字:ATMEGA16  读写iic  24c02  C语言程序 手机看文章 扫描二维码
随时随地手机看文章
#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;
}[page]

/*********************************************
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;i    delay_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;i    delay_1ms();
}

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

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

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

关键字:ATMEGA16  读写iic  24c02  C语言程序 引用地址:ATMEGA16读写iic(24c02) C语言程序 测试通过

上一篇:自制AVR ATmega16 JTAG
下一篇:AVR单片机ATMega16的UART通信总结

推荐阅读最新更新时间:2024-03-16 13:54

单片机系统的C语言程序结构优化
   2002年初,笔者着手写一个IC卡预付费电表的工作程序,该电表使用Philips公司的8位51扩展型单片机 87LPC764 ,要求实现很多功能,包括熄显示、负荷计算与控制、指示闪烁以及电表各种参数的查询等,总之,要使用时间的单元很多。笔者当时使用ASM51完成了这个程序的编写,完成后的程序量是2KB多一点。后来,由于种种原因,这个程序并没有真正使用,只是作了一些改动之后用在一个老化设备上进行计时与负荷计算。约一年后,笔者又重新改写了这些代码。 1 系统的改进   可以说,这个用ASM51实现的代码是没有什么组织性可言的,要什么功能就加入什么功能,弄得程序的结构非常松散,其实这也是导致笔者最终决定重新改写这些代码的
[单片机]
AVR单片机ATMEGA16 1602液晶驱动程序及心得
我自己研发的AVR微控制器芯片开发板,1602液晶屏实验成功!我很欣慰.写了一整天的程序,反复实验,最终在凌晨0点.终于成功了. 在此过程中,最大的问题莫过于那个所谓配套的1602液晶屏数据手册!这个手册简直是误人子弟,里面资料写的很含糊.并且有错误,而导致我反复试验失败,最终,我使用了通用的1602液晶屏数据手册,才得以成功. 我自制的AVR开发板尺寸和我买的51开发板差不多大小,ATmega16最小系统,8位数码管,蓝光流水灯,isp编程接口.过载保护保险丝,两个74hc573锁存器.1602液晶屏都已焊接完成,万用板是12X18cm的单孔玻纤板(质量不太好,便宜没好货).现在我才发现不够用,模块数量相同的两块实验板
[单片机]
单片机C语言程序设计:8X8LED 点阵显示数字
/* 名称:按键控制 8X8LED 点阵屏显 示图形 说明:每次按下 K1 时,会使 8X8LED 点阵屏循环显示不同图形。 本例同时使用外部中断和定 时中断。 */ #include reg51.h #include intrins.h #define uchar unsigned char #define uint unsigned int //待显示图形编码 uchar code M = { {0x00,0x7e,0x7e,0x7e,0x7e,0x7e,0x7e,0x00}, //图 1 {0x00,0x38,0x44,0x54,0x44,0x38,0x00,0x00}, //图 2 {0x
[单片机]
单片机<font color='red'>C语言程序</font>设计:8X8LED 点阵显示数字
AVR(ATMEGA128/ATMEGA16)数码管显示
这是多文件形式,程序为128的,16的没什么区别 PROTEUS仿真图 /****************led数码管的头文件*********************/ #ifndef __led_H__ #define __led_H__ #define led_wei_ddr DDRD|=0X0F #define led_wei PORTD #define led_duan_ddr DDRF=0XFF #define led_duan PORTF extern void led_display(uint dat,uchar num); #endif /************led数码管显示函数的C文件****
[单片机]
AVR(ATMEGA128/<font color='red'>ATMEGA16</font>)数码管显示
24C02串行E2PROM的读写资料
I2C总线是一种用于IC器件之间连接的二线制总线。它通过SDA(串行数据线)及SCL(串行时钟线)两根线在连到总线上的器件之间传送信息,并根据地址识别每个器件:不管是单片机、存储器、LCD驱动器还是键盘接口。   1.I2C总线的基本结构 采用I2C总线标准的单片机或IC器件,其内部不仅有I2C接口电路,而且将内部各单元电路按功能划分为若干相对独立的模块,通过软件寻址实现片选,减少了器件片选线的连接。CPU不仅能通过指令将某个功能单元电路挂靠或摘离总线,还可对该单元的工作状况进行检测,从而实现对硬件系统的既简单又灵活的扩展与控制。I2C总线接口电路结构如图1所示。 2.双向传输的接口特性 传统的单片机串行接口的发送和接
[单片机]
<font color='red'>24C02</font>串行E2PROM的<font color='red'>读写</font>资料
小容量单片机系统的C语言程序结构
引 言:   2002年初,笔者着手写一个IC卡预付费电表的工作程序,该电表使用Philips公司的8位51扩展型单片机87LPC764,要求实现很多功能,包括熄显示、负荷计算与控制、指示闪烁以及电表各种参数的查询等,总之,要使用时间的单元很多。笔者当时使用ASM51完成了这个程序的编写,完成后的程序量是2KB多一点。后来,由于种种原因,这个程序并没有真正使用,只是作了一些改动之后用在一个老化设备上进行计时与负荷计算。约一年后,笔者又重新改写了这些代码。 1 系统的改进   可以说,这个用ASM51实现的代码是没有什么组织性可言的,要什么功能就加入什么功能,弄得程序的结构非常松散,其实这也是导致笔者最终决定重新改写这些代
[单片机]
查找嵌入式C语言程序/软件中的缺陷的多种技术
    基于模式的静态代码分析、运行时内存监测、单元测试以及数据流分析等软件验证技术是查找嵌入式C语言程序/软件缺陷行之有效的方法。上述技术中的每一种都能查找出某一类特定的错误。即便如此,如果用户仅采用上述技术中的一种或者几种来进行验证,这样的验证方法很有可能会漏过对程序中的一些缺陷的检查。解决此类问题的一种安全和有效的策略就是同时使用上述软件验证中的所有互补技术。这样就能建立起一个牢固的框架来帮助用户检查出可能会避开某种特定技术的缺陷。与此同时,用户也自然地建立起一个能检测出关键并且难以查找的功能性错误的环境。     本文将详尽阐述基于模式的静态代码分析、运行时内存错误检测、单元测试以及数据流分析等自动化技术共同使用时是如何查
[嵌入式]
可编程数字电位器在atmega16单片机中的应用
1 引言   AVR嵌入式单片机具有丰富的硬件、软件资源,其中的串行I2C接口能满足很多应用场合的要求,两个AVR单片机通过I2C总线直接连接就可实现单片机相互通信;AVR单片机还可以和任何具有I2C总线接口的外设直接连接而无须其它硬件电路支持。而X9221系列可编程数字电位器在智能测试设备上应用非常广泛,通过I2C总线可以简单地构成单片机与各种外设之间乃至与计算机之间的通信,建立友好的人机界面联系。硬件设计简单、灵活,只需要将所有设备的SDA和SCL信号线分别并联在一起并加上拉电阻即可,有助于提高设备的自动化水平、可靠性、稳定性及电气装配的工艺性。AVR单片机和X9221系列可编程数字电位器都有内置的E2ROM单元,可以非常方
[单片机]
可编程数字电位器在<font color='red'>atmega16</font>单片机中的应用
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved