STM32课程设计–数字时钟+数字电压表+扩展功能–从零开始

目录

  • STM32课程设计--数字时钟+数字电压表+扩展功能--从零开始
    • 准备
    • 建立工程
      • 下载工程模板
      • 添加项目所需文件
        • 下载
        • 加入工程
        • 加入头文件路径
    • 编写main.c
    • 连接硬件
    • 烧录代码
    • 完整工程文件,及资料

题目是老师要求的,然后自己做了一些扩展,把原本按键实现的功能,用触控屏幕来实现
功能:数字电压表、数字时钟、闹钟、电压预警、触控、触控校准、串口输出

文章最后,有完整的工程文件,和其他资料,取字模软件

准备

所需硬件:

  • STM32F407ZG
  • 3.2寸彩色TFT屏(320*240)
  • 电位器
  • 蜂鸣器
  • 杜邦线
  • 面包板

软件:

  • keil5
  • 取字模软件
  • stm32cubeprogrammer(烧录用)

采用标准库开发

全家福:

建立工程

库函数开发代码结构如下:

下载工程模板

因为建立工程文件是比较繁琐,且没有技术含量的操作,所以这里直接给大家一个工程模板,下载来进行开发即可。

工程模板下载点击

这个工程模板是通用的,也适合其他的项目使用,里面有一些本项目不需要的库文件,可以去掉以提高编译的速度
例如:FWLIB文件夹里面的是标准库提供的硬件驱动可以去掉一下多余的

方法:


添加项目所需文件

当然,我们还需要添加本项目需要的库
下面是我自己写的库文件,和屏幕厂家提供的驱动库文件

下载

屏幕驱动库
我自己写的驱动文件

下载两个文件
在工程文件夹下,建立一个HARDWARE文件夹,把下载的两个文件里面的内容都复制进去
然后打开工程项目(点击USER目录下的.uvproj文件,即可打开)

加入工程

将刚刚复制进来的文件加入工程
方法:

最终效果:

加入头文件路径

然后再把头文件路径加入


最终效果也如上

到这里建立工程的前期工作就完成啦

编写main.c

我写好的main.c如下,复制替换工程模板里面的main.c的内容即可

到这里,本项目的全部代码,就完成啦,接下来就是硬件连接和烧录了

/****************************************************************stm32课程设计2019083641XX观XX硬件:stm32f407zg、3.2寸tft彩色触控屏(320*240)、电位器、蜂鸣器功能:数字电压表、数字时钟、闹钟、电压预警、触控、触控校准、串口输出****************************************************************/#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "lcd.h"
#include "GBK_LibDrive.h"
#include "my_show.h"
#include "adc.h"
#include "timer.h"
#include "time_t.h"
#include "Text.h"
#include "string.h"
#include "w25qxx.h"
#include "touch.h"
#include "GBK_LibDrive.h" uint8_t x=0;                        //LCDuint8_t lcd_id[12];                         //存放LCD ID字符串//   uint8_t dianya_num = 0;             uint16_t adcx;                      //adc读取的初值float temp;                         //初值处理得到的电压uint8_t dianya_sos_t[2] ={0,0};     //电压报警的阈值,整数float dianya_sos;                   //电压报警的阈值,浮点数uint8_t time_tt[3] = {12,30,10};    //计时uint8_t time_clock[3] = {0,0,0};    //闹钟定时//                                      标志变量uint8_t time_flash = 0;             //定时器中断uint8_t clock_flash = 0;            //开启闹钟uint8_t dianya_flash = 0;           //开启电压报警uint8_t cmd_flash = 0;              //功能选择void sos()                           //报警函数
{Color_Test();                      //彩色LCD_Clear(WHITE);PFout(9) = 1;delay_ms(500);   PFout(9) = 0;delay_ms(500);PFout(9) = 1;delay_ms(500);    PFout(9) = 0;delay_ms(500);show_main(time_tt,temp);         //回到主界面
}int main(void)
{ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2delay_init(168);                //初始化延时函数uart_init(115200);                //初始化串口波特率为115200Adc_Init();                     //ADC 初始化LCD_Init();                               //初始化LCD FSMC接口POINT_COLOR=RED;                        //画笔颜色:红色W25QXX_Init();                                    //W25QXX初始化while(W25QXX_ReadID()!=W25Q16)                              //检测不到W25QXX{LCD_ShowString(30,150,200,16,16,RED,"W25Q16 Check Failed!");delay_ms(500);LCD_ShowString(30,150,200,16,16,RED,"Please Check!      ");delay_ms(500);LED1=!LED1;                        //DS0闪烁}GBK_Lib_Init();                 //硬件GBK字库初始化--(如果使用不带字库的液晶屏版本,此处可以屏蔽,不做字库初始化) sprintf((char*)lcd_id,"LCD ID:%04X",lcddev.id);//将LCD ID打印到lcd_id数组。tp_dev.init();                     //触摸屏初始化TIM3_Int_Init(10000-1,8400-1);  //定时器时钟84M,分频系数8400,所以84M/8400=10Khz的计数频率,计数5000次为500ms   LCD_Clear(WHITE);                         //清屏//TP_Adjust();                            //屏幕校准  LED_Init();                             //初始化LED,其实只用一个gpiowhile(1) {         tp_dev.scan(0);                    if(tp_dev.sta&TP_PRES_DOWN)         //触摸屏被按下{   if(tp_dev.x[0]<lcddev.width&&tp_dev.y[0]<lcddev.height){
//              LCD_ShowNum(100,300,tp_dev.x[0],3,16,BLUE);
//              LCD_ShowNum(200,300,tp_dev.y[0],3,16,BLUE);if(tp_dev.x[0] < 79 && tp_dev.y[0] < 28 && cmd_flash != 0)                                       //按键:电压表{cmd_flash = 0;LCD_Clear(WHITE);   //清屏}else if(tp_dev.x[0] < 159 && tp_dev.x[0] > 85 && tp_dev.y[0] < 28&& cmd_flash != 1)              //按键:修改时间{cmd_flash = 1;LCD_Clear(WHITE);   //清屏}else if(tp_dev.x[0] < 237 && tp_dev.x[0] > 165 && tp_dev.y[0] < 28&& cmd_flash != 2)              //按键:屏幕纠正{cmd_flash = 2;LCD_Clear(WHITE);   //清屏}else if(tp_dev.x[0] < 150 && tp_dev.x[0] > 70 && tp_dev.y[0] < 160 && tp_dev.y[0] > 130 && cmd_flash != 3)  //按键:闹钟{cmd_flash = 3;LCD_Clear(WHITE);   //清屏}else if(tp_dev.x[0] < 160 && tp_dev.x[0] > 80 && tp_dev.y[0] < 270 && tp_dev.y[0] > 240 && cmd_flash != 4) //按键:电压报警{cmd_flash = 4;LCD_Clear(WHITE);   //清屏}
//              else
//                  TP_Draw_Big_Point(tp_dev.x[0],tp_dev.y[0],RED);     //显示触控轨迹}}else if( cmd_flash == 0 )                                          //主功能          {adcx = Get_Adc_Average(ADC_Channel_5,20);                     //  ADC检测temp = (float)adcx*(3.3/4096.0);                               //转化为电压if(time_flash == 1)             //定时器中断功能{tim3_timeadd(time_tt);time_flash = !time_flash;}if(clock_flash == 1)          //闹钟开启{if(time_clock[0] == time_tt[0] && time_clock[1] == time_tt[1] && time_clock[2] == time_tt[2] )   //判断时间{sos();}}if(dianya_flash == 1)       //电压报警开启{if(temp > dianya_sos)     //判断电压{sos();}}printf("time : %d : %d : %d \t\n\n" ,time_tt[0],time_tt[1],time_tt[2]);    //串口输出时间和电压printf("dianya : %f V \t\n\n",temp);show_main(time_tt,temp);          //更新主界面}else if ( cmd_flash == 1)         //修改时间功能{tim3_timemod(time_tt);           //修改时间键盘show_timemod(time_tt);           //修改时间界面delay_ms(10); cmd_flash = 0;                   //回到主界面LCD_Clear(WHITE);                //清屏}else if (cmd_flash == 2){LCD_Clear(WHITE);                //清屏TP_Adjust();                       //屏幕校准 delay_ms(10);  cmd_flash = 0;}else if (cmd_flash == 3){LCD_Clear(WHITE);  tim3_timemod(time_clock);         //闹钟键盘show_clock(time_clock);           //闹钟界面clock_flash = 1;                 //开启闹钟cmd_flash = 0;    LCD_Clear(WHITE);  }else if (cmd_flash == 4){LCD_Clear(WHITE); tim3_diannya(dianya_sos_t);             //电压预警键盘dianya_sos = dianya_sos_t[0] + dianya_sos_t[1]*0.1;    //电压数组转化为浮点数show_dianya_sos(dianya_sos_t);        //电压界面dianya_flash = 1;                     //开启电压报警cmd_flash = 0;LCD_Clear(WHITE);  //清屏}delay_ms(10);  }
}//定时器3中断服务函数
void TIM3_IRQHandler(void)
{if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET)  //溢出中断{    time_flash = !time_flash;                   //设置中断标志位}TIM_ClearITPendingBit(TIM3,TIM_IT_Update);   //清除中断标志位
}

