实现目标
1、加强数码管学习,实现数码显示变量数据(三位数的显示);
2、3位数码+2个按键+蜂鸣器实现模拟电磁炉功率调节及显示;
一、前期基础说明
关于74HC595的STM32F103的驱动以及数码的显示等请查阅我写的上一篇博客:https://blog.csdn.net/luojuan198780/article/details/136653377
二、原理图设计
三、STM32CubeMX 配置
1.管脚配置
四、程序设计
1、数码管码表及全局变量
//共阳数码管码表
char table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
int num = 210;//电磁炉开机功率初始值
2、函数声明(74HC595驱动函数及自定义延时函数)
void HC595_Send_Byte(unsigned char byte);
void for_delay_us(uint32_t nus);
3、按键处理、数码显示程序
while (1)
{
if (HAL_GPIO_ReadPin(GPIOB, K1_Pin)==0)
{
while(!HAL_GPIO_ReadPin(GPIOB, K1_Pin));
HAL_GPIO_WritePin(BEEP_GPIO_Port, BEEP_Pin, GPIO_PIN_SET);
HAL_Delay(150);
HAL_GPIO_WritePin(BEEP_GPIO_Port, BEEP_Pin, GPIO_PIN_RESET);
HAL_Delay(150);
if(num >= 210)
{
num = 210;
HAL_GPIO_WritePin(BEEP_GPIO_Port, BEEP_Pin, GPIO_PIN_SET);
HAL_Delay(100);
HAL_GPIO_WritePin(BEEP_GPIO_Port, BEEP_Pin, GPIO_PIN_RESET);
HAL_Delay(100);
}
else
num = num + 20;// num += 20
}
if (HAL_GPIO_ReadPin(GPIOB, K2_Pin)==0)
{
while(!HAL_GPIO_ReadPin(GPIOB, K2_Pin));
HAL_GPIO_WritePin(BEEP_GPIO_Port, BEEP_Pin, GPIO_PIN_SET);
HAL_Delay(150);
HAL_GPIO_WritePin(BEEP_GPIO_Port, BEEP_Pin, GPIO_PIN_RESET);
HAL_Delay(150);
if(num <= 10)
{
num = 10;
HAL_GPIO_WritePin(BEEP_GPIO_Port, BEEP_Pin, GPIO_PIN_SET);
HAL_Delay(100);
HAL_GPIO_WritePin(BEEP_GPIO_Port, BEEP_Pin, GPIO_PIN_RESET);
HAL_Delay(100);
}
else
num -= 20;// num = num - 20;
}
HAL_GPIO_WritePin(GPIOA, SEG1_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, SEG2_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, SEG3_Pin, GPIO_PIN_RESET);
HC595_Send_Byte(table[num/100]);//百位
for_delay_us(5); // 适当延时
HC595_Send_Byte(0xff); // 消影
HAL_GPIO_WritePin(GPIOA, SEG2_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, SEG1_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, SEG3_Pin, GPIO_PIN_RESET);
HC595_Send_Byte(table[num/10%10]);//十位
for_delay_us(5); // 适当延时
HC595_Send_Byte(0xff);// 消影
HAL_GPIO_WritePin(GPIOA, SEG2_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, SEG1_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, SEG3_Pin, GPIO_PIN_SET);
HC595_Send_Byte(table[num%10]);//个位
for_delay_us(5); // 适当延时
HC595_Send_Byte(0xff);// 消影
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
4、74HC595驱动函数及自定义延时函数
/* USER CODE BEGIN 4 */
void HC595_Send_Byte(unsigned char byte)
{
unsigned char i;
for (i = 0; i < 8; i ++) //一个字节8位,传输8次,一次一位,循环8次,刚好移完8位
{
/**** 步骤1:将数据传到DS引脚 ****/
if (byte & 0x80) //先传输高位,通过与运算判断第八是否为1
HAL_GPIO_WritePin(GPIOA, DATA_Pin, GPIO_PIN_SET); //如果第八位是1,则与 595 DS连接的引脚输出高电平
else //否则输出低电平
HAL_GPIO_WritePin(GPIOA, DATA_Pin, GPIO_PIN_RESET);
/*** 步骤2:SHCP每产生一个上升沿,当前的bit就被送入移位寄存器 ***/
HAL_GPIO_WritePin(GPIOA, SHCP_Pin, GPIO_PIN_RESET); // SHCP拉低
for_delay_us(5); // 适当延时
HAL_GPIO_WritePin(GPIOA, SHCP_Pin, GPIO_PIN_SET); // SHCP拉高, SHCP产生上升沿
for_delay_us(5);
byte <<= 1; // 左移一位,将低位往高位移,通过 if (byte & 0x80)判断低位是否为1
}
/** 步骤3:STCP产生一个上升沿,移位寄存器的数据移入存储寄存器 **/
HAL_GPIO_WritePin(STCP_GPIO_Port, STCP_Pin, GPIO_PIN_RESET); // 将STCP拉低
for_delay_us(5);
HAL_GPIO_WritePin(STCP_GPIO_Port, STCP_Pin, GPIO_PIN_SET);// 再将STCP拉高,STCP即可产生一个上升沿
for_delay_us(5);
}
/*
for循环实现延时us
*/
void for_delay_us(uint32_t nus)
{
uint32_t Delay = nus * 168/4;
do
{
}
while (Delay --);
}
/* USER CODE END 4 */
五、实验现象
实验效果参考下面网址视频:
shttps://live.csdn.net/v/370142文章来源:https://www.toymoban.com/news/detail-840990.html
六、仿真实现
文章来源地址https://www.toymoban.com/news/detail-840990.html
总结
到了这里,关于STM32 HAL库实现三位数码管显示(74HC595+按键+蜂鸣器)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!