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

📄 cmain.c

📁 用CS5532做的无线吊钩称的接收称重显示器程序
💻 C
📖 第 1 页 / 共 3 页
字号:

#include <reg52.h>
#include <intrins.h>

#define TRUE        1
#define FALSE       0


/* 8958  plcc44 */
sfr  SS1     = 0xbf;
sfr  SS2     = 0x85;
sfr  P4      = 0xe8;


/***************************************************************
各个IO的定义
***************************************************************/


//RS485的收发选择
//暂时没有
sbit txrx = P2 ^ 5;		// 1 -- 发送数据    0 -- 接收数据

//跳pin选择
sbit	IOK1	 = P0^7;
sbit	IOK2	 = P4^1;
sbit	IOK3	 = P2^7;
sbit	IOK4	 = P2^6;
sbit	IOK5	 = P2^5;

//蜂鸣器
sbit IOBeep  = P2^0;

//开关电源
sbit IOPower = P4^2;

//背光
sbit IOBK    = P4^3;

/******************************************************************
各个参数在Eeprom中的地址
******************************************************************/

#define e_min_add   0x02
#define e_s_unit    0x0f
#define e_para      0x10
#define e_adzero    0x20
#define e_adf       0x24
#define e_start     0x62


//调用IIC中的子程序
extern WriteEeprom(unsigned char t_addr, unsigned char num, unsigned char xdata *ptr);
extern ReadEeprom(unsigned char s_addr, unsigned char num, unsigned char xdata *ptr);

//调用LCD中的子程序
extern void InitLcd(void);
extern void DispUnit(unsigned char);
extern void DispStr(unsigned char code  *ptr_code);
extern void DispDigital(signed long li,signed char pos);
extern void tran(void);
extern void wrlcd(void);
extern void ClearFlag(void);

extern unsigned char xdata dispbuff[6];
extern unsigned char  data bankbuff[16];
extern unsigned char xdata TmpData[7];


//蜂鸣器的调用
extern unsigned char beep;
extern void BeepFunc(void);

//串口的调用
extern void InitUart(void);
extern void SendStr(unsigned char num);
extern bit RdBufData(void);

//菜单调用
void EnterMenu(void);
extern unsigned  int code exp_m[];		// = {1,10,100,1000,10000};
extern unsigned char code allbit[];		// = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

//键盘的调用
extern void KeyPro(void);
extern data unsigned char kbuf;
//各个键的定义
#define KEYUNIT   0x08
#define KEYMPLUS  0x10
#define KEYHOLD   0x04
#define KEYCHANGE 0x01
#define KEYT_Z    0x02

#define KEYQUIT   0x08
#define KEYCLEAR  0x10
#define KEYRIGHT  0x04
#define KEYINC    0x01
#define KEYENTER  0x02

unsigned  int  data  s_del;
unsigned char xdata test_start;
unsigned char bdata cont_1;
sbit gross_lcd  = cont_1^7;  //
sbit net_lcd    = cont_1^6;
sbit tare_lcd   = cont_1^5;  //
sbit clock      = cont_1^4;
sbit stab_lcd   = cont_1^3;  //
sbit auto_lcd   = cont_1^2;
sbit M_lcd      = cont_1^1;
sbit bat_r      = cont_1^0;

unsigned char bdata cont_2;
sbit T1_lcd     = cont_2^7;
sbit T2_lcd     = cont_2^6;
sbit T3_lcd     = cont_2^5;
sbit T4_lcd     = cont_2^4;
sbit bf_lcd     = cont_2^3;  //
sbit peak_lcd   = cont_2^2;  //
sbit ray_lcd    = cont_2^1;  //
sbit bat_l_lcd  = cont_2^0;  //

unsigned char bdata cont_3;
sbit hi_lcd     = cont_3^3;
sbit ok_lcd     = cont_3^2;  //
sbit lo_lcd     = cont_3^1;  //
sbit zero_lcd   = cont_3^0;  //
//sbit bat_space  = cont_3^4;

unsigned char bdata flag1;
sbit delb       = flag1^0;         		//开始延时置1,延时到为零
sbit bk_delb    = flag1^1;			//自动背光的显示时间
sbit bat_space  = flag1^2;

sbit ga         = flag1 ^ 3;
sbit ke         = flag1 ^ 4;			//有键按下
sbit keyp       = flag1 ^ 5;			//键盘有效的标志
sbit kerr_b     = flag1 ^ 6;			//按键时间太长

sbit m_delb     = flag1 ^ 7;			//累显的时间标志

unsigned char bdata flag2;
sbit add_lcd  = flag2^0;
sbit pcs_lcd  = flag2^1;
sbit batt_lcd = flag2^2;
sbit xg_lcd   = flag2^3;

