【单片机毕业设计】【mcuclub-cl-003】公交车报站 | 公交车自动报站 | 公交车语音报站

2024-02-08 16:40

本文主要是介绍【单片机毕业设计】【mcuclub-cl-003】公交车报站 | 公交车自动报站 | 公交车语音报站,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近设计了一个项目基于单片机的公交车报站 | 公交车自动报站 | 公交车语音报站系统,与大家分享一下:
一、基本介绍
项目名:基于单片机的公交车报站控制系统设计

                基于单片机的公交车自动报站系统设计

                基于单片机的公交车语音报站系统设计

项目编号:mcuclub-cl-003

单片机类型:STC89C52、STM32F103C8T6

具体功能:

1、通过DS18B20测得公交车内温度
2、通过外部时钟模块获取当前时间
3、通过TTS语音播报模块播报不同的站点信息
4、通过按键可以修改时间、播报站台等
5、通过OLED显示时间、温度、站台信息
6、通过两个LED代表上下行指示
扩展功能:通过蓝牙模块将测量数据发送到手机端

二、51实物图
单片机型号:STC89C52

板子为绿色PCB板,两层板,厚度1.2,上下覆铜接地。元器件基本上为插针式,个别降压芯片会使用贴片式。

供电接口:TYPE-C

三、51仿真图
仿真软件版本:proteus8.9

电路连线方式:网络标号连线方式

注意:部分实物元器件仿真中没有,仿真中会用其他工作原理相似的元件代替,这样可能导致实物程序和仿真程序不一样

 四、32实物图
单片机型号:STM32F103C8T6

板子为绿色PCB板,两层板,厚度1.2,上下覆铜接地。元器件基本上为插针式,个别降压芯片会使用贴片式。

供电接口:TYPE-C

 五、原理图
软件版本:AD2013

电路连线方式:网络标号连线方式

注意:原理图只是画出了模块的引脚图,而并不是模块的内部结构原理图

 六、PCB图
由原理图导出,封装很大一部分都是作者自己绘制,不提供封装库,只提供连接好的源文件。中间有一个项目编号,
隐藏在单片机底座下,插入单片机后不会看到。
两层板,上下覆铜接地。

七、系统框图

本设计以单片机为核心控制器,加上其他模块一起组成此次设计的整个系统,其中包括中控部分、输入部分和输出部分。中控部分采用了单片机控制器,其主要作用是获取输入部分的数据,经过内部处理,逻辑判断,最终控制输出部分。输入由三部分组成,第一部分是温度检测模块,通过该模块检测当前环境的温度;第二部分是第三模块是按键模块,通过该模块可以切换界面、设置阈值、播报站号等;第三部分是供电模块,通过该模块可给整个系统进行供电。输出由四部分组成,第一部分是显示模块,通过该模块可以显示监测的数据以及设置的时间;第二部分是语音输出模块,公交车到站之后,通过该模块进行站号的播报;第三部分是LED灯,显示当前公交车的运行方向。除此之外,蓝牙模块既作为输入又作为输出,蓝牙模块和手机进行连接,可以将监测的温度信息及其当前的站台信息数据传输到用户手机端,用户也可以通过手机端发送指令语音播报。具体系统框图如图3.1所示。


 八、软件设计流程


 九、部分程序展示
软件版本:keil5
逻辑程序和驱动程序分开,分布于main.c和其他.c文件


