📄 r.c
字号:
#include <at89x051.h>//原例使用12M晶振,现在改为6M
#define byte unsigned char
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
sbit ZJ=P1^6;
sbit Red=P1^1;
sbit Green=P1^2;
sbit Yellow=P1^3;
sbit DOG=P1^7;
//定义毫秒、秒、分
uint data i,j;
uint data C_lock,time;
uint data min16=0X4B00;//0x4B00 //test for 16s
uchar data ms200=4;
//以下变量接收数据和解码用
uchar data wd;
uchar data temp[3];
uchar data dc_p;//解码的中间变量
uchar data rx;
bit bdata Launch;
uchar data FaulseNum;
//以上变量接收数据和解码用
void wait(void)
{for(i=0;i<0xFFFF;i++)
//DOG=!DOG;
;
}
/*void send(char ch) //无ACC
{
EA=0;
SBUF=ch;
while(TI==0){}
TI=0;
EA=1;
}*/
void uart0_init() //using Timer1
{DOG=!DOG;
EA=0; //关全局中断
ES=0;
TMOD|=0x20;//MODE 2
TL1=0xFA;
TH1=0xFA;//FA--9600;FC--14400
SCON|=0x50;//MODE 1
PCON=0x80;//SMOD=1
ET1=0;
TR1=1; //开Timer1
PS=1;//串口中断优先级设定为高
IE |=0x90;//开全局中断,接收允许//ES=1;EA=1;
}
void Timer0_Initial() //11.0592M晶振,一个机器周期是1.08507us;方式1,是16位计数,也就是最多65536;71.11ms
{ DOG=!DOG;
EA=0; //
TMOD|=0x01; //开定时器0,方式1
TH0=0x4C; //得到0.05s=50ms;得到50ms是0x4C00;46080*1.08507us
TL0=0x00;
ET0=1;
PT0=0;//中断优先级设定 低
TR0=1; //开Timer0
EA=1;
}
void uart0_isr(void) interrupt 4 using 1
{
if(RI)
{RI=0;
rx=SBUF;
DOG=!DOG;
if((rx==0x68)&&(dc_p==0))//以下是解码 如果收到的是0x68并且第一次进(dc_p==0)
{dc_p++;
wd=0;
//goto nop;
}
else if(dc_p==1)//第二次进来,dc_p==1
{temp[wd]=rx;
wd++;
if(wd==2)//存2个数,wd++2次
{dc_p=2;
if((temp[0]==0xff)&&(temp[1]==0x68)||(temp[0]==0x00)&&(temp[1]==0x68))//判断命令报头 Launch
{dc_p=3;
wd=0;
}
else{wd=0;dc_p=0;FaulseNum++;}//restart 报头错误
}
}
else if(dc_p==3) //第三次进来,dc_p==1
{temp[2]=rx;
C_lock=0;//min16 的设定清零
if(temp[2]==0x55) //NormalCode
{FaulseNum=0;
dc_p=0;
}
else if(temp[2]==0xAA)//LaunchCode
{Launch=1;
FaulseNum=0;
ZJ=0;
Green=1;
Red=0;
Yellow=1;
dc_p=0;
TR0=0;//关Timer0
C_lock=0;
time=ms200;
TR0=1;//开Timer0
}
else{wd=0;dc_p=0;FaulseNum++;}//FaulseCode 报文错误
}
else{wd=0;dc_p=0;}//restart
if(FaulseNum>=3)
{ZJ=0;
FaulseNum=0;
EA=0; //CPU闭锁,等待人工复位
while(1)
{ZJ=0;
//DOG=!DOG;
Green=1;
Red=0;
Yellow=0;
wait();
Yellow=1;
wait();
}
}
}//RI end
}
void intsvr0(void) interrupt 1 using 2 /*定时器0的服务子程序*/
{
TH0=0x4C;
TL0=0x00;
C_lock++;
if(C_lock==time)
{if(time==min16)
{ZJ=0;
EA=0; //CPU闭锁,等待人工复位
while(1)
{ZJ=0;
DOG=!DOG;
Green=1;
Red=0;
Yellow=0;
}
}
else if(time==ms200)
{Launch=0;
C_lock=0;
time=min16;
ZJ=1;
ZJ=1;
}
else{}
}
DOG=!DOG;
}
main(void)
{DOG=!DOG;
ZJ=1;
Green=1;
Red=0;
Yellow=0;
time=min16;
uart0_init();
Timer0_Initial();
while(1)
{if(Launch==0)
{Red=1;
Yellow=1;
Green=0;
wait();
Green=1;
wait();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -