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

发布者:kappa20最新更新时间:2022-01-19 来源: eefocus关键字:ATMEGA16  串口发送  中断接收 手机看文章 扫描二维码
随时随地手机看文章

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

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 )

{undefined

    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发送子程序

{undefined

 while (!(UCSRA & (1< UDR = data;                    // 发送数据          

}

interrupt [USART_RXC] void USART_RCV_INT(void)   // USART接收中断服务

{undefined

    unsigned char data;

    data = UDR;         // 接收数据

    ledxs[5]=data/16;

    ledxs[6]=data%16;   // 接收数据转换成16进制显示

    ledxs[7]=18;   

}

void leddisplay()       // 显示子程序

{undefined

  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  串口发送  中断接收 引用地址:ATMEGA16串口发送和中断接收CVAVR程序

上一篇:avr+开发环境+linux,win7下avr单片机开发环境的搭建
下一篇:IAR 编写程序的代码比单片机的flash大了会出现故障Error[e16]

推荐阅读最新更新时间:2024-11-19 11:33

STM32串口1发送串口2接收
/** ****************************************************************************** * @file Project/STM32F10x_StdPeriph_Template/stm32f10x_it.c * @author MCD Application Team * @version V3.5.0 * @date 08-April-2011 * @brief Main Interrupt Service Routines. * This file provides template for all exceptions
[单片机]
STM32的串口中断发送
SECTION 2 先说TC。即Transmission Complete。发送一个字节后才进入中断,这里称为“发送后中断”。和原来8051的TI方式一样,都是发送后才进中断,需要在发送函数中先发送一个字节触发中断。发送函数如下 /******* 功能:中断方式发送字符串.采用判断TC的方式.即 判断 发送后中断 位. 输入:字符串的首地址 输出:无 *******/ void USART_SendDataString( u8 *pData ) { pDataByte = pData; USART_ClearFlag(USART1, USART_FLAG_TC);//清除传输完成标志位,否则可能会丢失第1个字节的数据
[单片机]
STM32串口打印printf发送中文乱码问题
1、首先要确保使用keil程序正确编译,并且程序经过调试,已经可以正常发送英文字符,但是发送中文字符时乱码。 2、使用记事本打开main.c文件(或其他主程序),点击另存为,在右下方选择编码方式为ANSI,替换原文件即可
[单片机]
关于PIC16F877A串口发送任意字符串的问题
以前在使用51系列的单片机的时候,下面两个函数使用起来完全没有问题,一个是发送单个字符的,一个是发送任意长度字符串的。 //向串口发送一个字符 void send_char_com( uint8 ch) { TXREG = ch; while (!TRMT); TRMT = 0 ; //必须写,不然有可能产生错误数据发送 } //向串口发送一个字符串 void send_string_com(uchar *str) { uint16 k= 0 ; do { send_char_com(*(str + k)); k++; } while (*(str + k)!=''); } 现在移
[单片机]
关于STM32F429VI串口发送错误,但有规律可循
先说结论:外部输入时钟与软件内配置时钟不统一。 通过串口6发送 01 06 00 57 00 00 38 1A 但是串口助手收到的如下,本以为乱码,但是每次发送内容一模一样,排除乱码可能。 问题在这里。 stm32f4xx.h中,高速外部时钟频率原本设置为25 000 000,但是板子上焊接的是8M晶振。 改成8 000 000 问题解决
[单片机]
关于STM32F429VI<font color='red'>串口</font><font color='red'>发送</font>错误,但有规律可循
18b20温度显示(164驱动8位LED)-CVAVR程序
//串行数码管显示 温度值 //芯片 ATMEGA16L //时钟 4MHz 内部 // DS18B20数据线是双向总线,采用一个IO口 // DS18B20数据线,输出不是通过IO口直接输出0和1,而是将IO口的PORT置成0。 // 输出方式,输出0; // 输入方式,内部上拉电阻无效,引脚为高组态,由于外部上拉电阻,引脚呈现高电平,输出1. // 采用系统自带延时程序 #include mega16.h #include delay.h #define hc164_da ta PORTD.0 // 164数据线 #define hc164_clk PORTD.1 // 164时钟线 #define DA TA_1
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved