找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3472|回复: 0
打印 上一主题 下一主题
收起左侧

avr单片机USART程序详解

[复制链接]
跳转到指定楼层
楼主
ID:68618 发表于 2014-11-11 19:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
USART 可以用中断和轮询,也可以用缓冲区做一个上层接口

*****************************************************************
//CPU:mega32
//编译器:iar
//USART一般编程方式
#include <ioavr.h>
void usart_init(void);
void put_char(char data);
void put_s(char *p);
char get_char( void );
char *get_s(char *p);
#define Fosc 8000000
#define Baud 9600
char c = '\n';
char str[9];
int main(void)
{
usart_init();
        put_s("acva");
      
while(1);
          put_char( get_char() );
}
void usart_init(void)
{
        UCSRB = (1<<RXEN)|(1<<TXEN);//接收中断允许,接收允许,发送允许

UCSRC = 0X86;  //选择UCSRC,异步模式,无校验,1位停止位,8位数据位
UBRRH = (Fosc/16/Baud - 1)>>8; //选择UBRRH,设置波特率
UBRRL = (unsigned char)(Fosc/16/Baud - 1);
}
/*
#pragma vector=USART_RXC_vect
__interrupt void receive(void)
{
c = UDR;
put_char('[');
put_char(c);
put_char(']');
}
*/
char get_char( void )
{
    while ( !(UCSRA & (1<<RXC)) );
    return UDR;
}
void put_char(char data)
{
while( !(UCSRA & (1<<UDRE)) );//查询发送寄存器是否空
UDR = data;//将要发送的数据送入发送寄存器
}


//发送字符串
void put_s(char *p)
{
    for(;*p!='\0';p++)    //如果不是结束符,就发送
    put_char(*p);
}

//接收字符转
char *get_s(char *p)
{
    char *p2 = p;
    while(1)
    {
      *p = get_char();
      put_char(*p);//回显
      if(*p == 0X0D)
      {
        *p = '\0';
        break;
      }
      p++;
    }
    return p2;
}

******************************************************************

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表