#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操作(主模式写和读) unsigned char I2C_Write(unsigned char Wdata,unsigned char RegAddress); /********************************************* Start(); //I2C启动 /********************************************* unsigned char I2C_Read(unsigned RegAddress) { /*以上是IIC.h头文件部分,需要对照技术文档好好研究*/ *----------------------------------------------------------------------- void delay_1us(void) //1us延时函数 void delay_nus(unsigned int n) //N us延时函数 void delay_1ms(void) //1ms延时函数 void delay_nms(unsigned int n) //N ms延时函数 #endif /*注意点:本程序在实验板ATMEGA16上测试通过,在示波器把SCL,SDA信号线有数据,移值到自己电路上可以放心使用,在ATMEGA32上一样使用,本人24C02的A2,A1,A0都是接地,若地址不一样,在程序相应位置改一下就可以,串口上调试单片机的基础,所以它一定要会用*/ /*本程序调试软件环境是ICC6.31*/
#define Start() (TWCR=(1<
#define SetAck (TWCR|=(1<
unsigned char I2C_Read(unsigned RegAddress);
I2C总线写一个字节
返回0:写成功
返回1:写失败
**********************************************/
unsigned char I2C_Write(unsigned char Wdata,unsigned char RegAddress)
{
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 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;
}
延时函数
编译器: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) ;
{
asm("nop");
}
{
unsigned int i=0;
for (i=0;i
}
{
unsigned int i;
for (i=0;i<1140;i++);
}
{
unsigned int i=0;
for (i=0;i
}
/*以上是delay.h部分,再加上IIC中自带的iom16v.h 和macros.h就可以编译通过*/
上一篇:自制AVR ATmega16 JTAG
下一篇:AVR单片机ATMega16的UART通信总结
推荐阅读最新更新时间:2024-03-16 13:54
设计资源 培训 开发板 精华推荐
- ADI 生命体征监测技术:对人体实施状态监控,答题有好礼
- 下载文章:“深入了解信号发生器”丰富知识赢取好礼
- 开启Altera SoC体验之旅,玩转Altera Cyclone V系列SoC
- 下载有礼!是德科技高速数字精选解决方案,专为您的数字设计而挑战!
- 英飞凌&英恒|如何选择一颗合适的车用MOSFET
- 趣味电子技术史话之通信技术史——科技与人文的结合,传奇故事在这里!
- ADI学霸型讲师又来了,探讨MEMS传感器和工业设备的故障监测
- 是德科技推出新的8通道示波器 点击获取报价
- “西北模电王”新概念模拟电路3——《运放电路的频率特性和滤波器》
- 了解设计完整AC-DC系统的快速低风险方法,轻松答题赢好礼