【Proteus仿真】【STM32单片机】出租车计价器

文章目录

  • 一、功能简介
  • 二、软件设计
  • 三、实验现象
  • 联系作者


一、功能简介

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


二、软件设计

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

*/


//系统数据显示
void sys_data_show(void)
{
	u8 buf[10];
	u16 price=0;
	u16 dis=0;
	static u8 oneflag=0;
	while(1)
	{	
		//显示日期时间
		buf[0]=gDS1302_TIME[6]/16+0x30;//年
		buf[1]=gDS1302_TIME[6]%16+0x30;
		buf[2]='\0';
		lcd1604_show_string(2,0,buf);
		buf[0]=gDS1302_TIME[4]/16+0x30;//月
		buf[1]=gDS1302_TIME[4]%16+0x30;
		buf[2]='\0';
		lcd1604_show_string(5,0,buf);
		buf[0]=gDS1302_TIME[3]/16+0x30;//日
		buf[1]=gDS1302_TIME[3]%16+0x30;
		buf[2]='\0';
		lcd1604_show_string(8,0,buf);
		buf[0]=gDS1302_TIME[5]%16+0x30-1;//星期
		buf[1]='\0';
		lcd1604_show_string(15,0,buf);
		buf[0]=gDS1302_TIME[2]/16+0x30;//时
		buf[1]=gDS1302_TIME[2]%16+0x30;
		buf[2]='\0';
		lcd1604_show_string(0,1,buf);
		buf[0]=gDS1302_TIME[1]/16+0x30;//分
		buf[1]=gDS1302_TIME[1]%16+0x30;
		buf[2]='\0';
		lcd1604_show_string(3,1,buf);
		buf[0]=gDS1302_TIME[0]/16+0x30;//秒
		buf[1]=gDS1302_TIME[0]%16+0x30;
		buf[2]='\0';
		lcd1604_show_string(6,1,buf);

		//白天夜晚状态显示
		if(sys_ctrl.daynight==0)lcd1604_show_string(11,1,"Day  ");
		else lcd1604_show_string(11,1,"Night");

		//运行状态显示
		switch(sys_ctrl.run)
		{
			case 0: lcd1604_show_string(12,3,"Stop");break;
			case 1: lcd1604_show_string(12,3,"Run ");break;
			case 2: lcd1604_show_string(12,3,"Puse");break;
		}

		//等待时间显示
		if(sys_ctrl.run==2)
		{
			lcd1604_show_nums(11,2,sys_ctrl.min,2,0x80);
			lcd1604_show_nums(14,2,sys_ctrl.sec,2,0x80);
		}

		//显示路程和费用
		if(sys_ctrl.run!=0)
		{
			//显示路程
			dis=sys_ctrl.dis*10;//保留1位小数
			buf[0]=dis/100+0x30;
			buf[1]=dis%100/10+0x30;
			buf[2]='.';
			buf[3]=dis%100%10+0x30;
			buf[4]='\0';
			lcd1604_show_string(4,2,buf);
			//显示费用
			price=sys_ctrl.totprice*10;//保留1位小数
			buf[0]=price/100+0x30;
			buf[1]=price%100/10+0x30;
			buf[2]='.';
			buf[3]=price%100%10+0x30;
			buf[4]='\0';
			lcd1604_show_string(6,3,buf);
		}

		//只有在运行结束才有打印
		if(sys_ctrl.totprice>0)
		{
			//打印
			if(S4==0)
			{
				if(oneflag==0)//仅串口发送1次
				{
					oneflag=1;
					UART_SendString("\r\n发票打印中...\r\n");
					UART_SendString("路程:");
					dis=sys_ctrl.dis*10;//保留1位小数
					buf[0]=dis/100+0x30;
					buf[1]=dis%100/10+0x30;
					buf[2]='.';
					buf[3]=dis%100%10+0x30;
					buf[4]='\0';
					UART_SendString(buf);
					UART_SendString("Km\r\n");
					UART_SendString("费用:");
					price=sys_ctrl.totprice*10;//保留1位小数
					buf[0]=price/100+0x30;
					buf[1]=price%100/10+0x30;
					buf[2]='.';
					buf[3]=price%100%10+0x30;
					buf[4]='\0';
					UART_SendString(buf);
					UART_SendString("元\r\n");
					UART_SendString("\r\n打印结束!\r\n");
					sys_parm_init();//系统参数初始化
					sys_open_show();//开机界面显示
				}
			}
			else oneflag=0;	
		}	

		break;			
	}
}


//应用控制系统
void appdemo_show(void)
{
	sys_parm_init();//系统参数初始化
	BEEP_Init();
	pcf8591_init();
	ctrl_pin_init();
	dc_motor_init();
	TIM2_Init(400-1,70);//定时10ms
	DS1302_GPIO_Init();
//	DS1302_Init();
	USART1_Init(9600);
	lcd1604_init();//LCD1602初始化
	sys_open_show();//系统初始界面显示

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






三、实验现象

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

【Proteus仿真】【STM32单片机】出租车计价器_第1张图片
【Proteus仿真】【STM32单片机】出租车计价器_第2张图片
【Proteus仿真】【STM32单片机】出租车计价器_第3张图片
【Proteus仿真】【STM32单片机】出租车计价器_第4张图片


联系作者

视频地址:https://space.bilibili.com/444388619/video
专注于51单片机、STM32、国产32、DSP、Proteus、ardunio、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。

你可能感兴趣的:(单片机,proteus,stm32,嵌入式硬件)