基于STM32的时钟设计并在六位数码管上显示附proteus仿真

这篇具有很好参考价值的文章主要介绍了基于STM32的时钟设计并在六位数码管上显示附proteus仿真。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


提示:以下是本篇文章正文内容,下面案例可供参考

一、项目介绍

本项目包含KEIL代码编写和Proteus代码仿真两部分,主要通过基础定时器实现时钟功能,难点在于在六位数码管上显示,本项目采用定时器3的中断,以一秒为一单位,重点对时间的处理,让小时,分钟,秒显示在数码管上,项目扩展部分,可以加入按键来进行一个时间的设置与校准。
Proteus仿真方面,配置好I/O后,在驱动数码管时,需要添加74LS245模块来增强I/O的驱动能力,数码管采用的是共阳极连接,对于段选和位选这里就不多赘述,值得注意的是,段选和位选的I/O分配最好不要都在一个I/O上,这样避免GPIO写入时发生冲突。

二、代码展示

1.SMG.C

代码如下(示例):

#include "stm32f10x.h"
#include "smg.h"
void SMG_Init(void)
{
	GPIO_InitTypeDef  GPIO_InitStructure;
//使能GPIOC时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE); 
	GPIO_InitStructure.GPIO_Pin = 0x00ff;					//PC0-PC7引脚配置
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   //配置为推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   //GPIOC速度为50MHz
 	GPIO_Init(GPIOC, &GPIO_InitStructure);				//初始化PC0-PC7
	GPIO_InitStructure.GPIO_Pin = 0x003f;					//PB0-PC5引脚配置
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   //配置为推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   //GPIOB速度为50MHz
 	GPIO_Init(GPIOB, &GPIO_InitStructure);				//初始化PB0-PB5
}

2.SWG.H

代码如下(示例):

#ifndef __SMG_H
#define __SMG_H
void SMG_Init(void);  
#endif

3.timer.c

#include "timer.h"
#include "stm32f10x_tim.h"

int count=0;
// 通用定时器3中断初始化
// 这里时钟选择为APB1的2倍,而APB1为36M
// arr:自动重装值。
// psc:时钟预分频数
// 这里使用的是定时器3!
void TIM3_Int_Init(u16 arr, u16 psc)
{
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	NVIC_InitTypeDef NVIC_InitStructure;

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); 						// 时钟使能
	
	// 定时器TIM3初始化
	TIM_TimeBaseStructure.TIM_Period = arr; 												// 设置在下一个更新事件装入活动的自动重装载寄存器周期的值	
	TIM_TimeBaseStructure.TIM_Prescaler = psc; 											// 设置用来作为TIMx时钟频率除数的预分频值
	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; 				// 设置时钟分割:TDTS = Tck_tim
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  		// TIM向上计数模式
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); 								// 根据指定的参数初始化TIMx的时间基数单位
 
	TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); 											// 使能指定的TIM3中断,允许更新中断

	// 中断优先级NVIC设置
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);//设定中断优先级分组0
	NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  								// TIM3中断
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  			// 先占优先级0级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  						// 从优先级3级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 								// IRQ通道被使能
	NVIC_Init(&NVIC_InitStructure);  																// 初始化NVIC寄存器

	TIM_Cmd(TIM3, ENABLE);  																				// 使能TIMx					 
}


// 定时器3中断服务程序
void TIM3_IRQHandler (void)  																		  // TIM3中断
{
	if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  						// 检查TIM3更新中断发生与否
	{
		count++;
		
		TIM_ClearITPendingBit(TIM3, TIM_IT_Update);  									// 清除TIMx更新中断标志 
	}
}

4.timer.h

#ifndef __TIMER_H
#define __TIMER_H

#include "sys.h" 

extern int count;
void TIM3_Int_Init(u16 arr,u16 psc);
 
#endif

5.main.c

