【Proteus仿真】【STM32单片机】公交车报站系统


一、功能简介

本项目使用Proteus8仿真STM32单片机控制器,使用LCD12864显示模块、DS18B20温度传感器、DS1302时钟模块、按键、LED蜂鸣器、ULN2003、28BYJ48步进电机模块等。

主要功能:
系统运行后,LCD12864液晶显示检测温度、日期时间、站台信息和运行方向;可按下K3键进入设置模式,默认调节年份,可再次按下K3键选择年月日时分秒星期,选择后可按下K1和K2键调节,按下K4键可保存时间并返回主界面。当到站后可按下K1键报站,显示屏显示当前站和下一站信息,并且蜂鸣器发出提示音,步进电机正反转控制门开关。可按下K2键切换运行方向,系统默认为下行。


二、软件设计

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

*/


//系统数据显示
void sys_data_show(void)
{
	u8 buf[11];
	while(1)
	{
		//正常模式显示
		if(sys_ctrl.mode==0)
		{
			//日期显示
			buf[0]='2';
			buf[1]='0';
			buf[2]=gDS1302_TIME[6]/16+0x30;
			buf[3]=gDS1302_TIME[6]%16+0x30;
			buf[4]='-';
			buf[5]=gDS1302_TIME[4]/16+0x30;
			buf[6]=gDS1302_TIME[4]%16+0x30;
			buf[7]='-';
			buf[8]=gDS1302_TIME[3]/16+0x30;
			buf[9]=gDS1302_TIME[3]%16+0x30;
			buf[10]='\0';
			lcd12864_show_string(0,1,buf,0);
			//时间显示
			buf[0]=gDS1302_TIME[2]/16+0x30;
			buf[1]=gDS1302_TIME[2]%16+0x30;
			buf[2]=':';
			buf[3]=gDS1302_TIME[1]/16+0x30;
			buf[4]=gDS1302_TIME[1]%16+0x30;
			buf[5]=':';
			buf[6]=gDS1302_TIME[0]/16+0x30;
			buf[7]=gDS1302_TIME[0]%16+0x30;
			buf[8]='\0';
			lcd12864_show_string(0,0,buf,0);
			//星期显示
			lcd12864_show_hz(14,0,gDS1302_TIME[5]+1);
			//温度显示
			buf[0]=sys_ctrl.temp/100+0x30;
			buf[1]=sys_ctrl.temp%100/10+0x30;
			buf[2]='.';
			buf[3]=sys_ctrl.temp%100%10+0x30;
			buf[4]='\0';
			lcd12864_show_string(11,1,buf,0);
			//运行方向
			if(sys_ctrl.dir==0)lcd12864_show_string(14,3,"->",0);
			else lcd12864_show_string(14,3,"<-",0);
			
			//站点显示
			//下行
			if(sys_ctrl.dir==0)
			{
				switch(sys_ctrl.num)
				{
					case 0:
						lcd12864_show_hz(8,3,17,0);//重新显示之前清屏的那块字
						lcd12864_show_hz(10,3,15,0);

						lcd12864_show_hz(6,2,3,0);//一号站
						lcd12864_show_hz(6,3,4,0);//二号站
						break;
					case 1:
						lcd12864_show_hz(6,2,4,0);//二号站
						lcd12864_show_hz(6,3,5,0);//三号站
						break;
					case 2:
						lcd12864_show_hz(6,2,5,0);//三号站
						lcd12864_show_hz(6,3,6,0);//四号站
						break;
					case 3:
						lcd12864_show_hz(6,2,6,0);//四号站
						lcd12864_show_hz(6,3,7,0);//五号站
						break;
					case 4:
						lcd12864_show_hz(6,2,7,0);//五号站
						lcd12864_show_string(6,3,"      ",0);
						break;
				}		
			}
			//上行
			else
			{
				switch(sys_ctrl.num)
				{
					case 0:
						lcd12864_show_hz(8,3,17,0);//重新显示之前清屏的那块字
						lcd12864_show_hz(10,3,15,0);

						lcd12864_show_hz(6,2,7,0);//五号站
						lcd12864_show_hz(6,3,6,0);//四号站
						break;
					case 1:
						lcd12864_show_hz(6,2,6,0);//四号站
						lcd12864_show_hz(6,3,5,0);//三号站
						break;
					case 2:
						lcd12864_show_hz(6,2,5,0);//三号站
						lcd12864_show_hz(6,3,4,0);//二号站
						break;
					case 3:
						lcd12864_show_hz(6,2,4,0);//二号站
						lcd12864_show_hz(6,3,3,0);//一号站
						break;
					case 4:
						lcd12864_show_hz(6,2,3,0);//一号站
						lcd12864_show_string(6,3,"      ",0);
						break;
				}	
			}
				
		}
		//设置模式显示
		else
		{
			switch(sys_ctrl.mode)
			{
				case 1://年
					lcd12864_show_hz(4,2,sys_ctrl.set_time[5]+1,0);

					buf[0]='2';
					buf[1]='0';
					buf[2]=sys_ctrl.set_time[6]/16+0x30;
					buf[3]=sys_ctrl.set_time[6]%16+0x30;
					buf[4]='\0';
					lcd12864_show_string(0,0,buf,1);
					break;
				case 2://月
					buf[0]='2';
					buf[1]='0';
					buf[2]=sys_ctrl.set_time[6]/16+0x30;
					buf[3]=sys_ctrl.set_time[6]%16+0x30;
					buf[4]='\0';
					lcd12864_show_string(0,0,buf,0);

					buf[0]=sys_ctrl.set_time[4]/16+0x30;
					buf[1]=sys_ctrl.set_time[4]%16+0x30;
					buf[2]='\0';
					lcd12864_show_string(6,0,buf,1);
					break;
				case 3://日
					buf[0]='2';
					buf[1]='0';
					buf[2]=sys_ctrl.set_time[6]/16+0x30;
					buf[3]=sys_ctrl.set_time[6]%16+0x30;
					buf[4]='\0';
					lcd12864_show_string(0,0,buf,0);

					buf[0]=sys_ctrl.set_time[4]/16+0x30;
					buf[1]=sys_ctrl.set_time[4]%16+0x30;
					buf[2]='\0';
					lcd12864_show_string(6,0,buf,0);

					buf[0]=sys_ctrl.set_time[3]/16+0x30;
					buf[1]=sys_ctrl.set_time[3]%16+0x30;
					buf[2]='\0';
					lcd12864_show_string(10,0,buf,1);
					break;
				case 4://时
					buf[0]='2';
					buf[1]='0';
					buf[2]=sys_ctrl.set_time[6]/16+0x30;
					buf[3]=sys_ctrl.set_time[6]%16+0x30;
					buf[4]='\0';
					lcd12864_show_string(0,0,buf,0);

					buf[0]=sys_ctrl.set_time[4]/16+0x30;
					buf[1]=sys_ctrl.set_time[4]%16+0x30;
					buf[2]='\0';
					lcd12864_show_string(6,0,buf,0);

					buf[0]=sys_ctrl.set_time[3]/16+0x30;
					buf[1]=sys_ctrl.set_time[3]%16+0x30;
					buf[2]='\0';
					lcd12864_show_string(10,0,buf,0);

					buf[0]=sys_ctrl.set_time[2]/16+0x30;
					buf[1]=sys_ctrl.set_time[2]%16+0x30;
					buf[2]='\0';
					lcd12864_show_string(0,1,buf,1);
					break;
				case 5://分
					buf[0]='2';
					buf[1]='0';
					buf[2]=sys_ctrl.set_time[6]/16+0x30;
					buf[3]=sys_ctrl.set_time[6]%16+0x30;
					buf[4]='\0';
					lcd12864_show_string(0,0,buf,0);

					buf[0]=sys_ctrl.set_time[4]/16+0x30;
					buf[1]=sys_ctrl.set_time[4]%16+0x30;
					buf[2]='\0';
					lcd12864_show_string(6,0,buf,0);

					buf[0]=sys_ctrl.set_time[3]/16+0x30;
					buf[1]=sys_ctrl.set_time[3]%16+0x30;
					buf[2]='\0';
					lcd12864_show_string(10,0,buf,0);

					buf[0]=sys_ctrl.set_time[2]/16+0x30;
					buf[1]=sys_ctrl.set_time[2]%16+0x30;
					buf[2]='\0';
					lcd12864_show_string(0,1,buf,0);

					buf[0]=sys_ctrl.set_time[1]/16+0x30;
					buf[1]=sys_ctrl.set_time[1]%16+0x30;
					buf[2]='\0';
					lcd12864_show_string(4,1,buf,1);
					break;
				case 6://秒
					buf[0]='2';
					buf[1]='0';
					buf[2]=sys_ctrl.set_time[6]/16+0x30;
					buf[3]=sys_ctrl.set_time[6]%16+0x30;
					buf[4]='\0';
					lcd12864_show_string(0,0,buf,0);

					buf[0]=sys_ctrl.set_time[4]/16+0x30;
					buf[1]=sys_ctrl.set_time[4]%16+0x30;
					buf[2]='\0';
					lcd12864_show_string(6,0,buf,0);

					buf[0]=sys_ctrl.set_time[3]/16+0x30;
					buf[1]=sys_ctrl.set_time[3]%16+0x30;
					buf[2]='\0';
					lcd12864_show_string(10,0,buf,0);

					buf[0]=sys_ctrl.set_time[2]/16+0x30;
					buf[1]=sys_ctrl.set_time[2]%16+0x30;
					buf[2]='\0';
					lcd12864_show_string(0,1,buf,0);

					buf[0]=sys_ctrl.set_time[1]/16+0x30;
					buf[1]=sys_ctrl.set_time[1]%16+0x30;
					buf[2]='\0';
					lcd12864_show_string(4,1,buf,0);

					buf[0]=sys_ctrl.set_time[0]/16+0x30;
					buf[1]=sys_ctrl.set_time[0]%16+0x30;
					buf[2]='\0';
					lcd12864_show_string(8,1,buf,1);
					break;
				case 7://星期
					buf[0]='2';
					buf[1]='0';
					buf[2]=sys_ctrl.set_time[6]/16+0x30;
					buf[3]=sys_ctrl.set_time[6]%16+0x30;
					buf[4]='\0';
					lcd12864_show_string(0,0,buf,0);

					buf[0]=sys_ctrl.set_time[4]/16+0x30;
					buf[1]=sys_ctrl.set_time[4]%16+0x30;
					buf[2]='\0';
					lcd12864_show_string(6,0,buf,0);

					buf[0]=sys_ctrl.set_time[3]/16+0x30;
					buf[1]=sys_ctrl.set_time[3]%16+0x30;
					buf[2]='\0';
					lcd12864_show_string(10,0,buf,0);

					buf[0]=sys_ctrl.set_time[2]/16+0x30;
					buf[1]=sys_ctrl.set_time[2]%16+0x30;
					buf[2]='\0';
					lcd12864_show_string(0,1,buf,0);

					buf[0]=sys_ctrl.set_time[1]/16+0x30;
					buf[1]=sys_ctrl.set_time[1]%16+0x30;
					buf[2]='\0';
					lcd12864_show_string(4,1,buf,0);

					buf[0]=sys_ctrl.set_time[0]/16+0x30;
					buf[1]=sys_ctrl.set_time[0]%16+0x30;
					buf[2]='\0';
					lcd12864_show_string(8,1,buf,0);

					lcd12864_show_hz(4,2,sys_ctrl.set_time[5]+1,1);
					break;	
			}			
		}		

		break;
	}
}

