stm32使用四位数码管制作简易时钟(库函数版)

这篇具有很好参考价值的文章主要介绍了stm32使用四位数码管制作简易时钟(库函数版)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.数码管情况介绍

数码管接线引脚:

4位时钟数码管单片机程序,stm32,嵌入式硬件,单片机 

 段码与上图情况,位选为:1-PB0,2-PB12,3-PB13,4-PB14。

本项目使用5461BS-1共四位数码管,为共阳型。

4位时钟数码管单片机程序,stm32,嵌入式硬件,单片机

 2.程序部分

Timer定时器:

#include "stm32f10x.h"                  // Device header

void Timer_Init(void){
	//1.开启时钟RCC
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//TIM2
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);	
	//2.选择时基单元时钟
	TIM_InternalClockConfig(TIM2);//内部时钟
	//3.配置时基单元
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;//选择时钟分频
	TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;//计数器模式(向上/向下/3种中央对齐模式)
	TIM_TimeBaseInitStruct.TIM_Period=10000-1;//ARR自动重装器的值(0-65535)
	TIM_TimeBaseInitStruct.TIM_Prescaler=7200-1;//PSC预分频器的值(0-65535);定时频率=72M/(PSC+1)/(ARR+1);72000
	TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0;//重复计数器的值(高级计数器才有)
	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);
	TIM_ClearFlag(TIM2,TIM_FLAG_Update);//将更新中断标志位清除,避免初始化完就进中断
	//4.使能更新中断
	TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
	//5.配置NVIC
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	NVIC_InitTypeDef NVIC_InitStruct;
	NVIC_InitStruct.NVIC_IRQChannel=TIM2_IRQn;//选择通道
	NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;//指定中断通道是使能/失能
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=2;//设置先占(抢占)优先级
	NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;//设置从占(响应)优先级
	NVIC_Init(&NVIC_InitStruct);
	//6.启动定时器
	TIM_Cmd(TIM2,ENABLE);
	
}

SMG数码管

#include "stm32f10x.h"                  // Device header
#include "Delay.h"

