一.了解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< //改的时分不要影响其它寄存器位,开串口中止
}
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/259910.html