发送:
1,设定数据传输波特率
2,发送START信号,等待应答
3,发送芯片地址,等待应答
4,发送数据的绝对地址,等待应答 ==》
5,发送要写入的数据,等待应答
6,发送STOP信号,释放总线
接收:
1,设定数据传输波特率
2,发送START信号,等待应答
3,发送芯片地址,等待应答
4,发送数据的绝对地址,等待应答 ==》
5,发送RESTART信号,等待应答
6,发送芯片地址并注明读操作,等待应答 ==》
7,读取数据,等待应答
8,发送STOP信号,释放总线
应用芯片 :ATMega 16
代码文件:Project
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IAR_DELAY.H
#ifndef __IAR_DELAY_H
#define __IAR_DELAY_H
#include
#define XTAL 7.3728
#define delay_us(x) __delay_cycles ( (unsigned long)(x * XTAL) )
#define delay_ms(x) __delay_cycles ( (unsigned long)(x * XTAL*1000) )
#define delay_s(x) __delay_cycles ( (unsigned long)(x * XTAL*1000000) )
#endif
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
UART.C
#include
#define uchar unsigned char
#define uint unsigned int
//########################################################### UBRRH=0x00; DDRD_Bit1=1; @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #include void Uart_Init(void); #define IIC_Start() #define IIC_Wait() //##############################################################################[page] unsigned char Receive_Byte ;
void Uart_Init(void)
{
UCSRC = (1<
UBRRL=47;
}
//###########################################################
void Uart_Transmit(uchar data)
{
UDR = data;
}
#include "IAR_DELAY.H"
#define uchar unsigned char
#define uint unsigned int
void Uart_Transmit(uchar data);
//变量声明
#define EEPROM_BUS_ADDRESS 0xA0
//主机发送模式时各状态字的后续动作
#define TW_START
#define TW_REP_START
#define TW_MT_SLA_ACK
#define TW_MT_SLA_NACK
#define TW_MT_DATA_ACK
#define TW_MT_DATA_NACK
#define TW_MT_ARB_LOST
//主机接收模式时各状态字的后续动作
#define TW_MR_ARB_LOST
#define TW_MR_SLA_ACK
#define TW_MR_SLA_NACK
#define TW_MR_DATA_ACK
#define TW_MR_DATA_NACK
#define IIC_Stop()
unsigned char twi_write(unsigned char addr, unsigned char dd)
{
IIC_Start();
IIC_Wait();
if ((TWSR & 0xF8) != 0x08) return 0; //检测到TWINT位置位,比对TWSR寄存器内的状态量,如果正确则向下进行数据传输,错误返回 0
TWDR = EEPROM_BUS_ADDRESS ;
TWCR = (1 << TWINT) | (1 << TWEN);
IIC_Wait();
if ((TWSR & 0xF8) != 0x18) return 0; //检测到TWINT位置位,比对TWSR寄存器内的状态量 , 如果正确则向下进行数据传输,错误返回 0
TWDR = addr;
TWCR = (1 << TWINT) | (1 << TWEN);
IIC_Wait();
if ((TWSR & 0xF8) != 0x28) return 0; //检测到TWINT位置位,比对TWSR寄存器内的状态量 , 如果正确则向下进行数据传输,错误返回 0
TWDR = dd;
TWCR = (1 << TWINT) | (1 << TWEN);
IIC_Wait();
if ((TWSR & 0xF8) != 0x28) return 0; //检测到TWINT位置位,比对TWSR寄存器内的状态量 , 如果正确则向下进行数据传输,错误返回 0
IIC_Stop();
return 1;
}
//##############################################################################
unsigned char twi_read(unsigned char addr)
{
TWBR = 2;
IIC_Start();
IIC_Wait();
if ((TWSR & 0xF8) != 0x08) return 0; //检测到TWINT位置位,比对TWSR寄存器内的状态量,如果正确则向下进行数据传输,错误返回 0
TWDR = EEPROM_BUS_ADDRESS;
TWCR = (1 << TWINT) | (1 << TWEN);
IIC_Wait();
if ((TWSR & 0xF8) != 0x18) return 0; //检测到TWINT位置位,比对TWSR寄存器内的状态量 , 如果正确则向下进行数据传输,错误返回 0
TWDR = addr;
TWCR = (1 << TWINT) | (1 << TWEN);
IIC_Wait();
if ((TWSR & 0xF8) != 0x28) return 0; //检测到TWINT位置位,比对TWSR寄存器内的状态量 , 如果正确则向下进行数据传输,错误返回 0
IIC_Start();
if ((TWSR & 0xF8) != 0x10) return 0; //检测到TWINT位置位,比对TWSR寄存器内的状态量 , 如果正确则向下进行数据传输,错误返回 0
TWDR = 0xA1;
TWCR = (1 << TWINT) | (1 << TWEN);
IIC_Wait();
if ((TWSR & 0xF8) != 0x40) return 0; //检测到TWINT位置位,比对TWSR寄存器内的状态量 , 如果正确则向下进行数据传输,错误返回 0
TWCR = (1 << TWINT) | (1 << TWEN);
IIC_Wait();
if ((TWSR & 0xF8) != 0x58) return 0; //检测到TWINT位置位,比对TWSR寄存器内的状态量 , 如果正确则向下进行数据传输,错误返回 0
Receive_Byte = TWDR;
IIC_Stop();
}
//##############################################################################
void main(void)
{
uchar c,d;
Uart_Init();
delay_us(20);
Uart_Transmit(0x55);
c = twi_write(0x51,0xf8);
Uart_Transmit(c);
delay_ms(2);
d = twi_read(0x51);
Uart_Transmit(d);
while(1);
}
上一篇:AVR单片机(学习ing)-ATMEGA16的USART与PC机串行通信
下一篇:AVR单片机(学习ing)—(九)、ATMEGA16的模数转换器—01
推荐阅读最新更新时间:2024-03-16 14:33
![<font color='red'>AVR单片机</font>(ATMEGA16)DA0832芯片D/A转换](https://6.eewimg.cn/news/statics/images/loading.gif)
![基于<font color='red'>AVR单片机</font>的汽车空调控制系统设计](https://6.eewimg.cn/news/statics/images/loading.gif)
![自制51/<font color='red'>avr单片机</font>USB ISP 下载<font color='red'>线</font>](https://6.eewimg.cn/news/statics/images/loading.gif)
![基于<font color='red'>AVR单片机</font>的有害气体感应及警示控制系统的设计](https://6.eewimg.cn/news/statics/images/loading.gif)
![<font color='red'>avr单片机</font>c语言编程风格介绍](https://6.eewimg.cn/news/statics/images/loading.gif)
![<font color='red'>avr单片机</font>用什么编程?<font color='red'>avr单片机</font>编程方式是什么](https://6.eewimg.cn/news/statics/images/loading.gif)