//5461BS-1为共阳型
u16 seg[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳
//u16 seg[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴

extern u16 tim4Cnt;

void SMG_Init(void){
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //开启GPIOA的外设时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	
	//配置端口模式
	GPIO_InitTypeDef GPIO_InitStructureA;//定义结构体变量
	GPIO_InitStructureA.GPIO_Pin=GPIO_Pin_All;  //选择你要设置的IO口
	GPIO_InitStructureA.GPIO_Mode=GPIO_Mode_Out_PP;	 //设置推挽输出模式
	GPIO_InitStructureA.GPIO_Speed=GPIO_Speed_50MHz;	  //设置传输速率为50MHZ
	GPIO_Init(GPIOA,&GPIO_InitStructureA); 	   /* 初始化GPIO */
	
	//配置端口模式
	GPIO_InitTypeDef GPIO_InitStructureB;//定义结构体变量
	GPIO_InitStructureB.GPIO_Pin=GPIO_Pin_All;  //选择你要设置的IO口
	GPIO_InitStructureB.GPIO_Mode=GPIO_Mode_Out_PP;	 //设置推挽输出模式
	GPIO_InitStructureB.GPIO_Speed=GPIO_Speed_50MHz;	  //设置传输速率为50MHZ
	GPIO_Init(GPIOB,&GPIO_InitStructureB); 	   /* 初始化GPIO */
	
	GPIO_SetBits(GPIOA,GPIO_Pin_All);
}

void SMG_clean(){
	GPIO_WriteBit(GPIOB,GPIO_Pin_0,Bit_RESET);
	GPIO_WriteBit(GPIOB,GPIO_Pin_12,Bit_RESET);			
	GPIO_WriteBit(GPIOB,GPIO_Pin_13,Bit_RESET);			
	GPIO_WriteBit(GPIOB,GPIO_Pin_14,Bit_RESET);	
	Delay_ms(2);
}

//选择第w位,显示数字num
void SMG_Light(uint16_t w,uint16_t num){
	SMG_clean();
	//位选
	switch(w){
		case 0:
			GPIO_WriteBit(GPIOB,GPIO_Pin_0,Bit_SET);
			GPIO_WriteBit(GPIOB,GPIO_Pin_12,Bit_RESET);
			GPIO_WriteBit(GPIOB,GPIO_Pin_13,Bit_RESET);		
			GPIO_WriteBit(GPIOB,GPIO_Pin_14,Bit_RESET);	
			break;
		case 1:
			GPIO_WriteBit(GPIOB,GPIO_Pin_12,Bit_SET);
			GPIO_WriteBit(GPIOB,GPIO_Pin_0,Bit_RESET);
			GPIO_WriteBit(GPIOB,GPIO_Pin_13,Bit_RESET);
			GPIO_WriteBit(GPIOB,GPIO_Pin_14,Bit_RESET);
			break;
		case 2:
			GPIO_WriteBit(GPIOB,GPIO_Pin_13,Bit_SET);
			GPIO_WriteBit(GPIOB,GPIO_Pin_12,Bit_RESET);		
			GPIO_WriteBit(GPIOB,GPIO_Pin_0,Bit_RESET);			
			GPIO_WriteBit(GPIOB,GPIO_Pin_14,Bit_RESET);	
			break;
		case 3:
			GPIO_WriteBit(GPIOB,GPIO_Pin_14,Bit_SET);
			GPIO_WriteBit(GPIOB,GPIO_Pin_12,Bit_RESET);			
			GPIO_WriteBit(GPIOB,GPIO_Pin_13,Bit_RESET);			
			GPIO_WriteBit(GPIOB,GPIO_Pin_0,Bit_RESET);	
			break;
	}
	//段码
	GPIO_Write(GPIOA,seg[num]);
	Delay_ms(2);
}

main主函数

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "Key.h"
#include "SMG.h"
#include "Timer.h"

uint16_t i,Tim2Num,miao,shi,fen;

int main(void){
	Key_Init();
	SMG_Init();
	Timer_Init();
	while(1){
		//时钟
		miao=Tim2Num%60;
		SMG_Light(0,miao%10);//ge
		SMG_Light(1,miao/10);//shi
		fen=Tim2Num%3600/60;
		SMG_Light(2,fen%10);//ge
		SMG_Light(3,fen/10);//shi
		shi=Tim2Num%(24*3600)/3600;
	}
}

//每秒计时
void TIM2_IRQHandler(void){
	if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET){//更新中断
		Tim2Num++;
		TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//清除标志位
	}
}

资料参考:

(75条消息) STM32F103C8T6 I/O口驱动4位共阳数码管_io口控制数码管_seaup2011的博客-CSDN博客

四位一体数码管LG5641BH共阳极引脚图,怎么读的?_百度知道 (baidu.com)

单片机数码管显示,看完这篇就够了 (zhihu.com)文章来源地址https://www.toymoban.com/news/detail-718037.html