连接硬件

因为我的屏幕和开发板是刚好有插口的,直接插进去就好了
只需要连接比较简单的蜂鸣器,电位器这些

  1. 蜂鸣器正极 ------》 stm32的PF9
  2. 蜂鸣器负极 -------》 stm32的GND
  3. 电位器的外面两硬件分别连接3.3v和GND,顺序不重要
  4. 电位器中间引脚 ------》 stm32的PA5

设置启动模式:
如果烧录代码,需要将BT0与GND连接
如果运行代码,需要将BT0与3.3V连接

烧录代码

如上所述,设置好烧录代码的启动模式后,按一重启,然后打开stm32cubeprogrammer(烧录用)

设置好串口,和波特率(建议115200,如果失败就往下降)

然后点击 open file 选择烧录文件

烧录文件在代码目录里面的OBJ文件夹内的hex文件就是

然后点击download开始烧录

弹出一个窗口显示成功即可

按照接线部分的内容,改启动模式为运行代码后,重启即可

完整工程文件,及资料

完整工程文件

取字模软件

大家还需要其他资料可以评论,我再更新

这个文章只简单介绍了,如何把我做好的东西用起来,没有很详细的讲解

如果需要的人多的话,评论多的话,我会再出一篇详细讲解代码的文章

另外如有错漏,欢迎批评纠正,我会更新,以免误导网友

