/**
*本文件头仅用于ATmega16,其他单片机需要进行适当修改
*/
#include <iom16v.h>
#include <macros.h>
//中断函数定义,接收中断
#pragma interrupt_handler UART_RX_Interrupt:12
#pragma interrupt_handler UART_TX_Interrupt:14
#define FOSC 11059200
#define BAUD 9600
/*
定义数据缓存大小
*/
#define UART_BUFFER_SIZE 64
#define UART_BUFFER_MASK (UART_BUFFER_SIZE-1)
/*计算寄存器数值
*异步正常模式
*UBRR UBRRH 与UBRRL 的数值 (0-4095)
*/
#define B_UBRR (FOSC/(16*BAUD)-1)
/**
*定义缓存数组
**/
static volatile unsigned char UART_BUFFER[UART_BUFFER_SIZE];
static volatile unsigned char RX_NUM=0;
static volatile unsigned char TX_NUM=0;
//设置寄存器,打开中断
void UART_INIT(void){
UCSRB = 0x00;
UCSRA = 0x00;
/*设置数据位为8,1位停止位
*/
UCSRC = (1<<UCSZ1)|(1<<UCSZ0);
DDRD|=(1<<PD1);//端口初始化,不知道有没有必要
UBRRH = B_UBRR/256;
UBRRL = B_UBRR%256;
/*
*接收使能,发送使能,接收中断使能
*全局中断使能
*/
UCSRB |= (1<<RXEN)|(1<<TXEN)|(1<<RXCIE);
/*
打开全局中断
*/
SREG = 0x80;
}
void delay(unsigned int time){
while (time--);
}
//发送数据
void sendData(){
TX_NUM = 0 ;
SREG = 0; //禁止中断
/*
以上禁止中断的方法是否可行?*/
while (TX_NUM < UART_BUFFER_SIZE){
while (!(UCSRA&(1<<UDRE)));
UDR = UART_BUFFER [TX_NUM];
TX_NUM++;
}
TX_NUM = 0 ;
if (TX_NUM > UART_BUFFER_SIZE){
TX_NUM = 0;
}
SREG = 0x80; //打开全局中断
}
//接收中断函数
void UART_RX_Interrupt(void){
if (RX_NUM < UART_BUFFER_SIZE){
UART_BUFFER[RX_NUM] = UDR;
RX_NUM++;
sendData();
}
if (RX_NUM = UART_BUFFER_SIZE){
RX_NUM = 0 ;
}
if (RX_NUM > UART_BUFFER_SIZE){
/*
*程序运行出错
*/
RX_NUM = 0;
}
}
void UART_TX_Interrupt(void){
}
主程序很简单#include "kohill_UART_INIT.h"
void main(){
UART_INIT();
while (1){
while (!(UCSRA&(1<<UDRE)));
UDR = 5;
}
}
程序功能说明:
利用中断方式将收到的数据保存在大小为64的数组中,待数组存满之后将数据发出
波特率:9600bps,晶振:11.0592MHZ
为了测试串口配置的正确性,主程序不间断地发送数字5,用串口调试助手检查收到的数据,但是串口调试助手收到的数据为一堆0x00
觉得应该是波特率没有设置对,但是又不知道哪儿不对
|