📄 irq.c
字号:
#pragma large
#include "public.h"
sfr WDT_CONTR = 0xE1;//看门狗
#define maxOverFlow 0xffff
#define oscFrequency 20000000
#define TMOD_AND_WORD 0xF0;
#define TMOD_TIME_MODE 0x01;
#define TMOD_COUNT_MODE 0x05; //设置计数模式位
sbit TCON_ENABLE_TIMER = TCON^4;
sbit TCON_TFx = TCON^5; //中断标志位
sbit IE_ETx = IE^1; //中断允许位为 ET0
sbit IP_PTx = IP^1; //中断优先级
UCHAR xdata gUartRxUser[100]; //串口发送缓冲区
UCHAR xdata gUartTxUser[100]; //串口发送缓冲区
unsigned char data gUartTxRead;
unsigned char data gUartTxWrite;
UCHAR gMainLoopTimeOut;
UINT gDogCounter; //看门狗计数器
unsigned char gAGCBrustFlag; //9ms 引导码
unsigned char gSpaceFlag;//4.5ms
unsigned char lastth;
unsigned char lasttl;
unsigned short tmptimer;
unsigned char mAddr;
unsigned long mData;
unsigned char mBits;
unsigned char gFisrtBrust;
unsigned char mDataOK;
/*
中断表 索引
/INT0 0
TIMER0 1
/INT1 2
TIMER1 3
UART 4
TIMER2 5
/INT2 6
/INT3 7
*/
void timer0Int (void) interrupt 1 using 3
{
TR0=0;
gAGCBrustFlag=0;
gFisrtBrust=0;
}
void Timer2Int(void) interrupt 5 using 0
{
}
void Ex0Int(void) interrupt 0 using 0
{
}
void Ex1Int(void) interrupt 2 using 0
{
}
void Ex2Int(void) interrupt 6 using 0
{
}
void Ex3Int(void) interrupt 7 using 0
{
//lastth=TH0;
//lasttl=TL0;
TR0=0;
tmptimer=TH0;
tmptimer<<=8;
tmptimer+=TL0;
TH0=0;
TL0=0;
TR0=1;
if(gFisrtBrust==0)
{
gFisrtBrust=1;
}
else
{
if(gAGCBrustFlag==0)
{
if(tmptimer<40000)//按键的重复
{
TR0=0;
mBits=0;
gUartTxUser[1]=mData>>24;
gUartTxUser[2]=mData>>16;
gUartTxUser[3]=mData>>8;
gUartTxUser[4]=mData;
gUartTxRead=1;
gUartTxWrite=4;
SBUF=gUartTxUser[1];
gAGCBrustFlag=0;
gFisrtBrust=0;
mBits=0;
}
else
{
gAGCBrustFlag=1;//收到了引导码
mBits=0;
}
}
else
{
if(mBits<32)
{
mData<<=1;
mBits++;
if(tmptimer<5617)//收到的为0
{
mData|=0;
}
else //收到的为1
{
mData|=1;
}
}
if(mBits>=32)
{
TR0=0;
mBits=0;
gUartTxUser[1]=mData>>24;
gUartTxUser[2]=mData>>16;
gUartTxUser[3]=mData>>8;
gUartTxUser[4]=mData;
gUartTxRead=1;
gUartTxWrite=4;
SBUF=gUartTxUser[1];
gAGCBrustFlag=0;
gFisrtBrust=0;
}
}
}
P3_5=!P3_5;
}
void InitWatchCmd()
{
WDT_CONTR=0x37;//WDT_EN=1 CLR_WDT=1 IDLE_WDT=0 PS2=1 PS1=1 PS0=1 6时钟模式 4.55s 复位
}
/**************************时钟中断处理函数*******************************
入口参数: 无
出口参数: 无
返 回 值: 无
功 能: 时钟中断处理函数
描 述: 50ms中断一次 公式:初值=65535-(20000000/6)*s //如果双倍速则为6 否则12
/**********************************************************************/
void Timer1Int(void) interrupt 3 using 2
{
TR1=0; //禁止计数
TH1=0x00;
TL1=0x00;
TR1=1; //允许计数
gDogCounter ++ ;
if(gDogCounter>20)//500ms
{
gDogCounter=0;
//主循环超时处理
if(gMainLoopTimeOut>0)
gMainLoopTimeOut --;
if(gMainLoopTimeOut ==0) //当程序陷入死循环或跑飞时,进行软件狗复位
{
gMainLoopTimeOut = 1;
return ;
}
//喂狗
WDT_CONTR=0x37;
//Timer1000ms();
}
}
/**************************用户串口中断处理函数*******************************
入口参数: 无
出口参数: 无
返 回 值: 无
功 能: 用户串口中断处理函数
描 述:
/**********************************************************************/
void SerialDte(void) interrupt 4 using 1
{
//UCHAR ch;
if(RI==1)
{
}
if(TI==1)
{
if(gUartTxRead!=gUartTxWrite)
{
gUartTxRead=gUartTxRead+1;
SBUF=gUartTxUser[gUartTxRead]; //发送一个字符后设置标志位空闲在主循环中进行发送
}
else
{
;
//gUartTxRead=0;
}
TI=0;
}
}
void InitTimer0 (void) //串口初始化
{
TR0 = 0; //停止定时器
TMOD &= TMOD_AND_WORD;
TMOD |= TMOD_TIME_MODE;
IP_PTx = 1; //置中断优先级为最高3
PT0H = 0;
IE_ETx = 1;
TR0 = 0;
}
void InitIR()
{
gAGCBrustFlag=0;
mBits=0;
gFisrtBrust=0;
}
void OpenComm(unsigned long iBaudRate)
{
unsigned short i;
gUartTxWrite=0;
gUartTxRead=0;
//tm= 256 - (oscFrequency/32/6/iBaudRate);
//TL1=tm; //定时器1作为串口1的波特率发生器,公式:bps=11059200/32/12/(256-TH1) 接 9600波特率 目前在89c54中使用了双倍速,这里公式中除12改为除6
//TH1=tm; //
T2CON=0x30;//bps mode
i= maxOverFlow - (oscFrequency/16/iBaudRate)+1; // T2=0ffffh-(11059200/(bps*16*2)),相同时不溢出。所有加一
TL2=i&0xFF;
TH2=(i&0xff00)>>8;
RCAP2L=i&0xFF;
RCAP2H=(i&0xFF00)>>8;
REN=1; //允许串口接收位
PS =0; //串行口中断声明为高优先级中断
PSH = 0; //优先级1
TI=0;
RI=0;
ES= 1; //允许串行口中断
//TR1=1; //开定时器1
TR2=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -