- /**
- *本文件头仅用于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
觉得应该是波特率没有设置对,但是又不知道哪儿不对
|