📄 main.c
字号:
/*--------------------------------------*/
//
// this program is for message receiveing module,including three subroutine:
// RS485, MB90092,FLASH-S29gl032/64m
//
//
/*
注意事项:
1,一天不能够给同一个用户超过16条信息,否则
系统存储会出错;
2,允许的房号编码不能超过32,否则系统会出错;
3,系统发布信息时候,时间信息必须是真实的,
如果时间信息有错误,会导致系统出错;
标准的发送演示:
06 B0 F0 01 01 0C 30 36 2D 30 31 2D 30 31 A0 B0 C0 D0 16
*/
/*----------------------------------------------------------------*/
#include "defineh.h"
#include "sbitdef.h"
#include "main.h"
/*-----------------------------------------*/
extern void Init_MB90092(void);
extern void Save_Message_Flash(void);
extern void init_timer0(void);
extern void save_homemessage(void);
extern void message_treat(void);
extern void clr_timer2(void);
extern void init_timer2(void);
extern void Chip_Erase_Op(void);
extern void delays60ms();
extern void txstart(void);
extern void Clr_Rx();
extern bit Read_ID_Op();
extern void Sector_Erase_Op(ulong write_address);
extern void save_infomessage(); //test
/*-----------------------------------------------*/
void init_timer(void)
{
SCON=0x50; //方式1 ,10位异步收发无效验位
PCON=0x80;
ES=1;
TMOD=0x21; //定时器0工作方式1,16位定时,定时器1工作方式2作串口波特率发生器
#if CRYSTALOID //1为12MHZ,RS485enable is low(receive)
{
TH1=0xf3; //波特率为4800 12MHZ
TL1=0xf2;
}
#else //0为11.0592MHz, RS485enable is high(receive)
{
TH1=0xf4; //波特率为4800,11.0592MHZ
TL1=0xf4;
}
#endif
TR1=1;
IT1=1;
EA=1;
}
/*------------------------------------------*/
/*
void watchdog(void) // wdt time=40ms
{
WDT_CON=0X10;
_nop_();
WDT_CON=0X26; //FOR 2.5S WDT-TIMER
}
*/
/*------------------------------------------*/
void Check_Home_Type()
{
if(*(info_buffer+2)&0xf0==0)
{
kindBYTE=FALSE;
}
else
{
kindBYTE=TRUE; //saving-energy type =0
}
}
/*------------------------------------------*/
void init_Mcu(void)
{
MbCE = valid;
MBSIM = valid;
MBSCLK = valid;
CNTRL =invalid;
mRs485G = receive;
LEDY =DARK; //not bright the work lamp test
}
/*-------------------------------------------*/
/*-------------------------------------------*/
void init_var(void)
{
Rx_count=0; /*接收数据计数器*/
Rx_bit=0; /*接收完毕标志*/
Rxrun_bit=0; /*接收数据标志,作定时用,超时接收退出*/
Rx_sum=0;
timeout0=0;
timeout2=0;
EnWork_bit=0; /*now on work*/
inspectBIT=0; //inspect symbol
inringBIT=0; //ring symbol
intalkingBIT=0; //in talking symbol
kindBYTE=1; /*defaulse intelligent home-machine*/
intalkingBIT=0;//通话标志位 1 为门口机和(用户或管理机)使用
ProgramOkFlag=TRUE;
count_copy=0;
}
/*---------------------------------------------*/
void main()
{
uchar data i,j;
uchar xdata *m;
info_buffer=&Rx_buffer[0];
init_var();
init_Mcu();
Init_MB90092();
Clr_Rx();
init_timer();
RESET=0;
_nop_();
_nop_();
RESET=1;
AUXR=0X03;
P1=0x01;
for(i=0;i<16;i++)
{
m=i*0x1000;
j=*m;
if(j!=0xff)
{
ProgramOkFlag=FALSE;
}
}
AUXR=0X00;
if(!ProgramOkFlag)
{
LEDY=0;
Chip_Erase_Op();
for(i=0;i<0x1f;i++)
{
delays60ms();
}
LEDY=1;
}
// watchdog(); //暂时屏蔽
for(;;)
{
// WDT_CON=0X36; //FOR 2.5S WDT-TIMER
if(Rx_bit)
{
if((*(info_buffer+1)==SINGLEINFO)||(*(info_buffer+1)==ALLINFO)) //门口机发特定短信息,用应答
{
save_homemessage();
Save_Message_Flash();
}
else if(*(info_buffer+1)==HOMEGETINFO) //提取信息
{
if(EnWork_bit)
{
Clr_Rx();
}
else
{
//wait door answered home for 4s, then the message module
//answer the home that the line FREE,AND BEGIN MESSAGE OPERATING
Check_Home_Type();
save_homemessage();
Clr_Rx();
init_timer2(); //begin check main-door answer for 4s
while((timeout2<0x64)&&(EnWork_bit==0))
{
if(Rx_bit==1)
{
if((Rx_count==15)&&(*(info_buffer+1)==MAINBACK))
{
EnWork_bit=1;
Clr_Rx();
}
else
{
Clr_Rx();
}
}
}
clr_timer2();
if(EnWork_bit)
{
message_treat();
}
}
}
else if((*(info_buffer+1)==MAINCALL)&&(EnWork_bit==0))//door call home
{
Clr_Rx();
init_timer2();
while(timeout2<0xc8)
{
if(Rx_bit)
{
if(*(info_buffer+1)==EXTBACK) //home answer
{
Clr_Rx();
inringBIT=1;
EnWork_bit=1;
init_timer2();
}
}
}
}
else if((*(info_buffer+1)==CENCALL)&&(EnWork_bit==0))//center call home
{
Clr_Rx();
init_timer2();
while(timeout2<0xc8)
{
if(Rx_bit)
{
if(*(info_buffer+1)==EXTBACK) //home answer
{
Clr_Rx();
inringBIT=1;
EnWork_bit=1;
init_timer2();
}
}
}
}
else if((*(info_buffer+1)==DDOORCALL)&&(EnWork_bit==0))//wall call home
{
Clr_Rx();
init_timer2();
while(timeout2<0xc8)
{
if(Rx_bit)
{
if(*(info_buffer+1)==EXTBACK) //home answer
{
Clr_Rx();
inringBIT=1;
EnWork_bit=1;
init_timer2();
}
}
}
inringBIT=1;
}
else if((*(info_buffer+1)==EXTCALL)&&(EnWork_bit==0))//home call center
{
Clr_Rx();
init_timer2();
while(timeout2<0xc8)
{
if(Rx_bit)
{
if(*(info_buffer+1)==MAINBACK) //door answer
{
Clr_Rx();
inringBIT=1;
EnWork_bit=1;
init_timer2();
}
}
}
}
else if((*(info_buffer+1)==EXTWATCH)&&(EnWork_bit==0))//inspect door
{
Clr_Rx();
init_timer2();
while(timeout2<0xc8)
{
if(Rx_bit)
{
if(*(info_buffer+1)==MAINBACK) //door answer
{
Clr_Rx();
inspectBIT=1;
EnWork_bit=TRUE;
init_timer2();
}
}
}
}
else if(*(info_buffer+1)==EXTZAIJI)
{
if((inringBIT)&&(EnWork_bit))
{
Clr_Rx();
inringBIT=0;
intalkingBIT=1;
init_timer2();
}
else
{
Clr_Rx();
}
}
else if(*(info_buffer+1)==GZAIJI)
{
if((inringBIT)&&(EnWork_bit))
{
Clr_Rx();
inringBIT=0;
intalkingBIT=1;
init_timer2();
}
else
{
Clr_Rx();
}
}
else
{
Clr_Rx();
}
}
if(inspectBIT)
{
if(timeout2>0x3e8) //inspect time 30s
{
inspectBIT=0;
EnWork_bit=0;
clr_timer2();
}
}
if((inringBIT)&&(EnWork_bit))
{
if(timeout2>0x7d0) //in-ring time 60s
{
inringBIT=0;
EnWork_bit=0;
clr_timer2();
}
}
if((inringBIT)&&(EnWork_bit==0))
{
if(timeout2>0x3e8) //in-ring time 30s
{
inringBIT=0;
EnWork_bit=0;
clr_timer2();
}
}
if(intalkingBIT)
{
if(timeout2>0x7d0) //in-talking time 60s
{
intalkingBIT=0;
EnWork_bit=0;
clr_timer2();
}
}
if(EnWork_bit)
{
if(timeout2>0x7d0) //if error commication ,set time 60s
{
EnWork_bit=0;
clr_timer2();
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -