📄 main.c
字号:
#include "reg932.h"
#define CONID 0x42//00h-10h
#define STAID 0x92
#define CMDID 0xe2
#define MODE0 0
#define MODE1 1
#define MODE2 2
#define MODE3 3
#define uint8 unsigned char
extern void AutoBaudrateAdj();
extern void ISP_INI();
sbit TX=P1^0;
sbit RX=P1^1;
//sbit SLNP=P0^3;
sbit LED1=P0^1;
sbit LED2=P0^2;
sbit LED3=P0^3;
sbit LED4=P0^4;
sbit LED5=P0^5;
sbit ISP_BIT=P2^1;
bit l_flg_recgood=0;
bit l_flg_timeok=0;
bit led_all_light=1;
uint8 l_sys_mode;
uint8 l_rec_data[10];
uint8 l_ledsta=2;
uint8 l_ledsep=0x8;
uint8 time=1;
uint8 flash=0;
unsigned int sleep_cout=0;
void delay();
void delayNS(unsigned int k);
uint8 checksum8(uint8 *chk8,uint8 num);
bit l_rce_data(void);
void l_send_back(uint8 * data_ptr,uint8 num);
void l_cmd_handle();
void l_sta_handle();
void l_con_handle();
void l_rtc_init();
void Int1_Isr() interrupt 2
{//uint8 i;
EX1=0;
ISP_BIT=0;
switch (l_sys_mode)
{
case MODE0:
TH0=255-((255-TH1)*160)/256;
TL0=255-((255-TH1)*160)%256;//检测第11位的电平。
TR0=1;
sleep_cout=0;
while(TF0==0);
TF0=0;
TR0=0;
if(RX==0)
l_sys_mode=MODE1;
break;
case MODE1:
AutoBaudrateAdj();
if(TH1<0X80)
{
TH1=0XFD;
l_sys_mode=0;
}
else
l_sys_mode=MODE2;//可以增加一些条件
break;
case MODE2:
TH0=0;
TL0=0;
TR0=1;
while(RI==0&&TF0==0);
TR0=0;
if(TF0==0)
{
RI=0;
l_rec_data[0]=SBUF;
if(l_rec_data[0]==CONID)//增加可睡眠和命令
{
l_sys_mode=MODE3;
}
else if(l_rec_data[0]==CMDID)
{
l_sys_mode=MODE3;
}
else if(l_rec_data[0]==STAID)
{
l_sys_mode=MODE3;
}
else if(l_rec_data[0]==0x80)
{
l_sys_mode=MODE3;
}
else
l_sys_mode=MODE0;
}
else
{
TF0=0;
l_sys_mode=MODE0;
}
break;
case MODE3:
break;
default : break;
}
if(l_sys_mode!=MODE3)
{
IE1=0;
EX1=1;
}
ISP_BIT=1;
}
main()
{
unsigned int cout=0;
delay();
P2M1 = 0x00; // 初始化端口
P2M2 = 0x00;
P1M1=0;
P1M2=1;
P0M1 = 0x00; // 初始化端口
P0M2 = 0x00;
if(ISP_BIT==0)
{
ISP_INI();
delay();
LED3=0;
while(1);
}
P0=0XAA;
delayNS(100);
P0=0X55;
delayNS(100);
P0=0XFF;
l_sys_mode=0;
TMOD=0X21;
TH1=0XFD;
PX1=1;
IP0H=0X02;
IT1=1;
EX1=1;
EA=1;
l_rtc_init();
while(1)
{
if(l_sys_mode==MODE3)
{
EX1=0;
if(l_rec_data[0]==CMDID||(l_rec_data[0]==0x80))
{
l_flg_recgood=l_rce_data();
}
else if(l_rec_data[0]==STAID)
{
IE1=0;
EX1=0;
l_sta_handle();
}
else if(l_rec_data[0]==CONID)
{
IE1=0;
EX1=0;
l_con_handle();
}
if(l_flg_recgood)
{
IE1=0;
EX1=0;
}
else
{
TR1=0;
IE1=0;
EX1=1;
l_sys_mode=MODE0;
TR1=0;
}
}
if(l_flg_recgood)
{
if(l_rec_data[0]==CMDID)
{
l_cmd_handle();
}
else if(l_rec_data[0]==0x80)
{
sleep_cout=1999;
}
TR1=0;
IE1=0;
EX1=1;
l_sys_mode=MODE0;
l_flg_recgood=0;
TR1=0;
}
if((RTCCON&0x80)==0x80)
{
RTCCON&=0x63;
if(time==l_ledsep)
{
l_flg_timeok=1;
time=0;
}
else
time++;
sleep_cout++;
if(sleep_cout==2000)
{
P0=0XFF;
PCON=PCON|0X03;
}
}
if((l_flg_timeok==1)&&(led_all_light==1))
{
switch(l_ledsta&0x03)
{
case 2 :
if(flash!=0)
flash=flash<<1;
else
flash=0x01;
break;
case 3 :
if(flash!=0)
flash=flash>>1;
else
flash=0x80;
break;
default :
break;
}
l_flg_timeok=0;
P0=flash^0xff;
}
}
}
void delay()
{
unsigned char i,j;
for(i=0;i<110;i++)
for(j=0;j<110;j++);
}
void delayNS(unsigned int k)
{
unsigned char i,j;
for(;k>0;k--)
for(i=0;i<110;i++)
for(j=0;j<110;j++);
}
uint8 checksum8(uint8 *chk8,uint8 num)
{
uint8 temp=0;
for( ;num>0;num--)
{
temp=temp+*chk8;
if(temp<*chk8)
temp++;
chk8++;
}
return(0xff-temp);
}
bit l_rce_data(void)
{
uint8 ii,temp;
TH0=0;
TL0=0;//可以增加选项
TR0=1;
while(RI==0&&TF0==0);
TR0=0;
if(TF0==0)
{
RI=0;
l_rec_data[1]=SBUF;
if(l_rec_data[0]==CMDID)
temp=5;
else
temp=3;
for(ii=2;ii<=temp;ii++)
{
TH0=0;
TR0=1;
while(RI==0&&TF0==0);
TR0=0;
if(TF0==0)
{
RI=0;
l_rec_data[ii]=SBUF;
}
else
{
TF0=0;
break;
}
}
if(l_rec_data[temp]==checksum8(&l_rec_data[1],temp-1))
{
l_rec_data[temp]=0;//清除校验和
return 1;
}
l_rec_data[temp]=0;//清除校验和
return 0;
}
else
{
TF0=0;
return(0);
}
}
void l_send_back(uint8 * data_ptr,uint8 num)
{
uint8 temp;
EX1=0;
SCON=0X40;
for(temp=0;temp<num;temp++)
{
SBUF=*data_ptr;
while(TI==0);
TI=0;
data_ptr++;
}
data_ptr=data_ptr-num;
SBUF=checksum8(data_ptr,num);
while(TI==0);
TI=0;
SCON=0X50;
IE1=0;
//EX1=1;
}
void l_cmd_handle()
{
l_ledsta=l_rec_data[1]&0x03;
l_ledsep=(l_rec_data[1]&0xf0)>>4;
if(l_ledsep==0)
{
led_all_light=0;
P0=0;
}
else
led_all_light=1;
flash=0;
time=0;
}
void l_sta_handle()
{
l_rec_data[1]=(l_ledsep<<4)+l_ledsta;
l_send_back(&l_rec_data[1],2);
}
void l_con_handle()
{
l_rec_data[1]=1;
l_rec_data[2]=0;
l_send_back(&l_rec_data[1],2);
}
void l_rtc_init()
{
RTCH=0x3;
RTCL=0Xff;
RTCCON=0X63;//??
PWDRT=0;
//EWDRT=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -