基于STM32F103的计秒设计
仿真软件:
Proteus 8.17
编程软件:
Keil 5
仿真实现:
在4位数码管上进行计秒显示,每100ms改变一次数值。
数码管原理:
数码管是一种常用的显示器件,主要用于显示数字和一些字母。其原理主要包括以下几个方面:
1. 结构
数码管通常由多个发光二极管(LED)组成,这些LED按照特定的形状排列,常见的有七段数码管和八段数码管。
七段数码管:由7个段(LED)和1个小点(用于显示小数点)组成,能够显示0-9的数字和部分字母。
八段数码管:在七段的基础上增加了一个额外的LED段,能够显示更多的字符。
2. 工作原理
数码管的工作原理主要基于LED的发光特性。通过控制不同的LED段的亮灭状态,可以形成所需的数字或字母。例如,显示数字"5"时,会点亮特定的LED段。
3. 控制方式
数码管的控制通常有两种方式:
共阳极:所有阳极连接在一起,数字的显示通过控制各个段的阴极来实现。
共阴极:所有阴极连接在一起,通过控制各个段的阳极来显示数字。
4. 驱动电路
数码管通常需要一个驱动电路来提供所需的电流和电压。常用的驱动方式包括:
直接驱动:使用微控制器的I/O口直接驱动数码管,但这种方式不适合大规模或高亮度的应用。
使用驱动芯片:例如74HC595或MAX7219等专用驱动芯片,可以简化电路设计,并实现多位数码管的驱动
电路介绍:
本次使用的4位共阴数码管,数码管的段选部分接在了PB8-PB15,位选部分接在了PB0-PB3,由于是仿真,就直接使用IO口直连了,没有使用三极管去驱动。
效果图:
程序介绍:
程序基于keil5开发,使用的是库函数开发。
STM32与51单片机不同,在使用GPIO时需要先使能对应的GPIO的时钟,然后设置对应的IO口的输入输出模式。本次仿真由于是驱动数码管显示,所以将对应的IO口设置为推挽输出状态。
void F_GPIO_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_All;//PB0-PB15
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStruct);
}
数码管部分:
void F_Display(void)
{
static uchar i;
switch(i)
{
case 0:GPIO_Write(GPIOB,((SMG_Table[V_ValueData / 1000]) << 8) | 0xFE);i++;break;
case 1:GPIO_Write(GPIOB,(SMG_Table[V_ValueData / 100 % 10] << 8) | 0xFD);i++;break;
case 2:GPIO_Write(GPIOB,((SMG_Table[V_ValueData / 10 % 10] | 0x80) << 8) | 0xFB);i++;break;
case 3:GPIO_Write(GPIOB,(SMG_Table[V_ValueData % 10] << 8) | 0xF7);i = 0;break;
}
}
Main函数:
int main(void)
{
F_GPIO_Init();
TIM3_Int_Init(1000-1,72-1); //1ms
while(1)
{
if(V_5msTimeCounter >= 5)
{
V_5msTimeCounter = 0;
V_MainLoopCounter++;
if(V_MainLoopCounter >= 20)//100ms
{
V_MainLoopCounter = 0x00;
V_ValueData++;
if(V_ValueData >= 10000)
{
V_ValueData = 0x00;
}
}
}
}
}
Main函数进入先对IO口以及定时器进行初始化,主循环设置的是5ms跑一次,连续跑20次就表示到了100ms了,就对V_ValueData加一次,然后显示在数码管上,数码管显示的函数放在了定时器中断里,每1ms刷新一次。从而实现仿真要求!