#include "stm32f10x.h"
#include "Delay.h"
#include "smg.h"
#include "timer.h"
//定义0~9十个数字的字型码表
uint16_t table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};   
uint16_t wei[]={0x0fe,0x0fd,0x0fb,0x0f7,0x0ef,0x0df,0xff,0xff}; //位码;
int main(void)
{
	SMG_Init();
	TIM3_Int_Init(719,9999);
	while(1)
	{
		
		if(count<60)
		{
			GPIO_Write(GPIOB,wei[0]);
			GPIO_Write(GPIOC,table[count%10]);
			Delay(10);
			GPIO_Write(GPIOB,wei[1]);
			GPIO_Write(GPIOC,table[count/10%10]);
			Delay(10);
			for(uint8_t i=2;i<=5;i++)
			{
				GPIO_Write(GPIOB,wei[i]);
				GPIO_Write(GPIOC,table[0]);
				Delay(10);
			}
		}
		if(count>=60||count<3600)
		{
			int m,n,t=0;
			n=count/60%10;
			m=count/60/10;
			t=count%60;
			
			GPIO_Write(GPIOB,wei[0]);
			GPIO_Write(GPIOC,table[t%10]);
			Delay(10);
			

			GPIO_Write(GPIOB,wei[1]);
			GPIO_Write(GPIOC,table[t/10%10]);
			Delay(10);
			
			GPIO_Write(GPIOB,wei[2]);
			GPIO_Write(GPIOC,table[n]);
			Delay(10);
			
			GPIO_Write(GPIOB,wei[3]);
			GPIO_Write(GPIOC,table[m]);
			Delay(10);
			
			GPIO_Write(GPIOB,wei[4]);
			GPIO_Write(GPIOC,table[0]);
			Delay(10);
						
			GPIO_Write(GPIOB,wei[5]);
			GPIO_Write(GPIOC,table[0]);
			Delay(10);
		}
		if(count>=3600||count<86400)
		{
			int m,n,t,x,y,q=0;
			x=count/3600/10;
			y=count/3600%10;
			q=count%3600;
			m=q/60/10;
			n=q/60%10;
			t=q%60;
			
			GPIO_Write(GPIOB,wei[0]);
			GPIO_Write(GPIOC,table[t%10]);
			Delay(10);
			
			GPIO_Write(GPIOB,wei[1]);
			GPIO_Write(GPIOC,table[t/10%10]);
			Delay(10);
			
			GPIO_Write(GPIOB,wei[2]);
			GPIO_Write(GPIOC,table[n]);
			Delay(10);
			
			GPIO_Write(GPIOB,wei[3]);
			GPIO_Write(GPIOC,table[m]);
			Delay(10);
			
			GPIO_Write(GPIOB,wei[4]);
			GPIO_Write(GPIOC,table[y]);
			Delay(10);
			
			GPIO_Write(GPIOB,wei[5]);
			GPIO_Write(GPIOC,table[x]);
			Delay(10);	
		}
		
	}
}

三、Proteus仿真

基于STM32的时钟设计并在六位数码管上显示附proteus仿真,嵌入式,Proteus,数码管,stm32,单片机,proteus

四、总结

在项目开发时候,需要理解数码管的工作原理,理解段选和位选的区别,对于数码管动态显示来说,认识到同一时间数码管只能显示一位,重点在于定时器中断后时间的处理,需要对数据进行分解。Proteus仿真方面,芯片调频72MHz。

五、文件

代码和模型文件:
链接:https://pan.quark.cn/s/25e64b55ec13
提取码:CG29文章来源地址https://www.toymoban.com/news/detail-527880.html

