#include "iom16v.h"
#include "macros.h"
#include "stdio.h"
//主模式启动状态
#define IIC_START 0x08 //启动总线
#define IIC_RESTART 0x10 //再启动总线
//主发送模式各种状态
#define MT_SLA_ACK 0x18 //SLA_W写地址已发送,收到应答位
#define MT_SLA_NACK 0x20 //SLA_W写地址已发送,收到非应答位
#define MT_DATA_ACK 0x28 //写入数据已发送,收到应答位
#define MT_DATA_NACK 0x30 //写入数据已发送,收到非应答位
#define MT_ARB_LOST 0x38 //SLA_W或数据仲裁失败
//主接收模式各种状态
#define MR_ARB_LOST 0x38 //SLA_W或数据仲裁失败
#define MR_SLA_ACK 0x40 //SLA_R已发送,收到应答位
#define MR_SLA_NACK 0x48 //SLA_R已发送,收到非应答位
#define MR_DATA_ACK 0x50 //接收到数据,应答位已返回
#define MR_DATA_NACK 0x58 //接收到数据,非应答位已返回
//IIC操作
#define IIC_Start() (TWCR=BIT(TWINT)|BIT(TWSTA)|BIT(TWEN))
#define IIC_Stop() (TWCR=BIT(TWINT)|BIT(TWSTO)|BIT(TWEN))
#define IIC_STATUS (TWSR & 0xf8)
#define IIC_Send() (TWCR=BIT(TWINT)|BIT(TWEN))
#define IIC_SendAck() (TWCR|=BIT(TWEA))
#define IIC_SendNoAck() (TWCR&=~BIT(TWEA))
#define IIC_ReadNoAck() (TWCR=BIT(TWINT)|BIT(TWEN))
#define IIC_ReadAck() (TWCR=BIT(TWINT)|BIT(TWEN)|BIT(TWEA))
#define IIC_Wait() while(!( TWCR & BIT(TWINT)))
//波特率,晶振
#define BAUD 9600
#define FXTAL 8000000
//串口接收完毕中断触发声明
#pragma interrupt_handler USART_Received_Ir:12
unsigned char Temp[7]={0,0,0,0,0,0,0};
unsigned char RX_Buffer,RX_Flag=0;
//IIC配置
unsigned char temp;
void delay_ms(unsigned int y)
{
unsigned int m,n;
for(n=y;n>0;n--)
for(m=0;m<1300;m++);
}
//串口IO初始化函数
void USART_IO_Init(void)
{
DDRD|=BIT(PD1); //PD1:TX为输出状态
}
//串口初始化函数
void USART_Init(void)
{
unsigned int Temp;
USART_IO_Init(); //串口IO初始化函数调用
UCSRA=0; //串口控制器A清零
UCSRB=0x00; //串口控制器B清零
UCSRC|=BIT(URSEL)|BIT(UCSZ1)|BIT(UCSZ0); //选择USCRC,异步操作,禁止检验危,1个停止位,八位数据
Temp=(FXTAL/BAUD/16)-1; //求出9600波特率的赋值
//UBRRH=((Temp>>8)&0x00ff); //波特率寄存器高八位赋值
//UBRRL=(Temp&0x00ff); //波特率寄存器低八位赋值
UBRRH=0x00;
UBRRL=0x33;
//UBRR=51; //从手册中直接取得赋值,9600kbps
UCSRB|=BIT(TXEN)|BIT(RXEN)|BIT(RXCIE); //发送使能、接受使能、接收完毕中断使能
SREG|=BIT(7); //全局中断使能
}
//串口发送函数
void USART_Send(unsigned char Data)
{
while(!(UCSRA&(BIT(UDRE)))); //数据寄存器UDR是否为空?
UDR=Data; //UDR赋值
while(!(UCSRA&(BIT(TXC)))); //数据是否已经发送完毕?
UCSRA|=BIT(TXC); //清除发送完毕标志位
}
void USART_Received_Ir()
{
UCSRB&=~BIT(RXCIE); //接收完毕中断不使能
RX_Buffer=UDR; //读取UDR的数据
if(RX_Buffer==1)
RX_Flag=1;
else RX_Flag=0;
UCSRB|=BIT(RXCIE); //接收完毕中断使能
}
//IIC初始化函数
void IIC_Init(void)
{
TWBR=32; //晶振为8Mhz,100KHz的波特率
TWSR=0; //无预分频
TWCR=0x44; //TWINT位清零,TWWC位清零
}
/************************************************************/
//co2数据的读取
/**********************************************************/
unsigned int co2_data()
{
}
/*******************************/
//数据处理
/******************************/
void data_conduct(unsigned int data)
{
}
void main()
{
unsigned int co2;
USART_Init();
IIC_Init(); //IIC初始化
while(1)
{
if(RX_Flag)
{
co2=co2_data();
data_conduct(co2);
delay_ms(2000);
}
}
}
|