📄 waterpos.c
字号:
/****************************************************************************
* *
* File: pos.c *
* *
* Version: *
* *
* Created: 21.05.2004 *
* Last Change: 21.05.2004 *
* 21.05.2004 *
* Author: *
* *
* Compiler: KEIL C51 V6.02 *
* *
* Description: 3个中断源:定时器0-----60ms中断 *
* 串口1 -----接收卡号中断 *
* 串口0 -----与HUB联系中断 *
* 计费方式为按流量计费 *
* 2004-03-11:修改了靠卡模式 --- 靠卡消费开始 --- 撤卡消费结束 *
* 2004-03-12:判断卡信息中消费额 *
* 2004-03-15:能显示负数余额 *
* 2004-06-02:计量模式为以时间计算 *
* 2004-08-09:脱机保存数据200条消费记录 *
* 添加消费流水号(初始流水号为1) *
* 用户程序(南京化校新校区) *
* 以时间为单位收费x分/1s *
* 此程序为MIFARE卡(由M1卡读头发送序列号加检测脚) *
****************************************************************************/
#include<w77c32.h>
#include<absacc.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define BN 12
#define FM_FLAG 0x5a /*sys flag */
#define writecommand 0xd0
#define readcommand 0xd1
#define fmwcmd 0xa0
#define fmrcmd 0xa1
/*-错误报警列表--*/
#define ERR0 0 //
#define ERR1 1 //
#define ERR2 2 //pci向PC请求数据超时
#define ERR3 3 //出纳员卡在消费机器上使用
#define ERR4 4 //
#define ERR5 5 //
#define ERR6 6 //
#define ERR7 7 //
#define ERR8 8 //
#define ERR9 9 //卡中余额不足
#define ERR10 10 //卡未注册
#define ERR11 11 //挂失卡
#define ERR12 12 //POS向PCI请求数据超时
#define ERR13 13 //卡号比较错误
#define ERR14 14 //
#define ERR15 15 //
#define ERR16 16 //
#define NOP5() _nop_();_nop_();_nop_();_nop_();_nop_()
#define NOP10() _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_()
//
#define fm_flag0 0x0 /*铁电中的系统标志 */
#define fm_master 0x1 /*铁电中的管理器地址 */
#define fm_addr 0x2 /*铁电中的本机地址 */
#define fm_status 0x3 /*pos FUNC. */
#define fm_idnum 0x4
#define SAL_RATE 0x0010
#define SAL_FLAG 0X0011
#define SAL_BEG 0X0012
#define SAL_END 0X0013
#define fm_buf 0x0100
/*BIT define*/
sbit a0=ACC^0;
sbit a1=ACC^1;
sbit a2=ACC^2;
sbit a3=ACC^3;
sbit a4=ACC^4;
sbit a5=ACC^5;
sbit a6=ACC^6;
sbit a7=ACC^7;
sbit send=P1^0;
sbit recieve=P1^1;
sbit battery_test=P1^4; /*check fastener battery */
sbit overloading=P1^5; /*检测电机堵转 */
sbit scl1=P1^6;
sbit sda1=P1^7;
sbit test_card=P1^3; /*检测ID卡是否还存在 */
sbit wp=P3^3; /*铁电FM2416的片选 */
sbit F_M1=P3^2;
sbit watchdog=P3^5; /*看门狗 */
sbit re184=P3^4; /*75lbc184 */
sbit beep=P3^6; /*beep */
sbit plusa=P2^4; /*脉冲 a */
sbit plusb=P2^5; /*脉冲 b */
sbit cm_a=P2^6; /*电机控制 1 */
sbit cm_b=P2^7; /*电机控制 2 */
sbit ser=P2^0; /*595 */
sbit srclk=P2^1;
sbit rclk=P2^2;
bit lastread;
bit f_ID; /*flag of has card */
bit reqst_sys; /*flag of request sys */
bit f_zh; /*flag of request accounts */
bit f_send; /*flag of request accounts */
bit lastplusa;
bit f_plusa;
bit lastplusb;
bit f_plusb;
bit f_sal;
bit f_status; /*请求发送消费数据 */
bit f_master; /*更新管理器地址 */
bit f_60ms;
bit f_err ;
bit f_ri0;
bit f_com;
bit f_card;
bit f_updata; /*更新时间标志 */
bit f_kguan0;
bit f_kuai5;
bit f_mifare;
bit s_err;
bit f_ri1;
bit f_ok;
bit f_connect;
bit f_off_line;
uchar TIME_OFF_LINE;
uchar address; /*本机地址 */
uchar addr; /*read address from FM */
uchar rcount;
uchar kcount;
uchar salecount;
uchar master; //HUB地址
uchar status; //消费功能状态字
uchar flag;
uchar rate; //消费费率
ulong money; //卡中余额变量
ulong expence; //消费变量
ulong idata liuliang; //流量变量
uint idata sal_time;
uchar idata serial1_sendnum;
uchar idata serial0_sendnum;
uchar idata Request_Information_Count;
uchar idata Card_On_Or_Off_Count;
uchar idata error;
uchar idata Inline_Or_Offline_Count;
//数组变量定义
uchar idata ASSIC[32]; //串口0缓冲区
uchar data idcode[6]; //ID卡号缓冲区
uchar idata dispbuf[5]={0xb,0xb,0xb,0xb,0xb}; //显示缓冲区
uchar code tempt[0x20]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40,0x79,0x50};
// 0 1 2 3 4 5 6 7 8 9 "暗"a -b "E"c "r"d
uchar code numkey[96]={0x0d,0xde,0x6f,0x37,0x83,0x83,
0x14,0x8a,0xc5,0xe2,0x28,0x28,
0x7d,0x3e,0x9f,0x4f,0x95,0x95,
0xad,0xd6,0x6b,0x35,0xc8,0xc8,
0xdf,0xef,0x77,0xbb,0xe4,0xe4,
0x09,0x84,0x42,0x21,0xbc,0xbc,
0x5f,0xaf,0xd7,0xeb,0xa5,0xa5,
0x29,0x14,0x8a,0xc5,0x9f,0x9f,
0xfa,0xfd,0xfe,0x7f,0xff,0xff,
0x73,0x39,0x9c,0xce,0xbe,0xbe,
0xfc,0x7e,0xbf,0xdf,0xbf,0xbf,
0xcf,0xe7,0x73,0x39,0x51,0x51,
0xf7,0xfb,0x7d,0x3e,0x5a,0x5a,
0xf2,0x79,0x3c,0x1e,0x8d,0x8d,
0xcf,0xe7,0x73,0x39,0x45,0x45,
0xb7,0xdb,0x6d,0xb6,0x7d,0x7d};
uchar xdata sendbuf[30]; //串口0发送缓冲区
uchar xdata sendbuf1[8];
uchar xdata *serial0_ReadSendPoint=sendbuf;
uchar xdata *serial1_ReadSendPoint=sendbuf1;
uchar xdata receivebuf[30];
uchar xdata salebuf[16]; //消费缓冲区
uchar xdata ASSIC5[32];
uchar xdata ASSIC6[32];
uchar xdata idcode5[32];
//函数申明
void read_plus(void);
void byte_to_595(uchar value);
void delay_ms(uint count);
void wait10ms(void);
void closevalue(void);
void openvalue(void);
void iwrbyte(uint address,uchar dd);
void iwrbyte(uint address,uchar dd);
void write_N_fm(uchar xdata *point,uint address,uchar count);
uchar irdbyte(uint address);
uchar read_N_fm(uint address,uchar number,uchar *point);
void accounts(void);
void disp(void);
bit xorsum(void);
bit JudgeFlagId(void);
/********************************************************/
/*读取系统中是否有保留消费信息
/********************************************************/
void Read_Sys(void)
{ uchar c;
if(irdbyte(SAL_FLAG)!=0xaa)
{
iwrbyte( SAL_BEG,0x0 );
iwrbyte( SAL_FLAG,0xaa );
iwrbyte( SAL_RATE,0X1 );
iwrbyte( SAL_END,0X0 );
}
rate=irdbyte( SAL_RATE );
}
/********************************************************/
/*Function: 初始化定时器0 */
/*Input: Nun. */
/*Output: Nun. */
/*Description: 定时60MS */
/********************************************************/
void init_T0()
{
TH0=-(60000/256);
TL0=-(60000%256);
TR0=1;
ET0=1;
}
/********************************************************/
/*Function: 初始化串口 */
/*Input: Nun. */
/*Output: Nun. */
/*Description: */
/********************************************************/
void init_serial() //
{
SCON=0xf0; //串口0和集线器通讯
SCON1=0x50; //串口1和读卡器通讯
ES1=1;
ES=1;
TMOD=0x21; //
TH1=0xFD; //T1用作串口1的波特率发生器 --- 和ID读卡头通讯
TL1=0xFD;
TR1=1;
TH2=0xff; //T2用作串口0的波特率发生器 --- 和HUB通讯
TL2=0xf4;
RCAP2H=0xff; //ff:fd ff:fa ff:f7 ff:f4 ff:ee ff:dc
RCAP2L=0xf4; //115200 57600 38400 28800 19200 9600
T2CON=0x34; //tf2 exf2 rclk tclk exen2 tr2 c/t2 cp/rl2
PS=1;
EA=1;
}
/********************************************************/
/*Function: ASSIC TO HEX */
/*Input: Nun. */
/*Output: Nun. */
/*Description: turn ASSIC to hex */
/********************************************************/
void assichex(void)
{
uchar i;
for (i=0;i<=BN-1;i++)
{
if (ASSIC[i]>0x39)
{
ASSIC[i]=ASSIC[i]-0x37;
}
else
{
ASSIC[i]=ASSIC[i]-0x30;
} /*12bytes assic----->12bytes hex*/
}
idcode[0]=ASSIC[0]<<4|ASSIC[1];
idcode[1]=ASSIC[2]<<4|ASSIC[3];
idcode[2]=ASSIC[4]<<4|ASSIC[5];
idcode[3]=ASSIC[6]<<4|ASSIC[7];
idcode[4]=ASSIC[8]<<4|ASSIC[9];
idcode[5]=ASSIC[0xa]<<4|ASSIC[0xb];
}
/********************************************************/
/*Function: 定时器0中断处理 */
/*Input: Nun. */
/*Output: Nun. */
/*Description: */
/********************************************************/
void Time0() interrupt 1 using 1
{
TR0=0;
TH0=-(60000/256);
TL0=-(60000%256);
f_60ms=1;
if(!f_com)
{
if((TIME_OFF_LINE++)==8)
{
f_off_line=!f_off_line;
TIME_OFF_LINE=0;
}
}
/*----------------------------------------------------------*/
/*--------------------开关检测------------------------------*/
if(f_card)
{
recieve=1;
_nop_();
_nop_();
if( !f_kguan0 )
{
if(!recieve)
{ rcount++; }
if(rcount==5)
{ f_kguan0=1;}
}
if ( f_kguan0 )
{
recieve=1;
_nop_();
_nop_();
if(!recieve)
{
kcount++;
rcount=0;
f_kguan0=0;
}
}
}
/*----------------------------------------------------------*/
if(f_card)
{
sal_time++; //置位60ms到标志
if( sal_time==17 )
{
f_updata=1;
sal_time=0;
}
}
/*-----------------------------------------------------------*/
if (Inline_Or_Offline_Count++==17)
{
f_com=0; //超过1.02S没清零说明通信出错
Inline_Or_Offline_Count=0;
f_connect=0; //1.02S时间溢出
}
/*------------------------------------------------------------*/
if ( Request_Information_Count ) //请求数据超时计数器(3 SECOND)
{
Request_Information_Count--; //初值Request_Information_Count=50
}
TR0=1;
}
/********************************************************/
/*Function: 串口1中断处理 */
/*Input: Nun. */
/*Output: Nun. */
/*Description: 靠卡串口中断 */
/*ID号START(0X02)+(12 BYTES)+END(0X0D)
/********************************************************/
void serial1() interrupt 7 using 2
{ static uchar rmod;
static uchar i;
uchar c;
if(RI_1)
{
RI_1=0;
if (!f_card) //消费中?判断卡合法后开始消费置f_card=1
{
c=SBUF1;
switch (rmod)
{
case 0://head 0x02
if (c==02)
//ASSIC[i++]=SBUF1;
rmod++;
break;
case 1://date 12 bytes
ASSIC[i++]=c;
if (i==BN) rmod++;
break;
case 2://last 0x0d 1byte
if (c==0x0D){
ASSIC[i++]=c;
//assichex();/*ASSIC---->HEX*/
f_ri0=1; //have
rmod=0;
i=0;
}
else
{ f_ri0=0;
rmod=0;
i=0;
}
break;
default:
break;
}
}
else
{
Card_On_Or_Off_Count=50; //重新装载检测卡计数器值
}
}
}
/********************************************************/
/*Function: 串口0中断处理程序 */
/*Input: Nun. */
/*Output: Nun. */
/*Description: 和管理机通信 */
/********************************************************/
void serial0() interrupt 4 using 3
{ static uchar lengh;
static uchar pf;
static uchar xdata *pnt;
static rmod;
uchar idata c;
//串口接收中断处理
if (RI)
{
RI=0;
c=SBUF;
switch(rmod)
{
case 0:
if(c==address) //|c==0xff) //address
{
SM2=0; //建立通信连接
rmod++;
}
break;
case 1: //length(字节数)
lengh=c; //实际字节数为LENGTH-2
if(lengh==4)
_nop_();
pf=lengh;
pnt=receivebuf;
lengh=lengh-2; //dec length and checksum
if(lengh>13)
lengh=13;
rmod++;
break;
case 2: //接收命令&数据体
*pnt++=c;
pf+=c;
if(lengh--==1) rmod++;
break;
case 3: //接收校验和
{
if (pf==c)
{
switch (receivebuf[0])
{
case 0x01://------轮循-----
{
if (status!=receivebuf[1])//比较状态功能
{
f_status=1; //置更新功能状态标
status=receivebuf[1];
}
if (master!=receivebuf[2]) //比较管理机号
{
f_master=1;
master=receivebuf[2];
}
f_com=1; /*置位通讯成立标志*/
Inline_Or_Offline_Count=0;
//-----------请求帐户信息? -----------
if (f_zh&&f_send)
{
uchar xdata *pnt=sendbuf;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -