MCU

串口接收和发送

0
阅读(2583)

/***********************************************************************************

程序实现功能:用串口调试助手向单片机发送一个16进制数,如00,01,02,。。。。。FF;那
么电路板上的LED灯会反应出发送的这 个16进制数的状态。

与此同时,串口调试助手的接收区里会显示串口调试助手向单片机发送的那个16进制数

注:LED灯亮时表示为低电平,LED灯灭时表示为高电平。

注:一次只能发一个16进制数 波特率为4800


************************************************************************************/


#include <iom16v.h>
#include <macros.h>


#define LED_DDR     DDRA
#define LED_PORT    PORTA

unsigned char received_data=0xff;//定义一个全局变量,令它初始值为高

unsigned char flag="0";
/***********************************************
             串口初始化子程序
***********************************************/
void INIT_USART(void)
  {
    UCSRB = 0x00; //disable while setting baud rate
    UCSRA = 0x00;
    UCSRC = BIT(URSEL) | 0x06;//设置帧格式: 8个数据位, 1个停止位,无奇偶校验位
    UBRRL = 0xcf; //波特率=4800
    UBRRH = 0x00; //波特率=4800
    UCSRB = 0x98; // /*接收、发送器使能、开接收和发送中断*/

  }
 
/***********************************************
                  初始化MCU
***********************************************/ 
void INIT_MCU(void)
  {
 MCUCR=0x00;
 LED_DDR=0xff;//定义LED端口方向为输出
 LED_PORT=0xff; //定义LED端口初始值为高
 
 _SEI();//开全局中断
  }
 
 
/***********************************************
             发送一个字符子程序
***********************************************/
void send_char(unsigned char input_char)
  {
    UDR="input"_char;
    while ((UCSRA&0x40)!=0x40);//没有发送完就等待
  }
 
/************************************************
                 主程序
/************************************************/
void main(void)
   { 
    
 
  INIT_MCU();//初始化单片机
 
  INIT_USART();//初始化串口
 
  while(1)
    {
      LED_PORT=received_data;//received_data的初始值为高,所以上电时LED不亮
   if(flag==1)//标志位为高时将接收到的数据再发送到串口调试助手那
     {
       send_char(received_data);
    flag="0";
     }
    }
 
   }
  
#pragma interrupt_handler uart0_rx_isr:12
void uart0_rx_isr(void)
{
   received_data=UDR;//读取接收的数据
   flag="1";//接收完数据令标志位为高
}