AVR__USART串口使用范例

合集下载

AVR_UART

AVR_UART
while ( !( UCSRA & (1<<UDRE))); /* 将数据放入缓冲器,发送数据 */
UDR = data;
}
12.接收结束标志(RXC) 用来说明接收缓冲器中是否有未读出的数据。 当接收缓冲器中有未
读出的数据时,此位为1,当接收缓冲器空时为0( 即不包含未读出的数据)。如果接收器
错而必须在正常操作下刷新缓冲器,则需要一直读取UDR 直到RXC 标志清零。下面的
代码展示了如何刷新接收缓冲器。
void USART_Flush( void )
{
unsigned char dummy;
while ( UCSRA & (1<<RXC) ) dummy = UDR; //读UDR会使RXC清零
些寄存器。所以不做研究.
ART 寄存器描述:
USART I/O 数据寄存器- UDR
USART 控制和状态寄存器A -UCSRA
USART 控制和状态寄存器B -UCSRB
USART 控制和状态寄存器C -UCSRC
USART 波特率寄存器- UBRRL和UBRRH
7.当写入UCSRC 寄存器时,由于UBRRH 与UCSRC 共用I/O 地址,URSEL 位(MSB) 必须置位。
8.初始化串口的范例
void USART_Init( unsigned int baud )
{
/* 设置波特率*/
UBRRH = (unsigned char)(baud>>8);
BAUD 波特率 ( bps)
fOSC 系统时钟频率
UBRR UBRRH 与UBRRL 的数值 (0-4095)

基于AVR单片机USART与PC机的串行通信

基于AVR单片机USART与PC机的串行通信

基于A VR单片机USART与PC机的串行通信
PC机发送字符给单片机控制发光管亮,同时将其传回PC机,其中单片机的发送和接收都采用查询方式
1、USART的主要特点
通用同步和异步串行接收器和转发器(USART)是一个高度灵活的串行通讯设备。

主要特点为:
全双工操作(独立的串行接收和发送寄存器)
异步或同步操作
主机或从机提供时钟的同步操作
高精度的波特率发生器
支持5,6,7,8,或9 个数据位和1 个或2 个停止位
支持的奇偶校验操作
数据过速检测?帧错误检测
噪声滤波,包括错误的起始位检测,以及数字低通滤波器三个独立的中断:发送结束中断,发送数据寄存器空中断,以及接收结束中断
多处理器通讯模式
倍速异步通讯模式
2、异步串行收发器
USART 分为了三个主要部分:时钟发生器,发送器和接收器。

控制寄存器由三个单元共享。

时钟发生器包含同步逻辑,通过它将波特率发生器及为从机同步操作所使用的外部输入时钟同步起来。

XCK (发送器时钟)引脚只用于同步传输模式。

发送器包括一个写缓冲器,串行移位寄存器,奇偶发生器以及处理不同的帧格式所需的控制逻辑。

写缓冲器可以保持连续发送数据而不会在数据帧之间引入延迟。

由于接收器具有时钟和数据恢复单元,它是USART 模块中最复杂的。

恢复单元用于异步数据的接收。

除了恢复单元,接收器还包括奇偶校验,控制逻辑,移位寄存器和一个两级接收缓冲器UDR。

接收器支持与。

AVR单片机学习七异步串行口UART

AVR单片机学习七异步串行口UART

AVR单片机学习(七)异步串行口UART 串行通讯技术概述异步串行通讯原理UART与电脑的通讯M16的USART中断方式使用USART步骤一、串行通讯技术概述串行通讯的通俗定义:一位发送一位(相对与并行,)当然通过位同步帧同步串行通讯的分类同步串行通讯时钟线、数据线、通过时钟保持数据同步SPI,IIC属于同步串口通讯异步串口通信只有一根数据线,通过波特率保证数据同步(顾名思义没有时钟线只有数据线)UART无线通信一般均为异步串行通信(相对于无形之中只能有一根天线)波特率每秒发送码元时间宽度为(1/9600)S大概是在100个微妙左右发送方按照波特率发出数据接收方按照波特率确定码元时间宽度对数据进行采样帧格式8位数据格式idle 空闲时候保持高电平在发送数据的时候先发送一位起始位低电平0然后数据 0 1 。

8 位P这位是可选的一般在多级通讯的时候需要发送9位数据在第9位时候是地址位SP1(必选的一位停止位是1)也可以选2位加一个SP2但是一般都是1位起始位 1位停止位 8位数据位之后数据继续保持空闲高电平接线图发送端:TXD接收端:RXD交叉连接RS232电平标准逻辑1 :-15V逻辑0 :+15VDB9 接口定义TXD/RXD/GDN三根线即可瞒足绝大数应用场合下面是开发板电路图MAX3232标示的是3.3V的芯片我们用的是5V MAX232 芯片标示错了不论引脚封装还是顺序都是完全相同的。

MAX 232芯片能提供2路串口我们只用一个。

由于这个电路图上是按照DB9定义的走线了所以我们就得用交叉线来跟PC 通讯了。

M16的USART特点全双工操作(独立的串行接受合发送寄存器,不像51是公用同一个寄存器,只能半双工)异步或同步操作(当然同步一般用不到。

所以我们只当异步串行口使用)支持5,6,7,8或9个数据位和1个或2个停止位(一般用的最多是8位数据 1位停止)硬件支持的奇偶校验操作(一般用不到,有限的场合通信质量还是可靠的,没必要加上校验)三个独立的中断源(看技术文档《一》)噪声滤波,包括错误的起始位检测,以及数字低通滤波器USART寄存器universal(通用的大体的)synchronous(同步) asynchronous(异步)R/T(接受/发送)UDRUCSRAUCSRBUCSRCUBRRL与UBRRH《一》Three Separate Interrupts (3个分离独立的中断 ) TXcomplete 发送完成中断,TX Data Register Empty 发送数据寄存器空中断RX Complete 接受完成中断。

AVR程序范例(USART串口通讯)

AVR程序范例(USART串口通讯)
RsBytes = 0; //将数组下标数RsBytes清零,以便下次使用
}
}
interrupt[USART0_RXC] void usart0_rx(void)//USART接收中断处理程序
{
temp=UDR0;
usart_char_send(temp);
//-------------------------------//利用数组RsBuf来装接收到的字符串
UBRR0H = 0x00; //波特率寄存器H:
SREG = 0x80; //开总中断
}
//*********************************// ADC模块
void adc_init(void) //ADC初始化
{
ADCSRA=0xe3;//自动转换方式:ADC使能,ADC开始转换,自动触发使能,ADC预频:8分频
RsBuf[RsBytes]=temp;
RsBytes++;
if(RsBytes>10)//如果超过10个,则清零
{
for(clear=0;clear<=10;clear++)
{
RsBuf[clear]=0;
}
//flag=0;
RsBytes=0;
}
//------------------------------//
欢迎一起交流单片机,QQ:669892537
#include "mega64.h"
#include "string.h"
#define uint unsigned int
#define uchar unsigned char

AVR单片机USART双机通讯

AVR单片机USART双机通讯
#n l d < o 6 . >[ i c u e i m1 v h 5 3 衔 n l d < co . > eu e ma r s h # n ld < ea . > i cu e d ly h
u sg e h ri n in d c a ;
us e a m[0 ={xf x6O5 , 4 ,x6 ni dc r u 1] O3 , 0 , b 0 f 6 , n g h n O x x 0 O6 ,xdO0 ,x f xf ; xdO7 ,x7O7, 6 } 0
d ly ea
_
ms2 0 ; ( 0 )
} }
} 从 机 的示 例程 序如下 :
# n l d < o 6v h> i c u e i ml . # n l de<ma m s h i cu c .> # n l de<d ly h> i cu ea .
it e h r vi) n gt a(od c
数据 寄存 器

收稿 日期 :0 1 0 — 8 2 1 — 4 2 作者简 介: 郝云鹏 (9 5 ) 男 , 15 一 , 辽宁鞍 山人 , 鞍山师范学院物理系副教授.
第 4期
郝云鹏 : V A R单片机 U A T双机通讯 SR
vi m i ( od a ) n

UBRR =51; / uBRR /


山 师 范
学ቤተ መጻሕፍቲ ባይዱ院
学 报
gun l fA sa r l nvri o ra nh nNoma i sy o U e t
20 1 0 1 4): 0— 2 1 — 8。 3( 6 6
A R单片机 U A T双 机通讯 V SR
郝 云鹏

IARAVRUSART收发程序

IARAVRUSART收发程序

IARAVRUSART收发程序AVR USART收发程序Free_Bird本文介绍了在IAR环境中,AVR上简单的USART收发程序:示意了最基本的前后台模式及串口接收中断的应用;完成的功能是:将上位机通过串口发给AVR的数据,再返回给上位机;我想这对新手是很有帮助的;再高级一点就搜FIFO、环形缓冲区吧~!呵呵程序如下:#include#define SEI() {SREG |= 0X80;}#define CLI() {SREG &= 0X7F;}unsigned char Flag = 0;unsigned char DATA = 0x55;void PORT_Init(void){PORTD = 0X01;DDRD = 0X02;}void UART_Init(void){/* 设置波特率9600 */UBRRH = 0x00;UBRRL = 0x67;UCSRA = 0x00;/* 接收使能、发送使能、接收中断使能、*/UCSRB = (1<<rxen)|(1<<txen)|(1<<rxcie);< p="">/* 设置帧格式: 8 个数据位, 1 个停止位, 无校验位*/UCSRC = (1<<ursel)|(1<<ucsz1)|(1<<="">#pragma vector = USART_RXC_vect__interrupt void usart_rxc_isr(void)//接收中断:置标志位,然后读取数据{Flag = 1;DATA = UDR;}void main(){PORT_Init();UART_Init();SEI();while(1){if (Flag)//标志位置位表示接收到数据{Flag = 0;while ( !( UCSRA & (1<<="" p="">UDR = DA TA;//将收到的数据发给上位机}}}//end</ursel)|(1<<ucsz1)|(1<</rxen)|(1<<txen)|(1<<rxcie);<>。

AVR单片机与PC机串口通讯程序

AVR单片机与PC机串口通讯程序

A V R单片机与P C机串口通讯程序(总3页)本页仅作为文档封面,使用时可以删除This document is for reference only-rar21year.MarchProteus环境下完成本实验时,需要roteus中设COMPIM////-----------------------------------------------------------------#define F_CPU 4000000UL //4M晶振#include <avr/>#include <avr/>#include <util/>#define INT8U unsigned char#define INT16U unsigned int//数字串接收缓冲struct{INT8U Buf_Array[100]; //缓冲空间INT8U Buf_Len; //当前缓冲长度} Receive_Buffer ;//清空缓冲标志INT8U Clear_Buffer_Flag = 0;//0-9的数字编码,最后一位为黑屏const INT8U SEG_CODE[] ={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00}; char *s = "\n", *p;//------------------------------------------------------------------// USART初始化//------------------------------------------------------------------void Init_USART(){UCSRB = _BV(RXEN)|_BV(TXEN)|_BV(RXCIE);UCSRC = _BV(URSEL)|_BV(UCSZ1)|_BV(UCSZ0);UBRRL = (F_CPU/9600/16-1)%256;UBRRH = (F_CPU/9600/16-1)/256;}//------------------------------------------------------------------// 发送一个字符//------------------------------------------------------------------void PutChar(char c){if(c=='\n') PutChar('\r');UDR = c;while(!(UCSRA&_BV(UDRE)));}//------------------------------------------------------------------// 显示所接收的数字字符(数字字符由PC串口发送,AVR串口接收) //------------------------------------------------------------------void Show_Received_Digits(){INT8U i;for(i=0;i<;i++){PORTC= SEG_CODE[[i]];_delay_ms(400);}}//------------------------------------------------------------------// 主程序//------------------------------------------------------------------int main(){= 0;DDRB = 0x00; PORTB = 0xFF;DDRC = 0xFF; PORTC = 0x00;DDRD = 0x02; PORTD = 0xFF;MCUCR = 0x08;GICR =_BV(INT1);Init_USART();sei();while(1)Show_Received_Digits();}//-----------------------------------------------------------------// 串口接收中断函数//-----------------------------------------------------------------ISR (USART_RXC_vect){INT8U c= UDR;//如果接收到回车换行符则设置清空缓冲标志if(c=='\r'||c=='\n') Clear_Buffer_Flag=1;if(c>='0'&&c<='9'){//如果上次曾收到清空缓冲标志,则本次从缓冲开始位置存放 if(Clear_Buffer_Flag==1){= 0;Clear_Buffer_Flag = 0;}//缓存新接收的数字[]= c-'0';//刷新缓冲长度(不超过最大长度)if<100) ++;}}//-----------------------------------------------------------------// INT1中断函数(向PC发送字符串)//-----------------------------------------------------------------ISR (INT1_vect){INT8U i = 0;while(s[i]!='\0')PutChar(s[i++]);// 向PC发送字符串}。

AVR单片机串口USART与PC通讯实例和中断程序分析

AVR单片机串口USART与PC通讯实例和中断程序分析

“并行”通讯:是指8位数据同时通过并行线进行传送,这样数据传送速度大大提高,但并行传送的线路长度受到限制,因为长度增加,干扰就会增加,数据也就容易出错。

“串行”通讯:形容一下就是一条车道,而并口就是有8个车道同一时刻能传送8位(一个字节)数据。

但是并不是并口快,由于8位通道之间的互相干扰。

传输时速度就受到了限制。

而且当传输出错时,要同时重新传8个位的数据。

串口没有干扰,传输重发一位就可以了。

所以要比并口快。

串行通讯协议较多,单片机常用的有USART,SPI,TWI,1-Wire 等。

串行通讯有分为同步和异步通讯:通俗讲同步就是你叫我去吃饭,我听到了就和你去吃饭;如果没有听到,你就不停的叫,直到我告诉你听到了,才一起去吃饭。

异步就是你叫我,然后自己去吃饭,我得到消息后可能立即走,也可能等到下班才去吃饭。

同步通讯:收信发信双方在使用同步时钟,在同一时刻传输线上的数据就是要传输的信息。

异步通讯:以字符为传输单位,字符与字符之间是异步的,而字符的位是同步的USART:异步串行通讯,常用与单片机和单片机,单片机和PC电脑间的数据传输。

波特率:表征通讯速度的参数,单位是位/秒(b/s),即每秒钟传输的二进制位数,如波特率9600,表示每秒钟传输9600个二进制位数据。

收发双方必须采用同样的波特率。

波特率不同将无法正常通讯。

全双工通讯:指是的是可以同时发送和接收数据。

半双工通讯:指的是在同一时刻只能发送或只能接收数据。

单片机与PC通讯的电平转换:单片机的电压一般是TTL电平,电压0v-5v,PC机串口采用的是RS-232协议,它的的电压范围是-15-+15v,电平不同,无法通讯。

要实现通讯,必须进行电平和逻辑关系的转换,一般用 MAX232集成芯片进行电平的转换。

ATmega16 串口结构:有一个全双工的串行口,有两条通讯线,TXD:数据发送线,RXD:数据接收线,对应的单片机外部引脚为PD1,PD0相关寄存器:UDR 串口数据寄存器,UCSRA 串口控制与状态寄存器AUCSRB 串口控制与状态寄存器BUCSRC 串口控制与状态寄存器CUBRRH,UBRRL 波特率寄存器发生器对波特率发生器的输出时钟进行2、8或16 的分频,具体情况取决于工作模式,如下图:如:系统时钟频率f=8MHZ,异步正常模式(16分频),波特率9600则:UBRR=8000000/16*9600-1=52-1=51; 波特率寄存器赋值:UBRRH=0; UBRRL=51;/*10进制写法*/,或者UBRRH=0;UBRRL=0x33;/*16进制写法*/操作步骤:一、设置异步模式:UCSRC|=(1<<URSEL)|(1<<URMEL); //UCSRC和UBRRH寄存器共用一个地址,写UCSRC时,URSEL应置1二、设置数据帧格式: 8位数据位,一位停止位,UCSRC|=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);三、设置波特率寄存器:UBRRL=51;UBRRH=0;四、使能发送接收:UCSRB|=(1<<TXEN)|(1<<RXEN);五、中断总使能:SREG=0X80;//函数功能:通过PC 串口向单片发送数据,单片机接收数据后,送到PA口显示,再送回到PC机#include<iom16v.h>#include<macros.h>#define fosc 8000000 //晶振8MHZ#define baud 9600 //波特率定义/*端口初始化函数*/void init(void){PORTA = 0xFF; //PA口输出高电平DDRA = 0xFF; //PA口设置为输出PORTD = 0X00; //USART的发送接收端口分别为PD0和PD1DDRD|=(1<<PD1); //PD0为接收端口置为输入;PD1为发送端口置为输出}/*串口初始化函数*/void uart_init(void){UCSRB = 0x00;UCSRA = 0x00;UCSRC |= (1<<URSEL)|(1 << UCSZ1)|(1 << UCSZ0); //异步,数据格式8,N,1//UCSRC寄存器与UBRRH寄存器共用相同的I/O地址,写UCSRC时,URSEL应设置为1。

AVR 单片机 串口通信 串行通讯 详细例程介绍

AVR 单片机 串口通信 串行通讯 详细例程介绍
AVR 系列单片机的串行通讯实例
Atmega128 有两个串口:USART0 与 USART1 以 USART0 为例
串口的初始化包括:
传输模式的选择:同步还是异步,默认为异步模式,可通过选择 USART 控制和状态 寄存器 UCSR0C 中的 UMSEL 位来选择,UMSEL 为 0,是异步模式. 波特率的设置:通信的双方都必须有相同的波特率,波特率可以通过设置波特率 发生寄存器 UBRR0 来确定,UBRR0 为两字节 16 位的寄存器,可分为 UBRR0H 和 UBRR0L.同时起作用的还有 UCSR0A 中的波特率加倍位 UX2,当 UX2 为 1 时设置的 波特率加倍.
3、设置 UCSR0C:
Bit6-UMSEL0:USART0 的模式选择,0 为异步模式,1 为同步模式 Bit5:4-UPM01:0:奇偶校验模式,00 禁止,01,保留,10 偶校验,11,奇校验 Bit3-USBS0:停止位的选择,0 停止位为 1bit,1 停止位为 2-bits Bit2:1-UCSZ01:0:字符长度,当 UCSZ02 为 0 时,00 表示 5 位,01 表示 6 位,10 表示 7 位,11 表示 8 位.当 UCSZ02 为 1 时,11 表示 9 位.(UCSZ02 为 UCSR0B 里的一位寄存器)
{ putchar0(*s); s++; }
putchar0(0x0a);//回车换行 putchar0(0x0d); }
/******************************************************************* ********* 函数功能:主程序 入口参数: 出口参数: ******************************************************************** ********/ void main(void) { unsigned char i;

avr单片机USART串口通讯初始化配置说明

avr单片机USART串口通讯初始化配置说明

avr单片机USART串口通讯初始化配置说明avr atmega16 单片机通用同步和异步串行接收器和转发器(USART)是一个高度灵活的串行通讯设备,其工作模式及其初始化,寄存器说明如下。

//*******************USART控制和状态寄存器A(UCSRA)*************** /*USART 控制和状态寄存器A(UCSRA)bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0RXC TXC UDRE FE DOR PE U2X MPCMRXC: USART 接收结束接收缓冲器中有未读出的数据时RXC 置位,否则清零。

接收器禁止时,接收缓冲器被刷新,导致RXC 清零。

RXC 标志可用来产生接收结束中断TXC: USART 发送结束发送移位缓冲器中的数据被送出,且当发送缓冲器(UDR) 为空时TXC 置位。

执行发送结束中断时TXC 标志自动清零,也可以通过写0进行清除操作。

TXC 标志可用来产生发送结束中断( 见对TXCIE 位的描述)。

UDRE: USART 数据寄存器空UDRE标志指出发送缓冲器(UDR)是否准备好接收新数据。

UDRE为1说明缓冲器为空,已准备好进行数据接收。

UDRE标志可用来产生数据寄存器空中断复位后UDRE 置位,表明发送器已经就绪。

FE: 帧错误如果接收缓冲器接收到的下一个字符有帧错误,即接收缓冲器中的下一个字符的第一个停止位为0,那么FE 置位。

这一位一直有效直到接收缓冲器(UDR) 被读取。

当接收到的停止位为1 时,FE 标志为0。

对UCSRA 进行写入时,这一位要写0。

DOR: 数据溢出数据溢出时DOR 置位。

当接收缓冲器满( 包含了两个数据),接收移位寄存器又有数据,若此时检测到一个新的起始位,数据溢出就产生了。

这一位一直有效直到接收缓冲器(UDR) 被读取。

对UCSRA 进行写入时,这一位要写0。

PE: 奇偶校验错误当奇偶校验使能(UPM1 1),且接收缓冲器中所接收到的下一个字符有奇偶校验错误时UPE 置位。

USART串口配置方法

USART串口配置方法

USART串口配置方法
一、USART串口概述
USART串口是一种典型的异步传输接口,它在通信双方之间没有时钟
信号,只通过特定的标志位来确定通信开始和结束,是一个非同步的接口。

USART串口能够实现两种不同的传输模式:点对点和点对多,它是最常用
的外设之一,可以把复杂的通信系统变得简单。

1.波特率配置:波特率是指每秒发送数据的比特数,配置USART串口
的波特率有两种方式,一种是使用USART串口的控制寄存器中的可编程波
特率位定时器(BRG)来配置,另一种是使用专门为USART串口设计的波
特率设置程序。

2.数据格式配置:数据格式是指USART的数据格式,即数据的位长、
停止位、奇偶校验等,这些参数都是在控制寄存器中进行配置的,我们可
以根据自己的应用程序来配置。

3.中断配置:USART串口也有很多的中断,我们可以选择性地使能这
些中断,从而实现更好的数据传送效率,灵活控制通信状态。

4.其他硬件配置:USART串口还有其他的硬件配置,例如发送和接收
中断允许位、多处理器通信模式等等。

AVR简单的串口通信程序

AVR简单的串口通信程序

AVR简单的串口通信程序
本例子是学习AVR 的串口通信时候编写的一个简单的串口通信的程序,运行的时候先向串口发送一个数据0x12,然后等待接收,当PC 机发送一个数据到单片机,单片机就对这个数据进行加1 处理,然后发回到PC 机显示。

以下是串口通信时候的界面和串口通信的源程序。

/***********************************************/
/************AVR USART 串口调试****************/
/************ClimberWin 2008.6.29**************/
/*CPU:ATMEGA32L 4MHZ 外部晶振(熔断位需要先配置好外部晶振)*/ /*说明:AVR 串口是通过UDR 发送出去的,类似于51 单片机的SBUF*/
/*程序功能:能够通过串行数据发送给PC 机0x12 数据,接收上位机数据并且+1 后发送回上位机*/
#include //AVR I/O 口定义头文件
#include // 延时头文件调用
#include interrupt.h> // 中断头文件调用
#define uchar unsigned char
//引脚定义
#define AVR_RXD 0 //PD0 RXD
#define AVR_TXD 1 //PD1 TXD
//常量定义
#define BAUDRATE 9600 //波特率定义
uchar UART_MID; //定义一个缓存区数据临时存储地址
/*******************串口接收中断服务程序*************************/。

usart的使用流程

usart的使用流程

USART的使用流程介绍USART(Universal Synchronous/Asynchronous Receiver Transmitter),通用同步/异步收发器,是一种串行通信协议,广泛应用于嵌入式系统中的数据传输。

本篇文档将为您介绍USART的使用流程。

步骤一:配置USART的基本参数1.确定USART的工作模式(同步或异步)和传输速率(波特率)。

2.根据MCU的型号和设置要求,设置USART的控制寄存器来配置USART的工作模式和波特率。

步骤二:配置USART的引脚1.确定MCU上USART的引脚。

根据MCU的引脚配置,选择合适的IO口作为USART的引脚。

2.配置MCU的引脚功能,将相应的IO口配置为USART的引脚功能。

步骤三:初始化USART1.调用初始化函数,将USART的控制寄存器和引脚进行初始化设置。

通常,MCU会提供一些库函数来实现这一步骤。

2.检查USART是否成功初始化,可以通过读取相应的状态寄存器来确认。

步骤四:数据传输1.准备要发送的数据。

将要发送的数据存储在合适的变量中。

2.调用发送函数,将数据写入USART的数据寄存器。

MCU通常会提供相应的库函数来实现这一功能。

3.等待发送完成。

可以轮询相应的状态寄存器,或者使用中断方式来等待发送完成的标志位。

步骤五:接收数据1.检查接收缓冲区是否有数据。

可以轮询相应的状态寄存器,或者使用中断方式来检查接收缓冲区状态。

2.读取接收缓冲区的数据。

将接收到的数据存储在合适的变量中,供后续处理使用。

步骤六:错误处理1.检查错误标志位。

通过读取相应的状态寄存器,可以检查是否发生了传输错误,如帧错误、奇偶校验错误等。

2.根据错误类型,进行相应的错误处理。

可以重新发送数据、重新配置USART等。

步骤七:关闭USART1.在所有数据传输完成后,调用关闭函数,将USART的控制寄存器关闭。

MCU通常会提供相应的库函数来实现这一功能。

2.检查USART是否成功关闭,可以通过读取相应的状态寄存器来确认。

AVR单片机串口操作程序

AVR单片机串口操作程序

AVR单片机串口操作程序#include#include#include#include#include#define FOSC 8000000 //mcu工作时钟频率typedef unsigned int uint16;typedef unsigned char uchar8;uchar8DoubleIRData[25]={0x64,0x00,0x20,0x04,0x40,0x00,0 ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; //双红外发射数据取PD2作为驱动远程红外发射//uchar8SingleIRData[25]={0x60,0x00,0x04,0x00,0x04,0x00,0 ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0} //取PD2作为驱动远程红外发射 //取PD3驱动红外发射uchar8 BitCount=0; //载波计数uchar8 BetyCount=0; //位计数volatile uchar8 UsartDataBuff=0;volatile uchar8 ChargeFlag=0,LED_Count;volatile uchar8 SYSCount=0;volatile uint16 ADCCurrent1=0; //AD0转换结果电压检测volatile uint16 ADCCurrent3=0; //AD3结果转换电流检测void Port_Init(void){DDRA = 0b00000000; //AD采样 PA0 PA1PORTA = 0b00000000; //PA口:初始化0//PB PC 没有使用DDRD = 0b11111110; //PD2 为远程红外发射 PD3 和PD4 状态指示灯,P3未充电 P4表示充电 PD5和PD6 双红外近区发射 PD7 开关充电使能PORTD = 0b00000011; //初始化输出为0 其中USART 接收口上拉高电平等待接收中断}void ADC_Init(void){ADCSRA=0x00; //ADC控制状态寄存器ADMUX =0x40; //ADC 多工选择寄存器参考电压为AVCC,其中AREF 引脚外加滤波电容数据右对齐结果选择0通道ACSR =(1;=66)//波特率=1/(0.00002625S*66)=577 {BetyCount++;if(BetyCount>;=20)//25{//TCCR0=0;//TCCR2=0;BetyCount=0;}BitCount=0;}}ISR(TIMER1_COMPA_vect){SYSCount=1;}void Usart_send(uchar8 data){while(!(UCSRA&(1;=200)//电压大于开始供电//200 {PORTD|=(1<<PD7);ChargeFlag=1;}else{ChargeFlag=0;}}//UsartDataBuff=Usart_Read(); if(UsartDataBuff){}}//i=((uchar8 *)(&k))[0];//j=((uchar8 *)(&k))[1];}}。

AVR单片机串口通信程序

AVR单片机串口通信程序

AVR单片机串口通信程序单片机的串口在很多时候都是一个有用的通信接口,比如要修改单片机内部的一些变量,就可以直接使用串口通信,将参数发送到单片机,就省去了重新编译下载的麻烦。

AVR单片机的串口通信功能可谓强大啊,下面就简单说下我在学习时的一些经验。

实验板是AVR-ATMEGA128A单片机,晶振8MHz。

1、初始化:设置波特率前,要关闭 USART0 的所有使用,包括使能和中断。

2、设置 UCSR0A: UCSR0A 能写的有Bit0,Bit1,Bit6,其他 5 位为状态位.我们一般使用的有Bit1-U2X0,当这一位为 1 时,波特率的分频因子从 16 降到 8,能够有效的将异步通信模式的传输速率加倍,但是这一位仅对异步操作有影响,使用同步操作时应将此位清零。

3、设置 UCSR0C: Bit6-UMSEL0:USART0 的模式选择0为异步模式,1为同步模式。

Bit5:4-UPM01:0:奇偶校验模式,00 禁止,01,保留,10 偶校验,11奇校验。

Bit3-USBS0:停止位的选择 0-停止位为1bit,1 停止位为 2bitsBit2:1-UCSZ01:0:字符长度当 UCSZ02 为0时:00 表示 5 位,01 表示 6 位,10 表示7 位,11表示 8 位。

当 UCSZ02 为 1 时,11 表示 9 位(UCSZ02 为UCSR0B 里的一位寄存器)。

4、设置 UBRR: UBRR 的设置和这些参数有关:U2X0,CPU 频率,波特率5、然后就是设置 UCSR0B:Bit7-RXCIE0 为接收结束中断使能,Bit6-TXCIE0 为发送结束中断使 ,Bit4-RXEN0 为接收使能,Bit3-TXEN0 为发送使能。

一般情况下,接收使用中断方式,所以使用接收结束中断使能。

下面是源代码:/** usart.c** Created: 2011/7/2 15:48:36* Author: YIN*/#include ;#include ;#include ;volatile unsigned char temp; void init(){UCSR0B=0x00;UBRR0H=0x00;UBRR0L=51;UCSR0A=0x00;UCSR0C=0x06;UCSR0B=0x98;sei();DDRF=0xff;PORTF=0xff;DDRD=0xf0;DDRA=0xff;}void delay(){unsigned int i;i=100;while(i--);}int main(void){init();while (1); //等待中断}SIGNAL(SIG_UART0_RECV) //将上位机发送的数据发送回上位机显示{temp=UDR0;PORTA=~temp;UDR0=temp;}部分内容摘自网络,希望对大家有帮助!。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

PORTB =0xFF;
//不用的管脚使能内部上拉电阻
PORTC =0xFF;
DDRA =(1<<LED2)|(1<<LED1)|(1<<LED0);
//输出
PORTA =((1<<LED2)|(1<<LED1)|(1<<LED0));
//高电平,灯灭
DDRD =(1<<串口使用范例
编译器:WinAVR-20050214
本程序简单的示范了如何使用 ATMEGA16 的 USART USART 的设置 波特率的计算
发送采用查询方式 接收采用中断方式 */
#include <avr/io.h> #include <avr/delay.h> #include <avr/signal.h> #include <avr/interrupt.h>
//等待发送缓冲器为空
UDR=c;
//将数据放入缓冲器,发送数据
}
void put_s(unsigned char *ptr)
{
while (*ptr)
{
put_c(*ptr++);
}
put_c(0x0D);
put_c(0x0A);
//结尾发送回车换行
}
SIGNAL(SIG_USART_RECV) //串口接收中断服务程序 {
LED2_ON();
//如果 FLAG 不加 volatile 限定(即 has_volatile=0),程序将永远都运行不到这里
while (FLAG!=0) pro_coammand();
LED2_OFF();
}
}
//管脚定义 #define PIN_RXD #define PIN_TXD #define LED0 #define LED1 #define LED2
0 //PD0 RXD 1 //PD1 TXD 0 //PA0 1 //PA1 3 //PA3
//常量定义 #define BAUDRATE //#define F_CPU
void pro_coammand(void) //多字节命令的处理程序
{
unsigned char i;
if (RX_index>=10)
{
UCSRB&= ~(1<<RXCIE); //关断 USART 接收中断
put_c(0x0D);
put_c(0x0A); //发送回车换行
put_s("Hello! 你之前输入的命令列表是:");
PC_COMMAND=UDR; //发送数据缓冲寄存器和接收数据缓冲寄存器共享地址,即 UDR switch(PC_COMMAND) {
case '0': //0x30 ASCII '0' LED0_ON(); put_s("用户输入 0#指令"); break;
case '1': LED1_ON(); put_s("用户输入 1#指令"); break;
PORTD =0xFF;
FLAG=0;
init_USART();
put_s("你好!");
put_s("这是一个简单的串口实验程序");
put_s("你可以在电脑上的超级终端程按下[0][1][2]按键,模拟用户板上的按键操作");
sei();
//使能全局中断
while (1)
{
while (FLAG==0) pro_coammand();
9600 //波特率 7372800 //这个已经在 makefile 里面定义了
//宏定义
#define LED0_ON()
PORTA&=~(1<<LED0) //输出低电平,灯亮
#define LED0_OFF()
PORTA|= (1<<LED0)
//输出高电平,灯灭
#define LED1_ON()
UCSRC = (1<<URSEL) | 0x06; //异步,8 位数据,无奇偶校验,一个停止位,无倍速,10000110
/* UBRRH 与 UCSRC 共用 I/O 地址。因此访问该地址时需注意以下问题: 当在该地址执行写访问时,USAR 寄存器选择位(URSEL)控制被写入的寄存器,若 URSEL 为 0,对 UBRRH 值更新;若 URSEL 为 1,则对 UCSRC 设置更新。对 UBRRH 或 UCSRC 寄存器的读访问则较为复杂。但在大多数应用中,基本不需要读这些寄存器。没有 UBRR 这个 16 位寄存器,因为 UBRRL(0x09)/UBRRH(0x20)的地址不连续,而且 UBRRH 跟 UCSRC 共用地址 */
//AVR 芯片的高低驱动能力都很强,甚至能推动 8 字数码管的公共极,怎么接都没问题
//全局变量 如果变量会在中断服务程序中被修改,须加 volatile 限定
volatile unsigned char FLAG;
//按键标志
volatile unsigned char PC_COMMAND;
/* 注: 本范例为 7.3728MHz 外部石英晶体振荡器 即 F_CPU=7372800
因为 7.3728MHz 能生成多种标准的通讯波特率 如果使用其他系统时钟频率,注意 波特率误差不要超过 +/-1%. 做 USART 通讯时,除非你掌握了校准技术,否则请不要使用内部/外部 RC 振荡器 */
//U2X=0 时的公式计算 UBRRL= (F_CPU/BAUDRATE/16-1)%256; UBRRH= (F_CPU/BAUDRATE/16-1)/256; //U2X=1 时的公式计算 //UBRRL= (F_CPU/BAUDRATE/8-1)%256; //UBRRH= (F_CPU/BAUDRATE/8-1)/256; //也可根据数据手册的[波特率设置的例子]查得: UBRR = 47 //UBRRL = 0x2F; //set baud rate lo //UBRRH = 0x00; //set baud rate hi UCSRA = 0x00; UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN); //使能接收中断,使能接收,使能发送 }
for (i=0;i<RX_index;i++) put_c(RX_BUFFER[i]);
put_c(0x0D);
put_c(0x0A); //发送回车换行
RX_index=0;
//清零
UCSRB|= (1<<RXCIE); //打开 USART 接收中断
}
}
int main(void)
{
//上电默认 DDRx=0x00,PORTx=0x00 输入,无上拉电阻
//PC 发出的当前命令
volatile unsigned char RX_BUFFER[16];
//存放接收数据的数组
volatile unsigned char RX_index;
//存放接收数据的个数
void put_c(unsigned char c) //发送采用查询方式
{
while( !(UCSRA & (1<<UDRE)) );
*/
RX_BUFFER[RX_index]=PC_COMMAND;
//保存数据到数组里面
RX_index++;
if (RX_index>=16) RX_index=0; //防止数组溢出
}
void init_USART(void) //USART 初始化 // 9600 8, n,1 PC 上位机软件(超级终端等)也要设成同样的设置才能通讯 {
case '2': LED0_OFF(); LED1_OFF(); FLAG=!FLAG; put_s("用户输入 2#指令"); break;
default: put_s("用户输入的指令无效!"); break;
}
/* 注意:使用 put_s 函数发送数据需要一定的时间,如果输入数据的速度过高将会导致 数据丢失,所以一般建议中断服务程序的处理时间尽量的短,只做采集数据和设标 志位,命令的处理交由主程序来完成,这里只是示范简单的命令处理
PORTA&=~(1<<LED1)
#define LED1_OFF()
PORTA|= (1<<LED1)
#define LED2_ON()
PORTA&=~(1<<LED2)
#define LED2_OFF()
PORTA|= (1<<LED2)
//51 系列高电平输出能力很弱,低电平也仅能点亮 LED,所以常见输出低电平才灯亮的接法
相关文档
最新文档