/****
*******显示函数
*****/
void Display_function(void)
{
    switch(flag_display)                                    //根据不同的显示模式标志位,显示不同的界面
    {
        case 0:                                                      //界面0:显示温度、时间、站台信息,方向
            Oled_ShowNum_2(1,4,calendar.hour);
      Oled_ShowString(1,6,":");
      Oled_ShowNum_2(1,7,calendar.min);
      Oled_ShowString(1,9,":");
      Oled_ShowNum_2(1,10,calendar.sec);

            Oled_ShowCHinese(2, 0, "温度:");
            sprintf(display_buf,"%d.%dC ",temp_value/10,temp_value%10);
            Oled_ShowString(2, 6, display_buf);
            
      Oled_ShowCHinese(3,0,"上站:");
      Oled_ShowCHinese(3,5,"号站");
            if(platform_c == 1 || platform_c == 6)
            {
                Oled_ShowCHinese(3,3,"终点");
            }
            else
            {
                sprintf(display_buf," %d  ",platform_c-1);
                Oled_ShowString(3,6,display_buf);
            }

      Oled_ShowCHinese(4,0,"下站:");
      Oled_ShowCHinese(4,5,"号站");
            if(platform_n == 1 || platform_n == 6)
            {
                Oled_ShowCHinese(4,3,"终点");
            }
            else
            {
                sprintf(display_buf," %d  ",platform_n-1);
                Oled_ShowString(4,6,display_buf);
            }

            if(flag_direction == 0) 
      {
        LED_UP = 0;
        LED_DW = 1;
      }
      else
      {
        LED_UP = 1;
        LED_DW = 0;
      }
        break;
        
        case 1:                                                                                            //界面1:显示设置年
            Oled_ShowCHinese(1,1,"设置当前时间");
            if(time_num % 5 == 0)
            {
        Oled_ShowNum_2(2,0,calendar.w_year/100);
        Oled_ShowNum_2(2,2,calendar.w_year%100);
        Oled_ShowString(2,4,".");
        Oled_ShowNum_2(2,5,calendar.w_month);
        Oled_ShowString(2,7,".");
        Oled_ShowNum_2(2,8,calendar.w_date);

                Oled_ShowNum_2(3,0,calendar.hour);
        Oled_ShowString(3,2,":");
        Oled_ShowNum_2(3,3,calendar.min);
        Oled_ShowString(3,5,":");
        Oled_ShowNum_2(3,6,calendar.sec);
            }
            if(time_num % 10 == 0)
            {
                Oled_ShowString(2,0,"    ");
            }
        break;
            
        case 2:                                                                                            //界面2:显示设置月
            Oled_ShowCHinese(1,1,"设置当前时间");
            if(time_num % 5 == 0)
            {
        Oled_ShowNum_2(2,0,calendar.w_year/100);
        Oled_ShowNum_2(2,2,calendar.w_year%100);
        Oled_ShowString(2,4,".");
        Oled_ShowNum_2(2,5,calendar.w_month);
        Oled_ShowString(2,7,".");
        Oled_ShowNum_2(2,8,calendar.w_date);

                Oled_ShowNum_2(3,0,calendar.hour);
        Oled_ShowString(3,2,":");
        Oled_ShowNum_2(3,3,calendar.min);
        Oled_ShowString(3,5,":");
        Oled_ShowNum_2(3,6,calendar.sec);
            }
            if(time_num % 10 == 0)
            {
                Oled_ShowString(2,5,"  ");
            }
        break;
            
        case 3:                                                                                            //界面3:显示设置日
            Oled_ShowCHinese(1,1,"设置当前时间");
            if(time_num % 5 == 0)
            {
        Oled_ShowNum_2(2,0,calendar.w_year/100);
        Oled_ShowNum_2(2,2,calendar.w_year%100);
        Oled_ShowString(2,4,".");
        Oled_ShowNum_2(2,5,calendar.w_month);
        Oled_ShowString(2,7,".");
        Oled_ShowNum_2(2,8,calendar.w_date);

                Oled_ShowNum_2(3,0,calendar.hour);
        Oled_ShowString(3,2,":");
        Oled_ShowNum_2(3,3,calendar.min);
        Oled_ShowString(3,5,":");
        Oled_ShowNum_2(3,6,calendar.sec);
            }
            if(time_num % 10 == 0)
            {
                Oled_ShowString(2,8,"  ");
            }
        break;

    case 4:                                                                                            //界面4:显示设置时
            Oled_ShowCHinese(1,1,"设置当前时间");
            if(time_num % 5 == 0)
            {
        Oled_ShowNum_2(2,0,calendar.w_year/100);
        Oled_ShowNum_2(2,2,calendar.w_year%100);
        Oled_ShowString(2,4,".");
        Oled_ShowNum_2(2,5,calendar.w_month);
        Oled_ShowString(2,7,".");
        Oled_ShowNum_2(2,8,calendar.w_date);

                Oled_ShowNum_2(3,0,calendar.hour);
        Oled_ShowString(3,2,":");
        Oled_ShowNum_2(3,3,calendar.min);
        Oled_ShowString(3,5,":");
        Oled_ShowNum_2(3,6,calendar.sec);
            }
            if(time_num % 10 == 0)
            {
                Oled_ShowString(3,0,"  ");
            }
        break;

    case 5:                                                                                            //界面5:显示设置分
            Oled_ShowCHinese(1,1,"设置当前时间");
            if(time_num % 5 == 0)
            {
        Oled_ShowNum_2(2,0,calendar.w_year/100);
        Oled_ShowNum_2(2,2,calendar.w_year%100);
        Oled_ShowString(2,4,".");
        Oled_ShowNum_2(2,5,calendar.w_month);
        Oled_ShowString(2,7,".");
        Oled_ShowNum_2(2,8,calendar.w_date);

                Oled_ShowNum_2(3,0,calendar.hour);
        Oled_ShowString(3,2,":");
        Oled_ShowNum_2(3,3,calendar.min);
        Oled_ShowString(3,5,":");
        Oled_ShowNum_2(3,6,calendar.sec);
            }
            if(time_num % 10 == 0)
            {
                Oled_ShowString(3,3,"  ");
            }
        break;

    case 6:                                                                                            //界面6:显示设置秒
            Oled_ShowCHinese(1,1,"设置当前时间");
            if(time_num % 5 == 0)
            {
        Oled_ShowNum_2(2,0,calendar.w_year/100);
        Oled_ShowNum_2(2,2,calendar.w_year%100);
        Oled_ShowString(2,4,".");
        Oled_ShowNum_2(2,5,calendar.w_month);
        Oled_ShowString(2,7,".");
        Oled_ShowNum_2(2,8,calendar.w_date);

                Oled_ShowNum_2(3,0,calendar.hour);
        Oled_ShowString(3,2,":");
        Oled_ShowNum_2(3,3,calendar.min);
        Oled_ShowString(3,5,":");
        Oled_ShowNum_2(3,6,calendar.sec);
            }
            if(time_num % 10 == 0)
            {
                Oled_ShowString(3,6,"  ");
            }
        break;
        
        default:
        break;
    }
}


