基于51单片机的出租车计价器(霍尔测速)

目录

具体实现功能

设计介绍

51单片机简介

设计思路

设计内容

原理图(AD19)

程序(Keil5)

仿真实现(protues8.7)

全部资料


具体实现功能

系统由AT89C52单片机+霍尔传感器模块+LCD1602液晶屏+DS1302时钟模块+AT24C02掉电存储模块+直流电机+按键模块+电源构成。

具体功能:

1、无乘客模式:显示当前时间;

2、切换到乘客模式:可以显示起步价(三公里内)、单价(三公里后)、总价(元)、里程和乘车时间,可以按照里程或计时两种模式收费;

3、里程模式收费:在高速情况下,按照起步价和里程单价收费

4、计时收费模式:在低速情况下,按照计时时间和时间单价收费

5、按清零键,计价器可清除计价。

6、可以设置白天和夜晚的起步价、单价,可以设置计时模式的单价;

7、根据当前时间,白天和夜晚的收费不同。

液晶显示的字母:

D------白天起步价

P------里程单价

PT-----时间单价

N-----夜晚起步价

按键:设置键、增加键、减小键、切换键(切换时间/乘客模式)

设计介绍

51单片机简介

51单片是一种低功耗、高性能CMOS-8位微控制器,具有8K可编程Flash存储器,使得其为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。

51系列单片机具有以下标准功能:

8k字节Flash,512字节RAM,

32位I/O口线,看门狗定时器,

内置4KB EEPROM,

MAX810复位电路,

三个16位定时器/计数器,

一个6向量2级中断结构,

全双工串行口。

另外, 51系列在空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机停止工作,直到下一个中断或硬件复位为止。本设计所使用的芯片可兼容以下所有的51系列单片机(包括AT系列和STC系列)。

设计思路

文献研究法:搜集整理相关研究资料,阅读文献,为研究做准备;

调查研究法:通过调查、分析、具体实验等方法,发现相关存在问题和解决办法;

比较分析法:比较不同设计的具体原理,以及同一类传感器性能的区别,分析系统的研究现状与发展前景;

软硬件设计法:通过软硬件设计实现硬件,最后测试各项功能是否满足要求。

设计内容

原理图(AD19)

本系统原理图设计采用Altium Designer19,具体如图。

程序(Keil5)

本设计利用KEIL5软件实现程序设计,主函数如下:

