单独的串口中断和定时器中断都没有问题,但是放在一块的时候,无论如何程序都不会进入串口中断,而是进入定时器中断,而且会跑飞。
#include <iom88v.h>
#include <macros.h>
#include <Serial_Communication.h>
unsigned char Data;
unsigned char temp;
/*
** =========================================================
** 名称:void USART_Init(void)
** 完成功能:串口初始化
** 参数:无
** 返回值:无
** =========================================================
*/
void USART_Init(void)
{
UBRR0L = 0x0c;//设置波特率
UBRR0H = 0x00;
UCSR0B = 0X98;//允许发送和接收,发送结束中断和接收结束中断使能
UCSR0C = 3<<UCSZ00;//模式选择:异步操作,1位停止位,8位字符长度
}
/*
** =========================================================
** 名称:unsigned char USART_Receive(void)
** 完成功能:发送数据
** 参数:无
** 返回值:UDR0缓冲器中数据
** =========================================================
*/
unsigned char USART_Receive(void)
{
while(!(UCSR0A&(1<<RXC0)))//判断缓冲器中是否有未读出数据
;
return UDR0;
}
/*
** =========================================================
** 名称:USART_Transmit(unsigned char data)
** 完成功能:接收数据
** 参数:unsigned char data:待发送的数据
** 返回值:无
** =========================================================
*/
void USART_Transmit(unsigned char data)
{
while(!(UCSR0A&(1<<UDRE0)))//判断缓冲器是否准备好接收新数据
;
UDR0=data;
}
void timer1_init(void)
{
TCNT1H = 0xE3; //设置 TC1 的 计数寄存器 高8位值,基于8M晶振
TCNT1L = 0xE1; //设置 TC1 的 计数寄存器 低8位值,基于8M晶振
TCCR1A = 0x00;
TCCR1B = 0x05; //设置TC1 为 CLK/1024分频,启动TC1
TIMSK1 = 0x01; //设置 定时计数器 的 屏蔽寄存器
}
void main(void)
{
DDRB=0XFF;
PORTB=0XFF;
CLI();
timer1_init();
Serial_Communication();//初始化串口通信模块标志位和数据
USART_Init(); //串口初始化
SEI(); //开中断
while(1)
{
if(temp==1) //判断标志位是否为1
{
Transmit_Buffer_Update();//更新数组
for(Transmit_Count=0;Transmit_Count<16;Transmit_Count++)
{
USART_Transmit(Transmit_Buffer[Transmit_Count]);
}
Transmit_Count=0;
temp=0; //标志位清零
}
}
}
/*
** =========================================================
** 名称:USART0_rxc_isr(void)
** 完成功能:串口接收中断子程序
** 参数:无
** 返回值:无
** =========================================================
*/
#pragma interrupt_handler USART0_rxc_isr:19
void USART0_rxc_isr(void)
{
unsigned char temp1=0;
PORTB=~PINB;
Receive_Buffer[Receive_Count]=USART_Receive();
Receive_Count++;
if(Receive_Count>7)
{
temp1=CRC16_Check(Receive_Buffer,6,6,7);
if(temp1==1)
{
Command_Decode(Receive_Buffer);
}
Receive_Count=0;
}
SEI();
}
#pragma interrupt_handler timer1_ovf_isr:14
void timer1_ovf_isr(void)
{
TCNT1H = 0xE3; //reload counter high value
TCNT1L = 0xE1; //reload counter low value
//PORTB=~PINB;
temp=1;
SEI();
}
|