打印
[AVR单片机]

串口发送一 ,不开始接受数据怎么回事

[复制链接]
1181|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
liwei900712|  楼主 | 2013-12-17 10:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#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);
               
          }
        }
}

相关帖子

受到警告 沙发
dong00520| | 2013-12-17 10:31 | 只看该作者
好贴得顶!

使用特权

评论回复
板凳
qin552011373| | 2013-12-18 08:20 | 只看该作者
从哪里抄来的?

使用特权

评论回复
地板
qin552011373| | 2013-12-18 08:22 | 只看该作者
************************************************************/
   //co2数据的读取
/**********************************************************/
unsigned int co2_data()
{
}

/*******************************/
//数据处理
/******************************/
void data_conduct(unsigned int data)
{
}


这两个函数整个是空函数,没有执行语句,你的while里面还调用了?!

使用特权

评论回复
5
yushan210| | 2013-12-18 08:31 | 只看该作者
为什么要用iic中断接受在发送就行了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

22

帖子

0

粉丝