📄 main.c
字号:
/***********************************************************/
/* */
/* CPU:AT89c55WD 20MHZ */
/* Copyright 2004.09 Comelit */
/* AUTHOR: LV_XIAO_LU */
/* */
/***********************************************************/
#include "reg52.h"
#include "define.h"
#include "variable.h"
#include "typedef.h"
#include "function.h"
sfr WDTRST = 0xa6;
sfr T2MOD = 0xc9;
sbit DIVA_STATUS_PORT = P3^2;
sbit MES_SW = P1^7;
sbit CALL_SW = P1^6 ;
sbit DISP_CTR_PORT = P3^5;
void Cpu_init(void);
void Diva_sts_hd(void);
void Judge_work_mode(void);
void Timer2_init(void);
sbit LED_CTR = P1^1 ;
/************************************************/
/*
/************************************************/
void main(void)
{
/* special_addr1 = 0xaa;
special_addr2 = 0x55;
special_addr1 = 0xa0;
init_code_b[0]=0xff;
init_code_b[1]=0xff;
init_code_b[2]=0xff;*/
Cpu_init();
Mes_init();
Init_mb9002_ic(1); //BLUE
Hsio_init(BPS4800);
Judge_work_mode(); //先判别是否要设置本机地址
/*启动狗*/
WDTRST = 0x1e;
WDTRST = 0xe1;
EA = 1;
TR2 = 1;
TR0 = 1;
main_step = 1;
while(1)
{
if(TF0 == 1)
{
TF0 = 0 ;
TH0 = TM20MS_H ;
TL0 = TM20MS_L ;
watch_dog_time = 0; //主循环10MS清0一次
Diva_sts_hd();
Write_flash_hd(); //管理flash写的状态
Key_hd();
Led_hd();
// Trm_hd();
Message_hd();
Backup_hd();
switch(main_step)
{
case 1:
Key_prc();
main_step++;
break;
case 2:
Disp_prc();
main_step++;
break;
case 3:
Backup_prc();
main_step++;
break;
case 4:
Led_prc();
main_step++;
break;
case 5:
main_step = 1;
break;
default:
main_step = 1;
break;
}
}
}
}
/************************************************/
/************************************************/
void Cpu_init(void)
{
DISP_CTR_PORT = 1;
LED_CTR = 1; //led off
EA = 0 ; //disable all interrupt
/* timer0 20ms no interrupt */
// TMOD = 0x01 ;
IE = 0x00 ;
TR0 = 0 ; // disable timer
TR1 = 0 ;
TMOD = 0x01 ;
TH0 = TM20MS_H ;
TL0 = TM20MS_L ;
Timer2_init();
return;
}
/************************************************/
/************************************************/
/* 下列函数用于判断当前话机的工作状态*/
void Diva_sts_hd(void)
{
DIVA_STATUS_PORT = 1;
now_port_F = DIVA_STATUS_PORT ; //读端口状态
if(now_port_F == 0) //话机处于呼叫打开状态时
{
if(pre_port_F == 1) //刚呼叫
{
pre_port_F = now_port_F ;
if(read_mes_F == 1) //如果正在看信息
{
// MES_SW = SW_OFF; //关闭信息通道
// mes_sw_F = 0;
CALL_SW = SW_OFF;
sw_delay = TM60MS; //等待信息通道继电器切换完成时间
}
else
{
call_disp_F = 1 ; //现在话机正处于呼叫状态
CALL_SW = SW_OFF;
}
}
else if(call_disp_F == 0)
{
if(sw_delay != 0)
sw_delay--;
else
{
// CALL_SW = SW_OFF; //恢复到默认状态
MES_SW = SW_OFF;
mes_sw_F = 0;
call_disp_F = 1;
}
}
}
else if(now_port_F == 1)
{
if(pre_port_F == 0) //呼叫结束时
{
pre_port_F = now_port_F ;
call_disp_F = 0;
if(read_mes_F == 1)
{
CALL_SW = SW_ON ;
sw_delay = TM60MS;
}
// sw_delay = TM50MS;
}
if(read_mes_F == 1 ) //只有在待机状态时才能去阅读信息,此时
{ //需要把二个继电器全部切换
if(sw_delay!=0)
sw_delay--; //等待呼叫通道切换到空闲状态
// else if(MES_SW == SW_OFF) //呼叫通道切换已完成,而信息通道还没切换过来则
else if(mes_sw_F == 0)
{
MES_SW = SW_ON;
mes_sw_F = 1;
DISP_CTR_PORT = DISP_ON; //话机CFP = 0;
sw_delay=TM800MS;
}
else //
DISP_CTR_PORT = DISP_OFF; //话机CFP不须一直维持0
}
else //不在阅读状态下
{
if(sw_delay!=0) //如果30S不按键,要关断话机必须把+19V电断掉0.5S
sw_delay--; //才有可能关闭话机,以防止别家正在呼叫时CALL+19V还有,关不断
else //空闲状态时切换到正常的呼叫通道中
CALL_SW = SW_OFF;
}
}
}
/********************************************/
/*本函数用于判别是否要处于设置地址的工作状态*/
/********************************************/
void Judge_work_mode(void)
{
unsigned char status_cnt=10;
CALL_SW = 1; //为读,先置1
while(status_cnt == 10)
{
if(CALL_SW == 0)
status_cnt++;
else
status_cnt--;
Delay_10ms();
CALL_SW = 1; //再读,先置1
if(CALL_SW == 0)
status_cnt++;
else
status_cnt--;
}
if(status_cnt == 12)
{
work_F = 1 ; //设置本机地址状态
main_step = 1;
TR0 = 1;
EA = 1;
while(1)
{
if(TF0 == 1)
{
TF0 = 0 ;
TH0 = TM20MS_H ;
TL0 = TM20MS_L ;
Trm_hd();
}
}
}
else
work_F = 0 ;
}
/***************************************************/
/***************************************************/
/***************************************************/
/* 定时器2用于喂狗 */
/***************************************************/
void Timer2_hd(void) interrupt 5
{
EA = 0;
TF2 = 0;
watch_dog_time++; //中断里5MS累加一次
if(watch_dog_time <= 100) //如果500ms主程序还没执行过一次的话,就认为出现了死机
{
WDTRST = 0x1e;
WDTRST = 0xe1;
}
EA = 1;
Trm_hd();
ES = 0;
if(time_out != 0)
time_out--;
ES = 1 ;
}
/***************************************************/
/***************************************************/
void Timer2_init(void)
{
T2CON = 0x00;
T2MOD = 0x00;
RCAP2H = TM4MS_H; //db
RCAP2L = TM4MS_L;
TH2 = TM4MS_H ;
TL2 = TM4MS_L;
ET2 = 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -