AVR单片机串口详解

发布者:渤海湾最新更新时间:2016-10-23 来源: eefocus关键字:AVR单片机  串口详解 手机看文章 扫描二维码
随时随地手机看文章
一.熟悉AVR单片机UART资源,首先从波特率和帧说起

  波特率:与51不同有单独的波特率发生器,不需要定时器来产生,节省了资源
          波特率计算公式,这里我采用IccAVR的配置功能,直接计算生成
       单片机支持的模式:异步正常模式,异步倍数模式,和同步模式,一般选第一种模式
  帧格式:起始位+数据位(5-9位可选)+校验位(可选)+停止位(1、2位)   空闲
           o      *********          P           1                 1         
  通讯电路空闲时为高电平

二、大概了解了下硬件资源后,就要了解软硬件的桥梁—寄存器了
 1.数据寄存器:数据来了要有个接受的地方吧,数据发送要有个数据发送的信封吧。
   这就是数据寄存器 UDR (RXB和TXB) 物理上为分开的,地址上是一样的。就像写信和接信时,你家的地址只

有同一个地址一样,但是写信和别人发给你的信封却有2个一样。使用时自动控制的。
    数据寄存器为空时才能发送数据,否则会无效。数据进入后,进入移位寄存器,由引脚TXD一位位发出。
 2.控制和状态寄存器 UCSRA
    RXC          TXC           UDRE            FE        DOR          PE         U2X       MPCM
接受完成置1  发送完成置1     数据为空标志    帧错误1   接受数据   校验位错误   倍速模式  多机通信
读取数据清0  中断时自动清0   数据完全到移              溢出1          1           1       地址位
                             位寄存器中1
UCSRB  设置相关中断的允许
RXCIE            TXCIE       UDRIE        RXEN          TXEN       UXSZ2      RXB8        TXB8
接受中断允许  发送中断允许  空中断允许  数据接受允许 数据发送允许 位数设置  接受第9位

RXEN,TXEN设置时会改变时普通IO口,或者是当做复用口用,在发送数据时设置下,数据全部发送后才生效 
RXB8,TXB8需要先读写出

UCSRC

URSEL           UMSEL        UPM1       UPM0      USBS      UCSZ1     UCSZ0       UCPOL
寄存器选择      工作模式        校验方式         停止位    和上面的UXSZ2设置
写时需要设为1    1异步                                           数据个数
存在共用寄存器               00禁止11奇10偶     0为1个1为2个

波特率寄存器:UBRRL  UBRRH
 UBRRH和UCSRC共用 了底4位  加上UBRRL共12位  设置后正在传的数据会被打断
需要注意URSEL的设置 :0  写入的比特率高4位
                      1  写入的是寄存器的内容
读UBRRH,第一次是比特率的内容  在连续的2个时钟周期内再读一次就是UCRSC的内容 

使用时可以查速查表,直接用ICCAVR生成工具即可。  

三,相关操作  等练习个程序后补上
1 初始化   关全局中断   
TXC  RXC看数据是否完成   发送数据前TXC必须请零 
把数据放入到发送缓冲器即可  UDR中  5-8位
2 注意下空中断  允许后需要不断写数据  否则一直不断的中断产生  一般禁止就可以了
 TXEN 设置0后 所有数据发送后生效  然后就当普通IO口用了
  禁止接受 会立即 丢失数据

四一些总线标准
RS232 9针D型接口 
  1 -3 ~-25     0   3-25V
需要使用电平转换电路  MAX232

 

五.工业设计中的串口

这里如果大家看到了还是注意下比较好 ,网上写的不多的,我也是从工程实践和查找大量的参考书中总结的

设计思路是基于状态机,并自定义了协议,同时协议中使用了CRC校验,和简易的加密技术

思路是:主从方式,上位机发送数据包,下位机在中断中接受,接受数据时要一位位的确认,并不断进行切换,发送的位置状态,把初步确认的数据放到接受缓冲器里,等所有的数据接收好了,程序进入大循环了,就执行主程序中加入uart操作函数,这个函数首先判断主机发送的命令和设置是否接受完成,在完成的状态下进行校验正确性,校验后,根据主机命令,组装数据包和存贮主机的设置数据,并把需要发送的数据包或设置完成数据包放在需要发送的数据缓冲区,接着改变下此时的状态:为我组好了,准备发送数据了,接着触发中断,可以直接往串口发个数据即可,正常发送后,单片机会执行其他程序,等上位机接受到这个触发数据后,下位机会中断,中断程序会根据状态,一位位的发生缓冲区的数据,直到所有的数据发送完成,发送完成后还要置位到接受数据状态0。

我的环境是atmega128

初始化

 


