谢谢你们,我也问了几个朋友,他们说是硬件问题,不是中断优先级的问题,就是第一次上电,接收中断接不了数据,下面是我的中断部分程序:#include "../inc/MySerial.h"
void UART_Interrupt_Receive(void) interrupt 4
{
unsigned char temp;
if(RI) //RI由硬件置1,请求CPU处理接收数据
{
RI = 0;
temp=SBUF;
//--------------------------------
if(PassWord==1) //Version 1.0版自定义协议
{
if(ReceiveConter>10) ReceiveConter=0;
switch(ReceiveConter)
{
case 0:
if(temp==0x55||temp==0xf0)
{
ReceiveData[0]=temp;
ReceiveConter++;
}
else
{
ReceiveConter=0;
}
break;
case 1:
if(temp==0xaa||temp==0x0f)
{
ReceiveData[1]=temp;
ReceiveConter++;
}
else
{
ReceiveConter=0;
}
break;
case 10:
if(temp==0x0d)
{
ReceiveData[10]=temp;
ReceiveConter=0;
ReceiveFinish_f=1;
}
else
{
ReceiveConter=0;
}
break;
default:
ReceiveData[ReceiveConter]=temp;
ReceiveConter++;
break;
}
}
//--------------------------------
else if(PassWord==3) //Version 3.0版自定义协议
{
switch(ReceiveConter)
{
case 0:
if(temp==0x55||temp==0xf0)
{
ReceiveData[ReceiveConter]=temp;
ReceiveConter++;
}
else
{
ReceiveConter=0;
}
break;
case 1:
if(temp==0xaa||temp==0x0f)
{
ReceiveData[ReceiveConter]=temp;
ReceiveConter++;
}
else
{
ReceiveConter=0;
}
break;
default:
if((ReceiveConter>=2)&&(ReceiveConter<5))
{
ReceiveData[ReceiveConter]=temp;
ReceiveConter++;
}
else if((ReceiveConter>=5)&& ((ReceiveConter+1)<ReceiveData[4]))
{
ReceiveData[ReceiveConter]=temp;
ReceiveConter++;
}
else if(((ReceiveConter+1)==ReceiveData[4])&&(temp==0x16))
{
ReceiveData[ReceiveConter]=temp;
ReceiveConter=0;
ReceiveFinish_f=1;
}
else
{
ReceiveConter=0;
}
break;
}
}
}
}
void Timer_Init (void)
{
TMOD = 0x11; // 16 位定时器/ 计数器,TL0、TH0 全用
TH0 = 0xda; // set to reload immediately
TL0 = 0xe8; // Init reload value T0:10mS
TH1 = 0xed; // set to reload immediately
TL1 = 0x74; // Init reload value T1:5mS
ET0 = 1; // enable Timer0 interrupts
TR0 = 1; // start Timer0
ET1 = 1; // enable Timer1 interrupts
TR1 = 1; // start Timer1
}
void serial_port_initial() // 使用独立波特率发生器作为波特率发生器
{
EA=1;
SCON = 0x50; //0101,0000 8 位可变波特率,无奇偶校验位
switch(SetupData[93])
{case 1:BRT = RELOAD_COUNT1;break; //600
case 2:BRT = RELOAD_COUNT2;break; //1200
case 3:BRT = RELOAD_COUNT3;break; //2400
case 4:BRT = RELOAD_COUNT4;break; //4800
case 5:BRT = RELOAD_COUNT5;break; //9600
default:BRT = RELOAD_COUNT2;break;} //1200
AUXR |= 0x11; //T0x12,T1x12,UART_M0x6,BRTR, S2SMOD,BRTx12,XRAM,S1BRS
//Baud = Fosc/(256 - RELOAD_COUNT)/32/12 (12T 模式)(!!!采用!!!)
//Baud = Fosc/(256 - RELOAD_COUNT)/32 (1T 模式)
//BRTR = 1,启动独立波特率发生器
//S1BRS = 1,串口1 选择独立波特率发生器作为波特率发生器,
//此时定时器1 可以释放出来作为定时器,计数器,时钟输出使
RI=0;
ES = 1; //允许串口中断
}
复位电路
我用Multisim仿得,复位时间(VCC---2.4V)有700ms,实际测量也相差不多。
|