×
单片机 > 单片机程序设计 > 详情

ATMEGA16串口发送和中断接收CVAVR程序

发布时间:2020-06-19 发布时间:
|
/*********************************************

File name     : USART.c
Chip type           : ATmega16
Program type        : Application
Clock frequency     : 4.000000 MHz
Memory model        : Small
External SRAM size  : 0
Data Stack size     : 256
*********************************************/

#include
#include

#define BAUD    1200         // 波特率采用1200bps
#define CRYSTAL 4000000      // 系统时钟4MHz

//计算和定义波特率设置参数
#define BAUD_SETTING (unsigned int)((unsigned long)CRYSTAL/(16*(unsigned long)BAUD)-1)   // 波特率计算
#define BAUD_H (unsigned char)(BAUD_SETTING>>8)   // 高8位
#define BAUD_L (unsigned char)(BAUD_SETTING)      // 低8位

// USART控制和状态寄存器的标志位定义 

#define UDRE 5       // 数据寄存器空     (UCSRA)

#define RXCIE 7      // 接收完成中断允许 (UCSRB)
#define RXEN  4      // 接收允许         (UCSRB)
#define TXEN  3      // 发送允许         (UCSRB)

#define URSEL 7      // 寄存器模式选择   (UCSRC)
#define UCSZ1 2      // 字符长度选择     (UCSRC)
#define UCSZ0 1      // 字符长度选择     (UCSRC)

void leddisplay();                                // 显示子程序
void USART_SEND(unsigned char data);              // USART发送子程序
interrupt [USART_RXC] void USART_RCV_INT(void);   // USART接收中断服务 
unsigned char ledxs[8]={16,16,16,16,16,0,0,18};   // 数码管显示缓冲区 
flash unsigned char tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0,0xff,0x76};
                          //共阴极代码 0-F,  全灭,全亮,H
void main( void )
{
    unsigned char dat=0,i;
         
    DDRA = 0xff; 
    DDRC = 0xff;        // LED段码、位码输出
    PORTD = 0x03;       // TXD(PD1)输出
    DDRD  = 0x02;       // RXD(PD0)输入,上拉有效
    
    UCSRA = 0x00;       // USART初始化    
    UCSRB = (1<       // UCSRB = 0x98;                     
    UCSRC = (1<       // UCSRC = 0x86; 
    UBRRH = BAUD_H;     // 设置波特率,1200bps
    UBRRL = BAUD_L;
    #asm("sei")         // 开中断
    while(1)
    {   
      for(i=0;i<60;i++)
        leddisplay();   // 循环显示60次,延时480ms
      USART_SEND(dat);  // 发送数据(0-255)
      dat++;
      if (dat > 255) dat = 0;
    }

void USART_SEND(unsigned char data)    // USART发送子程序
{
 while (!(UCSRA & (1<  UDR = data;                    // 发送数据           
}
interrupt [USART_RXC] void USART_RCV_INT(void)   // USART接收中断服务
{
    unsigned char data;
    data = UDR;         // 接收数据
    ledxs[5]=data/16;
    ledxs[6]=data%16;   // 接收数据转换成16进制显示
    ledxs[7]=18;    
}
void leddisplay()       // 显示子程序
{
  PORTC=0xdf;
  PORTA=tab[ledxs[0]];
  delay_ms(1);
  PORTA=0x00;

  PORTC=0x5f;
  PORTA=tab[ledxs[1]];
  delay_ms(1);
  PORTA=0x00;

  PORTC=0x9f;
  PORTA=tab[ledxs[2]];
  delay_ms(1);
  PORTA=0x00;

  PORTC=0x1f;
  PORTA=tab[ledxs[3]];
  delay_ms(1);
  PORTA=0x00;

  PORTC=0xff;
  PORTA=tab[ledxs[4]];
  delay_ms(1);
  PORTA=0x00;

  PORTC=0x7f;
  PORTA=tab[ledxs[5]];
  delay_ms(1);
  PORTA=0x00;

  PORTC=0xbf;
  PORTA=tab[ledxs[6]];
  delay_ms(1);
  PORTA=0x00;

  PORTC=0x3f;
  PORTA=tab[ledxs[7]];
  delay_ms(1);
  PORTA=0x00;
}

关键字:ATMEGA16  串口发送  中断接收

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
C51 特殊功能寄存器SFR的名称和地址