HC-06蓝牙模块与Atmega16单片机在CodeVisionAVR编译环境下的串口通信程...
发布网友
发布时间:2022-04-25 12:00
我来回答
共1个回答
热心网友
时间:2024-08-17 10:42
您好,这样:
#include <iom16v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int
//#define BIT(n) (1<<n)
#pragma interrupt_handler uart_recdata:12
#define mcuclk 8000000
uchar rdata;
uchar flag=0;
void delay(uint n) //10ms延时
{
uint i,j;
for(i=0;i<n;i++)
for(j=0;j<1543;j++)
;
}
void uart_init(uint baud) //串口控制状态寄存器初始化,波特率设置
{
UCSRB=0x00;
UCSRA=0x00; //控制寄存器清零
UCSRC=(1<<URSEL)|(0<<UPM0)|(3<<UCSZ0); //选择UCSRC,异步模式,禁止
// 校验,1位停止位,8位数据位
baud=mcuclk/16/baud-1 ; //波特率
UBRRL=baud;
UBRRH=baud>>8; //设置波特率
UCSRB=(1<<TXEN)|(1<<RXEN)|(1<<RXCIE); //接收、发送使能,接收中断使能
SREG=BIT(7); //全局中断开放
DDRD|=0x02; //配置TX为输出(很重要)
}
void uart_senddata(uchar data)
{
while(!(UCSRA&(BIT(UDRE)))); //第五位UDRE为高,数据寄存器空,发数据至UDR
UDR=data;
while(!(UCSRA&(BIT(TXC)))); //第六位TXC高, 发送结束
UCSRA|=BIT(TXC); //置位TXC
}
void uart_recdata()
{
UCSRB&=~BIT(RXCIE);
rdata=UDR;
flag=1;
UCSRB|=BIT(RXCIE);
}
void main()
{
// uchar i='A';
// uchar j=4;
uart_init(19200);
while(1)
{
if(flag)
{
uart_senddata(rdata);
flag=0;
}
}
}