//门的开关动作
void _door_open_close(void)
{
	u8 i=3;
	while(i--)
	{
		step_motor_28BYJ48_send_pulse(4,0,80,1,1);
	}
	delay_ms(1000);
	i=3;
	while(i--)
	{
		step_motor_28BYJ48_send_pulse(4,1,80,1,1);
	}	
}

//应用控制系统
void appdemo_show(void)
{
	u8 i=10;
	sys_parm_init();//系统参数初始化
	lcd12864_init();
//	ds1302_init();
	ds18b20_init();
	//间隔一段时间,等待数据稳定
	while(i--)
	{
		//温度获取
		sys_ctrl.temp=ds18b20_read_temperture()*10;
		delay_ms(100);	
	}
	sys_open_show();//系统开机界面显示	
	
	while(1)
	{	
		sys_data_get();//系统数据获取
		sys_data_show();//系统数据显示
		sys_data_set();//系统数据设置
		sys_fun_ctrl();//系统功能控制
	}
}


三、实验现象

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

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

联系作者

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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
自动浇花灌溉系统是一种智能化的花园管理系统,可实现对植物的自动浇水和灌溉。该设计基于STM32单片机,并利用Proteus仿真软件进行模拟。 在该系统中,STM32单片机作为主控制器,通过传感器检测土壤湿度、光照强度和温度等信息,然后根据预设的参数来判断是否需要进行浇水或灌溉。若土壤湿度低于设定阈值,系统将自动打开电磁阀,开始进行浇水或灌溉。 在Proteus仿真软件中,可以通过连接电路图和编写相应的程序来实现系统功能。通过模拟传感器读取数据,将相关数据传输给STM32单片机,然后进行相关计算和控制。将相应的控制信号输出至电磁阀,实现自动浇水或灌溉功能。 此外,还可以在Proteus仿真软件中添加显示屏模块,用于实时显示传感器数据和系统状态。通过与STM32单片机的通信,将数据传输到显示屏上,使用户可以随时监测植物的生长环境和系统工作状态。 通过Proteus仿真,可以对自动浇花灌溉系统的设计进行测试和优化。可以模拟不同的环境条件和传感器数据,验证系统的稳定性和可靠性。同时,还可以进行不同的参数调整和算法优化,以提高系统的效率和节省水资源的使用。 总之,基于STM32单片机Proteus仿真软件的自动浇花灌溉系统设计可以实现对植物的智能管理和高效浇水灌溉,提高植物的生长质量和节约水资源的使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值