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

2023-11-03 17:30

本文主要是介绍基于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  OffLCD1602_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]);	}
}

五、设计资料

这篇关于基于51单片机的出租车计价器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/339773

相关文章

day-51 合并零之间的节点

思路 直接遍历链表即可,遇到val=0跳过,val非零则加在一起,最后返回即可 解题过程 返回链表可以有头结点,方便插入,返回head.next Code /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}*

基于51单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机

单片机毕业设计基于单片机的智能门禁系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍程序代码部分参考 设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订

代码训练营 Day26 | 47.排序II | 51. N-皇后 |

47.排序II 1.跟46题一样只不过加一个树层去重 class Solution(object):def backtracking(self,nums,path,result,used):# recursion stopif len(path) == len(nums):# collect our setresult.append(path[:])return for i in range(

基于stm32的河流检测系统-单片机毕业设计

文章目录 前言资料获取设计介绍功能介绍具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机设计精品

VB和51单片机串口通信讲解(只针对VB部分)

标记:该篇文章全部搬自如下网址:http://www.crystalradio.cn/thread-321839-1-1.html,谢谢啦            里面关于中文接收的部分,大家可以好好学习下,题主也在研究中................... Commport;设置或返回串口号。 SettingS:以字符串的形式设置或返回串口通信参数。 Portopen:设置或返回串口

MCU5.51单片机的最小系统

1.最小系统的组成部分 晶振电路(时钟),复位电路,电源电路(控制电压,保持稳定),下载电路(外加的,用于烧录程序) 烧录: 通过下载电路,把程序下载到单片机中用于运行 2.晶振电路 电路图: 是晶振 是电容 为了防止晶振起振时产生影响,因此加电容 3.复位电路 电路图: 按按钮RSTK1(保持一段时间的高电平)即可实现STC芯片的复位 4.电源电路 电路图:

单片机XTAL引脚引出的晶振分析

51单片机的18,19脚XTAL1,XTAL2用来提供外部振荡源给片内的时钟电路。 XTAL1和XTAL2引脚,该单片机可以使用外部时钟也可以使用内部时钟。 当使用内部时钟时,此二引线端用于外接石英晶体和微调电容; 当使用外部时钟时,用于接外部时钟信号,NMOS接XTAL2,CMOS接XTAL1。 原理: XTAL1和XTAL2分别是一个反相器的输入和输出。NMOS的反相器是

飞凌单片机开发IDE环境

飞凌单片机 资料下载选择芯片类型:MCU->GPIO选择芯片型号:FM8PE53B IDE工具安装: 资料下载 飞凌官网 选择芯片类型:MCU->GPIO 选择芯片型号:FM8PE53B IDE工具安装: 运行Generic ICE 0.02-250.03 setup,一直点击“下一步”即可。 双击运行:Generic ICE

基于51单片机的智能小车转向控制系统设计与实现

文章目录 前言资料获取设计介绍功能介绍具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机设计精品