有关中断的问题,PIC16F877A中有多个中断源,但只有一个中断入口,在一个中断子程序中可以通过中断标志位判断是哪个中断从而执行。下面那个程序是一个测试程序,:中断子程序中有两个中断,一个是串口中断,另一个是time0中断,time0中断是让蜂鸣器间隔响,但是发现上电后蜂鸣器没有响,只有运行串口调试助手程序使串口收发数据后才能使蜂鸣器响,按理说一上电time0定时器应该已经执行,和串口的执行与否没关系的。另外还发现蜂鸣器响的时间不是我所设定的中断时间,并且无法改变时间,好像蜂鸣器响的时间间隔是由串口的波特率决定的。这是怎么回事?PIC的中断难懂,真让我这从51刚转过来的新手纳闷。
#include<pic.h>
__CONFIG(0X1832);
#define uchar unsigned char
#define fmq RC2
unsigned int t;
void delay(uchar z)
{
uchar i;
while(z--)
for(i=0;i<250;i++);
}
void port_init()
{
TRISC=0xc0; //RC7/RXRC6/TX输入,其余口输出,RX,TX口必须设置为输入状态,之后硬件会自动匹配为相应方向
}
void usart_init()
{
SPBRG=0X33; //4M晶振,1200波特率
TXSTA=0X20;
RCSTA=0X90;
RCIE=0X01; //接收中断使能
GIE=0X01; //总中断使能
PEIE=0X01; //外部中断使能
}
void interrupt receive_data(void)
{
if(T0IF==1)
{
TMR0=100;
T0IF=0;
t++;
if(t==1000)
{
t=0;
fmq=1;
}
fmq=0;
}
if(RCIE&&RCIF) //判断是否中断和中断标志位是否为1
{
PORTC=RCREG; //C口的LED亮
TXREG=RCREG;
while(!TRMT);
}
}
void main()
{
port_init();
usart_init();
TMR0=100;
T0IE=1;
TXREG=0X01;
while(!TRMT);
while(1);
} |