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

📄 yh_t3_new.c

📁 电子秤源程序。去年的心血啊!c语言编写的51单片机程序。
💻 C
📖 第 1 页 / 共 5 页
字号:
										//为0,正常称重状态
										//为1,去皮称重状态
bit bdata f_bat=0;//表征电池电量
									//为0,电量充足
									//为1,电量不足	
bit bdata f_zero=0;//表征示数归零
										//为0,没有归零;
										//为1,当前的示数为0
bit bdata f_add=0;//表征累加状态
									//为0,称重结果不累加
									//为1,称重结果累加
//---------------------------------
//下面这两个旗标暂时什么也不代表。
bit bdata f_x1=0;
//----------------------------------
bit bdata f_minus=1;//表征结果的正负,
										//为1,结果是正数;
										//为0,结果是负数。
//----------------------------------
bit bdata f_delay1m=0;//表征定时器T0和计数器C1
											//是否正在运行
											//为1,正在运行;
											//为0,没有运行。
bit bdata f_LCD=0;//表征LCD是否处于屏保状态;
									//为1,屏保;
									//为0,正常显示。											
bit bdata f_stab_mainly=0;//表征LCD显示示数基本稳定
													//变化的范围控制在正负一个
													//数字之间。
													//为1,表示稳定;
													//为0,表示不稳定																			
//-----------------------------------
//以下是4种单位的旗标
bit bdata f_g=0;//表征单位克
								//为1,显示该单位
								//为0,不显示该单位
//bit bdata f_kg=0;//表征单位千克
								//为1,显示该单位
								//为0,不显示该单位
//bit bdata f_lb=0;//表征单位英镑
								//为1,显示该单位
								//为0,不显示该单位
//bit bdata f_oz=0;//表征单位盎司
								//为1,显示该单位
								//为0,不显示该单位																																											
ulong temp_ad13;	//排序过程中,作为中间量,因为涉及到
								//相邻的几次排序,所以必须定义成
								//全局变量
uint ad_zero;//表示当前零点的AD平均值
uint ad_zero_kj;//表示开机时最初零点的AD平均值								
//注意:按键数目限制在4个。
//按键的功能
sbit ZERO=P0^0;//功能说明:清零及校准时空载AD确认
sbit MENU=P0^1;//功能说明:单位转换及进入AD校准。
								//进入AD校准方法:先按住UNIT键,然后
								//开机,最后松开UNIT键
								//注意:给MENU键增加一个串口输出功能								
sbit ADD=P0^2;//功能说明:累加,电路图上是PCS键
//sbit PRN=P0^3;//功能说明:串口输出
sbit TARE=P0^4;//功能说明:去皮及校准时加校准砝码后
							 //AD确认


char count1;
char count2;
//除了AD校准时存放AD的BCD需要6位全部使用,别的只使用
//后5位。
uchar arr_BCD[6];
ulong ad3[3];//最新的三次AD存放缓冲区
//最新的13次AD3次平均值缓冲区
struct AFEI idata ad13[13];
char temp_j;
void rotate3(void);
ulong average3(void);
void rotate(void);
void sort(void);
void BIN_to_BCD(ulong data_BIN);
void over_load(void);
ulong zero_comp(void);
bit stab(ulong ad,ulong ad0);
bit stab2(void);
ulong auto_zero(ulong ave3_ad);
//void zero_button(void);
//void tare_button(void);
//uchar code arr_step[6]={1,2,5,10,20,50};
//uint code arr_baud[4]={1200,2400,4800,9600};
//ulong idata limit_load;//表示超载界限的AD平均值
//long idata AD_over;//表示
//long idata zero_pos;
//long idata	zero_neg;
//long idata	manu_zero_pos;
//long idata	manu_zero_neg;
//long idata	auto_zero_pos;
//long idata	auto_zero_neg;
//long idata	tare_high;
long y;	//	作为一系列宏定义的实际参数,存储的是满量程
				//的AD平均值增量。
char idata step;//表示真正的分度值	
	
	
	
