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

📄 jl2key.bak

📁 这是我在我们公司做的C51加油单片机程序
💻 BAK
字号:
/* ---------------------------------------------------------- */
/*                                                            */
/*                 IC卡加油机通讯子模块                       */
/*                 负责键盘与计量主板通讯                     */
/*                 最后修改日期:2002年5月18日                */
/*                                                            */
/* ---------------------------------------------------------- */

#include "D:\comm_d\comm_pub.h"
#include "D:\comm_d\jl2key.h"
#include "reg52.h"
unsigned char data unit_2s;
extern unsigned char idata comm_status;
unsigned char send_jl(unsigned char gun_num,unsigned char command)
{
	register unsigned char length,tem;
        ES=0;
	if(req_bus(gun_num))return(3);		// 请求占用总线超时
	SOURCE=4;				// 置收发数据来源为加油机主板
	switch(command)
	{
		case 0xa0:			// 读单价
		case 0xa1:			// 读提前关阀量
		case 0xa2:			// 读密度
		case 0xa3:			// 读预置量
		case 0xa4:			// 读当次加油量
		case 0xa5:			// 读当次金额
		case 0xa6:			// 读加油量班累
		case 0xa7:			// 读金额班累
		case 0xa8:			// 读加油量总累
		case 0xa9:			// 读金额总累
		case 0xaa:			// 读状态标志位
		case 0xab:			// 读错误类型
		case 0xb5:			// 清班累
		case 0xc1:			// 停止加油
		case 0xc2:			// 清数
		case 0xc3:			// 查税控明细
		case 0xc8:			// 查税控时钟
		case 0xca:			// 关断电池
			length=3;		// 命令长度(不包括通讯头)
			break;
                case 0xc0:			// 开始加油
                     length=3;
                     break;
		case 0xb0:			// 写单价
		case 0xb2:			// 写密度
			length=5;
			break;
		case 0xb1:			// 写提前关阀量
		case 0xc7:			// 税控检定确认
		case 0xc9:			// 查税控总累计
			length=4;
			break;
		case 0xb3:			// 写金额预置量
                       length=6;
                       break;
		case 0xb4:			// 写油量预置量
                       length=6;
                       break;
		case 0xc5:			// 查税控月累计
			length=6;
			break;
		case 0xc4:			// 查税控日志
			length=7;
			break;
		case 0xc6:			// 设置税控时钟
			length=9;
			break;
                case 0xd0:
                        length=7;
                        break;          
		default:
			HAND_WR=1;		// 释放总线
			return(5);		// 无此命令
			break;
	}
	for(tem=length-2;tem>1;tem--)send_buf[tem]=send_buf[tem-2];
	send_buf[0]=0xd0|length;		// 通讯头
	send_buf[1]=gun_num;			// 枪号
	send_buf[length-1]=command;		// 命令码
	send_buf[length]=check_jl(length-1,send_buf+1);	// 校验和
	send(0,length+1);

	switch(command)
	{
		case 0xaa:
		case 0xab:
		case 0xca:
			length=5;
			break;
		case 0xa0:
		case 0xa2:
			length=7;
			break;
		case 0xa1:
			length=6;
			break;
		case 0xa3:
		case 0xa4:
		case 0xa5:
			length=8;
			break;
		case 0xa6:
		case 0xa7:
		case 0xa8:
		case 0xa9:
			length=10;
			break;
		case 0xc0:
		case 0xc1:
		case 0xc2:
		case 0xc3:
		case 0xc4:
		case 0xc5:
		case 0xc6:
		case 0xc7:
		case 0xc8:
		case 0xc9:
		case 0xb5:
		case 0xb4:
		case 0xb3:
		case 0xb2:
		case 0xb1:
		case 0xb0:
                case 0xd0;
			length=5;
			break;
	}
	tem=recv(0,length);
	if(tem==2 || tem==1)	// 超时/奇偶校验错
	{
		HAND_WR=1;	//释放总线
		return(tem);
	}
	tem=rekk[0];
	if((tem&0xf0)!=0xd0)	// 判断通讯头是否正确
	{
BACK:		HAND_WR=1;
		return(4);
	}
	if((tem&0xf)!=(length-1))goto BACK;	// 长度不对
	if(rekk[1]!=gun_num)goto BACK;	// 返回枪号与发出者不符
	if(rekk[length-2]!=command)goto BACK;	// 命令码与发出的不符
	tem=check_jl(length-2,rekk+1);
	if(rekk[length-1]!=tem)goto BACK;	// 校验和错
	for(tem=0;tem<length-4;tem++)rekk[tem]=rekk[tem+2];	// 没出错,把数据放在接收缓冲区头
	HAND_WR=1;
        comm_status=0;
        ES=1;
        return(0);				// 成功返回
}

unsigned char check_jl(unsigned char length,unsigned char xdata *buf)
{
	register unsigned char temp,i;

	temp=buf[0];
	for(i=1;i<length;i++)temp=temp^buf[i];
	i=temp>>4;
	temp=(temp&0xf)+0x50;
	temp^=i;
	return(temp);
}

bit req_bus(unsigned char gun_num)
{
	register unsigned char i=0;

	unit_2s=0;				// 2秒计时单元清0
	HAND_WR=1;				// 处于读状态
LABEL1:	if((HAND_RD&0x2)==0x2)i++;		// 判断总线状态
	else i=0;
	if(unit_2s>=100)return(1);		// 超时返回
	if(i<42)goto LABEL1;			// 未检测到500us的总线空闲,继续检测
	HAND_WR=0;				// 占用总线
	if(gun_num==0)return(0);		// 0号枪占用总线成功
	for(i=0;i<15;i++);			// 1号枪延时50us后释放总线
	HAND_WR=1;
	i=0;
LABEL2:	if((HAND_RD&0x2)==0x2)i++;
	else goto LABEL1;			// 总线被枪0占用(枪0优先级高),继续等待
	if(unit_2s>=100)return(1);		// 超时返回
	if(i<3)goto LABEL2;			// 再检测50us,总线空闲,继续检测
	HAND_WR=0;				// 1号枪占用总线
	return(0);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -