| 本帖最后由 xlsbz 于 2009-12-1 08:31 编辑 
 刚学单片机中断时,用于调试理解中断采样和中断查询的程序!
 用的是软件仿真。以前没有条件买硬件仿真器
 注意用的是keil 我当时用的是V8.02 
#include <REG52.H>
void HardwareConfig(void);
void delay1(void);
void delay2(void);
void delay3(void);
unsigned char i;
/* 一个机器周期 = (12/晶振)= 1us
  【1】与【2】之间2us,其中前1us用于中断采样,后1us用于中断查询 */
/*-------------------------------------------------------------------------*/
void main(void) {
    HardwareConfig();
    TR1   = 1;    // TR1:  timer 1 run    
    ES    = 1;    // 开串口中断
    EA    = 1;    // 开CPU中断
    TI = 1;       //【1】此语句1us
    i = 1;    //【7】
    i = 1;    //【8】
    i = 1;    //【11】【14】
    delay1();  //【15】
    while (1) {        
        ;
    }
}
void uart_server(void) interrupt 4
{    
    if (TI) { //【3】【9】
    i = 1;    //【4】【10】
    }
    if (RI) {   //【5】【11】
    i = 1;
    }                 
}                //【6】【12】
void delay1(void)
{
    delay2();
    i = 1;
    i = 1;
    i = 1;
} 
void delay2(void)
{
    delay3();
}                    /*【2】【8】【13】【16】此语句2us。事实上,哪里有LJMP指令,【2】就可以放在哪里!
                            书上的是用LCALL指令*/ 
void delay3(void){
    i = 1;
}
void HardwareConfig(void)
{
    TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit reload
    TH1   = 250;  // TH1:  reload value for 9600 baud @ 22.1184 MHz 
    TL1   = 250;
    SCON  = 0x50; // SCON: mode 1, 8-bit UART, enable rcvr
    PCON  = 0x00; // SMOD = 0
}
优先级一定要设置为0
 晶振12Mhz
 
 程序中的序号 代表程序执行的次序
 |