unsigned int  xdata m_del;		//可以设置的累显延迟时间
unsigned  int xdata bk_del; 			///自动背光的显示时间延时
unsigned char xdata last_min;			//电池不足时的开机时间
unsigned char xdata min_add;			//电池不足
unsigned  int xdata c_del;			//时间定时,400次到1秒
unsigned char xdata minute;			//分钟指示 0 -- 59
unsigned char xdata second;			//秒指示   0 -- 59
unsigned char xdata shut_min;
unsigned char xdata unit;			//显示单位
							// 0 --     1 --
unsigned  int del_num; 				//延时时间参数
unsigned char xdata  *ptr_xdata;
unsigned int  xdata times;			//零位跟踪的时间

  signed long int xdata tmp_li1,tmp_li2,tmp_li3;

/**************************************************
与秤重有关的变量
**************************************************/
  signed long int xdata capacity;
  signed long int xdata capacity_n;			//标定单位kg状态下的量程
  signed char     xdata division;
  signed char     xdata division_n;
  signed char     xdata decimal;
  signed char     xdata decimal_n;			//标定单位kg状态下的小数点位置
  signed long int xdata adzero;
  signed long int xdata adf;
  signed long int xdata adz0;
  signed long int xdata adz;
  signed long int xdata w_gross;
  signed long int xdata w_net;
  signed long int xdata w_tare;
  signed long int xdata n_tare;		//按扣重键或调入得到的扣重值

//unsigned char xdata re_zero;		//手动归零的百分比
  signed long int xdata fd5;			//0.5d的内码值
  float           xdata f_z;
  float           xdata f_w;
  float           xdata f_t;
  float           xdata f_h;				//Hold时的重量
  signed long int xdata w_hold;
/**************************************************************
单位设置
**************************************************************/
  signed char xdata s_unit;		//0--kg,1--lb,2--台斤,3--港斤
  signed char xdata t_unit;		//按扣重键时的单位或调入得到的扣重值时的单位

/**************************************************************
//参数
**************************************************************/
typedef struct	cmd_entry	/* define the struct 'cmd_entry'  */
{
	unsigned char divisionprecision;	// 0
	unsigned char auto_zero;		// 1
	unsigned char capacity;			// 2
	unsigned char bk;				// 3
	unsigned char inp;			// 4
	unsigned char unit;			// 5
	unsigned char poweroff;			// 6
	unsigned char prt;			// 7
	unsigned char change;			// 8
}x;


extern union exam
{
	struct cmd_entry mode;
	unsigned char cmode[9];
}xdata para;

/************************************************************
与累加有关的变量
************************************************************/
#define MAXTOTAL 999				//最多累加次数
  signed long int xdata w_total;		//累加重量
  signed  int     xdata n_total;		//累加次数

/************************************************************
闪烁变量
************************************************************/
unsigned int xdata wink;


unsigned char code disp_full[] = {0x30,0x30,0x30,0x30,0x30,0x30};		//显示8.8.8.8.8.8.
unsigned char code version[]   = {0x20,0x1d,0x23,0x00,0x01,0x20};		//V1.01
unsigned char code err_4[]     = {0x0e,0x1a,0x1a,0x20,0x20,0x04};		//Err  4
unsigned char code err_6[]     = {0x0e,0x1a,0x1a,0x20,0x20,0x06};		//Err  6
unsigned char code err_10[]    = {0x0e,0x1a,0x1a,0x20,0x01,0x00};		//Err 10
unsigned char code err_11[]    = {0x0e,0x1a,0x1a,0x20,0x01,0x01};		//Err 11
unsigned char code err_12[]    = {0x0e,0x1a,0x1a,0x20,0x01,0x02};		//Err 12


unsigned char code ol[]        = {0x1f,0x1f,0x17,0x15,0x1f,0x1f};		//--oL--

unsigned char code d__[]       = {0x1f,0x1f,0x1f,0x1f,0x1f,0x1f};		//------
unsigned char code d_space[]   = {0x20,0x20,0x20,0x20,0x20,0x20};		//     

unsigned char code d_battlo[]  = {0x0b,0x0a,0x1c,0x10,0x15,0x17};		//bAt Lo


unsigned char bdata flag5;
sbit BErrData   = flag5 ^ 3;		//在一定时间内串口没有接收到有用的内码
sbit r_succes_b = flag5 ^ 4;		//成功接受一个字符的标志
sbit in_send    = flag5 ^ 5;		//正在发送数据标志
sbit crc_err    = flag5 ^ 6;		//CRC 校验错误

sbit BTareFlag      = flag5 ^ 7;		//扣重标志位

