历史上的今天
今天是: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 SetAck (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;i } 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 } #endif /*以上是delay.h部分,再加上IIC中自带的iom16v.h 和macros.h就可以编译通过*/ /*注意点:本程序在实验板ATMEGA16上测试通过,在示波器把SCL,SDA信号线有数据,移值到自己电路上可以放心使用,在ATMEGA32上一样使用,本人24C02的A2,A1,A0都是接地,若地址不一样,在程序相应位置改一下就可以,串口上调试单片机的基础,所以它一定要会用*/ /*本程序调试软件环境是ICC6.31*/
史海拾趣
|
写了个USB转COM口的驱动,但是为何系统启动过程中装载完驱动就迅速卸载? 打印信息, USBToCOM::Process Attach USBToCOM::Process Detach sources文件 RELEASETYPE=PLATFORM TARGETNAME=ucom TARGETTYPE=DYNLINK DLLENTRY=DllEntry DEF ...… 查看全部问答> |
|
使用的是winCE5.0 ARM9核, 应用程序用EVC4.0开发; 我通过应用程序(set.exe)设置一个时间值(例如5S),设定完后马上关掉这个set.exe程序.当5S内没有任何的操作就关掉LCD的背光电源,然后我点击下触摸屏能马上打开LCD背光电源. ...… 查看全部问答> |
|
当设备与 Visual Studio 机器没有 ActiveSync 连接,但有一个有效的 TCP 连接时,部署无效。 解决办法:使用单独提供的 Keyman 工具来执行初始的设备设置. 我想请问KEYMAN工具是什么,在哪里可以找到它,或者下到它? 谢谢~… 查看全部问答> |
|
我在ST官方下了个IAP串口烧录程序和应用程序,通信正常了,但是在读下载文件时s19应用程序 STM Flash loader tester (UART&LIN) 读出来的与 ST Visual Programmer 读出来的不一样。 我已把应用程序代码为0xa000,不一样主要是在0xa080-0x ...… 查看全部问答> |
|
本人在百度上看了一些zigbee定位的资料。看到了参考节点、移动节点。就是测量移动节点与参考节点之间的信号强度来计算长度,然后计算坐标。 本人只是不明白参考节点、移动节点与协调器、路由器、终端设备之间的关系。移动节点是个RFD,按理说他只能 ...… 查看全部问答> |