uchar LED_Temp=0xFF;
uchar OUT_temp=0x04;
static uchar Uart_Status;
static uchar R_Data_Lenth;


uchar Tx_Buf[TxBufSize];
uchar Rx_Buf[RxBufSize];
uchar *P_Uart_Rx;
uchar *P_Uart_Tx;
uchar Rx_Count;
uchar Tx_Count;

 

void Uart_Init(void)
{
  //UCSR0B = 0x00; //先关闭
  UCSR0A=0x00;
  UCSR0C=0x06;                 //8 DATA ,1 STOP, NO PARITY
  UCSR0B = (1<   // RXCIE=1;TXCIE=1;UDREIE=0;RXEN=1;TXEN=1
  Com_baudrate (9600);
  P_Uart_Tx=Tx_Buf;     //缓冲区指针定义
  P_Uart_Rx=Rx_Buf;
  Uart_Status=0;        //开始时状态为接受起始位状态,其实这里是因为我在程序中用了通信协议

                         //本篇为基础,就把协议的内容删去了,仅仅提供了能运行的最简单的框架
  SEI(); //re-enable interrupts
}


// 函数说明:波特率设置
void Com_baudrate (unsigned int baudrate)
{
    unsigned int tmp;
    tmp= 8000000/baudrate/16-1;
    UBRR0H=(unsigned char)(tmp>>8);
    UBRR0L=(unsigned char)tmp;
}
// 函数说明:串口接收中断函数
#pragma interrupt_handler uart0_rx_isr:iv_USART0_RXC
void uart0_rx_isr(void)

{

   //这里填写串口中断处理的内容,可以添加协议,使用状态机就可以了

   //把接收到得内容放在缓冲区,然后再创建个处理缓冲区数据的函数,直接放在主循环中即可
}

 

//函数说明:串口发送完成中断函数 
#pragma interrupt_handler uart0_tx_isr:iv_USART0_TXC
void uart0_tx_isr(void)
{
    //发送数据的处理函数

}


// 函数说明:uart进程函数 ,放在大循环中
void Uart_Process(void)
{
   //接收到得数据,再具体的在系统中实现,比如上位机的监控,或者传输数据等

}


//函数说明:uart测试程序 
void Uart_Test(uchar data)
{
   UDR0 = 0x01;//发送数据
}

 


//- 功能描述:串口发送字节的函数
 //- 函数属性:外部,使用户使用
 //- 参数说明:mydata:要发送的一个字节
// - 返回说明:无
// - 注:发送一个字节,是串口发送的基础操作
void UART_Send_Byte(unsigned char mydata) 
{
 // UCSR0B = (1<   UCSR0B &= ~((1<   while(!(UCSR0A &(1<    //等待发送缓冲区为空
  UDR0 = mydata;
 // delay_nms(5);
  UCSR0B |= (1< //改的时候不要影响其它寄存器位,开串口中断
}

关键字:AVR单片机  串口详解 引用地址:AVR单片机串口详解

上一篇:AVR单片机中断模式的串口发送与接收
下一篇:AVR单片机ADC实验

推荐阅读最新更新时间:2024-03-16 15:17

AVR单片机全系列性能参数表
AVR单片机全系列性能参数表 包括:tiny11,tiny12,tiny13,tiny15L,tiny2313,tiny26,tiny26L,tiny28L,tiny28V,90S1200, 90S2313 Mega128,Mega128L,Mega16,Mega16L,Mega162,Mega162L,Mega162V, Mega169,Mega169L,Mega169V,Mega32,Mega32L 包括:Mega48,Mega88,Mega168,Mega64,Mega64L,Mega8,Mega8L,Mega8515, Mega8515L,Mega8535,Mega8535L
[单片机]
<font color='red'>AVR单片机</font>全系列性能参数表
AVR单片机教程——LCD1602
显示屏 开发板套件里有两块屏幕,大的是LCD(液晶显示),小的是OLED(有机发光二极管)。正与你所想的相反,短小精悍的比较贵,而本讲的主题——LCD1602——功能较少,使用起来也简单很多。 这块屏幕的显示是以字符为单位的。每个字符都是8像素高,5像素宽。1602这个名字,来源于显示字符的数量,共2行,每行16个字符。出售1602的商家提供了一份文档:提取码8c1u。 硬件 一个典型的1602显示屏有16个引脚(还有些模块是用串行总线驱动的): 名称 功能 连接 VSS 电源地 GND VDD 正电源 VCC(5V) VO 对比度调整 左侧的电位器,其左端接GND,右端接VCC RS 数据/指令选择 PB0
[单片机]
<font color='red'>AVR单片机</font>教程——LCD1602
基于AVR单片机的电子镇流器设计
摘要:电子镇流器(Electrical ballast)是镇流器的一种,是指采用电子技术驱动电光源,使之产生所需照明的电子设备。电子镇流器自身功耗低,有更佳的照明效果,消除了闪频现象,发光更稳定,而且可以调光。文章采用AVR单片机作为控制芯片,通过电子镇流器进行调光和相关功能的控制,最大限度地发挥智能型镇流器的特点。实际应用表明,文中的方法有效。 关键词:电子镇流器;AVR单片机;调光 0 引言 电子镇流器是新型节能产品,不仅能带动一些照明灯具,还可以和一些紫外灯结合在一起,对于空气净化和水源净化都有着非常大的作用。当前,全世界都在大力提倡环境保护,电子镇流器间接地为环保提供了原动力。AVR单片机是一款性价比较高的单片机,用
[单片机]
基于<font color='red'>AVR单片机</font>的电子镇流器设计
AVR单片机的智能家居监控系统提高生活水平
随着科技的发展和人民生活水平的提高,智能家居成为了一个热门的研究领域。智能家居问题中面临的主要问题就是安全防盗、电器控制等问题。 智能 家居不仅能够完成出现问题对主人进行的报警功能,还应提供智能家居设备执行主人的命令操作,比如通过手机或是平板电脑等终端控制电器进行做饭或是空气清洁等工作。 因此, 智能 家居中用到的传感器主要有红外传感器、门磁传感器、实时时钟芯片等。 1 家居监控系统工作原理 系统主要由门磁报警、红外传感器报警、煤气传感器报警、正常工作、用户命令执行动作构成。 1.1 门磁报警 门磁系统完成对门出入安全的监测,主要有磁铁和干簧管组成。当主人离开房子的时候可以启动防盗功能,如果两者保持正对,那么在磁铁的作用下
[电源管理]
<font color='red'>AVR单片机</font>的智能家居监控系统提高生活水平
基于AVR单片机的数字正弦逆变电源设计
摘要:提出一种高性能的直流-交流(DC-AC)数字式正弦逆变电源的设计方法。采用SG3525A与AVR系列单片机AT90PWM2作为控制器进行设计。SG3525A产生PWM波进行前端的推挽升压控制,通过直流母线上高电压的负反馈,使得全桥逆变的输入电压保持稳定。AT9OPWM2的波形发生器产生SPWM波形对后级全桥逆变进行控制,通过采样全桥逆变后的输出电流以及输出电容电压,实现双闭环控制,使得逆变电源在各种不同类型负载条件下都能具备良好的输出特性以及负责效应。实验结果表明:1 kW样机性能稳定,逆变效率大于90%,在不同种类的满功率的负载条件下均能保持电压精度为220 V±l%,频率精度50 Hz±O.1%,THD小于l%。 关键词
[单片机]
基于<font color='red'>AVR单片机</font>的数字正弦逆变电源设计
基于AVR单片机和EM4094读写芯片的多协议RFID读卡器
  引言   射频识别(RFID)是利用无线方式对电子数据载体(电子标签)进行识别的一种新兴技术。与接触式IC卡和条形码识别等系统比较,它有着巨大的优势。利用射频识别技术,能有效实现对数量大、分布区域广的信息进行智能化管理,达到高效快捷运作的目的,特别是在第二代身份证、物流、交通航运、自动收费、超市、门禁系统管理、服务领域等方面有着广泛的应用前景。随着我国国民经济的快速发展,国内RFID行业也正经历着深刻的变革。   RFID系统一般是由读写器、射频卡、应用软件来组成。其中读写器的设计是至关重要的,它决定了系统的稳定性和准确性。   除了要求其能支持一系列协议、标准和收发器外,对读写器可能还有其它功能性方面的要求,如高性能、
[单片机]
基于<font color='red'>AVR单片机</font>和EM4094读写芯片的多协议RFID读卡器
基于AVR单片机与FPGA的低频数字式相位测量仪
在工业领域中经常要用到低频数字式相位仪来精确测量两信号之问的相位差,比如在电力系统、频率特性的研究、激光测距等领域均有广泛的应用,相位检测的精度直接决定系统的整体性能。这就要求测量仪逐渐向智能化和测试自动化方向发展,本设计采用MCU和FPGA相结合的系统方案,以AVR单片机ATmega128和Altera公司的Cyclone系列EP1C3T100为核心,充分发挥各自的优势,如AVR单片机先进的RISC结构和强劲的运算、控制功能,Altera公司的FPGA运算速度快、资源丰富以及易编程的特点,合理设计,此方案的相位仪具备速度快、稳定可靠、精度高等优点,而且容易实现“智能化”和“自动化”。 1 系统方案设计 1.1 测量方法的比较与
[单片机]
基于<font color='red'>AVR单片机</font>与FPGA的低频数字式相位测量仪
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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