//主函数
void main()
{
	//初始化
	Ds1302_Init();
	Init_LCD();
	initeeprom();
	//SETS();
	//读取初始参数
	READS();
	//定时器初始化
	InitTimer0();
	//循环
	while(1)
	{
		//时钟模式
		if(Mode==0)
		{
			//读时间
			if(Wei==0)
			{
				Ds1302_Read_Time();
				//显示时间
				display_NYR(time_buf1,Wei,0);
			}
		}
		else if(Mode==1)
		{
			if(time_buf1[4]>=23||time_buf1[4]<7)  
			DN=1;
			else
			DN=0;
			//显示计价器信息
			
			display_S(Day,Night,DanJia,ZJ,GL/10,Time,GT,DN);
		}


		if(K4==0)
		{
			delay(100);
			//调时
			if(Mode==0)
			{
				Wei++;
				if(Wei==1)
				{
					SS=1;
				}
				//闪烁
				display_NYR(time_buf1,Wei,SS);
				if(Wei==7)
				{
					Wei=0;
					//保存时间
					Ds1302_Write_Time();
					Init_LCD();
				}
			}
			else if(Mode==1)
			{
				JGWei++;
				if(JGWei==1)
				{
					Mode=2;
					//显示计价器价格
					Init_LCD_JGTZ();
					display_D(Day,Night,DanJia,JGWei,DJ_min);
				}
			}
			else if(Mode==2)
			{	
				JGWei++;	
				display_D(Day,Night,DanJia,JGWei,DJ_min);
				if(JGWei==5)
				{
					Mode=1;
					JGWei=0;
					//参数初始化
					//保存
					SETS();
					//读初值
					READS();
	
					ZJ=0;
					GL=0;
					Time=0;
					//开启定时器
					TR0=1;
					//显示计价器
					Init_LCD_JJQ();
				}
			}
			while(K4==0);
		}
		//+
		if(K3==0)
		{
			delay(100);
			//调时
			if(Mode==0)
			{
				//年
				if(Wei==1)
				{
					time_buf1[1]++;
					if(time_buf1[1]>=100)
						time_buf1[1]=0;
				}
				//月
				else if(Wei==2)
				{
					time_buf1[2]++;
					if(time_buf1[2]>=13)
						time_buf1[2]=1;
				}
				//日
				else if(Wei==3)
				{
					time_buf1[3]++;
					if(time_buf1[3]>=YDay(time_buf1[1],time_buf1[2])+1)
						time_buf1[3]=1;
				}	
				//时
				else if(Wei==4)
				{
					time_buf1[4]++;
					if(time_buf1[4]>=24)
						time_buf1[4]=0;
				}	
				//分
				else if(Wei==5)
				{
					time_buf1[5]++;
					if(time_buf1[5]>=60)
						time_buf1[5]=0;
				}
				//秒
				else if(Wei==6)
				{
					time_buf1[6]++;
					if(time_buf1[6]>=60)
						time_buf1[6]=0;
				}
				//显示
				if(Wei!=0)
					display_NYR(time_buf1,Wei,SS);			
			}
			//调价
			else if(Mode==2)
			{
				//单价
				if(JGWei==1)
				{
					DanJia++;
					if(DanJia>999)
					{
						DanJia=1;
					}
				}
				//等待时间单价
				else if(JGWei==2)
				{
					DJ_min++;
					if(DJ_min>999)
					{
						DJ_min=1;
					}
				}
				//夜间
				else if(JGWei==3)
				{
					Night++;
					if(Night>999)
					{
						Night=1;
					}
				}
				//白天
				else if(JGWei==4)
				{
					Day++;
					if(Day>999)
					{
						Day=1;
					}
				}
				display_D(Day,Night,DanJia,JGWei,DJ_min);
			}

			while(K3==0);
		}

		//-
		if(K2==0)
		{
			delay(100);
			//调时
			if(Mode==0)
			{
				//年
				if(Wei==1)
				{
					time_buf1[1]--;
					if(time_buf1[1]<0)
						time_buf1[1]=99;
				}
				//月
				else if(Wei==2)
				{
					time_buf1[2]--;
					if(time_buf1[2]<=0)
						time_buf1[2]=12;
				}
				//日
				else if(Wei==3)
				{
					time_buf1[3]--;
					if(time_buf1[3]<=0)
						time_buf1[3]=YDay(time_buf1[1],time_buf1[2]);
				}	
				//时
				else if(Wei==4)
				{
					time_buf1[4]--;
					if(time_buf1[4]<0)
						time_buf1[4]=23;
				}	
				//分
				else if(Wei==5)
				{
					time_buf1[5]--;
					if(time_buf1[5]<0)
						time_buf1[5]=59;
				}
				//秒
				else if(Wei==6)
				{
					time_buf1[6]--;
					if(time_buf1[6]<0)
						time_buf1[6]=59;
				}
				//显示
				if(Wei!=0)
					display_NYR(time_buf1,Wei,SS);			
			}
			//调价
			else if(Mode==2)
			{
				//单价
				if(JGWei==1)
				{
					DanJia--;
					if(DanJia==0)
					{
						DanJia=999;
					}
				}
				//等待时间单价
				else if(JGWei==2)
				{
					DJ_min--;
					if(DJ_min==0)
					{
						DJ_min=999;
					}
				}
				//夜间
				else if(JGWei==3)
				{
					Night--;
					if(Night==0)
					{
						Night=999;
					}
				}
				//白天
				else if(JGWei==4)
				{
					Day--;
					if(Day==0)
					{
						Day=999;
					}
				}
				display_D(Day,Night,DanJia,JGWei,DJ_min);
			}
			while(K2==0);
		}	
		//切换
		if(K1==0)
		{
			delay(100);
			//计价器模式
			if(Mode==1)
			{
				Mode=0;
				ZJ=0;
				GL=0;
				Time=0;
				//开启定时器
				TR0=0;
				EX0=0;
				//显示计价器
				Init_LCD();
			}
			else if(Mode==0)
			{
				Mode=1;
				//参数初始化
				//读初值
				READS();
				ZJ=0;
				GL=0;
				Time=0;
				//开启定时器
				m=0;
				TR0=1;
				EX0=1;
				//显示计价器
				Init_LCD_JJQ();
			}
			while(K1==0);
		}
	}
}

代码运行截图:

仿真实现(protues8.7)

本设计利用protues8.7软件实现仿真设计。

全部资料

全部资料包括程序(注释)、AD原理图、protues仿真、参考论文、程序讲解、仿真讲解、仿真视频、原理图讲解、资料使用介绍等,全网最全!!!

资料获取:
https://docs.qq.com/doc/DSWVmZVBOUGlkT01i

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值