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

📄 yh_t3_new.c

📁 电子秤源程序。去年的心血啊!c语言编写的51单片机程序。
💻 C
📖 第 1 页 / 共 5 页
字号:
		}
		over_load();
		ave3_ad0=ave3_ad;
		ave3_ad=average3();
		f_stab=stab(ave3_ad,ave3_ad0);
		f_stab2=stab2();																	
		//自动归零功能
		ad_zero=auto_zero(ave3_ad);
		i=0;
		while(i<13)
		{
			ad13[i].times++;
			if(ad13[i].times==13)
				{
					temp_j=i;
					ad13[i].ad=ave3_ad;
					ad13[i].times=0;
				}
			i++;
		}
		rotate();
		sort();
		if(ad13[6].ad>=ad_zero)
			{
				inc_ad=ad13[6].ad-ad_zero;
				f_minus=1;
			}						
		else
			{
				inc_ad=ad_zero-ad13[6].ad;
				f_minus=0;
			}									
		weight=inc_ad*buf_24c02_2L[0];
		temp_weight=weight%(buf_24c02_AD[1]);
		weight/=(buf_24c02_AD[1]);
		if(temp_weight>((buf_24c02_AD[1])/2))			
				weight++;			
		weight*=step;
		BIN_to_BCD(weight);		
		if((dis_zone[1]==0xbe)&&(count_point!=4))
			{
				dis_zone[1]=0x00;
				if((dis_zone[2]==0xbe)&&(count_point!=3))
					{
						dis_zone[2]=0x00;
						if((dis_zone[3]==0xbe)&&(count_point!=2))
							{
								dis_zone[3]=0x00;
								if((dis_zone[4]==0xbe)&&(count_point!=1))
										dis_zone[4]=0x00;										
							}
					}
			}					
		//稳定符号
		if(weight==temp_weight0)
				f_stab_weight=1;
		else
			{
				f_stab_weight=0;
				temp_weight0=weight;
			}
		//归零符号
		if(weight==0)
				f_zero=1;
		else
				f_zero=0;
		//-----------------------
		//数据的正负也是公共的
 		if((f_minus==0)&&(weight>=step))
 				dis_zone[0]=0x40;
 		else
 				dis_zone[0]=0x00;
  	//单位是克的情况
  	if((f_g==1)&&(count_point!=0))  				
  			dis_zone[5-count_point]|=0x01;  		
  	/********************************
  	//单位是千克的情况
  	if(f_kg==1)
  		{
  			i=1;
  			while(i<6)
  			{
  				j=arr_BCD[i];
  				dis_zone[i]=discode_num[j];
  				i++;
  			}
  			//1621显示区域的第2个字位,必须包含小数点
  			dis_zone[1]=((dis_zone[1])|0x01);
  		}
  	//单位是英镑的情况
  	if(f_lb==1)
  		{
  			weight*=220468;
  			i=5;
  			while(i>0)
  			{
  				weight/=10;
  				i--;
  			}
  			temp_weight=weight;
				BIN_to_BCD(temp_weight);
				i=1;
  			while(i<6)
  			{
  				j=arr_BCD[i];
  				dis_zone[i]=discode_num[j];
  				i++;
  			}
  			//1621显示区域的第2个字位,必须包含小数点
  			dis_zone[1]=((dis_zone[1])|0x01);
  		}
  	//单位是盎司的情况
  	if(f_oz==1)
  		{
  			weight*=352734;
  			i=4;
  			while(i>0)
  			{
  				weight/=10;
  				i--;
  			}
  			temp_weight=weight;
				BIN_to_BCD(temp_weight);
				if(arr_BCD[0]==0)
					{
						i=1;
  					while(i<6)
  					{
  						j=arr_BCD[i];
  						dis_zone[i]=discode_num[j];
  						i++;
  					}
  					//1621显示区域的第2个字位,必须包含小数点
  					dis_zone[1]=((dis_zone[1])|0x01);
  				}
  			else
  				{
  					i=0;
  					while(i<5)
  					{
  						j=arr_BCD[i];
  						dis_zone[i+1]=discode_num[j];
  						i++;
  					}
  					//1621显示区域的第2个字位,必须包含小数点
  					dis_zone[2]=((dis_zone[2])|0x01);
  				}
  		}
  	*********************************/
  	
  	
  	//LCD显示的这条语句是公共的
  	display_1621();
		
		//清零功能
		//清零和去皮模块必须有范围,否则容易出现超载现象
		//暂时将手动清零的范围设定为+2%~-2%,并且是
		//以开机零点为基准
		if(ZERO==0)
			{
				delay_nms(50);
				if(ZERO==0)
					{						
						while(1)
						{
							if(ZERO==1)
									break;
						}
						alarm(200);//按键音,表示按键有效
						if(f_zero==1)
							{
								n_add=0;
								total=0;
								f_add=0;
								//显示“n   =0”
								dis_zone[0]=discode_low[14];
								dis_zone[1]=0x00;
								dis_zone[2]=0x00;
								dis_zone[3]=0x00;
								dis_zone[4]=discode_low[0];
								//dis_zone[5]=0xbe;
								dis_zone[5]=discode_num[0];
								display_1621();
								delay_nms(5000);									
							}
						else if(f_tare==1)//去皮状态下不能清零														
								alarm(2000);							
						else
							{
								dif=ad13[6].ad-ad_zero_kj;
								if((dif<MANU_ZERO_POS(y))&&(dif>MANU_ZERO_NEG(y)))
								//if((dif<manu_zero_pos)&&(dif>manu_zero_neg))
										ad_zero=ad13[6].ad;
								else
										alarm(800);
							}
					}
			}
		//去皮功能
		//去皮模块必须有范围,而且去皮必须有标识符号
		//去皮的范围上限暂时设定为100%
		//说明:自己编写的这个去皮模块包含了扣重。
		//这个下限暂时copy保加利亚,
		//?不知道该下限如何确定。
		if(TARE==0)
			{
				delay_nms(50);
				if(TARE==0)
					{						
						while(!TARE);
						alarm(200);//按键音,表示按键有效
						//f_tare=1;
						f_tare=!f_tare;
						if(f_tare==1)
							{
								//if(f_minus==0)//重量为负数时,不能去皮。
									//{
										//f_tare=0;
										//alarm(800);
									//}
									dif=ad13[6].ad-ad_zero;//注意:此处使用的是
																					//当前的零点
									if(((dif>TARE_LOW)&&(dif<TARE_HIGH(y)))||((dif>-TARE_HIGH(y))&&(dif<-TARE_LOW)))
									//if(((dif>TARE_LOW)&&(dif<tare_high))||((dif>-tare_high)&&(dif<-TARE_LOW)))										
											ad_zero=ad13[6].ad;										
									else
										{
											f_tare=0;
											alarm(800);
										}	
						  }
						 else						 	
						 		ad_zero=ad_zero_kj;										
					}
			}
		/****************
		if(MENU==0)
			{
				delay_nms(50);
				{
					if(MENU==0)
						{
							delay_nms(500);//延时的作用:避免按
															//一下,程序当作按
															//两下。
							count_unit++;
							if(count_unit>4)
									count_unit=1;
							switch(count_unit)
							{
								case 1:f_oz=1;
											 f_lb=0;
											 f_g=0;
											 f_kg=0;
											 break;	
								case 2:f_oz=0;
											 f_lb=1;
											 f_g=0;
											 f_kg=0;
											 break;
								case 3:f_oz=0;
											 f_lb=0;
											 f_g=1;
											 f_kg=0;
											 break;
								case 4:f_oz=0;
											 f_lb=0;
											 f_g=0;
											 f_kg=1;
											 break;
								default://应该报错!显示Err 2
												dis_zone[0]=0x00;
												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]=0x7c;
												dis_zone[5]=discode_num[2];
												display_1621();
												alarm(800);
							}
						}
				}
			}
		****************/
		//----------------------------------------------
	//串口部分
	if(MENU==0)
		{
			delay_nms(50);
			if(MENU==0)
				{					
					while(!MENU);
					//TH2=0xFF;				// 波特率9600
					//TL2=0xDC;
					//TR2=1;				// 启动定时器2
					//TR1=1;				// 启动定时器1
					alarm(200);					
					i=5;//arr_BCD[0]中存放的内容无意义。
					while(i>0)
					{
						arr_BCD[i]+=48;
						i--;
					}
					for(;i<5-count_point;i++)
					{
						arr_BCD[i]=arr_BCD[i+1];
					}									
					arr_BCD[i]=46;
					i=5;
					while(i>=0)
					{
						//发送之前必须把数字转化成ASCII码。
						send_byte(arr_BCD[i]);
						i--;
					}
					if(f_minus==0)														
							send_byte(45);//"-"对应的ASCII码
					else							
							send_byte(32);//" "对应的ASCII码
				}
				//TR2=0;				// 停止定时器2
				//TR1=0;				// 停止定时器1
		}
	//-------------------------------------------
	//累加部分
	if(ADD==0)
		{
			if(ADD==0)
				{
					while(1)
					{
						if(ADD==1)
								break;
					}
					alarm(200);
					f_add=1;
					if(f_zero==0)//不是空载的情况下。
						{
							total+=weight;
							n_add++;
						}	
					//显示:“totL= ”					
					dis_zone[0]=discode_low[20];
					dis_zone[1]=discode_low[15];
					dis_zone[2]=discode_low[20];
					dis_zone[3]=discode_cap[12];
					dis_zone[4]=discode_low[0];
					dis_zone[5]=0x00;
					display_1621();
					delay_nms(5000);												
					BIN_to_BCD(total);
					if((dis_zone[0]==0xbe)&&(count_point!=5))
						{
							dis_zone[0]=0x00;
							if((dis_zone[1]==0xbe)&&(count_point!=4))
								{
									dis_zone[1]=0x00;
									if((dis_zone[2]==0xbe)&&(count_point!=3))
										{
											dis_zone[2]=0x00;
											if((dis_zone[3]==0xbe)&&(count_point!=2))
												{
													dis_zone[3]=0x00;
													if((dis_zone[4]==0xbe)&&(count_point!=1))
															dis_zone[4]=0x00;										
												}
										}
								}
						}
					if(count_point!=0)	
							dis_zone[5-count_point]|=0x01;
					display_1621();
					delay_nms(5000);
					//显示“n   =x”
					dis_zone[0]=discode_low[14];
					dis_zone[1]=0x00;
					dis_zone[2]=0x00;
					dis_zone[3]=0x00;
					dis_zone[4]=discode_low[0];
					dis_zone[5]=discode_num[n_add];
					display_1621();
					delay_nms(5000);		
				}
		}
		
	//以下是延时关闭LCD部分。
	if(f_stab_mainly==0)
		{
			if(f_stab_weight==1)

⌨️ 快捷键说明

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