stm32f103c8t6实现电子时钟数码管显示
时间: 2024-06-23 18:00:58 浏览: 171
STM32F103C8T6是一款基于Cortex-M3内核的微控制器,常用于嵌入式系统中,包括实现各种电子时钟和数码管显示。要使用它来实现电子时钟和数码管显示,你需要遵循以下步骤:
1. **配置硬件**:
- 连接STM32F103C8T6到开发板,确保GPIO引脚正确连接至数码管的段驱动和公共端。
- 如果数码管是共阳极或共阴极,选择相应的驱动方式。
2. **初始化**:
- 配置定时器(如TIMx)作为系统的时钟源,设置分频以得到精确的时间间隔。
- 初始化数码管接口,配置GPIO为输出模式,并设置初始状态。
3. **编写定时器中断服务程序**:
- 当定时器溢出时,触发一个中断。
- 在中断处理程序中,获取当前时间并将其转换为数码管的显示格式。
4. **数码管显示算法**:
- 使用7-segment码(对于7段数码管)将时间数据转换成对应的段驱动信号。
- 控制数码管的每个段根据转换后的值开关相应的GPIO。
5. **循环更新**:
- 在主程序中,进入一个无限循环,不断读取定时器,更新显示,并调用中断服务程序。
6. **错误处理和调试**:
- 添加适当的错误处理代码,比如检查输入是否有效,以及数码管的显示是否正确。
相关问题
stm32f103c8t6一个按键控制数码管显示程序
以下是一个简单的程序,实现了按下按键后,数码管上的数字循环显示0~9:
```c
#include "stm32f10x.h"
int main(void)
{
// 使能GPIOC和AFIO时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);
// 配置PC13为输入模式
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOC, &GPIO_InitStructure);
// 配置PC0~PC3为输出模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
// 数码管显示0~9的编码
const uint8_t digit_code[] = {
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f
};
uint8_t digit_index = 0;
while(1)
{
// 如果按键按下
if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13) == Bit_RESET) {
// 数码管显示下一个数字
digit_index = (digit_index + 1) % 10;
GPIO_Write(GPIOC, digit_code[digit_index] << 4);
}
}
}
```
程序的主要逻辑是在一个无限循环中,不断检测PC13引脚的输入状态。如果该引脚为低电平,说明按键被按下,此时数码管显示下一个数字。为了方便控制数码管,我们将PC0~PC3引脚配置为输出模式,并且使用一个编码表来表示数字0~9的编码。具体实现细节请参考代码注释。
用keil4使用stm32f103c8t6配置三位静态数码管显示133的工程
好的,我可以为您提供一个简单的工程示例,实现STM32F103C8T6单片机驱动三位共阳数码管显示133的功能。请按照以下步骤进行操作:
1.硬件连接
将三位共阳数码管连接至单片机的PB0~PB2引脚,连接方式如下图所示:
![image](https://img-blog.csdn.net/20180513183714833?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2h1bmdoYWl1NzI0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/q/50)
2.新建工程
在Keil4中新建一个工程,选择STMicroelectronics->STM32F10x MDK,输入工程名字,然后选择存储路径,最后点击OK按钮。
3.配置工程
在工程中添加需要的源文件和头文件,具体如下:
(1)添加头文件"stm32f10x.h"。
(2)在main函数中进行如下配置:
初始化GPIOB口,将PB0~PB2引脚设置为输出模式;
使用TIM2定时器,设置预分频系数为71,计数器自动重装载,计数器周期设置为1000,开启TIM2中断;
开启全局中断;
启动TIM2计数器。
4.编写代码
在main函数中编写如下代码:
```c
#include "stm32f10x.h"
void delay(int n) {
int i;
while (n--) {
for (i = 0; i < 1000; i++);
}
}
void TIM2_IRQHandler(void) {
static int cnt = 0;
static int digit = 0;
int i;
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) {
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
cnt++;
if (cnt == 1000) {
cnt = 0;
digit++;
if (digit == 3) {
digit = 0;
}
}
switch (digit) {
case 0:
GPIO_SetBits(GPIOB, GPIO_Pin_0);
GPIO_ResetBits(GPIOB, GPIO_Pin_1|GPIO_Pin_2);
break;
case 1:
GPIO_SetBits(GPIOB, GPIO_Pin_1);
GPIO_ResetBits(GPIOB, GPIO_Pin_0|GPIO_Pin_2);
break;
case 2:
GPIO_SetBits(GPIOB, GPIO_Pin_2);
GPIO_ResetBits(GPIOB, GPIO_Pin_0|GPIO_Pin_1);
break;
}
switch (cnt / 333) {
case 0:
GPIO_SetBits(GPIOB, GPIO_Pin_5|GPIO_Pin_4|GPIO_Pin_3);
break;
case 1:
GPIO_ResetBits(GPIOB, GPIO_Pin_5);
GPIO_SetBits(GPIOB, GPIO_Pin_4|GPIO_Pin_3);
break;
case 2:
GPIO_ResetBits(GPIOB, GPIO_Pin_4);
GPIO_SetBits(GPIOB, GPIO_Pin_5|GPIO_Pin_3);
break;
case 3:
GPIO_ResetBits(GPIOB, GPIO_Pin_3);
GPIO_SetBits(GPIOB, GPIO_Pin_5|GPIO_Pin_4);
break;
}
}
}
int main(void) {
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能GPIOB时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //使能TIM2时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
TIM_TimeBaseStructure.TIM_Period = 1000;
TIM_TimeBaseStructure.TIM_Prescaler = 71;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_Cmd(TIM2, ENABLE);
while (1) {
}
}
```
5.编译下载
编译代码并下载到单片机中,就可以看到三位共阳数码管上显示133了。
希望以上内容对您有所帮助!
阅读全文