本文主要是介绍atmega16应用之串口通信(HC05),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
串口通信
https://baike.baidu.com/item/串口通信/3775296?fr=aladdin
由于我比较懒,所以大家自己去看串口通信的原理啦
串口通信的寄存器配置
如果大家学过微机原理这门课,就知道单片机使用离不开三种寄存器,状态寄存器,是读取状态用的,控制寄存器,是配置参数控制功能,数据寄存器,是存储数据用的,只要我们正确的配置寄存器,就能使用自己想要的功能
USART I/O数据寄存器-UDR
大家只要知道结束数据和发送的数据都是存储在UDR这个寄存器里就够了,文字太多懒得看
USART控制和状态寄存器A- UCSRA
一般来说,我们自己完的单片机就一对一通信,功能不复杂,因此只需要配置和读取的是RXC、TXC还有异步通信模式下的U2X
USART控制和状态寄存器B- UCSRB
这个寄存器使用的东西非常多,首先 RXCIE和TXCIE写中断服务函数使用的,在接受和发送完一个字符后,需要执行某些操作时,必须要置位,才能使用中断服务函数。 RXEN和TXEN是打开串口通信的接受和发送数据的功能,否则是无法发送或结束到数据的。一般来说,配置这几个就够了
USART控制和状态寄存器C- UCSRC
常用的使用是配置 UMSEL (选择同步或异步)、UPM1:0: (奇偶校验)、USBS(停止位)、 UCSZ1:0: 字符长度 ,其他的基本不用管
USART波特率寄存器-UBRRL 和UBRRH
大家自己查资料计算比特率的计算公式了,我比较懒
HC05的使用
HC05怎么用,别人已经写的 很好了,就不写了,我是用HC05与手机通信,所以比特率是9600,用的是手机串口调试软件
https://blog.csdn.net/u011318735/article/details/17429879
代码
//串口IO初始化函数
void Serial_PortInit(void)
{int BAUD;DDRD &= 0XFE;DDRD |= 0X02;UCSRA |= (1 << U2X); //倍速模式UCSRB |= ((1 << RXEN )|(1 << TXEN)); //发送接受使能UCSRB |= ( (1<< RXCIE)| (1<< TXCIE)); //发送接受结束中断使能UCSRB &= ~(1 << UCSZ2);UCSRC |= ((1 << UCSZ1)|(1 << UCSZ0)); //8位数据位UCSRC &= ~(1 << UMSEL); //异步UCSRC &= ~((1 << UPM1)|(1 << UPM0)); //无奇偶校验位UCSRC &= ~(1 << USBS); //1位停止位BAUD = 12; //波特率9600UBRRL = (unsigned char)BAUD;UBRRH = (unsigned char)(BAUD>>8);SREG|=BIT(7); //开全局中断
}
//串口发送函数
void USART_Send(unsigned char Data)
{while(!(UCSRA&(BIT(UDRE)))); //数据寄存器UDR是否为空?UDR=Data; //UDR赋值while(!(UCSRA&(BIT(TXC)))); //数据是否已经发送完毕?UCSRA|=BIT(TXC); //清除发送完毕标志位
}
/*发送字符串*/
void UART_Send_String(unsigned char* str, unsigned char length)
{//unsigned char i=0;while(length--){USART_Send(*str);*str++;}}
//串口接收完毕中断函数
interrupt[USART_RXC] void USART_Received_Ir()
{UCSRB &= ~BIT(RXCIE); //接收完毕中断不使能RX_buffer=UDR; //读取UDR的数据if(Rx_Flag) //将命令存入数组RX_cmd[R_i++] = RX_buffer;if(RX_buffer == '#'){R_i = 0;Rx_Flag=1;}//if(RX_buffer == 'o')//lcd_puts("hello");//lcd_putchar(UDR);UCSRB |= BIT(RXCIE); //接收完毕中断使能
}
大家不懂的在问我吧
这篇关于atmega16应用之串口通信(HC05)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!