单片机实验13:用热敏电阻和ADC实现测量温度

2024-03-30 04:38

本文主要是介绍单片机实验13:用热敏电阻和ADC实现测量温度,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

实验中使用的芯片为XPT2046,点击了解XPT2046

实验源代码:

  • XPT2046.h
#include <reg52.h>				
#include <intrins.h>#define uint unsigned int
#define uchar unsigned charsbit DIN = P3^4;		 	
sbit ADCS = P3^5;
sbit DCLK = P3^6;
sbit DOUT = P3^7;sbit led2 = P2^2;
sbit led3 = P2^3;
sbit led4 = P2^4;void WRITE_AD(uchar dat);	//写入数据函数声明
uint READ_AD();				//读取数据函数声明
uint LOAD_AD(uchar cmd);	//载入数据函数声明
  • XPT2046.C
#include "XPT2046.h"	   //引入头文件void WRITE_AD(uchar dat)   //写入数据函数定义
{uchar i;DCLK = 0;for(i=0; i<8; i++)	   //对8位数据进行操作{DIN = dat >> 7;	   //将dat右移7位,将最高位置于数据读取位	dat <<= 1;		   //再将dat左移一位,这时dat本身才发生变化DCLK = 0;			DCLK = 1;}
}uint READ_AD()			   //读取数据函数定义
{uint i, dat=0;DCLK = 0;for(i=0; i<12; i++)		{dat <<= 1;		   //先将dat左移一位DCLK = 1;DCLK = 0;dat |= DOUT;}return dat;
}uint LOAD_AD(uchar cmd)	   //载入数据函数定义
{uchar i;uint AD_Value;DCLK = 0;			   //时钟置位0ADCS  = 0;			   //片选拉低WRITE_AD(cmd);		   //写入数据for(i=6; i>0; i--);    //预留一点时间用于数据转化	DCLK = 1;	  		   //延时两个时钟周期_nop_();_nop_();DCLK = 0;_nop_();_nop_();AD_Value=READ_AD();	   //读取数据并赋值给AD_ValueADCS = 1;			   //片选拉高return AD_Value;	   //返回AD_Value
}
  • TEM.C
#include "XPT2046.h"		//引入头文件number[8];					//建立一个用于数码管显示数据存放的数组
uchar code duanxuan_xs[] = {0xbf,0x86,0xdb,0xcf,  //0,1,2,30xe6,0xed,0xfd,0x87,  //4,5,6,70xff,0xef};			  //8,9(有小数点)uchar code duanxuan[] = {0x3f,0x06,0x5b,0x4f,	  //0,1,2,30x66,0x6d,0x7d,0x07,	  //4,5,6,70x7f,0x6f,0x77,0x7c,	  //8,9,A,B0x39,0x5e,0x79,0x71};	  //C,D,E,F		段选void delay_xms(uchar i)		//延时函数
{uchar m;for(;i>0;i--)for(m=110;m>0;m--);
}void data_AD(uchar time)	//获取数据函数
{uint temp = 0;			//temp临时变量用于存放获取的数据,0 ~ 4095分辨率double C;				//双精度浮点型C用于存放数据转化为摄氏度的大小uint c;					//将浮点型C变为整型,用于数码管显示if(time == 50)			//当time=50时,才进行一次数据获取{temp = LOAD_AD(0XD4);C = ((125.000/4095)*temp)-40;	//XPT2046测量范围为-40℃ ~ +85℃,因此跨越幅度为125,最后还要减去负的40c = 10*C;}number[0] = duanxuan[c/100];		//十位number[1] = duanxuan_xs[c%100/10];	//个位(带小数点)number[2] = duanxuan[c%10];			//十分位number[3] = 0x39;					//显示摄氏度符号“C”//number[4] = duanxuan[temp/1000];//number[5] = duanxuan[temp%1000/100];//number[6] = duanxuan[temp%100/10];//number[7] = duanxuan[temp%10];
}void display()    //数码管显示函数
{int i;for(i=0;i<4;i++)  //4代表只有前四位数码管显示{switch(i){case(0):led2=1,led3=1,led4=1;break;case(1):led2=0,led3=1,led4=1;break;case(2):led2=1,led3=0,led4=1;break;case(3):led2=0,led3=0,led4=1;break;case(4):led2=1,led3=1,led4=0;break;			 case(5):led2=0,led3=1,led4=0;break;case(6):led2=1,led3=0,led4=0;break;case(7):led2=0,led3=0,led4=0;break;}P0 = number[i];	  //P0的段选来调控每一位显示的内容delay_xms(10);	  //延时10msP0 = 0x00;		  //消影}
}void main()
{uchar time = 0;		 	//无符号整型time,用于控制是否进行数据获取while(1){data_AD(time);	 	//数据获取函数display();		 	//数码管显示函数time = (time+1)%51; //当time到达51时,重新从0开始计算}
}
  • 运行结果

在这里插入图片描述

  • 实验总结
    这个实验还是花了我挺多时间的,中间出现错误,总是想不出来原因,但最后总算克服了,完成了实验。
    虽说是完成了实验,但是还是有不足之处的,比如温度测量范围是 - 40℃~+85℃,但是这个实验其实真正的测量范围只有0℃ ~ +85℃,因为很容易看到temp和c的数据类型都是uint——无符号整型,那么如果小于0,自然会出现错误。
    而且小于0之后要做的工作还要一些,比如数码管显示数字的位置要发生变化,需要空出第一个位置,来显示正负,而这个数字究竟是正还是负,又需要另一个临时变量来记录,然后在display函数内加入多一个判断条件,最终来决定是否要显示 “-” 号。还有就是temp和c的数据类型也要随之改变为有符号型,但是数码管要显示的数字可不分正负,因此在临时变量时需要区分正负,但是回到数码管显示时又需要去数字的绝对值,因此需要做的工作还很多。

这篇关于单片机实验13:用热敏电阻和ADC实现测量温度的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

HTML5 getUserMedia API网页录音实现指南示例小结

《HTML5getUserMediaAPI网页录音实现指南示例小结》本教程将指导你如何利用这一API,结合WebAudioAPI,实现网页录音功能,从获取音频流到处理和保存录音,整个过程将逐步... 目录1. html5 getUserMedia API简介1.1 API概念与历史1.2 功能与优势1.3

Java实现删除文件中的指定内容

《Java实现删除文件中的指定内容》在日常开发中,经常需要对文本文件进行批量处理,其中,删除文件中指定内容是最常见的需求之一,下面我们就来看看如何使用java实现删除文件中的指定内容吧... 目录1. 项目背景详细介绍2. 项目需求详细介绍2.1 功能需求2.2 非功能需求3. 相关技术详细介绍3.1 Ja

使用Python和OpenCV库实现实时颜色识别系统

《使用Python和OpenCV库实现实时颜色识别系统》:本文主要介绍使用Python和OpenCV库实现的实时颜色识别系统,这个系统能够通过摄像头捕捉视频流,并在视频中指定区域内识别主要颜色(红... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间详解

PostgreSQL中MVCC 机制的实现

《PostgreSQL中MVCC机制的实现》本文主要介绍了PostgreSQL中MVCC机制的实现,通过多版本数据存储、快照隔离和事务ID管理实现高并发读写,具有一定的参考价值,感兴趣的可以了解一下... 目录一 MVCC 基本原理python1.1 MVCC 核心概念1.2 与传统锁机制对比二 Postg

SpringBoot整合Flowable实现工作流的详细流程

《SpringBoot整合Flowable实现工作流的详细流程》Flowable是一个使用Java编写的轻量级业务流程引擎,Flowable流程引擎可用于部署BPMN2.0流程定义,创建这些流程定义的... 目录1、流程引擎介绍2、创建项目3、画流程图4、开发接口4.1 Java 类梳理4.2 查看流程图4

C++中零拷贝的多种实现方式

《C++中零拷贝的多种实现方式》本文主要介绍了C++中零拷贝的实现示例,旨在在减少数据在内存中的不必要复制,从而提高程序性能、降低内存使用并减少CPU消耗,零拷贝技术通过多种方式实现,下面就来了解一下... 目录一、C++中零拷贝技术的核心概念二、std::string_view 简介三、std::stri

C++高效内存池实现减少动态分配开销的解决方案

《C++高效内存池实现减少动态分配开销的解决方案》C++动态内存分配存在系统调用开销、碎片化和锁竞争等性能问题,内存池通过预分配、分块管理和缓存复用解决这些问题,下面就来了解一下... 目录一、C++内存分配的性能挑战二、内存池技术的核心原理三、主流内存池实现:TCMalloc与Jemalloc1. TCM

OpenCV实现实时颜色检测的示例

《OpenCV实现实时颜色检测的示例》本文主要介绍了OpenCV实现实时颜色检测的示例,通过HSV色彩空间转换和色调范围判断实现红黄绿蓝颜色检测,包含视频捕捉、区域标记、颜色分析等功能,具有一定的参考... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间

Python实现精准提取 PDF中的文本,表格与图片

《Python实现精准提取PDF中的文本,表格与图片》在实际的系统开发中,处理PDF文件不仅限于读取整页文本,还有提取文档中的表格数据,图片或特定区域的内容,下面我们来看看如何使用Python实... 目录安装 python 库提取 PDF 文本内容:获取整页文本与指定区域内容获取页面上的所有文本内容获取

基于Python实现一个Windows Tree命令工具

《基于Python实现一个WindowsTree命令工具》今天想要在Windows平台的CMD命令终端窗口中使用像Linux下的tree命令,打印一下目录结构层级树,然而还真有tree命令,但是发现... 目录引言实现代码使用说明可用选项示例用法功能特点添加到环境变量方法一:创建批处理文件并添加到PATH1