STM32实现数码管显示DS18B20温度

个人网站:https://chenqi.autmake.com/

1.数码管介绍

数码管分共阴极连接和共阳极连接两种,本次试验所用的数码管为共阴极连接方式,如下所示。数码管为4位8段数码管,8段分别是A,B,C,D,E,F,G,DP,如显示数字3,需要将A,B,C,D,G点亮,显示其他数字原理相同。

2.硬件资源介绍

试验采用的是正点原子mini开发板,一个DS18B20,一个数码管,数码管1~12引脚对应连接到PB0~PB11,18B20的数据引脚连接到PA0上。读取18B20的温度程序暂不作介绍,后面补充。

3.程序介绍

本次采用的显示方式是逐位扫描,根据原理图可以看出数码管一次只能输出一位数组,所以如果是多位的必须使用扫描的方式输出,缩短切换的间隔,就可以达到不闪烁的效果。

#include "io.h"
#include "delay.h"

int num[10] = {0x64b,0x48,0x453,0x45a,0x258,0x61a,0x61b,0x448,0x65b,0x65a};//对应显示0~9
int p;

void DisPlayNum(int n)
{
    if (n < 9999)
    { 
        int i = 0;
        for (i=0;i<4;i++)//逐位显示,从低位至高位显示
        {
            HAL_GPIO_WritePin(GPIOB, GPIO_PIN_All, GPIO_PIN_RESET);
            HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_11, GPIO_PIN_SET);
            switch (i)
            {
            case 0:
                HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_RESET);
                break;
            case 1:
                HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET);
                HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,GPIO_PIN_SET);//小数点
                break;
            case 2:
                HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET);
                break;
            case 3:
                HAL_GPIO_WritePin(GPIOB, GPIO_PIN_11, GPIO_PIN_RESET);
                break;
            }
            p = n % 10;
            HAL_GPIO_WritePin(GPIOB, num[p], GPIO_PIN_SET);//显示每一位的0~9
            
            n = n / 10;//依次显示下一位
            delay_ms(5);//显示完1位,延时5ms,然后显示下一位
            
            if (n==0)//最后一位显示完,结束(从低位至高位显示)
                break;
        }
    }
}

着重介绍下面代码:

int num[10] = {0x64b,0x48,0x453,0x45a,0x258,0x61a,0x61b,0x448,0x65b,0x65a};//对应显示0~9

 HAL_GPIO_WritePin(GPIOB, num[p], GPIO_PIN_SET);//显示每一位的0~9

以数字0来说明:

0:ABCDEF,需要将这几段同时点亮,即写成高电平,GPIO_PIN_10|GPIO_PIN_6|GPIO_PIN_3|GPIO_PIN_1|GPIO_PIN_0|GPIO_PIN_9  = 0x64b

如: HAL_GPIO_WritePin(GPIOB, 0x64b, GPIO_PIN_SET);//即将0对应的ABCDEF拉高,点亮

每一个引脚对应相应的数值,stm32f1xx_hal_gpio.h中定义:

主函数:

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */
  

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  /* USER CODE BEGIN 2 */
  DS18B20_Init();
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
      temp = DS18B20_Get_Temp();
      n = (int)(temp * 10);
      DisPlayNum(n);
  }
  /* USER CODE END 3 */
}

主函数没有什么需要特别说明的,直接将18B20读取的温度显示出来。

以上。

贴出链接,供大家参考。

链接:https://pan.baidu.com/s/1tFBvOjAD0rac-h8pJQH50A 
提取码:24za 
 

发布了16 篇原创文章 · 获赞 9 · 访问量 2万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览