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

📄 yh_t3_new.c

📁 电子秤源程序。去年的心血啊!c语言编写的51单片机程序。
💻 C
📖 第 1 页 / 共 5 页
字号:
										  			}																																														
												}
										}
									if(ZERO==0)
										{
											delay_nms(50);
											if(ZERO==0)
												{													
													while(!ZERO);
													alarm(200);//按键音																										
													if(f_FaMa==0)
														{															
															temp_FaMa=0;
															f_FaMa=1;	
														}
													else
														{
															temp_FaMa*=10;
															if(temp_FaMa>=100000)
																	temp_FaMa%=100000;																																				
														}
													count_FaMa=0;																						
												}
										}																					
									if(MENU==0)
										{
											delay_nms(50);
											if(MENU==0)
												{													
													while(!MENU);
													alarm(200);//按键音	
													buf_24c02_2L[0]=temp_range;	
													buf_24c02_2L[1]=temp_FaMa;											
													wr_nbyte(0x10,buf_24c02_2L,8);
													delay_nms(10);
													if(buf_24c02_2L[0]!=buf_24c02_2L[1]) 		 															
 													{ 		
 														buf_24c02_AD[1]*=buf_24c02_2L[0];
 														buf_24c02_AD[1]/=buf_24c02_2L[1]; 													
 													}																			
													wr_nbyte(0x00,buf_24c02_AD,8);
													delay_nms(10);
													break;																																																																																																																							
												}
										}																																													
									BIN_to_BCD(temp_FaMa);
									dis_zone[0]=discode_cap[6];//第一个字位显示“F”													
									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();
								}
							}
																																																											
						//校准完成后显示“byE”字符
						dis_zone[0]=0x00;
						dis_zone[1]=discode_low[2];
						dis_zone[2]=discode_low[25];
						dis_zone[3]=discode_cap[5];
						dis_zone[4]=0x00;
						dis_zone[5]=0x00;
						dis_zone[6]=0x00;
						display_1621();
						alarm(1000);												
						wr_nbyte(0x08,buf_24c02_4B,4);						
						//菜单结束:
						while(1)
						{
							if(MENU==0)
								{
									delay_nms(50);
									if(MENU==0)
										{											
											while(!MENU);
											alarm(200);//按键音																																	
											break;
										}
								}
						}																																																				
					}
		    }
		}																					
  //-------------------------------
 	//读取AT24C02中的数据
 	//buf_24c02_AD[0]=rd_long(0x00);
 	//buf_24c02_AD[1]=rd_long(0x04);
	rd_seq(0x00,buf_24c02_AD,8);	
 	y=(long)(buf_24c02_AD[1]);
 	//buf_24c02_2L[0]=rd_long(0x10);
 	//buf_24c02_2L[1]=rd_long(0x14); 
	rd_seq(0x10,buf_24c02_2L,8);
 	//---------------------------------
 	
 	/***********************************
 	zero_pos=buf_24c02_AD[1]/5;
 	zero_neg=buf_24c02_AD[1]/25;
 	zero_neg*=(-1);
 	manu_zero_pos=buf_24c02_AD[1]/50;
 	manu_zero_neg=manu_zero_pos*(-1);
 	auto_zero_pos=buf_24c02_AD[1]/200;
 	auto_zero_neg=auto_zero_pos*(-1);
 	tare_high=buf_24c02_AD[1];//可以100%去皮。
 	AD_over=E*9;
 	AD_over+=buf_24c02_AD[1];
 	AD_over+=buf_24c02_AD[0];
 	************************************/
 	
 	
 	
 	//y=buf_24c02_AD[1];
 	//buf_24c02_AD[0]=15420;
 	//buf_24c02_AD[1]=76477;
 	//limit_load=buf_24c02_AD[0];
 	//此处求解满量程的AD平均值的上限会存在一定的误差,
 	//但是,误差有限,可以忽略。
 	//if(buf_24c02_2L[0]==buf_24c02_2L[1]) 		
 			//limit_load=buf_24c02_AD[0]+buf_24c02_AD[1];
 	//else
 		//{ 		
 			//limit_load=buf_24c02_AD[1]*buf_24c02_2L[0];
 			//limit_load/=buf_24c02_2L[1];
 			//limit_load+=buf_24c02_AD[0];
 		//}
 	//limit_load+=E*9;
 	//--------------------------------------					
	//读取AT24C02中的除校准之外的数据
	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];
	//下面这些条件判断语句的目的是防止从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;	
	//---------------------------------------
	//串口设置
	//串口方式选择方式1,波特率可选。
	//PCON可能会应用一下,毕竟我们的波特率是可选的。
	//这样改变波特率肯定比修改定时器的寄存器要方便。
	//如果使用T2作为波特率发生器,则PCON没有意义。
	//定时器2产生波特率,T2,设置成波特率模式且串口
	//产生发送脉冲。
	/********************************************
	T2CON=0x30;			// 定时器2工作于波特率模式。	
	RCAP2H=0xFF;				// 波特率9600
	RCAP2L=0xDC;
	//TH2=0xFF;				// 波特率9600
	//TL2=0xDC;
	SCON=discode_low[0];			// 设定串行口工作方式			
	IE=0x00;				// 禁止任何中断
	//TR2=1;				// 启动定时器2
	***********************************************/
	//---------------------------------------------
	
	//---------------------------------------------		
	TMOD = 0x25;	// 定时器1工作于8位自动重载模式,作为波特率发生器。
								//计数器0工作于16计数器模式。
	T2CON=0x00;		//定时器2工作在16位自动重装载模式。	
	//TH1 = 0xFD;		// 波特率9600
	//TL1 = 0xFD;	
	switch(count_baud)
	{
		case 0:	TH1 = discode_cap[6];		
						TL1 = discode_cap[6];
						break;//波特率1200
		case 1:	TH1 = 0xf4;		
						TL1 = 0xf4;
						break;//波特率2400
		case 2:	TH1 = discode_low[2];		
						TL1 = discode_low[2];
						break;//波特率4800
		case 3:	TH1 = 0xfd;		
						TL1 = 0xfd;
						break;//波特率9600	
		default:	//显示错误号“Err 8”		
							alarm(800);
							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]=0xfe;
							dis_zone[5]=discode_num[8];
							display_1621();													
							//此处延时很长,目的是让使用者
							//看清楚错误号。
							delay_nms(5000);										
	}
	RCAP2H=0x3c;			
	RCAP2L=0xb0;
	SCON=0x40;			// 设定串行口工作方式
	PCON&=0xef;			// 波特率不倍增		
	TR1=1;				// 启动定时器1								
	CLK_COUNTER0=0;	 
	
	//--------------------------------------
	//确定称重时的分度值
	switch(count_step)
	{
		case 0:	step=1;
						break;
		case 1:	step=2;
						break;
		case 2:	step=5;
						break;
		case 3:	step=10;
						break;
		case 4:	step=20;
						break;
		case 5:	step=50;
						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[4]=0x00;
							//dis_zone[5]=0x0e;
							dis_zone[5]=discode_num[7];
							display_1621();
							alarm(800);
							//此处延时很长,目的是让使用者
							//看清楚错误号。
							delay_nms(5000);															
	}	 	
	buf_24c02_2L[0]/=step;//使分度值发挥作用,此后
												//buf_24c02_2L[0]存储的数据
												//并不是准确的量程值,但是
												//从另一种角度来讲是真正的
												//量程。
  //-------------------------------
  //下面是开机显示部分
  //reset_1621();
  //cmd_1621(BIAS_COM);
  //cmd_1621(SYSTEN);
  //-------------------------------
  //cmd_1621(BUZON);//打开蜂鸣器
  //cmd_1621(F_2K);//声音频率设为2K
  //delay_nms(800);
  //cmd_1621(BUZOFF);//关闭蜂鸣器
  alarm(800);
  //-------------------------------
  //利用初始化数据,使得开机时LCD不显示
	//display_1621();
  //cmd_1621(LCDON);//打开LCD
  //-------------------------------
  i=0;
  while(i<6)
  {
  	cs_1621=0;
  	wr_id(ID_WR);
  	wr_addr(0x00+2*i);
  	wr_byte_1621(0xff);
  	reset_1621();
  	delay_nms(400);
  	cs_1621=0;
  	wr_id(ID_WR);
  	wr_addr(0x00+2*i);
  	wr_byte_1621(0x00);
  	reset_1621();
  	delay_nms(400);
  	i++;
  }
  //-------------------------------
  //使LCD全部显示
  f_g=1;
  //f_kg=1;//表征单位克								
  //f_lb=1;//表征单位英镑								
  //f_oz=1;//表征单位盎司
  
  f_x1=1;												
	f_hold=1;									
	f_tare=1;
	f_bat=1;
	f_zero=1;
	
	f_stab_weight=1;
	f_add=1;
	
  i=5;
  while(i>=0)
	{
		dis_zone[i]=0xff;
		i--;
	}
	display_1621();
	//-------------------------------
	off_on_lcd();
	off_on_lcd();
	//清除LCD上的多余内容,因为默认单位是克,所以此处
	//没有把f_g清零。		
  //f_kg=0;					
  //f_lb=0;						
  //f_oz=0;
  
 	f_x1=0;												
	f_hold=0;									
	f_tare=0;
	f_bat=0;
	f_zero=0;
	
	f_stab_weight=0;
	f_add=0;
	
	i=5;
	while(i>=0)
	{
		dis_zone[i]=0x00;
		i--;
	}
	display_1621();
	//-------------------------------    
  //背光是否点亮取决于下面这条语句。
  BL=count_BL;
  //------------------------------------------
  //alarm_low();
  //------------------------------------------									
	i=0;
  while(i<3)//最开始取3次AD值,存放在ad3数据缓冲区
  {
  	cmd_5460(0x5e);//输入向状态寄存器写数据命令
		write_5460(0x00800000);//向5460中写入24位数据
																				//DRDY清零
		while(1)
		{	
			cmd_5460(0x1e);//输入读状态寄存器命令
			buf_5460=read_5460();//从5460读出24位数据	
																			//查询DRDY											
			if(((buf_5460)&0x00020000)==0x00020000)
  			{
  								//cmd_5460(0x0e);//读取瞬时电流寄存器
  				cmd_5460(0x16);//读取平均电流寄存器
					ad3[i]=read_5460();
					break;											
				}
		}
		i++;
	}
	ave3_ad=average3();
	ad_zero_kj=ave3_ad;
	i=12;
	while(i>=0)
	{
		ad13[i].ad=ave3_ad;
		ad13[i].times=12-i;
		i--;
	}	
	//------------------
	over_load();
	//------------------------------------
	//记重部分开始
	ad_zero_kj=zero_comp();
	ad_zero=ad_zero_kj;
	while(1)
	{
		rotate3();
		cmd_5460(0x5e);//输入向状态寄存器写数据命令
		write_5460(0x00800000);//向5460中写入24位数据
																	//DRDY清零
		while(1)
		{	
			cmd_5460(0x1e);//输入读状态寄存器命令
			buf_5460=read_5460();//从5460读出24位数据	
																			//查询DRDY
			if(((buf_5460)&0x00020000)==0x00020000)
  			{
  								//cmd_5460(0x0e);//读取瞬时电流寄存器
  				cmd_5460(0x16);//读取平均电流寄存器
					ad3[0]=read_5460();
					break;											
				}

⌨️ 快捷键说明

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