unsigned char bdata flag6;
sbit B0d0a      = flag6 ^ 0;		//已经出现过了0d 0a
sbit BSign      = flag6 ^ 1;		//是否是负数
sbit BProtocol  = flag6 ^ 2;		//出现了0d,0a或ff后,协议依然不正确

sbit BReq       = flag6 ^ 3;		//请求发送内码命令已发送
sbit BMustDisp  = flag6 ^ 4;		//需要立即显示

sbit BHold      = flag6 ^ 5;		//Hold键已按下
sbit BHoldDisp  = flag6 ^ 6;		//Hold的重量已经显示

sbit BTmp       = flag6 ^ 7;		//临时标志位

unsigned char bdata flag7;		//协议设置标志区
sbit pick       = flag7 ^ 0;		//可读内码标志
sbit stab       = flag7 ^ 1;		//内部稳定标志
sbit bat_crane  = flag7 ^ 2;		//吊秤缺电标志
sbit BRecData   = flag7 ^ 3;		//接收端已接收到数据(长度>=7个)标志
sbit BLess20d   = flag7 ^ 4;		//小于20d的标志
sbit BOverLoad  = flag7 ^ 5;		//超载标志
sbit BAcc       = flag7 ^ 6;		//可以累加标志

unsigned char xdata ReqTime;		//请求发送数据以后的最长等待时间
unsigned char xdata ReqNum;         //请求发送的次数

/*union
{
	unsigned char c[2];
	unsigned  int i;
}chi;*/



extern unsigned long int xdata ad_out;					//读出的内码
extern   signed char xdata RecCounter;		//接受字符指针
extern   signed char xdata RdCounter;		//读接收缓冲区的指针
//unsigned char RdChar(unsigned char num);




/*
	功能:延时,查询方式
		输入参数:loop	
*/  
void 	delay	(unsigned int loop)
{
	for ( ; loop>0; loop--) ;
}


void DelayInter(unsigned int num)
{
	del_num=num;
	delb=1;
	do 
	{	 
	}
	while (delb);
}

////////中断程序///////////
void int_ex0 (void) interrupt 0 
{
}
void int_t0(void)  interrupt 1 
{
}
void int_ex1 (void) interrupt 2 
{
	EX1=0;
}

/////
void RunTime(void)
{
	if (delb)
	{
		del_num--;
		if (del_num == 0) 
		{
			delb = FALSE;
		}
	}
}
 
//////unit weight input enter time////
////
void BkTime(void)
{
	if (bk_delb)
	{
		bk_del=bk_del-1;
		if (bk_del==0)
		{
			bk_delb=0;
		}
	}
}

//累加显示延迟
void mdel(void)
{
	if (m_delb)
	{
		m_del--;
		if (m_del == 0) m_delb = FALSE;
	}
}

void ClockDel(void)
{
	c_del=c_del-1;
	if (c_del==0)
	{
		c_del=100;
		second++;
		if (second>59)
		{
			second=0;
			minute++;
			if (minute>59) minute = 0;
			shut_min++;
		}
	}
	if (c_del>100)
	{
		c_del = 100;
	}
}

void UartTime(void)
{
	if (BReq)
	{
		ReqTime--;
		if (ReqTime == 0) 
		{
			BReq = FALSE;
			ReqNum++;
			if (ReqNum > 7) ReqNum = 7;
		}
	}
}

//////////
void int_t1 (void)  interrupt 3
{
	TH1=0xdc;		//0xee;		//0xf7;   
	mdel();
	RunTime();
	BeepFunc();	
	BkTime();
	ClockDel();
	UartTime();		//串口交换数据之间的时间常数
	KeyPro();		//键盘程序
	wink++;
	times++;
}
/**************************************************************************
读参数和初始化变量
**************************************************************************/
extern unsigned char code factory_para[];		// = {1,1,0,0,0,0,1,1,1};
void init_s (void)
{
	  signed char loop;
	for (loop = 0; loop < 9; loop++)
	{
		ReadEeprom(e_para+loop,1,(unsigned char xdata*)&para.cmode[loop]);
	}

	if (para.cmode[0] == 0xff)
	{

		for (loop=0;loop<9;loop++)
		{
			WriteEeprom(e_para+loop,1,(unsigned char xdata*)&factory_para[loop]);
		}
	}
	ReadEeprom(e_adzero,4,(unsigned char xdata*)&adzero);
	ReadEeprom(e_adf,4,(unsigned char xdata*)&adf);
	ReadEeprom(e_s_unit,1,(unsigned char xdata*)&s_unit);
	if ( (s_unit >3 ) || (s_unit < 0) ) s_unit = 0;

	if ( (para.mode.unit&0x0f) == 0)
	{
		s_unit = 0;		//没有打开单位,默认为kg
		goto getcap_ret;

⌨️ 快捷键说明

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