📄 main.c
字号:
//#pragma src
#include <reg52.h> //
#include <regusre.h>
#include <value.h> //
#include <tab.h> //共用字库表
#include <v_static.h> //
//#include <show.h> //
//#include <control.c> //
void startwd(void);
#define high 1;
#define low 0;
/*---------------------------------- 主程序及主程序初始化开始 -------------------------------------*/
void main()
{
/*-------------主程序初始化------------*/
unsigned char idata * data a;
uchar tempb;
uchar xdata * idata addr_xa;
// uchar tempp,tempp1;
IE=0x1a; /*中断允许*/
TMOD=0x21; /*堆栈设置*/
TCON&=0x00; /*定时器0工作模式设置,工作于重新装入常数的16位定时器*/
T2CON=0x00; /*定时器2工作模式设置,工作于自动重新装入常数的16位定时器*/
T2MOD=0x00;
TL0=reload_low0;
TH0=reload_high0; /*定时器溢出值设定,定时时间为1ms*/
TL2=reload_low2;
TH2=reload_high2;
AUXR|=0x0c;
//WDTPRG=0; //for debug
//WDTRST=0x1e;
//WDTRST=0xe1;
//dis_number=CMOD;
//通讯初始化子程序
TMOD|=0x20; //设定T1为定时模式2
ET1=0; //关闭T1中断使能
TH1=0xfd; //预置定时器初值f5,波特率9.6k
TL1=0xfd;
TR1=1; //起动定时器T1
PCON|=0x80; //波特率加倍
SCON=0x50; //串口工作在方式1,并且接收使能
IE|=0x10; //使能串口中断
//通讯初始化结束
/*通讯初始化*/
P0=P2=0x0ff;
P1=P1&0xf8;
P3=P3|0x04;
IE=IE|0x80; /*开中断*/
TR0=1;
TR2=1;
P1=P1|0x38;
P3=P3&0x37;
LEDStart = 0;
LEDAlarm = 0;
LEDStop = 0;
LEDFault = 0;
LEDRun = 0;
lcdinit();
clr_fullscreen(); /*LCD显示初始化*/
for (a=ram_data_start;a<255;a++) /*内存初始化*/
{tempb=1;*a=0x00;
tempb=*a;}
for(addr_xa=0x0;addr_xa<1024;addr_xa++)
*addr_xa=0;
alone_user=1; //单机模式=1
mode_judge=1; //工作模式未判决
menu_program(); //刷新位置1 nnn
// remote_build_count=0; //通讯建立计数
remote_build(); //调用通讯建立程序
//init_remote
key_scan=1;
old_dis_number=38;
dis_number=38;
first_enter=0;
fault_first_enter=0;
TripLogState=0;
p25=1;
LcdDelay=1;
LcdTime=0;
// power_init();
/*-------------主程序初始化结束-- ----------*/
while(1)
{
if(ms20s==1)
{
ms20s=0;
if(alone_user==1)//单机模式定时检查设备连接
{remote_build();}
if(program_state)
{
CLK=0;
if(s05s==1)
{
s05s=0;
clr_fullscreen();
lcdwrite_chineseN(2,40,3,bianchen);
}
program_state=0;
}
else
{
control();
if(WaitTime>200)
{
WaitTime=0;
//GetState();
OperateStateCheck();
}
key_check();
if(key==0x07)
{
if(SuperUser==0)
{
SuperUser=1;
key=0;
}
else
{
SuperUser=0;
key=0;
}
}
if(key==0x01||key==0x02||key==0x04||key==0x08||key==0x06)
{
display();
key=0x00;
display();
}
else
{
if(s05s==1)
{
s05s=0;
LEDFault^=PLEDFault;
display();
//p25^=1;
if((LcdDelay)&&(LcdTime<0xf0))
{p25=1;LcdTime++;}
else
{
p25=0;
LcdDelay=0;
LcdTime=0;
}
}
}
}
}
}
}
/*---------------------------------- 主程序及主程序初始化结束 -------------------------------------*/
/*--------------------------------------- 界面显示程序开始 ----------------------------------------*/
void display()
{
switch(dis_number)
{
//----------djz--------------
case 0:stop_show();break;
case 3: motor_run_show();break;
case 8: power_run_show();break;
case 10: Stopped_Reason();break; //(上次)停车原因
case 11: Stopping_display();break; //正在停车(断开)
case 12:
case 13:
case 14:
case 15:
case 16:
case 17:
case 18:
case 19:
case 20:
case 21:
case 22:
case 23:
case 24:
case 25:
case 26:
case 27:
case 28:
case 29:
case 30:
case 188:
case 189:
case 190:
case 191:
case 192:
case 193:
case 194:
case 195:
OperationControl();
break;
case 32: ComunicationFault();
break;
case 33:
menu_main_control();
break;
case 34:
case 35:
case 36:
case 37: menu_measure();
break;
case 38: menu_program();
break;
case 53:
case 52:
case 51:
case 49:
case 46:
case 43:
case 41:
case 39:
case 187: //debug
menu_adjust();
break;
case 186:
menu_caozuo();
break;
//-----------chenjw-------s----
case 95: alarm_message1();break;
case 97: alarm_message2();break;
case 98: alarm_message3();break;
case 100: trip_alarm_dis1();break;
case 105: trip_alarm_dis1();break;
case 110: notrip_alarm_dis();break;
case 113:
case 115:
case 117:
case 119:
case 121:
case 163:
case 165: fault_message_dis();break;
case 124:
case 127:
case 130:
case 133:
case 136:
case 139:
case 142:
case 145:
case 148:
case 151:
case 154:
case 157:
case 167:
case 160: fault_dis();break;
case 185: menu_guzhangjl_zero();break;
case 9: //添加允许分断电流的特殊处理
case 54:
case 55:
case 56:
case 57:
case 58:
case 59:
case 60:
case 61:
case 62:
case 63:
case 64:
case 65:
case 66:
case 67:
case 68:
case 69:
case 70:
case 71:
case 72:
case 73:
case 74:
case 75:
case 76:
case 77:
case 78:
case 79:
case 80:
case 81:
case 82:
case 83:
case 84:
case 85:
case 86:
case 87:
case 89:
case 31:
case 88: set_set_dis();break;
case 90: protect_set_dis();break;
//------------------chenjw ----------e---------
//-----------------jyj
case 170: io_set(); break;
case 173: io_state();break;
case 174: di_display();break;
case 175: do_display();break;
case 176:
case 178: parameter_set();break;
case 250: alone_dis1();break;
default: break;
}
}
/*--------------------------------------- 界面显示程序结束 ----------------------------------------*/
/*--------------------------------------- 通讯控制程序开始 ----------------------------------------*/
/********************************************************************
*
* 名称: remote_build
* 说明: 试用不同波特率,发送特殊报文取设备动态地址.
* 功能: 通讯建立
* 调用: 1,由通讯初始化程序;
2,通讯失败10次后由接收中断程序
* 输入: 无
* 返回值: remote_type_address=1;
***********************************************************************/
void remote_build(void)
{//通讯建立程序
remote_type_address=1;
remote_sign_built=0;
while(remote_sign_built==0)
{ //单机/首次工作模式执行一次;联机工作模式则始终搜索设备
if(program_state==1) return;
//22.1184MHz
if((PCON&0x80)==0)
{ //不加倍
if(TH1==0xf4){TH1=0xfa;TL1=0xfa;} //4.8K->9.6K
else if(TH1==0xfa){TH1=0xfd;TL1=0xfd;} //9.6K->19.2K
else {PCON|=0x80;TH1=0xfd;TL1=0xfd;} //19.2K->38.4K
}
else
{PCON&=0x7f;TH1=0xf4;TL1=0xf4;} //38.4K->4.8K
//12MHz //for debug
//通讯故障,显示通讯故障
trbuf[0]=0x68;
trbuf[1]=0x00;
trbuf[2]=0x00;
trbuf[3]=0x68;
trbuf[4]=0xd0; //特殊报文校验码
read_trbuf_p=trbuf; //指向发送缓存
TxdLength=5; //发送缓存使用长度
receive_byte_number=5; //接收字节数
Txded_Number=0; //发送缓存读计数清零
REN=0;
Current_Message_End=1;
CLK=1;
SBUF=*read_trbuf_p; //起动发送
WaitTime=0;
while((remote_sign_built!=1)&&(WaitTime<200))
WD_SDA=~WD_SDA;
if(alone_user==1){remote_sign_built=1;}//单机模式,建立通讯只执行一次
//remote_sign_built=1;//for debug
}
}//remote_build
void GetData(void)
{
unsigned char i;
unsigned char j;
value_message_count=0;
for(i=0;i< message_count[dis_number];i++)
{
again:
if(program_state==1) return;
if(value_message_count==0)
{ //于首条报文
value_message_p = &dis_message_tab[0][0] + dis_number * long_dis_message; //发送报文的首地址
write_rebuf_p=union_vlaue.revalue_buf;//指向其接收缓存
RxdPointBak=write_rebuf_p;
}
trbuf[0]=address_device;
trbuf[1]=0x03;
for(j=0;j<4;j++) //取报文数据
trbuf[j+2]=*(value_message_p+value_message_count*4+j); //[行][列]*(p+i*long_dis_message+j)
receive_byte_number=5+(*(read_trbuf_p+5))*2; //计算条报文接收字节数(支持到256)
RemoteTypeBak=3;
/*debug*/ if(receive_byte_number>37) //接收长度出错可能导致系统有问题.
return;
//---------故障记录区读取的特殊处理--s-------
if((trbuf[3]!=0xb3)&&(TripLogState==1)) //非接地类型地址,地址偏移,0xb3为接地保护方式
{
trbuf[3]+=0x8e; //(570h-454h)/2=8e.
}
//---------故障记录区读取的特殊处理--s------- receive_byte_number=37;
TxdLength=6;//实际发送缓存有效长度
crc_account(); //crc计算
Txded_Number=0; //发送缓存读计数清零,接收缓存清零在发送结束时清零. //发送缓存读计数清零
Current_Message_End=1;
REN=0; //启动发送 //起动输出
CLK=1;
RI=0;
RxdPointBak=write_rebuf_p;//
SBUF=trbuf[0];
WaitTime=0;
//Current_Message_End=0;//for debug
while((Current_Message_End!=0)&&(WaitTime<150))
WD_SDA=~WD_SDA;
//Current_Message_End=0;//for debug
if(Current_Message_End!=0)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -