基于51单片机的出租车计价器

目录

一、项目功能

二、原理图

三、仿真

 四、程序

五、设计资料


资料下载地址:基于51单片机的出租车计价器

一、项目功能

1、1602显示时间、日期、行驶距离、当前金额、和总价等信息

2、按键设置时间、日期、起步金额、历史数据查看等功能

3、通过霍尔传感器计算电机转速

二、原理图

三、仿真

系统刚上电,显示时间

点击开始按钮系统显示行驶公里、时间、费用、司机等待时间

通过霍尔传感器计算电机转速,从而计算出行驶路程

 按下设置时间可以依次更改年月日、时分秒。

 按下设置金额,可以对价格进行设置

 

 四、程序

部分程序

/*		
    1602液晶,是常用的显示器件,一共是16个管脚,其中有八个管脚是数据传输管脚,有三个管脚是数据命令使能端管脚,还有两组电源管脚,
其中一组电源管脚是给整个液晶进行供电的,还有一组电源是单纯的背景光电源,还剩下的最后一个管脚是对比度调节管脚,一般接上一个3K电
阻再接地即可。
 
*/ 

/*
数据显示的时候一般的处理:

    首先,无论是数码管显示还是液晶显示,进行显示的时候绝对都是一个一个进行显示的,那么,比如说一个数据123,一百二十三,
进行显示的时候,要先显示1,然后是2,然后是3,那么怎么把数据提取出来??   
提取百位    123/100=1
提取十位    123/10=12      12%10=2     “%”是取余的意思,像这个,就是12对10取余,换句话说,12除以10,然后取余数,就是2
提取个位    123%10=3       解释同上

取余的用法也有很多种,大家只要知道出现这个的时候,一般都是进行数据提取的就行


然后
如果您是数码管显示数据,将提取的数据放到段码数组里面送给IO即可,
如果是液晶显示,需要将数据转化成字符,因为液晶是字符屏,只能显示字符数据,数据0对应的字符是0x30,数据1对应的字符是0x31,
所以将提取出的数据直接加上0x30送给液晶即可,或者加上'0' 也是一样的 

*/

void Display()
 {
	   if(Page==0) 
	    {
				 LCD1602_write(0,0x80);                 
				 LCD1602_writebyte("20");           
		         if(state==1&&s0)  LCD1602_writebyte("  "); 
				 else 											 
				  {
				     LCD1602_write(1,0x30+time_data_1[5]/10);		   
				     LCD1602_write(1,0x30+time_data_1[5]%10);	 //显示年	   
				  }
		  		 LCD1602_writebyte("/"); 
		         if(state==2&&s0)  LCD1602_writebyte("  "); 	 //显示月
				 else 											 
				  {
				     LCD1602_write(1,0x30+time_data_1[4]/10);		   
				     LCD1602_write(1,0x30+time_data_1[4]%10);		   
				  }
		  		 LCD1602_writebyte("/"); 
		         if(state==3&&s0)  LCD1602_writebyte("  "); 	 //显示日
				 else 											 
				   {
				     LCD1602_write(1,0x30+time_data_1[3]/10);		   
				     LCD1602_write(1,0x30+time_data_1[3]%10);		   
				   }
		  		 LCD1602_writebyte(" "); 
		
		        switch(Conver_week(time_data_1[5],time_data_1[4],time_data_1[3]))
				 {
				  case 0: LCD1602_writebyte("  Sun");    break;
				  case 1: LCD1602_writebyte("  Mon");    break;
				  case 2: LCD1602_writebyte("  Tue");    break;
				  case 3: LCD1602_writebyte("  Wed");    break;
				  case 4: LCD1602_writebyte("  Thu");    break;
				  case 5: LCD1602_writebyte("  Fri");    break;
				  case 6: LCD1602_writebyte("  Sat");    break;	  //星期	 
				 }
		
				LCD1602_write(0,0xC0);    
				LCD1602_writebyte("    ");
		        if(state==4&&s0)    LCD1602_writebyte("  "); 	 //显示时
				else 											 
				 {
								    LCD1602_write(1,0x30+time_data_1[2]/10);		   
								    LCD1602_write(1,0x30+time_data_1[2]%10);		   
				 }
				LCD1602_writebyte(":"); 	 
		        if(state==5&&s0)  LCD1602_writebyte("  "); 	 //显示分
				else 											 
				  {
							      LCD1602_write(1,0x30+time_data_1[1]/10);		   
							      LCD1602_write(1,0x30+time_data_1[1]%10);		   
				  }
				LCD1602_writebyte(":");  
		        if(state==6&&s0)     LCD1602_writebyte("  "); 	 //显示分
				 else 											 
				  {
								  LCD1602_write(1,0x30+time_data_1[0]/10);		   
								  LCD1602_write(1,0x30+time_data_1[0]%10);		   
				  }		 
				LCD1602_writebyte("    "); 	
		}
	   else if(Page==1||Page==2)   //Page等于 1  2 代表的是,接客界面,1,开始计费,2,停止计费
	    {
				 LCD1602_write(0,0x80);                 
				 LCD1602_writebyte("S:");
 				 LCD1602_write(1,0x30+Mileage/100000%10);
 				 LCD1602_write(1,0x30+Mileage/10000%10);
 				 LCD1602_write(1,0x30+Mileage/1000%10);  //显示里程界面
//				 LCD1602_write(1,0x30+Mileage/100%10);
//				 LCD1602_write(1,0x30+Mileage/10%10);
//				 LCD1602_write(1,0x30+Mileage%10);	     //屏蔽这块是千米下数据,显示的时候直接显示千米数据了,千米下就不显示了

				 if(DJ_Star==0&&s0==0)	LCD1602_writebyte("Km   :"); 
				 else 		            LCD1602_writebyte("Km Wt:");   //在电机停止的时候,根据s0变量进行闪烁
				 if((Waiting_Time/60)>9)     LCD1602_write(1,0x30+(Waiting_Time/60)/10%10);
				 else 	                     LCD1602_writebyte(" ");
				 LCD1602_write(1,0x30+(Waiting_Time/60)%10);	 		   //显示等待时间
				 LCD1602_writebyte("Min");  
 
 
				 LCD1602_write(0,0xC0);                 		
				 LCD1602_write(1,0x30+(Driving_time/60)/10%10);
				 LCD1602_write(1,0x30+(Driving_time/60)%10);
				 LCD1602_writebyte(":"); 
				 LCD1602_write(1,0x30+(Driving_time%60)/10%10);
				 LCD1602_write(1,0x30+(Driving_time%60)%10);  			   //系统运行时间
				 LCD1602_writebyte(" ");

				 if(Page==2)	  LCD1602_writebyte("Off ");
				 else 			  LCD1602_writebyte("On  ");			   //Page等于 1 是 开始计费, 2 是不计费,这里显示On  Off

				 LCD1602_write(1,0x5c);

				 if(Unit_price>999)  LCD1602_write(1,0x30+Unit_price/1000%10);
				 else 	             LCD1602_writebyte(" ");
				 if(Unit_price>99)   LCD1602_write(1,0x30+Unit_price/100%10);
				 else 	             LCD1602_writebyte(" ");
				 LCD1602_write(1,0x30+Unit_price/10%10);
				 LCD1602_writebyte(".");
				 LCD1602_write(1,0x30+Unit_price%10);	 	//显示单价,该数据的个位数实际是小数位,这里注意一下
		}
	   else if(Page==3||Page==4||Page==5||Page==6) 	   //Page 等于 3  4  5  6 代表的是,设置,等待金额,白天价格,晚上价格还有起步价
	    {							     	 	
				 LCD1602_write(0,0x80);                 
				 LCD1602_writebyte("Wp:");			  //显示等待金额
				 if(Page==3&&s0)   LCD1602_writebyte("    ");
				 else 
				 {
					 if(Waiting_amount>99)   LCD1602_write(1,0x30+Waiting_amount/100%10);
					 else 	                 LCD1602_writebyte(" ");
					 LCD1602_write(1,0x30+Waiting_amount/10%10);
					 LCD1602_writebyte(".");
					 LCD1602_write(1,0x30+Waiting_amount%10);
				 }  
				 LCD1602_writebyte("  ");
				 LCD1602_writebyte("pD:");	  			//显示白天单价
				 if(Page==4&&s0)   LCD1602_writebyte("    ");
				 else 
				 {
					 if(Daytime_price>99)   LCD1602_write(1,0x30+Daytime_price/100%10);
					 else 	                 LCD1602_writebyte(" ");
					 LCD1602_write(1,0x30+Daytime_price/10%10);
					 LCD1602_writebyte(".");
					 LCD1602_write(1,0x30+Daytime_price%10);
 				 }
				 LCD1602_write(0,0xC0);                 
				 LCD1602_writebyte("Sp:");				//显示 起步价 
				 if(Page==5&&s0)   LCD1602_writebyte("    ");
				 else 
				 {
					 if(Starting_price>99)   LCD1602_write(1,0x30+Starting_price/100%10);
					 else 	                 LCD1602_writebyte(" ");
					 LCD1602_write(1,0x30+Starting_price/10%10);
					 LCD1602_writebyte(".");
					 LCD1602_write(1,0x30+Starting_price%10);
				 }
				 LCD1602_writebyte("  ");
				 LCD1602_writebyte("pN:");	 		   //显示夜晚单价
				 if(Page==6&&s0)   LCD1602_writebyte("    ");
				 else 
				 {
					 if(Night_price>99)   LCD1602_write(1,0x30+Night_price/100%10);
					 else 	              LCD1602_writebyte(" ");
					 LCD1602_write(1,0x30+Night_price/10%10);
					 LCD1602_writebyte(".");
					 LCD1602_write(1,0x30+Night_price%10);
				 }
 		}
	   else if(Page==7)  //Page等于7,代表的是
	    {
				 LCD1602_write(0,0x80);                 
				 LCD1602_writebyte("The total monney:");  //总金额	
				 LCD1602_write(0,0xC0); 
				 LCD1602_writebyte("     ");
				 LCD1602_write(1,0x5c);		 //显示人民币符号 

				 if(Total_amount>9999) LCD1602_write(1,0x30+Total_amount/10000%10);
				 else 	               LCD1602_writebyte(" ");
				 if(Total_amount>999)  LCD1602_write(1,0x30+Total_amount/1000%10);
				 else 	               LCD1602_writebyte(" ");
				 if(Total_amount>99)   LCD1602_write(1,0x30+Total_amount/100%10);
				 else 	               LCD1602_writebyte(" ");
				 LCD1602_write(1,0x30+Total_amount/10%10);
				 LCD1602_writebyte(".");
				 LCD1602_write(1,0x30+Total_amount%10);		//显示总金额数据
				 LCD1602_writebyte("      ");
		}
 
 }		 
