我写了一个小程序做个试验,目的是用定时器T0做中断,串口收到PC机指令后,P2.0端口输出一个脉冲,定时器定时脉冲间隔为10ms,
void serial() interrupt 4 using 3 { uchar dat; if(RI) { RI=0; ES=0; dat=SBUF; } }
//********************************************* void init_serial_comm(void) { SCON=0x50; TMOD=0x20; //TMOD: timer 1, mode 2, 8-bit reload PCON=0x00; //SMOD=0 TH1=0x0Fd; //Baud:9600 TL1=0x0Fd; ES=1; EA=1; TR1=1; // timer 1 run }
uchar receive_char_com(void) { uchar dat; while(RI==0); RI=0; dat=SBUF; return dat; } //**************************************** void timer0(void) interrupt 1 using 2 { TH0=-10000/256; TL0=-10000/256; TF0=0; ET0=0; EA=0; mot1_cp=0; NOP5(); mot1_cp=1; } //***************************** void motorrun(uint sn) { while(sn--) { TR0=0; TMOD=0x01; TH0=-10000/256; TL0=-10000/256; EA=1; ET0=1; TR0=1; // timer 0 run while(TF0==0); TR0=0; } }
//************************************************************* void main(void) { uchar dd; init_serial_comm(); aa: dd=receive_char_com(); switch(dd) { case 'A':motorrun(50);break; // case'B' } goto aa; } 试验中发现,在输出所要的50个脉冲以后(正常,本应该回到主程序继续检测串口指令),但主程序无法继续正确执行,即再次输入A,程序不响应,无脉冲输出。是不是定时器中断和串口中断冲突的问题,但是我对之不了解,想请教一下高手给我们介绍一下这方面的知识。谢谢。
|