蓝桥杯单片机快速开发笔记——特训6 温度采样与显示

2024-03-26 04:52

本文主要是介绍蓝桥杯单片机快速开发笔记——特训6 温度采样与显示,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、原理分析

        DS18B20温度传感器:http://t.csdnimg.cn/fFZlz

        HC573/HC138:http://t.csdnimg.cn/W0a0U

        数码管:http://t.csdnimg.cn/kfm9Y

        独立键盘:http://t.csdnimg.cn/YPInc

二、示例题目

在CT107D单片机综合训练平台上,新建工程并以I/O模式编写代码,实现以下功能:

  1. 将DS18B20的底层驱动代码文件正确移植到工程中。
  2. 配置J5为BTN模式,将S4设置为独立按键,用于切换温度的显示格式。
  3. 系统上电后,单片机循环启动DS18B20温度转换,并读取温度转换结果,进行适当的换算后,在数码管的右侧显示。
  4. 系统上电后,默认显示格式为保留2位小数;按下S4按键后松开,显示格式切换为保留1位小数;再次按下S4按键后松开,显示格式切换为只保留整数部分;再次按下S4按键后松开,显示格式重新恢复为保留2位小数;按键控制如此循环。

三、特别提醒

        移植onewire.c时,要把它的延时函数改为

void Delay_OneWire(unsigned int t)  
{t = t * 10;while(t--);
}

四、示例代码

