当前位置:   article > 正文

【Proteus仿真】【51单片机】出租车计价器_基于proteus的出租车计费器设计

基于proteus的出租车计费器设计


一、功能简介

本项目使用Proteus8仿真51单片机控制器,使用LCD1604显示模块、按键模块、蜂鸣器模块、DS1302时钟、速度检测模块、
直流电机驱动,票据打印等。
主要功能:
系统运行后,LCD1604显示当然日期时间,白天/夜晚状态,行驶距离,等待时间,计费及行驶状态;
首先选择处于白天还是夜晚计费模式,即控制S2开关是否闭合,闭合是夜晚,反之白天;
当S1开关闭合时,计费开始,小车开始行驶,根据所选模式计费,显示当前行驶距离和费用,可调节电位器模拟小车行驶速度变化,行驶距离及计费时间长短也将随之变化,当S3开关闭合时,小车进入等待状态,如超出起步价距离,则开始计算等待时间计费,等待时间开始计时,当S3开关断开,小车继续行驶;当S1开关断开,表示行驶结束,蜂鸣器发出提示音,停止计费;可闭合S4开关打印发票,串口显示当然行驶距离和费用。


二、软件设计

/*
作者:嗨小易(QQ:3443792007)

*/


//系统功能控制
void sys_fun_ctrl(void)
{
	static u8 oneflag=0;
	//运行开始
	if(sys_ctrl.run==1)
	{
		oneflag=0;
		motor_fr_run();
		TR0=1;//打开定时器
		//如果是晚上
		if(sys_ctrl.daynight==1)
		{
			sys_ctrl.price_s=10;//起步价10
			sys_ctrl.perkil=2.5;//每公里价格	
		}
		//如果是白天
		else
		{
			sys_ctrl.price_s=8;//起步价8
			sys_ctrl.perkil=2.0;//每公里价格	
		}
		//如果小于2.5公里
		if(sys_ctrl.dis<2.5)sys_ctrl.runprice=sys_ctrl.price_s;
		//如果大于2.5公里
		else
			//行驶总价=起步价+公里数*每公里价格
			sys_ctrl.runprice=sys_ctrl.price_s+(sys_ctrl.dis-2.5)*sys_ctrl.perkil;
	}
	//运行暂停
	else if(sys_ctrl.run==2)
	{
		motor_stop();
		//如果大于2.5公里
		if(sys_ctrl.dis>=2.5)
			//等待总价=等待时间*20/每小时
			sys_ctrl.witeprice=((float)(sys_ctrl.min*60+sys_ctrl.sec)*20/3600);
	}
	//停止
	else if(sys_ctrl.run==0)
	{
		motor_stop();
		TR0=0;//关闭定时器
		if(sys_ctrl.totprice>0)//代表行驶结束
		{
			if(oneflag==0)//仅蜂鸣1次
			{
				oneflag=1;
				beep_alarm(4,50000);//蜂鸣器提示
			}
		}	
	}
	//总价=行驶总价+等待总价
	sys_ctrl.totprice=sys_ctrl.runprice+sys_ctrl.witeprice;	
}

//应用控制系统
void appdemo_show(void)
{
	sys_parm_init();//系统参数初始化
	lcd1604_init();
//	ds1302_init();
	time0_init();//定时器初始化
	UART_Init();//串口初始化9600
	sys_open_show();//系统开机界面显示	

	while(1)
	{	
		sys_data_get();//系统数据获取
		sys_data_show();//系统数据显示
		sys_data_set();//系统数据设置
		sys_fun_ctrl();//系统功能控制
	}
}

//定时器0中断函数
void time0() interrupt 1
{	
	static u8 i=0;

	TH0=0xDC;
	TL0=0x00; 
	i++;
	if(i>=100)//1S到
	{
		i=0;
		if(sys_ctrl.run==1)//运行
		{
			sys_ctrl.dis+=(float)sys_ctrl.speed*1/3600;//公里/S		
		}
		else if(sys_ctrl.run==2)//等待
		{
			sys_ctrl.sec++;
			if(sys_ctrl.sec>=60)//1分到
			{
				sys_ctrl.sec=0;
				sys_ctrl.min++;
				if(sys_ctrl.min>=60)//1小时到
				{
					sys_ctrl.min=0;
					sys_ctrl.hour++;
					if(sys_ctrl.hour>=24)//到达最大计时
					{	
						sys_ctrl.hour=0;	
					}
				}
			}		
		}
	}
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117

三、实验现象

B站演示视频:https://space.bilibili.com/444388619

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


联系作者

专注于51单片机、STM32、国产32、DSP、Proteus、ardunio、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/385652
推荐阅读
相关标签
  

闽ICP备14008679号