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

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

实验源代码:

  • XPT2046.h
#include <reg52.h>				
#include <intrins.h>

#define uint unsigned int
#define uchar unsigned char

sbit 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;			   //时钟置位0
	ADCS  = 0;			   //片选拉低
	WRITE_AD(cmd);		   //写入数据
	for(i=6; i>0; i--);    //预留一点时间用于数据转化	
	DCLK = 1;	  		   //延时两个时钟周期
	_nop_();
	_nop_();
	DCLK = 0;
	_nop_();
	_nop_();
	AD_Value=READ_AD();	   //读取数据并赋值给AD_Value
	ADCS = 1;			   //片选拉高
	return AD_Value;	   //返回AD_Value
}
  • TEM.C
#include "XPT2046.h"		//引入头文件

number[8];					//建立一个用于数码管显示数据存放的数组
uchar code duanxuan_xs[] = {0xbf,0x86,0xdb,0xcf,  //0,1,2,3
							0xe6,0xed,0xfd,0x87,  //4,5,6,7
							0xff,0xef};			  //8,9(有小数点)

uchar code duanxuan[] = {0x3f,0x06,0x5b,0x4f,	  //0,1,2,3
						 0x66,0x6d,0x7d,0x07,	  //4,5,6,7
					 	 0x7f,0x6f,0x77,0x7c,	  //8,9,A,B
						 0x39,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,最后还要减去负的40
		c = 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);	  //延时10ms
		P0 = 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的数据类型也要随之改变为有符号型,但是数码管要显示的数字可不分正负,因此在临时变量时需要区分正负,但是回到数码管显示时又需要去数字的绝对值,因此需要做的工作还很多。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值