ATmega16是一种8位的高性能单片机,由Atmel公司生产。它具有高速、低功耗和强大的处理能力,广泛应用于嵌入式系统、自动化、智能控制、工业控制等领域。
异步通信以字符为单位进行传输,字符之间没有固定的时间间隔要求,而每个字符中的各位则固定的时间传送。异步通信中,收发双方去的同步是通过在字符格式中设置起始位和停止位的方式来实现的。具体来说就是,在一个有效字符正式发送之前,发送器先发送一个起始位,然后发送有效字符位,在字符结束时再发送一个停止位,起始位和停止位构成一帧。停止位和下一个起始位之间是不定长的空闲位,并且规定起始位为低电平(逻辑值为0),停止位和空闲位都是高电平(逻辑值为1),这样就保证了起始位开始处一定会有一个下跳沿,由此就可以标志一个字符传输的起始;根据起始位和停止位就很容易的实现了字符的界定和同步。
对于波特率的计算公式:
BAUD=Fosc/(16*BAUD)-1
公式中:BAUD为通信速率(b/s),Fosc为系统时钟频率,UBRR为波特率寄存器UBRRH、UBRRL中的值(0~4095)。
硬件设计原理图:
对于如何使用串口通信控制LED灯呢?
我们将使用Cx控制LEDx的亮,使用Fx控制LEDx的灭。
/*
* 串口点灯.c
*
* Created: 2023/4/26 19:50:06
* Author: chen
*/
#include <mega16.h>
#include <delay.h>
#define FOSC 4000000
#define BAUD 9600
#define MYUBRR (unsigned int)((unsigned long)FOSC/(16*(unsigned long)BAUD)-1)
unsigned char led=0xff;
unsigned char ledbuf[2]={0};
unsigned char ledflag=0;
void USART_Init(unsigned int ubrr){
PORTD = 0x03;
DDRD =0X02;
UCSRA=0x00;
UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
UBRRH = (unsigned char)(ubrr>>8);
UBRRL = (unsigned char)ubrr;
}
void USART_Transmit(unsigned char data){
while(!(UCSRA & (1<<UDRE)));
UDR=data;
}
interrupt [USART_RXC] void usart_rx_isr (void)
{
unsigned char status,data;
status = UCSRA;
data=UDR;
if(data=='C'){
ledbuf[0]='C';
}else if(data=='F'){
ledbuf[0]='F';
}
if(ledbuf[0]=='C'&& (0<(data-'0')&&(data-'0')<9)){
led=led &(~(1<<((data-'0')-1)));
ledbuf[0]=0;
ledflag=1;
}else if(ledbuf[0]=='F'&& (0<(data-'0')&&(data-'0')<9)){
led=led |((1<<((data-'0')-1)));
ledbuf[0]=0;
ledflag=1;
}
USART_Transmit(data);
}
void main(void)
{
unsigned char i=1;
USART_Init(MYUBRR);
PORTA = led;
DDRA = 0xff;
#asm("sei")
while (1)
{
// Please write your application code here
if(ledflag=1){
PORTA=led;
ledflag=0;
}
}
}
这样我们就能使用串口通信控制LED的状态了。