到了这里,关于stm32使用四位数码管制作简易时钟(库函数版)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 四位数码管显示计时分钟和秒(单片机代码)

    8051系列单片机有两个定时器:T0和T1,分别称为定时器和定时器T1,这两个定时器都是16位的定时器/计数器;8052系列单片机增加了第三个定时器/计数器T2;它们都有定时或事件计数功能,常用于时间控制、延时、对外部时间计数和检测等场合。 8051单片机的两个定时器T0和T1分别都由两

    2024年02月12日
    浏览(48)
  • Arduino UNO驱动TM1637四位时钟数码管显示时间

    TM1637 是一种带键盘扫描接口的LED(发光二极管显示器)驱动控制专用电路,内部集成有MCU 数字接口、数据锁存器、LED 高压驱动、键盘扫描等电路。  显示模式(8 段×6 位),支持共阳数码管输出  键扫描(8×2bit),增强型抗干扰按键识别电路  辉度调节电路(占空比

    2024年02月12日
    浏览(43)
  • STM32HAL库驱动数码管

    本文档创建于2023年3月7日 本文记录了我学习数码管驱动的过程,实际是微机原理课上留的一个作业。 本文作者:RobotFreak 本文参考《NANO_STM32F103开发指南-HAL库版本_V2.0》,正点原子官网可下载。 数码管,也称LED数码管,按发光二极管单元连接方式可分为“共阳极数码管”和“

    2024年02月08日
    浏览(39)
  • STM32-GPIO数码管动态显示

    目录 一、数码管原理 1、LED数码管的结构 2、LED数码管工作原理 3、数码管动态显示 1)动态显示的概念 2)动态显示的接口 二、代码的实现 三、仿真结果展示   本篇文章将继续进一步了解GPIO外设输出模式 知道这一部分的朋友可以直接点击目录部分跳过这段跳过 ,这里介绍

    2023年04月08日
    浏览(41)
  • 嵌入式开发:使用STM32CubeMX 和 Keil uVision5实现两位数码管循环显示实验

    一、STM32CubeMx实现数码管 1、双击打开STM32CubeMX。 2、点击File选项,在File列表下选择New Project选项新建工程。 3、在图中所示位置的方框中输入我们使用的芯片型号来搜索芯片 4、与我们的搜索相关的芯片型号会在这里呈现,我们只需要选择我们需要的即可,这里我们双击第一个

    2024年02月08日
    浏览(54)
  • 基于FPGA的四位数码管显示按键计数器设计(verilog编程)

    软件:Vivado 2022.2 硬件:BASYS 3 设计描述:通过开发板上的四个按键,按下一次记数加一,分别由四个数码管从左到右分别显示四个按键记数情况。 例: 1.初始值为0000,意为无记数 2.当按下第一个按键,记数加一,数码管显示1000 3.再次按下一第一个按键,记数加一,数码管显

    2024年02月08日
    浏览(49)
  • STM32 4位数码管和74HC595

            在使用一位数码管的时候,会用到8个IO口,那如果使用4位数码管,难道要使用32个IO口吗?肯定是不行的,太浪费了IO口了。把四个数码管全部接一起共用8个IO口,然后分别给他们一个片选。所以4位数码管共有12个IO口。         当选择数码管1显示的时候,这可以

    2024年04月17日
    浏览(99)
  • Arduino:实现四位LED共阴极数码管显示——从认识、连接、程序到实现功能

    (1)一位八段共阴极数码管        在认识四位共阴极数码管之前我先介绍一下一位八段共阴极数码管。如左图所示为以为数码管的实物图,其中它共有10个引脚,且上下各五个。 小数点位于右下时为数码管正面 ,在四位共阴极数码管中也是如此,在连接组装时尤为重要。

    2024年02月02日
    浏览(50)
  • STM32物联网项目——TM1620驱动数码管显示

    程序功能:       TM1620 这里主要说说关于TM1620指令与数据传输,其他概述等内容详细见TM1620手册: 链接:https://pan.baidu.com/s/1C4I_oy9n9QjSPu8UD-FJRg  提取码:9ec0  --来自百度网盘超级会员V2的分享 TM1620一共有4条指令: (1) 显示模式命令设置:  该指令用来设置选择段和位的个数

    2024年01月16日
    浏览(42)
  • 【STM32+HAL+Proteus】系列学习教程---数码管显示定时

    1、STM32 基于HAL库定时器的使用; 2、加强数码管的学习。 3、具体目标:利用定时器3实现一个60秒的定时,定时时间在数码管上显示,定时时间到,蜂鸣器响一声作为提示功能。         自动生成的代码中,中断回调函数都有一个__weak ,加上了__weak 修饰符的函数,

    2024年04月09日
    浏览(79)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包