http://资料点击该链接到官网下载:www.mcubee.comicon-default.png?t=N7T8http://xn--www-y28d13pdjh59cbgps9dz58akt9a5s5ajzd4ujyjw9710b.mcubee.com

这篇关于【单片机毕业设计】【mcuclub-cl-003】公交车报站 | 公交车自动报站 | 公交车语音报站的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/691599

相关文章

SpringBoot中封装Cors自动配置方式

《SpringBoot中封装Cors自动配置方式》:本文主要介绍SpringBoot中封装Cors自动配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot封装Cors自动配置背景实现步骤1. 创建 GlobalCorsProperties

idea中创建新类时自动添加注释的实现

《idea中创建新类时自动添加注释的实现》在每次使用idea创建一个新类时,过了一段时间发现看不懂这个类是用来干嘛的,为了解决这个问题,我们可以设置在创建一个新类时自动添加注释,帮助我们理解这个类的用... 目录前言:详细操作:步骤一:点击上方的 文件(File),点击&nbmyHIgsp;设置(Setti

使用Python实现文本转语音(TTS)并播放音频

《使用Python实现文本转语音(TTS)并播放音频》在开发涉及语音交互或需要语音提示的应用时,文本转语音(TTS)技术是一个非常实用的工具,下面我们来看看如何使用gTTS和playsound库将文本... 目录什么是 gTTS 和 playsound安装依赖库实现步骤 1. 导入库2. 定义文本和语言 3

一文详解SQL Server如何跟踪自动统计信息更新

《一文详解SQLServer如何跟踪自动统计信息更新》SQLServer数据库中,我们都清楚统计信息对于优化器来说非常重要,所以本文就来和大家简单聊一聊SQLServer如何跟踪自动统计信息更新吧... SQL Server数据库中,我们都清楚统计信息对于优化器来说非常重要。一般情况下,我们会开启"自动更新

Flask 验证码自动生成的实现示例

《Flask验证码自动生成的实现示例》本文主要介绍了Flask验证码自动生成的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习... 目录生成图片以及结果处理验证码蓝图html页面展示想必验证码大家都有所了解,但是可以自己定义图片验证码

讯飞webapi语音识别接口调用示例代码(python)

《讯飞webapi语音识别接口调用示例代码(python)》:本文主要介绍如何使用Python3调用讯飞WebAPI语音识别接口,重点解决了在处理语音识别结果时判断是否为最后一帧的问题,通过运行代... 目录前言一、环境二、引入库三、代码实例四、运行结果五、总结前言基于python3 讯飞webAPI语音

Python Excel实现自动添加编号

《PythonExcel实现自动添加编号》这篇文章主要为大家详细介绍了如何使用Python在Excel中实现自动添加编号效果,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、背景介绍2、库的安装3、核心代码4、完整代码1、背景介绍简单的说,就是在Excel中有一列h=会有重复

Springboot的自动配置是什么及注意事项

《Springboot的自动配置是什么及注意事项》SpringBoot的自动配置(Auto-configuration)是指框架根据项目的依赖和应用程序的环境自动配置Spring应用上下文中的Bean... 目录核心概念:自动配置的关键特点:自动配置工作原理:示例:需要注意的点1.默认配置可能不适合所有场景

Java中实现订单超时自动取消功能(最新推荐)

《Java中实现订单超时自动取消功能(最新推荐)》本文介绍了Java中实现订单超时自动取消功能的几种方法,包括定时任务、JDK延迟队列、Redis过期监听、Redisson分布式延迟队列、Rocket... 目录1、定时任务2、JDK延迟队列 DelayQueue(1)定义实现Delayed接口的实体类 (

shell脚本自动删除30天以前的文件(最新推荐)

《shell脚本自动删除30天以前的文件(最新推荐)》该文章介绍了如何使用Shell脚本自动删除指定目录下30天以前的文件,并通过crontab设置定时任务,此外,还提供了如何使用Shell脚本删除E... 目录shell脚本自动删除30天以前的文件linux按照日期定时删除elasticsearch索引s