本项目使用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
视频地址:https://space.bilibili.com/444388619/video
专注于51单片机、STM32、国产32、DSP、Proteus、ardunio、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。