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

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

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

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

准备

所需硬件:

  • 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;                        //LCD
	uint8_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);//设置系统中断优先级分组2
	
	delay_init(168);                //初始化延时函数
	
	uart_init(115200);		          //初始化串口波特率为115200
	
	Adc_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,其实只用一个gpio
	
	while(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开始烧录

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

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

完整工程文件,及资料

完整工程文件

取字模软件

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

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

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

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

  • 8
    点赞
  • 72
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GuanFuXinCSDN

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值