外部中断、定时中断、串口中断C51程序

【外部中断、定时中断、串口中断C51程序】/********************************
文件所用资源
1.外部中断0、1
定时中断0、1
串口中断
2.端口:P3.0,P3.1,P3.3,P3.4,P3.5
********************************/
sfr ISP_CONTR = 0xe7;
/***************************
外部中断0服务子程序
****************************/
/*void Int0() interrupt 0
{
}*/
/***************************
定时中断0服务子程序
****************************/
/*void timer0() interrupt 1
{
}*/
/***************************
外部中断1服务子程序
****************************/
/*void Int1() interrupt 2
{
}*/
/***************************
自动ISP功能函数
***************************/
void isp_check(unsigned char tmp)
{
static isp_counter=0;
unsigned int i;
unsigned char code isp_comm[16]=
{0x12,0x34,0x56,0x78,0x90,0xab,0xcd,0xef,0x12,0x34,0x56,0x78,0x90,0xab,0xcd,0xef};
if(tmp != isp_comm[isp_counter++])
{
isp_counter = 0;
return;
}
else if (isp_counter > 15)
{
EA = 0;
for(i=0;i<5000;i++);
ISP_CONTR = 0x60; //软复位进入ISP下载模式
}
}
/***************************
串口中断服务子程序
****************************/
void serial () interrupt 4
{
if (RI)
{
RI = 0 ;
isp_check(SBUF);
}
}
/**************************
串口发送一个字符
**************************/
void com_send_dat(unsigned char dat)
{
SBUF=dat;
while (TI== 0);
TI= 0 ;
}
/**************************
串口初始化
**************************/
void init_com( void )
{
SCON=0x50 ; //UART为模式1,8位数据,允许接收
TMOD|=0x20 ; //定时器1为模式2,8位自动重装
TH1=0xfa ; //波特率:19200 晶振="22.1184MHz"
TL1=0xfa;
PCON|=0x80; //SMOD=1;波特率加倍;
TR1 = 1 ; //启动定时器1
ES=1; //开串口中断
}
/**************************
定时器0初始化
**************************/
void init_timer0( void )
{
TMOD|=0x02; //定时器0为模式1,16位计数结构
TH0=0xa0 ;
TL0=0xa0;
//TR0=1; //启动定时器0
ET0=1;//开定时中断0
}

    推荐阅读