我买了一块开发板,但是在测试外部中断时发现老是导致系统复位,请各位看看哪里出问题。即每当按一个按键,该按键连接GND和PD1(外部中断1),按下按键时,PD1接GND,引起中断来。初始化时串口发0x99,每当按按键触发中断时,在中断函数中发0x22然后重启。(现象就是每按键,串口收到一个22然后一个99)
有人说打开熔丝位103,即兼容mega103模式,我试过不行。况且也不符合理论
//***********************************************************************
// 包含文件
//***********************************************************************
#include
#include
//#define F_CPU 16000000 // 单片机主频为16MHz,用于延时子程序,熔丝位必须设置到外部高频晶振才行
#include
#include
#include
#include //中断信号头文件
#include "Config.h"
//***********************************************************************
// 定义变量区
//***********************************************************************
volatile unsigned char count=255; //定义键盘计数变量
uint tx_count=200,tx_flag=0xff;
uchar usart_rx_data=0xff;
//***********************************************************************
// IO端口初始化
//***********************************************************************
//*************************************************************************
// 串口相关中断服务子程序
//*************************************************************************
//数据发送结束中断向量
SIGNAL(SIG_USART0_TRANS) //中断服务程序
{
delay_ms(10); //相关操作
}/**/
//数据接收结束中断向量
//数据寄存器空中断向量
void Send_SingleChar(uchar usart_tx_data)
{
while(!(UCSR0A&(1<
udr0="usart_tx_data;" //写入发送数据
while(!(UCSR0A&(1<
UCSR0A|=(1<
}
SIGNAL(SIG_USART0_RECV) //中断服务程序
{
usart_rx_data="UDR0;" //将接收到的数据取出
Send_SingleChar(usart_rx_data); //接收到的数据再发回电脑,显示在串口调试助手上
}/**/
void usart_init()
{
ucsr0a="0x00;" //单倍速模式
ucsr0b="0x98;" //接收中断允许,发送结束和寄存器空中断关闭,采用查询发送模式
ucsr0c="(1<
ubrr0h="baud_h;" //写波特率的值
ubrr0l="baud_l;"
}
void system_init()
{
ledddr="0xFF;
" led="0xFF;
" keyport="0x02;" //PD1设置为输入,打开上拉,高电平
keyddr="0xFD;" //设置为输入,PD1上拉电阻使能有效
}
//*************************************************************************
// 将count值送入到LED发光二极管显示
//*************************************************************************
void Display_Key(unsigned char num)
{
led="num;
" delay_ms(1000);
}
//*************************************************************************
// 中断初始化设置
//*************************************************************************
void interrupt_init()
{
EIMSK|=0x02; //使能外部中断0和外部中断1
eicra="0x0A;" //下降沿触发方式
mcucsr="0x00;" //控制和状态寄存器初始化
}
//*************************************************************************
// 中断服务子程序
//*************************************************************************
/*ISR(INT0_vect) //中断0服务程序
{
}*/
ISR(INT1_vect) //中断1服务程序
{
/*if(!(PIND & (1 << PD1)))
{
delay_ms(50);
if(!(PIND & (1 << PD1)))
{
delay_ms(50);
if(!(PIND & (1 << PD1)))
{
if(count)
count--;
else
count="255;
"
}
}
}*/
//EIFR&=(1<
//SREG|=0x80;
Send_SingleChar(0x22);
}
//*************************************************************************
// 主程序
//*************************************************************************
int main(void)
{
system_init(); //系统初始化
usart_init(); //usart串口初始化配置
interrupt_init(); //中断配置初始化
SREG|=0x80; //开启全局中断
Send_SingleChar(0x99);
Display_Key(0xF0);
delay_ms(500);
while(1)
{
Display_Key(0xFF); //显示键值到8位LED灯
Send_SingleChar(0x11);
delay_ms(1000);
}
}