中断程序不知道哪的问题,接受中断后往上位机发一个指令,可是上位机总会遗漏一到两个指令,还有时候会往上位机发一些乱码
#include <string.h>
#include <stdio.h>
#define F_CPU 16000000 // 单片机主频为16MHz,用于延时子程序,熔丝位必须设置到外部高频晶振才行
#include <util/delay.h>
#include <avr/io.h>
#include <avr/wdt.h>
#include <avr/iom128.h>
#include <avr/interrupt.h> //中断信号头文件
#include "Config.h"
#include <util/delay.h>
//***********************************************************************
// 定义变量区
//***********************************************************************
unsigned int tx_count=200,tx_flag=0xff,data=0x03,data1=0x05,data2=0x06;
static unsigned char A1,A2,A3;
unsigned char usart_rx_data=0xff;
void watchdog(void)
{
WDTCR=0x1F; //使能watchdog,并且,采用2048K分频,典型溢出时间5V时1.9S
WDTCR=0x0F; //使能watchdog,并且,采用2048K分频,典型溢出时间5V时1.9S
}
//***********************************************************************
// IO端口初始化
//***********************************************************************
void system_init()
{
KEYPort=0x02; //PD1设置为输入,打开上拉
KEYDDR=0xFD; //设置为输入,PD1上拉电阻使能有效
}
//*************************************************************************
// 中断初始化设置
//*************************************************************************
void interrupt_init()
{
EIMSK|=0x03; //使能外部中断0和外部中断1
EICRA=0x0F; //下降沿触发方式
MCUCSR=0x00; //控制和状态寄存器初始化
}
//*************************************************************************
// 中断服务子程序
//*************************************************************************
ISR(INT0_vect) //中断0服务程序
{
}
ISR(INT1_vect) //中断1服务程序
{
Send_SingleChar(data);
}
void usart_init()
{
UCSR0A=0x00; //单倍速模式
UCSR0B=0x98; //接收中断允许,发送结束和寄存器空中断关闭,采用查询发送模式
UCSR0C=(1<<UCSZ01)|(1<<UCSZ00); //写UCSRC寄存器,异步通信无校验,8位数据1位停止位
UBRR0H=baud_h; //写波特率的值
UBRR0L=baud_l;
}
//*************************************************************************
// 数据处理函数
//*************************************************************************
void data_do(uchar temp_d)
{
uchar A2t;
A1=temp_d/100; //分出百,十,和个位
A2t=temp_d%100;
A2=A2t/10;
A3=A2t%10;
}
//*************************************************************************
// 串口相关中断服务子程序
//*************************************************************************
//数据发送结束中断向量
SIGNAL(SIG_USART0_TRANS) //中断服务程序
{
delay_ms(10); //相关操作
}
//数据接收结束中断向量
SIGNAL(SIG_USART0_RECV) //中断服务程序
{
usart_rx_data=UDR0; //将接收到的数据取出
Send_SingleChar(usart_rx_data); //接收到的数据再发回电脑,显示在串口调试助手上
}
//数据寄存器空中断向量
void Send_SingleChar(uchar usart_tx_data)
{
while(!(UCSR0A&(1<<UDRE0))); //等待发送寄存器空
UDR0=usart_tx_data; //写入发送数据
while(!(UCSR0A&(1<<TXC0))); //等待发送完毕
UCSR0A|=(1<<TXC0);
}
int main(void)
{
watchdog();
usart_init();
system_init(); //系统初始化
interrupt_init(); //中断配置初始化
SREG|=0x80; //开启全局中断
unsigned int j;
for(j=0;j<3;j++)
{
asm("wdr"); //喂狗,避免发生看门狗复位
Send_SingleChar(data2);
}
while(1)
{ unsigned int i,j;
for(i=0;i<10;i++)
{
delay_ms(1000);
asm("wdr"); //喂狗,避免发生看门狗复位
Send_SingleChar(data1);
}
delay_ms(2000);
}
}
|