到了这里,关于基于STM32的时钟设计并在六位数码管上显示附proteus仿真的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 毕业设计 基于STM32与wifi的天气预报网时钟系统 - 物联网 单片机

    文章目录 0 前言 1 设计内容 2 软件设计 3 关键代码 4 最后 🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及

    2024年02月06日
    浏览(52)
  • 基于STM32单片机的温度报警器(数码管)(Proteus仿真+程序)

            本设计由STM32F103单片机最小系统+DS18B20温度传感器+数码管显示模块+声光报警模块+独立按键组成。 1、主控制器是STM32F103单片机 2、DS18B20温度传感器测量温度 3、数码管显示温度值,精度0.1摄氏度 4、三个按键可设置温度上限、下限报警值,温度超过上限、或者温度低

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

    2019   级    电子科学与技术   专业FPGA课程设计 报   告 2022  年 5 月 20 日 多功能数字电子钟的设计 摘要 电子设计自动化(EDA)是一种实现电子系统或电子产品自动化设计的技术,使用EDA技术设计的结果既可以用FPGA / CPLD来实施验证,也可以直接做成专用集成电路(ASIC)。

    2024年02月03日
    浏览(35)
  • 基于STM32单片机的直流电机PWM调速(数码管显示)(Proteus仿真+程序)

          由 STM32单片机+数码管显示模块+键盘模块+L298N电机驱动模块+直流电机 1、采用STM32F103单片机为主控制器 2、四个按键,分别为启动/暂停、方向切换、加速、减速功能 3、数码管显示PWM占空比和电机转动方向(0正转,1反转) 注意:proteus8.11版本才能打开   24、基于STM32单

    2024年02月11日
    浏览(46)
  • 基于STM32单片机的温湿度检测报警器(数码管)(Proteus仿真+程序)

           本设计由STM32F103单片机最小系统+DHT11温湿度传感器+数码管显示模块+声光报警模块+独立按键组成。 1、主控制器是STM32F103单片机 2、DHT11传感器测量温度和湿度数据 3、数码管显示温度、湿度,精度1℃、1%RH 4、三个按键可设置温度、湿度上限报警值,温度或者湿度超过

    2024年02月03日
    浏览(63)
  • 单片机AT89C51六位数码管秒表

    详细代码讨论加我QQ:1271370903   本设计的数字电子秒表系统采用AT89C51单片机为中心器件,利用其定时器/计数器定时和记数的原理,结合显示电路、LED数码管以及外部中断电路来设计计时器。将软、硬件有机地结合起来,使得系统能够实现LED显示,显示时间为0~9999.99秒,计时

    2024年02月03日
    浏览(47)
  • stm32毕业设计 电子时钟设计与实现

    共用体除非必要,否则学长不推荐使用,枚举的用法比较简单,在本书19章的项目实践中有很好的示例,这节课我们先来练习一下结构体的使用。下边这个程序的功能是一个带日期的电子钟,相当于一个简易万年历了,并且加入了按键调时功能。学有余力的同学看到这里,不

    2024年02月08日
    浏览(37)
  • STM32CubeMX生成C代码及时钟树配置(基于stm32f407)

    近来对于stm32单片机编程中,HAL库逐渐取代标准库成为主流的库。标准库支持的芯片型号有限,而且目前已经停止支持,而HAL库支持所有类型的芯片,可移植性也很高,再加上有神器STM32Cube可以生成工程模板,越来越多的编程开始从使用标准库转到使用HAL库。 新建工程后,在

    2024年02月15日
    浏览(49)
  • 六位数字时钟(IDE+Protuse)

    实验条件:Cube IDE +Protuse 任务目标: STM32F103R6T6系列的MCU引脚上接有8个共阴极的七段数码管,原理图见如下Protuse图,实现复用STM32F103R6T6微控制器的TIM2进行定时,定时时长为1s,编程实现数字时钟的功能,然后通过8位的数码管显示,时钟的格式:23-45-56,原理图如下。  一

    2024年02月03日
    浏览(21)
  • 97、基于stm32单片机智能药箱药盒温湿度体温光照时钟wifi手机APP监控(程序+原理图+PCB源文件+手机APP源码+硬件设计资料+元器件清单等)

    单片机类型选择 方案一:可以使用现在比较主流的单片机STC89C5单片机进行数据处理。这款单片机具有的特点是内存和51的单片机相比多了4KB内存,但是价格和51单片机一样。并且支持数据串行下载和调试助手。此款单片机是有ATMEL公司生产,可用5V电压编程,而且擦写时间仅需

    2024年02月13日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包