STM32课程设计--数字时钟+数字电压表+扩展功能--从零开始
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); //清除中断标志位
}
连接硬件
因为我的屏幕和开发板是刚好有插口的,直接插进去就好了
只需要连接比较简单的蜂鸣器,电位器这些
- 蜂鸣器正极 ------》 stm32的PF9
- 蜂鸣器负极 -------》 stm32的GND
- 电位器的外面两硬件分别连接3.3v和GND,顺序不重要
- 电位器中间引脚 ------》 stm32的PA5
设置启动模式:
如果烧录代码,需要将BT0与GND连接
如果运行代码,需要将BT0与3.3V连接
烧录代码
如上所述,设置好烧录代码的启动模式后,按一重启,然后打开stm32cubeprogrammer(烧录用)
设置好串口,和波特率(建议115200,如果失败就往下降)
然后点击 open file 选择烧录文件
烧录文件在代码目录里面的OBJ文件夹内的hex文件就是
然后点击download开始烧录
弹出一个窗口显示成功即可
按照接线部分的内容,改启动模式为运行代码后,重启即可
完整工程文件,及资料
完整工程文件
取字模软件
大家还需要其他资料可以评论,我再更新
这个文章只简单介绍了,如何把我做好的东西用起来,没有很详细的讲解
如果需要的人多的话,评论多的话,我会再出一篇详细讲解代码的文章
另外如有错漏,欢迎批评纠正,我会更新,以免误导网友
STM32课程设计--数字时钟+数字电压表+扩展功能--从零开始相关推荐
- 数字逻辑课程设计-数字时钟时分秒的设计
数字逻辑课程设计-数字时钟 ------------- 课程设计的三个简单要求 1.设计一个能显示日期.小时.分钟.秒的数字电子钟,并具有整点报时的功能. 2.由晶振电路产生1HZ标准的信号.分.秒为 ...
- 数字逻辑课程设计-数字时钟(月:日:时:分:秒)
csdn账号被异地登陆,注册邮箱密码丢失找不回来,辛辛苦苦挣得点C币没了 重新注册了账号,内容转至 https://blog.csdn.net/qq_25066049/article/details/ ...
- 单片机课程设计--网络时钟
单片机课程设计–网络时钟 测控1902 孙楷亮 文章目录 单片机课程设计--网络时钟 作品功能 目标功能 典型应用场景 总体计划 代码计划 时间规划 开发资源 开发环境 硬件资源 软件资源 文档资料 ...
- 数字秒表c语言程序设计,课程设计 数字秒表
<课程设计 数字秒表>由会员分享,可在线阅读,更多相关<课程设计 数字秒表(24页珍藏版)>请在人人文库网上搜索. 1.计算机控制技术综合应用设计题目 数字秒表 二级学院 电子 ...
- 数电课设——555定时器设计数字时钟
熬夜做课设,写出来的东西,真香 数电课设--555定时器设计数字时钟 数电课设--555定时器设计数字时钟 链接: link.
- FPGA课程设计——数字电子时钟VERILOG(基于正点原子新起点开发板,支持8位或6位共阳极数码管显示时分秒毫秒,可校时,可设闹钟,闹钟开关,led指示)
2019级电子科学与技术专业FPGA课程设计 报 告 2022 年 5 月 20 日 多功能数字电子钟的设计 摘要 电子设计自动化(EDA)是一种实现电子系统或电子产品自动化设计的技术,使用ED ...
- 单片机课程设计数字心率计_课程设计-基于单片机的数字人体心率计设计.doc
课程设计-基于单片机的数字人体心率计设计 中北大学 基于单片机的心率计设计 课 程 设 计 说 明 书 2017年 6月30日 课 程 设 计 任 务 书 1.设计目的:通过本课程设计的学习,学生将复 ...
- 51单片机c语言教程温度计,单片机课程设计-数字温度计.doc
武 夷 学 院 课程设计报告 课程名称: 单片机及嵌入式技术 设计题目: 数字温度计 学生班级: 13计算机科学与技术(1)班 学生姓名: 陈圣盛.周鹏飞.刘犇 指导教师: 焦金涛 完成日期: 201 ...
- 天津大学计算机课程设计挂,天津大学智能装置课程设计 电子时钟..doc
智能装置课程设计 一.课程设计目的: 1.深入了解PIC16F877单片机的工作原理,熟练掌握汇编语言程序设计方法,熟练使用MPLAB-ICD仿真器及MPLAB-IDE仿真调试软件. 2.通过该课程设 ...
最新文章
- Github标星24k,127篇经典论文下载,这份深度学习论文阅读路线图不容错过
- python官网地址-python官网地址
- Initialization SQL Statement – Custom 配置错误,导致无法加载FORM
- 小程序如何把文字玩出花样
- 配置虚拟机 Linux 静态IP
- 数据结构-循环单链表之约瑟夫问题
- Apache Shiro第3部分–密码学
- nodejs与javascript中的aes加密
- java执行python提示import os找不到_java利用Jython调用python抛出错误ImportError: No module named odbchelper...
- 模块化分析设计(简单的注册登录模块)
- 软件自动化测试的学习路线
- 爬虫学习笔记1:爬虫基本概念
- Windows11安装教程
- 嵌入式linux根文件系统制作--busybox
- OpenCV基础知识
- [论文阅读] Facial Expression Recognition Using Residual Masking Network
- 破解软件的原理是什么(软件被破解公开)
- html实现选择头像,HTML5实现上传头像图片大小选择(简单实现)
- mapx讲义 (来自skyma)
- Merriam-Webster's Vocabulary Builder 学习笔记 Unit 19