void read_time1()     //实时读取DS1302中的时间数据
{
 uchar i;
	 if(state==0)  //等于 0 ,正常显示的时候,读取时间数据
	  {
			time_data[0]=ds1302read(0x81);
			time_data[1]=ds1302read(0x83);
			time_data[2]=ds1302read(0x85);
			time_data[3]=ds1302read(0x87);
			time_data[4]=ds1302read(0x89);
			time_data[5]=ds1302read(0x8D);  		
			time_data_1[0]=time_data[0]/16*10+time_data[0]%16;
			time_data_1[1]=time_data[1]/16*10+time_data[1]%16;
			time_data_1[2]=time_data[2]/16*10+time_data[2]%16;
			time_data_1[3]=time_data[3]/16*10+time_data[3]%16;
			time_data_1[4]=time_data[4]/16*10+time_data[4]%16;
			time_data_1[5]=time_data[5]/16*10+time_data[5]%16;
			if(time_data_1[0]>59||time_data_1[0]<0)
			   {
			 	ds1302write(0x8e,0x00); 
				ds1302write(0x80,0x80);
				ds1302write(0x80,0);
				ds1302write(0x8e,0x80);     
			   }				  
	  }	
	  else 	  //否则就是写时间,将时间数据实时写进DS1302,修改数据
	      {
			ds1302write(0x8e,0x00); 
			ds1302write(0x80,0x80);
			for(i=0;i<7;i++)
			{
				time_data_2[i]=time_data_1[i]/10;
				time_data_3[i]=time_data_1[i]%10;	  
			}
			for(i=0;i<7;i++){time_data_4[i]=time_data_2[i]*16+time_data_3[i];}
			ds1302write(0x80,time_data_4[0]);
			ds1302write(0x82,time_data_4[1]);
			ds1302write(0x84,time_data_4[2]);
			ds1302write(0x86,time_data_4[3]);
			ds1302write(0x88,time_data_4[4]);
			ds1302write(0x8C,time_data_4[5]);	
		  }
}





五、设计资料

  • 0
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

森旺电子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值