首页->【AVR从入门到精通】

4155 8

中断发送优点:省去循环等待时间,以下面例子为例,4800bps时查询发送约占用单片机5ms多,而中断发送只占单片机几十微秒(单片机速度越快,占用时间越少)。
中断发送缺点:代码稍复杂,发送过程不易控制。

以下为串口以中断方式发送数据的程序   测试通过的  需要的可以直接拿去用

/*********************************************************
注:波特率要设定为4800,选择COM1,以16进制的形式显示
**********************************************************/
#include "iom16v.h"
#include "macros.h"

unsigned char send[8]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};   //发送数组
unsigned char send_count=0;                                        //发送个数
/**************************************************    
   端口初始化 函数
***************************************************/
void port_init(void)
{
  PORTA=0xFF;
  DDRA=0xFF;
  PORTB=0xFF;
  DDRB=0x00;      
  PORTC=0xFF;
  DDRC=0x00;
  PORTD=0xFF;
  DDRD=0x02;
}
 
/**********************************************
                  延时函数
**********************************************/
void delay_us(unsigned int delay_counter)//延时1us
{
  do{
 delay_counter--;
  }while(delay_counter>1);
}
 
void delay_ms(unsigned int delay_counter)//延时1ms
{
  while(delay_counter!=0)
  {
 delay_us(1000);
    delay_counter--;
  }
}
/***********************************************
              串口参数初始化
***********************************************/
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; //接收、发送器使能
}
 
/**************************************************************
         串口数据发送  查询方式  用来向上位机返回信息
**************************************************************/
void uart_transmit(unsigned char i)
{
  UDR = i;         /* 发送数据*/
  while (!(UCSRA & (1<<TXC)));   /* 等待发送缓冲器为空*/
}
 
/***********************************************
                  初始化MCU
***********************************************/ 
void INIT_MCU(void)
{
  MCUCR=0x00;
}
 
 
/************************************************
                 主程序
/************************************************/
void main(void)
{  
  INIT_MCU();  //初始化单片机
  port_init(); //端口初始化
  INIT_USART();//初始化串口
  SEI();     //使能总中断  才能进入串口发送中断
 
  send_count=3; //发送数组send的前几个数据
  uart_transmit(send[7]);  //发送完该数据后  单片机会进入串口发送中断函数  把前3个数据发送出去
  UCSRB = 0xD8; //中断发送使能
  while(1);
}
/****************************************************
                  发送中断函数
*****************************************************/
#pragma interrupt_handler uart0_tx_isr: 14
void uart0_tx_isr(void)
{
  if(send_count>0)              //判断发送个数是否为0
  {
    UDR = send[send_count-1];   //把数组中的数据放入UDR
 send_count--;               //发送个数减一
 UCSRA |= BIT(TXC);          //置位TXC
  }
  else
  {
    UCSRA &= ~BIT(TXC);         //清除TXC
 UCSRB = 0x98;      //中断发送禁止
  }
}
  
楼主可见

  1. gabe 8#

    好东西,学习

  2. xulei1324 7#

    void uart_transmit(unsigned char i)
    {
      UDR = i;         /* 发送数据*/
      while (!(UCSRA & (1< }

    没写全啊、、?当然我自己 能知道啦

    还是很 不错!

  3. nihao555 6#

    挺好的。

  4. sunq 5#

    谢谢啦

  5. rrt454 4#

    谢谢啦

  6. eer444 3#

    留着用啊  谢谢啦

  7. wangp 2#

    学习了

  8. simaz 1#

    谢谢啦