STM32课程设计--数字时钟+数字电压表+扩展功能--从零开始相关推荐

  1. 数字逻辑课程设计-数字时钟时分秒的设计

    数字逻辑课程设计-数字时钟 ------------- 课程设计的三个简单要求 1.设计一个能显示日期.小时.分钟.秒的数字电子钟,并具有整点报时的功能. 2.由晶振电路产生1HZ标准的信号.分.秒为 ...

  2. 数字逻辑课程设计-数字时钟(月:日:时:分:秒)

    csdn账号被异地登陆,注册邮箱密码丢失找不回来,辛辛苦苦挣得点C币没了 重新注册了账号,内容转至 https://blog.csdn.net/qq_25066049/article/details/ ...

  3. 单片机课程设计--网络时钟

    单片机课程设计–网络时钟 测控1902 孙楷亮 文章目录 单片机课程设计--网络时钟 作品功能 目标功能 典型应用场景 总体计划 代码计划 时间规划 开发资源 开发环境 硬件资源 软件资源 文档资料 ...

  4. 数字秒表c语言程序设计,课程设计 数字秒表

    <课程设计 数字秒表>由会员分享,可在线阅读,更多相关<课程设计 数字秒表(24页珍藏版)>请在人人文库网上搜索. 1.计算机控制技术综合应用设计题目 数字秒表 二级学院 电子 ...

  5. 数电课设——555定时器设计数字时钟

    熬夜做课设,写出来的东西,真香 数电课设--555定时器设计数字时钟 数电课设--555定时器设计数字时钟 链接: link.

  6. FPGA课程设计——数字电子时钟VERILOG(基于正点原子新起点开发板,支持8位或6位共阳极数码管显示时分秒毫秒,可校时,可设闹钟,闹钟开关,led指示)

    2019级电子科学与技术专业FPGA课程设计 报   告 2022  年 5 月 20 日 多功能数字电子钟的设计 摘要 电子设计自动化(EDA)是一种实现电子系统或电子产品自动化设计的技术,使用ED ...

  7. 单片机课程设计数字心率计_课程设计-基于单片机的数字人体心率计设计.doc

    课程设计-基于单片机的数字人体心率计设计 中北大学 基于单片机的心率计设计 课 程 设 计 说 明 书 2017年 6月30日 课 程 设 计 任 务 书 1.设计目的:通过本课程设计的学习,学生将复 ...

  8. 51单片机c语言教程温度计,单片机课程设计-数字温度计.doc

    武 夷 学 院 课程设计报告 课程名称: 单片机及嵌入式技术 设计题目: 数字温度计 学生班级: 13计算机科学与技术(1)班 学生姓名: 陈圣盛.周鹏飞.刘犇 指导教师: 焦金涛 完成日期: 201 ...

  9. 天津大学计算机课程设计挂,天津大学智能装置课程设计 电子时钟..doc

    智能装置课程设计 一.课程设计目的: 1.深入了解PIC16F877单片机的工作原理,熟练掌握汇编语言程序设计方法,熟练使用MPLAB-ICD仿真器及MPLAB-IDE仿真调试软件. 2.通过该课程设 ...

最新文章

  1. Github标星24k,127篇经典论文下载,这份深度学习论文阅读路线图不容错过
  2. python官网地址-python官网地址
  3. Initialization SQL Statement – Custom 配置错误,导致无法加载FORM
  4. 小程序如何把文字玩出花样
  5. 配置虚拟机 Linux 静态IP
  6. 数据结构-循环单链表之约瑟夫问题
  7. Apache Shiro第3部分–密码学
  8. nodejs与javascript中的aes加密
  9. java执行python提示import os找不到_java利用Jython调用python抛出错误ImportError: No module named odbchelper...
  10. 模块化分析设计(简单的注册登录模块)
  11. 软件自动化测试的学习路线
  12. 爬虫学习笔记1:爬虫基本概念
  13. Windows11安装教程
  14. 嵌入式linux根文件系统制作--busybox
  15. OpenCV基础知识
  16. [论文阅读] Facial Expression Recognition Using Residual Masking Network
  17. 破解软件的原理是什么(软件被破解公开)
  18. html实现选择头像,HTML5实现上传头像图片大小选择(简单实现)
  19. mapx讲义 (来自skyma)
  20. Merriam-Webster's Vocabulary Builder 学习笔记 Unit 19

热门文章

  1. 【计算机视觉】张正友标定法相机标定
  2. c++ eos智能合约开发_EOS智能合约开发为何编译成WebAssembly?
  3. 十二星座匹配对象_十二星座最佳恋人配对
  4. macos 一些kafka命令整理
  5. 使用selenium模拟动态登录QQ邮箱爬取收件箱内容放在CSV文件中
  6. SQL结构化查询语言
  7. 一个鼠标控制两台电脑
  8. 卅三先生的工程电磁场讲座.EEm04——电势能001
  9. 明清时期宗族、乡绅与基层社会
  10. 置液晶显示器的台式计算机,计算机用液晶显示器通用标准.doc