本帖最后由 adsionshm 于 2012-12-12 20:45 编辑
问题如下:
小弟用ATMEGA64测试串口232的接受中断,连好硬件后,我在笔记本电脑上用串口助手通过USB转232串口线发送一个代码,比如十六进制的11,按照程序里的设置,理论上,我的单片机会回一个11到串口助手的界面上,但是程序却从main函数开始执行了一遍,也就是发了个FF,我在在发个22,也是回个FF,就是说还是从main函数开始执行了,这是为啥,请大侠们帮忙看看代码:
补充下:我的熔丝位设置如下:低位EF,高位D9,扩展FF
/***********************************************************/
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#pragma interrupt_handler uart0_rx_isr:19
#define uchar unsigned char //定义无符号字符为 uchar
#define uint unsigned int //定义无符号整型
#define Crystal 8000000 //晶振8MHZ
#define Baud 9600 //波特率
//函数声明
void port_init(void);
void usart0_init(void);
void init_devices(void);
void usart0_char_send(uchar i);
void usart0_str_send(uchar *s);
uchar usart0_char_receive(void);
void uart0_rx_isr(void);
//void ReceiveData_deal(void);
void JudgeLED(void);
uint j;
uchar Receive_data;
uchar flag=0;
/******************端口初始化*******************************/
void port_init(void)
{
/*配置PORTA的输入 输出
初始状态:
PORTA 输入端口 并且输出高电平 按键
*/
PORTA = 0xFF;
DDRA = 0x00;
/*配置PORTC
初始状态:
PORTC 配置为输出,输出高电平
*/
PORTC = 0xFF;//
DDRC = 0xFF;//
/*配置PORTD状态为 输入ru
*/
PORTD = 0x00; //设置RXD1和TXD1
DDRD = 0x88; //配置PD3(TXD1)为输出,RXD1为输入
PORTE = 0x00; //设置RXD0和TXD0
DDRE = 0x02; //配置PE1(TXD0)为输出,RXD0为输入
DDRF=0XFF; //F口配置为输出,初始高电平,按键
PORTF=0XFF;
}
/*****************串口初始化********uart0*************************/
void usart0_init(void)
{
UCSR0B = 0x00; //禁止发送和接收
// UCSR0A = 0x02; //倍速异步模式USX=1
UCSR0A = 0X00;
UCSR0C = 0x06; //0000 0110,UCSZ1=1,UCSZ0=1
// UCSR0C = (1<<URSE0L) | 0x06;
//8位字符,1位停止位
UBRR0L = 0x33; //若为正常异步模式USX0=0则位,波特率9600
UBRR0H = 0x00; //参见ATMAGE64使用手册
UCSR0B = 0x98; //允许发送和接收,0x98,接收中断和接收使能,0x18,接收使能
}
/************串口初始化*****************/
/******************初始器件****************/
/**************************************/
void init_devices(void)
{
port_init();
usart0_init();
//usart1_init();
}
//****************发送一个字符******************************
void usart0_char_send(uchar i)
{
while(!(UCSR0A&(1<<UDRE0)));
UDR0=i;
}
/****************/
/******************发送一个字符串*************************/
void usart0_str_send(uchar *s)
{
while(*s)
{
//usart0_char_send(*s);
s++;
}
}
/*****************接收一个字符****************************/
uchar usart0_char_receive(void)
{
if((UCSR0A&(1<<RXC0))) {return UDR0;} // 查询方式接收,可行
}
/*************************/
void uart0_rx_isr(void)
{
SREG=0x00;
Receive_data=UDR0;
SREG=0x80;
}
/***************主函数*****************************/
main(void)
{
init_devices();
MCUCR = 0x01;
MCUCR = 0x02;
WDTCR=0x18;
WDTCR=0x10; //看门狗禁止
//_delay_ms(1000);
EIMSK = 0x00;
EICRA = 0x03;//详见datasheet的P86,P87页。
EIFR = 0x01;
//EIMSK = 0x01;//使能INT0中断
SREG = 0x80; //使能全局中断
x1_flag=0;
usart0_char_send(0xFF);
while(1)
{ };
}
|