文章目录 一、功能简介二、软件设计三、实验现象联系作者
一、功能简介
本项目使用Proteus8仿真51单片机控制器,使用LCD12864显示模块、DS18B20温度传感器、DS1302时钟模块、按键、LED蜂鸣器、ULN2003、28BYJ48步进电机模块等。
主要功能:
系统运行后,LCD12864液晶显示检测温度、日期时间、站台信息和运行方向;可按下K3键进入设置模式,默认调节年份,可再次按下K3键选择年月日时分秒星期,选择后可按下K1和K2键调节,按下K4键可保存时间并返回主界面。当到站后可按下K1键报站,显示屏显示当前站和下一站信息,并且蜂鸣器发出提示音,步进电机正反转控制门开关。可按下K2键切换运行方向,系统默认为下行。
二、软件设计 //系统数据显示 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设计,视频分享,技术交流。