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;                                 //波特率9600
    UBRRL = (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);        //接收完毕中断使能
}

在这里插入图片描述

大家不懂的在问我吧

猜你喜欢

转载自blog.csdn.net/github_39582118/article/details/85926644