打印
[AVR单片机]

Mega8 串口接收不改数据程序如下请指教

[复制链接]
1810|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
luxuan_006|  楼主 | 2008-3-24 14:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

/*********************************************************************
** 实验目的:实现用一个数组接收10个数据然后再将这10个数据发送回去
** 遇到问题:接收的数据不能够改变,每次接收后都返回第一次接收到的
             10个数据。
** 调试软件: 串口精灵
*********************************************************************/


/********************************************************************
*********                                                  **********
********* 文件名:  MeUsart.h                              **********
********* 编译软件: EWAVR V4.21a                           **********
********* 编译日期: 22/03/08                               **********
*********                                                  **********
********************************************************************/
#ifndef __MEUSART_H_
#define __MEUSART_H_
/********************************************************************
********* 调入相应CPU的头文件                              **********
********************************************************************/
#include"MeHard.h"

/********************************************************************
********* 宏定义                                           **********
********************************************************************/
#define   BAUDRATE    9600            //定义串口波特率
#define   Send_Mode   1               //定义串口发送模式。0=查询发送
                                      //                  1=中断发送
/********************************************************************
********* 变量定义                                         **********
********************************************************************/
unsigned char *Com_P;                 //定义串口指针
unsigned char Current_Number=0;       //串口当前发送、接收字节数
unsigned char Byte_Number=1;          //串口需要发送、接收字节数
unsigned char Txd_Sending=0;          //数据发送中标志
unsigned char Rxd_Receive=1;          //数据接收中标志

/********************************************************************
*********                                                  **********
********* 函数名:  Inq_Usart_Send                         **********
********* 函数功能: 串口发送程序,查询方式                 **********
********* 编译日期: 22/03/08                               **********
*********                                                  **********
********************************************************************/
void Inq_Usart_Send(void)
{
  while (Current_Number<Byte_Number)
  {
    while(!(UCSRA&(1<<UDRE)));
    UDR=*Com_P;
    Com_P++;
    Current_Number++;
  }
  Current_Number=0;
  Txd_Sending=0;
}

/********************************************************************
*********                                                  **********
********* 函数名:  Int_Usart_Send                         **********
********* 函数功能: 串口发送程序,中断方式                  **********
********* 编译日期: 22/03/08                               **********
*********                                                  **********
********************************************************************/
#pragma vector=USART_TXC_vect
__interrupt void Int_Usart_Send(void)
{
  Com_P++;
  Current_Number++;
  if (Current_Number<Byte_Number)
  {
    UDR=*Com_P;
  }
  else
  {
    Current_Number=0;
    Txd_Sending=0;
  }
}

/********************************************************************
*********                                                  **********
********* 函数名:  Int_Usart_Receive                      **********
********* 函数功能: 串口接收程序,中断方式                  **********
********* 编译日期: 22/03/08                               **********
*********                                                  **********
********************************************************************/
#pragma vector=USART_RXC_vect
__interrupt void Int_Usart_Receive(void)
{
  *Com_P=UDR;
  Com_P++;
  Current_Number++;
  if(Current_Number>=Byte_Number)
  {
    Current_Number=0;
    Rxd_Receive=0;
  }
}

/********************************************************************
*********                                                  **********
********* 函数名:  Usart_Send                             **********
********* 函数功能: 单字节串口发送                         **********
********* 编译日期: 22/03/08                               **********
*********                                                  **********
********************************************************************/
void Usart_Send(void)
{
  Txd_Sending=1;
  if (Send_Mode)
  {
    UDR=*Com_P;
  }
  else
  {
    Inq_Usart_Send();
  }
}

/********************************************************************
*********                                                  **********
********* 函数名:  Init_Usart                             **********
********* 函数功能: 串口初始化程序                         **********
********* 编译日期: 22/03/08                               **********
*********                                                  **********
********************************************************************/
void Init_Usart(void)
{
  UCSRC=(1<<URSEL)|0x06;
  UBRRL=(F_CPU/BAUDRATE/16-1)%256;
  UBRRH=(F_CPU/BAUDRATE/16-1)/256;
  UCSRA=0x00;
  if (Send_Mode)
  {
    UCSRB=(1<<RXEN)|(1<<RXCIE)|(1<<TXEN)|(1<<TXCIE);
  }
  else
  {
    UCSRB=(1<<RXEN)|(1<<RXCIE)|(1<<TXEN);
  }
}
#endif


/*********************************************************************
** 实验目的:实现用一个数组接收10个数据然后再将这10个数据发送回去
** 遇到问题:接收的数据不能够改变,每次接收后都返回第一次接收到的
             10个数据。
** 调试软件: 串口精灵
*********************************************************************/

#include"MeUsart.h"

unsigned char Temp[11]={0,1,2,3,4,5,6,7,8,9};

int main()
{
  Init_Usart();           //串口初始化
  Com_P=Temp;             //设置串口指针指向的数组
  Byte_Number=10;         //设置需要接收的字节数
  Current_Number=0;       //设置当前已接收字节数
  _SEI();                 //开中断
  
  while(1)
  {
    while(Rxd_Receive);   //等待串口接收完
    Com_P=Temp;           //重新定向串口指针指向的数组
    Byte_Number=10;       //设置需要发送的字节数
    Usart_Send();         //串口发送
    while(Txd_Sending);   //等待串口发送完
    Com_P=Temp;           //重新定向串口指针指向的数组
    Rxd_Receive=1;        //等待接收
    Byte_Number=10;       //定义接收数据字节数
  }
}

第一次用AVR 不太明白的地方大家多指教.

相关帖子

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

本版积分规则

2

主题

29

帖子

1

粉丝