#include "stc15.h"
#include "onewire.h"#define TKEY 200
#define TSMG 500unsigned char mode = 1;   //模式
float temp = 0;  //读取到的温度sbit s4 = P3^3;code unsigned char Seg_Table[] = 
{0xc0, //00xf9, //10xa4, //20xb0, //30x99, //40x92, //50x82, //60xf8, //70x80, //80x90, //90x88, //A0x83, //b0xc6, //C0xa1, //d0x86, //E0x8e //F
};code unsigned char Seg_DotTable[] = 
{0x40, //0.0x79, //1.0x24, //2.0x30, //3.0x19, //4.0x12, //5.0x02, //6.0x78, //7.0x00, //8.0x10  //9.
};void hc573(unsigned char channel, unsigned char dat)
{P2 = (P2 & 0x1f) | 0x00;P0 = dat;switch(channel){case 4:P2 = (P2 & 0x1f) | 0x80;break;case 5:P2 = (P2 & 0x1f) | 0xa0;break;case 6:P2 = (P2 & 0x1f) | 0xc0;break;case 7:P2 = (P2 & 0x1f) | 0xe0;break;}P2 = (P2 & 0x1f) | 0x00;
}void delay_smg(unsigned int t)
{while(t--);
}void delay_key(unsigned int t)
{while(t--);
}//控制所有数码管
void smg_all(unsigned char dat)
{hc573(6, 0xff);hc573(7, dat);
}
//控制单个数码管
void smg_bit(unsigned char pos, unsigned char dat)
{hc573(6, 0x01 << pos);hc573(7, dat);delay_smg(TSMG);hc573(6, 0x01 << pos);hc573(7, 0xff);
}void smg_display()
{unsigned int smg_one = 0;  //数码管显示温度if(mode == 1)    //模式1{smg_one = temp * 100;smg_bit(4, Seg_Table[smg_one / 1000]);smg_bit(5, Seg_DotTable[(smg_one / 100) % 10]);smg_bit(6, Seg_Table[(smg_one / 10) % 10]);smg_bit(7, Seg_Table[smg_one % 10]);}else if(mode == 2) //模式2{smg_one = temp * 10;smg_bit(5, Seg_Table[smg_one / 100]);smg_bit(6, Seg_DotTable[(smg_one / 10) % 10]);smg_bit(7, Seg_Table[smg_one % 10]);}else  							//模式3{smg_one = temp;smg_bit(6, Seg_Table[smg_one / 10]);smg_bit(7, Seg_Table[smg_one % 10]);}
}//完成首次温度转换
void init_one()
{unsigned int MSB = 0;unsigned int LSB = 0;init_ds18b20();Write_DS18B20(0xcc);  //忽略ROMWrite_DS18B20(0x44);	//启动温度转化do{init_ds18b20();Write_DS18B20(0xcc);  //忽略ROMWrite_DS18B20(0xbe);	//读取暂存LSB = Read_DS18B20(); //读取低八位MSB = Read_DS18B20(); //读取高八位MSB = (MSB << 8) | LSB;  //合成16位}while(MSB == 85);
}//读取温度
void read_one()
{unsigned int MSB = 0;unsigned int LSB = 0;smg_display();init_ds18b20();Write_DS18B20(0xcc);  //忽略ROMWrite_DS18B20(0x44);	//启动温度转化smg_display();init_ds18b20();smg_display();Write_DS18B20(0xcc);  //忽略ROMWrite_DS18B20(0xbe);	//读取暂存LSB = Read_DS18B20(); //读取低八位MSB = Read_DS18B20(); //读取高八位MSB = (MSB << 8) | LSB;  //合成16位smg_display();if((MSB & 0xf800) == 0x0000)  //如果温度为正{temp = MSB * 0.0625;}smg_display();//上述程序中插入多处数码管刷新,可使显示亮度充足
}void scan_key()
{unsigned char key_mode = 1;   //暂时保存模式值,以便实现按完按键后才改变模式值key_mode = mode;              //获取当前模式if(s4 == 0){delay_key(TKEY);if(s4 == 0){key_mode++;if(key_mode== 4){key_mode = 1;}while(s4 == 0){smg_display();}}}mode = key_mode;
}void init_sys()
{hc573(5, 0x00);hc573(4, 0xff);smg_all(0xff);init_one();      //初始化温度读取
}void main()
{init_sys();while(1){scan_key();  //键盘扫描read_one();  //刷新温度读取}
}
  1. void hc573(unsigned char channel, unsigned char dat):定义了一个函数hc573,用于控制74HC573锁存器芯片,根据通道和数据写入数据。
  2. void delay_smg(unsigned int t):定义了一个延时函数delay_smg,用于实现数码管的延时控制。
  3. void delay_key(unsigned int t):定义了一个延时函数delay_key,用于按键的延时控制。
  4. void smg_all(unsigned char dat):定义了一个函数smg_all,用于控制所有数码管显示相同的数据。
  5. void smg_bit(unsigned char pos, unsigned char dat):定义了一个函数smg_bit,用于控制单个数码管显示特定位置的数据。
  6. void smg_display():定义了一个函数smg_display,根据当前模式和温度值控制数码管显示。
  7. void init_one():定义了一个函数init_one,用于首次温度转换,初始化DS18B20传感器并获取温度值。
  8. void read_one():定义了一个函数read_one,用于读取温度值,启动温度转换并获取温度数据。
  9. void scan_key():定义了一个函数scan_key,用于扫描按键状态并根据按键切换显示模式。
  10. void init_sys():定义了一个函数init_sys,用于系统初始化,包括数码管初始化和温度传感器初始化。
  11. void main():定义了主函数,程序入口,初始化系统后进入主循环,循环中进行按键扫描和温度读取。

这篇关于蓝桥杯单片机快速开发笔记——特训6 温度采样与显示的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/847340

相关文章

Python开发文字版随机事件游戏的项目实例

《Python开发文字版随机事件游戏的项目实例》随机事件游戏是一种通过生成不可预测的事件来增强游戏体验的类型,在这篇博文中,我们将使用Python开发一款文字版随机事件游戏,通过这个项目,读者不仅能够... 目录项目概述2.1 游戏概念2.2 游戏特色2.3 目标玩家群体技术选择与环境准备3.1 开发环境3

电脑显示mfc100u.dll丢失怎么办?系统报错mfc90u.dll丢失5种修复方案

《电脑显示mfc100u.dll丢失怎么办?系统报错mfc90u.dll丢失5种修复方案》最近有不少兄弟反映,电脑突然弹出“mfc100u.dll已加载,但找不到入口点”的错误提示,导致一些程序无法正... 在计算机使用过程中,我们经常会遇到一些错误提示,其中最常见的就是“找不到指定的模块”或“缺少某个DL

一文教你Python如何快速精准抓取网页数据

《一文教你Python如何快速精准抓取网页数据》这篇文章主要为大家详细介绍了如何利用Python实现快速精准抓取网页数据,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录1. 准备工作2. 基础爬虫实现3. 高级功能扩展3.1 抓取文章详情3.2 保存数据到文件4. 完整示例

快速修复一个Panic的Linux内核的技巧

《快速修复一个Panic的Linux内核的技巧》Linux系统中运行了不当的mkinitcpio操作导致内核文件不能正常工作,重启的时候,内核启动中止于Panic状态,该怎么解决这个问题呢?下面我们就... 感谢China编程(www.chinasem.cn)网友 鸢一雨音 的投稿写这篇文章是有原因的。为了配置完

Go语言开发实现查询IP信息的MCP服务器

《Go语言开发实现查询IP信息的MCP服务器》随着MCP的快速普及和广泛应用,MCP服务器也层出不穷,本文将详细介绍如何在Go语言中使用go-mcp库来开发一个查询IP信息的MCP... 目录前言mcp-ip-geo 服务器目录结构说明查询 IP 信息功能实现工具实现工具管理查询单个 IP 信息工具的实现服

Python利用ElementTree实现快速解析XML文件

《Python利用ElementTree实现快速解析XML文件》ElementTree是Python标准库的一部分,而且是Python标准库中用于解析和操作XML数据的模块,下面小编就来和大家详细讲讲... 目录一、XML文件解析到底有多重要二、ElementTree快速入门1. 加载XML的两种方式2.

使用Python开发一个带EPUB转换功能的Markdown编辑器

《使用Python开发一个带EPUB转换功能的Markdown编辑器》Markdown因其简单易用和强大的格式支持,成为了写作者、开发者及内容创作者的首选格式,本文将通过Python开发一个Markd... 目录应用概览代码结构与核心组件1. 初始化与布局 (__init__)2. 工具栏 (setup_t

Spring Shell 命令行实现交互式Shell应用开发

《SpringShell命令行实现交互式Shell应用开发》本文主要介绍了SpringShell命令行实现交互式Shell应用开发,能够帮助开发者快速构建功能丰富的命令行应用程序,具有一定的参考价... 目录引言一、Spring Shell概述二、创建命令类三、命令参数处理四、命令分组与帮助系统五、自定义S

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

Python通过模块化开发优化代码的技巧分享

《Python通过模块化开发优化代码的技巧分享》模块化开发就是把代码拆成一个个“零件”,该封装封装,该拆分拆分,下面小编就来和大家简单聊聊python如何用模块化开发进行代码优化吧... 目录什么是模块化开发如何拆分代码改进版:拆分成模块让模块更强大:使用 __init__.py你一定会遇到的问题模www.