//-----------------------------
//主函数开始
void main(void)
{
	ulong idata weight;//称重的结果
	ulong temp_weight;//作为重量计算时四舍五入的数据
										//缓冲,另外,在单位转换中也会
										//用到,作用:数据缓冲。
	ulong idata temp_weight0;//缓冲变量,存放上次的重量值
	ulong temp_weight_5m;
	ulong total=0;//表示累加的重量
	uchar n_add=0;//表示累加的次数
	long dif;//清零、去皮时的中间结果
	ulong inc_ad;//表示AD平均值的增量
	ulong ave3_ad;//表示AD的平均值
	ulong ave3_ad0;//表示上一次的AD平均值
  char i;//循环变量
  uchar count_stab=0;//  
  //char j;//循环变量
  /**********************************************
  单位转换,循环计数器的取值说明:
  目前使用的LCD是1621--GD-1730WP;
  count_unit可以取值:1,盎司
  										2,英镑
  										3,克
  										4,千克
  **********************************************/
  //char count_unit=3;//单位转换,循环计数器,默认是g
  
  /**********************************************
	菜单的设计流程:		菜单开始	
										1,分度值
										2,小数点的位置
										3,波特率
										4,背光
										
										
										//5,量程
										//6,校准
										菜单结束
											
	**********************************************/
  /*******************************************
	count_range_zeroes		表示量程数字后面0的个数
	count_range_zeroes的取值范围:0~4
	*******************************************/
  //uchar idata count_range_zeroes=0;
  
  /*******************************************
	count_step  表示分度值的代码。
	count_step取值范围:0 对应的分度值1;
											1 对应的分度值2;
											2 对应的分度值5;
											3 对应的分度值10;
											4 对应的分度值20;
											5 对应的分度值50;
	*******************************************/
	uchar idata count_step;	
	/*******************************************
	count_point  表示小数点的位置。
	count_point取值范围:	0 没有小数点;
												1~5 表示2至6位(从右边数)
												的小数点 ;
	注意:第五位的小数点也就是LCD的最高位的小数点,
				实际上是没有意义的。	
	*******************************************/
	uchar idata count_point;
  /*******************************************
	count_baud  表示串口的波特率。
	count_baud的取值范围:0 对应的波特率1200;
												1 对应的波特率2400;
												2 对应的波特率4800;
												3 对应的波特率9600;						
	*******************************************/
	uchar idata count_baud;
  /*******************************************
	count_BL  表示背光开关的代码。
	count_BL的取值范围:0 对应的背光OFF;
											1 对应的背光ON;									
	*******************************************/
	uchar idata count_BL;
	/*******************************************
	count_range  表示量程的最低位,值域:[0,9]							
	*******************************************/
	uchar idata count_range;
	/*******************************************
	temp_range  表示新的量程,值域:[0,99999]							
	*******************************************/
	ulong idata temp_range;
	//旗标f_cal的用途是检验在菜单的量程处是否有TARE键
	//或者ZERO键按下。
	//另外,也可以判断TARE键或者ZERO键是否是首次按下。
	bit bdata f_cal;
	/*******************************************
	count_FaMa  表示校准砝码重量的最低位,值域:[0,9]							
	*******************************************/
	uchar idata count_FaMa;
	/*******************************************
	temp_FaMa  表示校准砝码重量的最低位,值域:[0,9]							
	*******************************************/
	ulong idata temp_FaMa;
	//旗标f_FaMa的用途:判断TARE键或者ZERO键是否是首次
	//按下。
	bit bdata f_FaMa;	
  
  
  //----------------------------------------
  cmd_5460(0xff);
	cmd_5460(0xff);
	cmd_5460(0xff);
	cmd_5460(0xfe);//初始化5460的串口
	//---------------------------------------
	cmd_5460(0x4a);//将转换周期改为N
	write_5460(N_5460);
	//修改配置寄存器,将电流通道的增益改为50							
	cmd_5460(0x40);
	write_5460(0x00010001);
	//启动5460的连续转换
	cmd_5460(0xe8);
	reset_1621();//初始化LCD的一些参数。
  cmd_1621(BIAS_COM);
  cmd_1621(SYSTEN);
  cmd_1621(LCDON);//打开LCD	
  alarm_low();
  display_1621();	//利用dis_zone[]的初始化数据,使
  								//开机LCD完全不显示。
  //----------------------------------
  //菜单部分
  if(MENU==0)
		{
			delay_nms(50);
			if(MENU==0)
				{						
					while(!MENU);
					alarm(200);//按键音
					//delay_nms(2000);				  				  												
					f_g=1;	//在菜单状态下也显示单位:克。								
//--------------------------------------					
					while(1)
					{			
						rd_seq(0x08,buf_24c02_4B,4);
//--------------------------------------					
						count_step=buf_24c02_4B[0];
						count_point=buf_24c02_4B[1];
						count_baud=buf_24c02_4B[2];
						count_BL=buf_24c02_4B[3];
//--------------------------------------
						//buf_24c02_2L[0]=rd_long(0x10);
						//buf_24c02_2L[1]=rd_long(0x14);	
						rd_seq(0x10,buf_24c02_2L,8);		
//下面这些条件判断语句的目的是防止从24C02中第一次
//的读出数据超出指定的范围,造成差错。
						if(count_step>5)
								count_step=0;
						if(count_point>5)
								count_point=0;
						if(count_BL>1)
								count_BL=0;
						if(count_baud>3)
								count_baud=0;
						//菜单进入:显示“SEt”	
						dis_zone[0]=0x00;
						//dis_zone[1]=0xda;
						dis_zone[1]=discode_cap[19];
						//dis_zone[2]=discode_cap[5];
						dis_zone[2]=discode_cap[5];
						//dis_zone[3]=discode_low[20];
						dis_zone[3]=discode_low[20];
						dis_zone[4]=0x00;
						dis_zone[5]=0x00;
						dis_zone[6]=0x00;
						display_1621();																											
						while(1)
						{
							if(MENU==0)
								{
									delay_nms(50);
									if(MENU==0)
										{											
											while(!MENU);
											alarm(200);//按键音,表示按键有效																						
											break;
										}
								}
						}
						//菜单一:分度值选择	
						dis_zone[0]=discode_low[4];	//LCD第一个字位显示”d“
						dis_zone[1]=0x00;
						dis_zone[2]=0x00;
						dis_zone[3]=0x00;					
						while(1)
						{																																																																																																																																						
							if(TARE==0)
								{
									delay_nms(50);
									if(TARE==0)
										{											
											while(!TARE);
											alarm(200);//按键音											
											count_step++;
											if(count_step==6)
													count_step=0;
										}
								}		
							if(MENU==0)
								{
									delay_nms(50);
									if(MENU==0)
										{											
											while(!MENU);
											alarm(200);//按键音																						
											buf_24c02_4B[0]=count_step;
											break;
										}
								}	
							switch(count_step)
							{
								case 0:	dis_zone[4]=0x00;//分度值为1
												dis_zone[5]=0x06;
												break;
								case 1:	dis_zone[4]=0x00;//分度值为2
												dis_zone[5]=0x7c;
												break;
								case 2:	dis_zone[4]=0x00;//分度值为5
												dis_zone[5]=0xda;
												break;
								case 3:	dis_zone[4]=0x06;//分度值为10
												dis_zone[5]=0xbe;
												break;
								case 4:	dis_zone[4]=0x7c;//分度值为20
												dis_zone[5]=0xbe;
												break;
								case 5:	dis_zone[4]=0xda;//分度值为50
												dis_zone[5]=0xbe;
												break;
								default:	//显示错误号"Err 7"
													dis_zone[0]=0x00;//
													//dis_zone[1]=discode_cap[5];
													//dis_zone[2]=discode_low[18];
													//dis_zone[3]=discode_low[18];
													dis_zone[1]=discode_cap[5];
													dis_zone[2]=discode_low[18];
													dis_zone[3]=discode_low[18];
													dis_zone[4]=0x00;													
													dis_zone[5]=discode_num[7];
													display_1621();
													alarm(800);
													//此处延时很长,目的是让使用者
													//看清楚错误号。
													delay_nms(5000);
													//alarm(200);													
							}
							display_1621();																												
						}
						//菜单二:小数点位置选择
						//dis_zone[0]=discode_low[4];	//LCD第一个字位显示”d“
						//dis_zone[1]=0xec;	//LCD第一个字位显示”P“
						dis_zone[0]=discode_low[4];
						dis_zone[1]=discode_low[16];
						dis_zone[2]=0x00;
						dis_zone[3]=0x00;
						dis_zone[4]=0x00;
						while(1)
						{															
							if(TARE==0)
								{
									delay_nms(50);
									if(TARE==0)
										{											
											while(!TARE);
											alarm(200);//按键音											
											count_point++;
											if(count_point==6)
													count_point=0;
										}
								}	
							if(MENU==0)
								{
									delay_nms(50);
									if(MENU==0)
										{											
											while(!MENU);
											alarm(200);//按键音																																	
											buf_24c02_4B[1]=count_point;
											break;
										}
								}
							dis_zone[5]=discode_num[count_point];
							display_1621();
						}

⌨️ 快捷键说明

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