⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 waterpos.c

📁 水控POS机的程序
💻 C
📖 第 1 页 / 共 4 页
字号:
/****************************************************************************
*                                                                           *
* 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 + -