本帖最后由 xlsbz 于 2009-12-1 08:31 编辑
刚学单片机中断时,用于调试理解中断采样和中断查询的程序!
用的是软件仿真。以前没有条件买硬件仿真器
#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
}
注意用的是keil 我当时用的是V8.02
优先级一定要设置为0
晶振12Mhz
程序中的序号 代表程序执行的次序 |