📄 main.c
字号:
/* ******************************************************** */
#include "REG51STC.H"
#include "CMD16887.H"
#include "variable.h"
#include <ABSACC.H>
/********************************************************/
/**************************************************************************
* 功能:清除工作面A加油数据
*
***************************************************************************/
void clear_worka(void)
{ uchar i;
if(state1==0x00 || ration_pulse_a==0){ration_num_a=999999;ration_mode_a=0;calculate_ration(0);}
gun1.liter=0x00; //升
gun1.sale=0x00; //金额
gun1.pulse=0;
jl1s=0;
for(i=40;i<49;i++)
{
table_buf[i]=0;
}
//cgq1s1old=cgq1s1;
//cgq1s2old=cgq1s2;
if(!cease_power)disp_lcd1(price_a,0x0);
updatea=1;
}
/**************************************************************************
* 功能:清除工作面B加油数据 [ok]
*
***************************************************************************/
void clear_workb(void)
{ uchar i;
if(state2==0x00 || ration_pulse_b==0){ration_num_b=999999;ration_mode_b=0;calculate_ration(1);}
gun2.liter=0x00; //升
gun2.sale=0x00; //金额
gun2.pulse=0;
jl2s=0;
for(i=40+53;i<49+53;i++)
{
table_buf[i]=0;
}
//cgq1s2old=cgq2s1;
//cgq2s2old=cgq2s2;
if(!cease_power)disp_lcd2(price_b,0x0);
updateb=1;
}
/*****************************************************************************
*
*功能:系统上电初始化
; BOUD=57600,由定时器1产生
*****************************************************************************/
void InitializeSystem(void)
{ uchar i;
for(i=0;i<106;i++)
{
table_buf[i]=0;
}
Get1302(); //上电读时间,便于打印
k1spk_time=0;
keyinput_a=0;
hang_cnt1=0;hang_cnt2=0;
jl1s=0;
jl2s=0;
//oil_types_a=1; //油枪a的油类别
timer_time=20;
time_seccnt=20;
prn1time=0;
prn2time=0;
TMOD&=0x0f;
TMOD|=0x21;
PCON|=0x80;
SCON=0xf0; /* MODEL --3,REN=1,SM2=1 */
TH1=0xd0;
TL1=0xd0; //fdh--波特率19200 fah--9600,均为单倍速时 d0,e8
TR1=1;
TH0=0xf8;
TL0=0x30;
isp_err=0;
RCAP2H=0xd8;
RCAP2L=0xf0;
TH2=0xd8;
TL2=0xf0;
T2CON=0x00;
TCON=0x01;
ration_a=0;
ration_b=0;
ration_mode_a=0; //1--a枪为定升加油 0--a枪为定元加油模式
ration_mode_b=0; //1--a枪为定升加油 0--a枪为定元加油模式
vip_mode_a=0;
vip_mode_b=0;
/************************/
// AUXR |=0x02;
// cmdmem=XBYTE[TQJLADD];
// AUXR &=0xfd;
/************************/
clear_worka();
clear_workb();
state1=0;state2=0;
keya_num[0]=0x7e;
keya_num[1]=0x00;
keya_num[2]=0x00;
keya_num[3]=0x00;
keya_num[4]=0x00;
keyb_num[0]=0x7e;
keyb_num[1]=0x00;
keyb_num[2]=0x00;
keyb_num[3]=0x00;
keyb_num[4]=0x00;
save_oka=0;idle_numa=0;
save_okb=0;idle_numb=0;
printformat_saveok=0;
TR2=1;
IP=0x00;
TR0=1;
TR1=1;
IE=0xb3;
EX0=1;
}
/***************************************************************************
* 中断0:外部中断0
****************************************************************************/
void int_int0(void) interrupt 0 using 1
{ cease_power=1;
}
/***************************************************************************
* 中断1:定时器0 12T时2mS中断一次
****************************************************************************/
void int_timer0(void) interrupt 1 using 1
{ uchar data mem_inn; //做堆栈用--AUXR
bit bittemp=0;
TH0=0xf8;
TL0=0x30;
scanfkey=1;
mem_inn=AUXR; //做堆栈用
AUXR |=0x02;
cmdmem=XBYTE[TQJLADD];
AUXR &=0xfd;
if (state1==1)
{
if(cgq1s1 && !cgq1s1old)
{
jl1s++;
if(ration_pulse_a>0) ration_pulse_a--;
if(ration_pulse_a<residue_a) {if(DCFD1==0){DCFD1=1;bittemp=1;}}
if(ration_pulse_a==0) {ration_a=1;DCFX1=1;DCFD1=1;state1=0x0;}
}
cgq1s1old=cgq1s1;
if(cgq1s2 && !cgq1s2old)
{
jl1s++;
if(ration_pulse_a>0) ration_pulse_a--;
if(ration_pulse_a<residue_a) {if(DCFD1==0){DCFD1=1;bittemp=1;}}
if(ration_pulse_a==0) {ration_a=1;DCFX1=1;DCFD1=1;state1=0x0;}
}
cgq1s2old=cgq1s2;
}
///////////////////
if (state2==1)
{
if(cgq2s1old && !cgq2s1)
{
jl2s++;
if(ration_pulse_b>0) ration_pulse_b--;
if(ration_pulse_b<residue_b) {if(DCFD2==0){DCFD2=1;bittemp=1;}}
if(ration_pulse_b==0) {ration_b=1;DCFX2=1;DCFD2=1;state2=0x0;}
}
cgq2s1old=cgq2s1;
if(cgq2s2old && !cgq2s2)
{
jl2s++;
if(ration_pulse_b>0) ration_pulse_b--;
if(ration_pulse_b<residue_b) {if(DCFD2==0){DCFD2=1;bittemp=1;}}
if(ration_pulse_b==0) {ration_b=1;DCFX2=1;DCFD2=1;state2=0x0;}
}
cgq2s2old=cgq2s2;
}
//if(bittemp) dcespk_out(); //关电磁阀
//////////////////////////
timer_time--;
switch (timer_time)
{
case 0:
timer_time=40;
if (jsq1out) {jsq1out=0;jsq1=0;} //计数器输出
else jsq1=1;
if (jsq2out) {jsq2out=0;jsq2=0;} //计数器输出
else jsq2=1;
break;
case 5:
update_worka=1;
break;
case 10:
if(hang_time1!=0) hang_time1--; //挂枪延时
if(hang_time2!=0) hang_time2--; //挂枪延时
break;
case 15:
update_workb=1;
break;
case 20:
break;
case 25:
break;
case 30:
if(hang_time1!=0) hang_time1--; //挂枪延时
if(hang_time2!=0) hang_time2--; //挂枪延时
break;
case 32:
time_seccnt--; //6T时刚好1秒
if(time_seccnt==0) {time_seccnt=2;} //温度转换
break;
/*default:
timer_time=40;
break;*/
}
AUXR=mem_inn; //做堆栈用 //AUXR &=0xfd;
}
/*****************************************************************************
* 功能:串行中断,接收上位机数据
*****************************************************************************/
void seri_int (void) interrupt 4 using 2
{ uchar data mem_inn; //做堆栈用--AUXR
uchar data i;
uchar data rece_data;
uchar data verify=0;
mem_inn=AUXR; //做堆栈用
AUXR &=0xfd;
rece_data=SBUF;
if(RI)
{ RI=0;
if(RB8)
{
//rece_num=1; //记数器清零
if(rece_data==gunadd_a || rece_data==gunadd_b || rece_data==0) {SM2=0;rece_buf[0]=rece_data;rece_num=1;}
}
else
{
i=rece_num++;
rece_buf[i]=rece_data;
i=rece_buf[1]; //长度
if(rece_num>i)
{ SM2=1;
verify=0;
for(i=0;i<rece_buf[1];i++)
{
verify+=rece_buf[i]; //计算检验字
}
verify=~verify+1; //取反+1
if(verify==rece_buf[rece_buf[1]])
{
//rece_ok=1;
rece_command(); //通讯处理
}
else //返回错误代码
{
}
rece_num=1;
}
}
if(rece_num>158)
{
rece_num=0;
}
}
else if(TI) //发送
{
TI=0;
send_unm++;
if(send_unm<send_buf[0])SBUF=send_buf[send_unm];
}
AUXR=mem_inn; //做堆栈用
}
/***************************************************************************
* 中断5:定时器2 12T时:20mS中断1次
* 时长[100:1长2短,50:2短,20:1短,<20:不鸣]
****************************************************************************/
void int_timer2(void) interrupt 5 using 1
{ uchar data mem_inn; //做堆栈用--AUXR
TF2=0;
TH2=0xb1;
TL2=0xe1;
mem_inn=AUXR;
AUXR &=0xfd;
dispkeyok=1;
disp_key();
if (k1spk_time==100 || k1spk_time==50 || k1spk_time==20) k1spk=0; //打开蜂鸣器1
if (k1spk_time==60 || k1spk_time==30 || k1spk_time==0) k1spk=1; //关闭蜂鸣器1
if (k1spk_time>0) k1spk_time--;
if (k1spk_time==0) k1spk=1;
/****************************/
if (k2spk_time==110 || k2spk_time==50 || k2spk_time==20) k2spk=0; //打开蜂鸣器1
if (k2spk_time==60 || k2spk_time==30 || k2spk_time==0) k2spk=1; //关闭蜂鸣器1
if (k2spk_time>0) k2spk_time--;
if (k2spk_time==0) k2spk=1;
timesec++;
if(timesec==100) //秒
{ timesec=0;dispprn_a=1;
if(disp_floor_level_a>(gun1.pulse+4))disp_floor_level_a-=4;
if(disp_floor_level_b>(gun2.pulse+4))disp_floor_level_b-=4;
if(prn1time>0)prn1time--;
if(state1==4 && menu1==4 && temp_mema==4) temp_mema=0;
if(state2==4 && menu2==4 && temp_memb==4) temp_memb=0;
//------------------- 临时时间继电器
time_temp_delay--;
if(time_temp_delay>9) time_temp_delay=9;
if(time_temp_delay==5)dely1=1;
if(time_temp_delay==0){dely1=0;time_temp_delay=9;}
//-------------------
}
if(mcstoptime_a>0)mcstoptime_a--;
if(mcstoptime_b>0)mcstoptime_b--;
AUXR=mem_inn;
}
/**************************************************************************
* 功能:累计并保存数据a
***************************************************************************/
void sum_a(void)
{ uint add;
void *pt;
if(gun1.pulse>disp_floor_level_a)
{
gun1.sum_liter+=gun1.liter;
gun1.sum_sale+=gun1.sale;
gun1.work_liter+=gun1.liter;
gun1.work_sale+=gun1.sale;
//----------------------
pt=&invoice_number;
readbyteseq(506,pt,4);
invoice_number++;
gun1.ppu=invoice_number;
writebyteseq(506,pt,4);
//------------------------
pt=&gun1;
writebyteseq(0x01,pt,37); //写EEPROM
/////////////////////////////////////
temp_mema=readbyte(0);
temp_mema++;
if(temp_mema<0) temp_mema=0;
if(temp_mema>9) temp_mema=0; //共10条记录
writebyte(0,temp_mema);
add=temp_mema*10+101; //记录地址从:101开始-->144
pt=&(gun1.liter);
writebyteseq(add,pt,8); //写加油记录
add+=8;
pt=&price_a;
writebyteseq(add,pt,2);
Get1302();
if(printermode_a==0)print_proof(0); //打印加油票据A
accumulative_total_list_a(); //累计转换至列表a
}
}
/**************************************************************************
* 功能:累计并保存数据b [ok]
***************************************************************************/
void sum_b(void)
{ uint add;
void *pt;
if(gun2.pulse>disp_floor_level_b)
{
gun2.sum_liter+=gun2.liter;
gun2.sum_sale+=gun2.sale;
gun2.work_liter+=gun2.liter;
gun2.work_sale+=gun2.sale;
//-----------------------
pt=&invoice_number;
readbyteseq(506,pt,4);
invoice_number++;
gun2.ppu=invoice_number;
writebyteseq(506,pt,4);
//--------------------------
pt=&gun2;
writebyteseq(38,pt,37); //写EEPROM
/////////////////////////////////////
temp_memb=readbyte(300);
temp_memb++;
if(temp_memb<0) temp_memb=0;
if(temp_memb>9) temp_memb=0; //共10条记录
writebyte(0+300,temp_memb);
add=temp_memb*10+301; //记录地址从:101+300开始-->144+300
pt=&(gun2.liter);
writebyteseq(add,pt,8); //写加油记录
add+=8;
pt=&price_b;
writebyteseq(add,pt,2);
Get1302();
if(printermode_b==0)print_proof(1); //打印加油票据B
accumulative_total_list_b(); //累计转换至列表b
}
}
/***************************************************************************
* 功能: 工作面A计量处理
****************************************************************************/
void workajl(void)
{ if(update_worka)
{ update_worka=0;
if(jl1s>0)
{
while (jl1s>0)
{ gun1.pulse+=1;
jl1s--;
gun1.pulse_jsq++;
if (gun1.pulse_jsq==120) { gun1.pulse_jsq=0;jsq1out=1;} //通知计数器
updatea=1;save_oka=1;idle_numa=0;
}
}
else
{
if(state1!=1 || !INT0) //if(state1==0 || !INT0) 2006-07-11
{
if(idle_numa<20)idle_numa++;
if(ration_a && (idle_numa>3)) //定量加油完毕
{ ration_a=0;
save_oka=1;idle_numa=20;
if(ration_mode_a)gun1.liter=ration_num_a;
else gun1.sale=ration_num_a;
disp_key_clear_a();
updatea=1;
}
if(idle_numa==20 && save_oka){save_oka=0;sum_a();} //累計
}
else idle_numa=0;
}
}
}
/***************************************************************************
* 功能: 工作面B计量处理 [ok]
****************************************************************************/
void workaj2(void)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -