在日常生活中,需要检测人员的体温,而且这个温度范围很小。该系统采集主要以Atmel公司的AT89C51单片机为控制处理核心,由它完成对数据的采集处理以及控制数据在LCD显示屏上的显示。AT89C51单片机是一种低功耗/低电压/高性能的8位单片机,片内带有一个8KB的可编程/可擦除/只读存储器。
在本文中,主要说明单片机与K型热电偶以及K型热电偶模数转换器—MAX6675的组合,形成单片机的温度检测系统。包括:如何根据选择的器件设计外围电路和单片机的接口电路,如何编写控制温度检测器件进行数据传输的单片机程序,如何使用LCD12864进行字符的显示,并简要介绍数字温度传感器MAX6675的应用。
1 系统总体方案设计
1.1 工作原理
1.2 总体设计方案
2 系统硬件设计
2.1 信号采集电路
2.1.1 传感器
2.2 单片机系统电路
2.3 人机交互电路
2.4 温度显示电路
3 仿真电路及硬件分析
4 系统软件设计
4.1 软件设计思路
4.2 程序流程图
4.3 主要程序代码
5 实验结果显示
6 附录及元器件清单
6.1 所用相关软件
6.2 元器件清单
统总体方案设计
1.1 工作原理热电堆基本原理 热电堆是一种热释红外线传感器,它是由热电偶构成的一种器件。它在耳式体温计、放射温度计、电烤炉、食品温度检测等领域中,作为温度检测器件获得了广泛的应用。热电堆的组成基本单元--热电偶。 K型热电偶作为一种温度传感器,K型热电偶通常和显示仪表,记录仪表和电子调节器配套使用。K型热电偶可以直接测量各种生产中从0℃到1300℃范围的液体蒸汽和气体介质以及固体的表面温度。K型热电偶通常由感温元件、安装固定装置和接线盒等主要部件组成,K型热电偶是目前用量最大的廉金属热电偶,其用量为其他热电偶的总和。K型热电偶丝直径一般为1.2~4.0mm。K型热电偶具有线性度好,热电动势较大,灵敏度高,稳定性和均匀性较好,抗氧化性能强,价格便宜等优点,能用于氧化性惰性气氛中广泛为用户所采用。 热电偶测温由热电偶、连接导线及显示仪表三部分组成。如果将热电偶的热端加热,使得冷、热两端的温度不同,则在该热电偶回路中就会产生热电势,这种物理现象就称为热电现象(即热电效应)。在热电偶回路中产生的电势由温差电势和接触电势两部分组成。接触电势:它是两种电子密度不同的导体相互接触时产生的一种热电势。当两种不同的导体A和B相接触时,假设导体A和B的电子密度分别为NA和NB并且NA>NB,则在两导体的接触面上,电子在两个方向的扩散率就不相同,由导体A扩散到导体B的电子数比从B扩散到A的电子数要多。导体A失去电子而显正电,导体B获得电子而显负电。因此,在A、B两导体的接触面上便形成一个由A到B的静电场,这个电场将阻碍扩散运动的继续进行,同时加速电子向相反方向运动,使从B到A的电子数增多,最后达到动态平衡状态。此时A、B之间也形成一电位差,这个电位差称为接触电势。此电势只与两种导体的性质相接触点的温度有关,当两种导体的材料一定,接触电势仅与其接点温度有关。温度越高,导体中的电子就越活跃,由A导体扩散到B导体的电子就越多,接触面处所产生的电动势就越大,即接触电势越大。
MAX6675的工作原理与功能 根据热电偶测温原理,热电偶的输出热电势不仅与测量端的温度有关,而且与冷端的温度有关,使用硬件电路进行冷端补偿时,虽能部分改善测量精度,但由于热电偶使用环境的不同及硬件电路本身的局限性,效果并不明显;而使用软件补偿,通常是使用微处理机表格法或线性电路等方法来减小热电偶本身非线性带来的测量误差,但同时也增加了程序编制及调试电路的难度。MAX6675对其内部元器件参数进行了激光修正,从而对热电偶的非线性进行了内部修正。同时,MAX6675内部集成的冷端补偿电路、非线性校正电路、断偶检测电路都给K型热电偶的使用带来了极大方便,其工作原理如图2所示。 (1) 温度变换 MAX6675内部具有将热电偶信号转换为与ADC输入通道兼容电压的信号调节放大器,T+和T-输入端连接到低噪声放大器A1,以保证检测输入的高精度,同时是热电偶连接导线与干扰源隔离。热电偶输出的热电势经低噪声放大器A1放大,再经过A2电压跟随器缓冲后,送至ADC的输入端。在将温度电压值转换为相等价的温度值之前,它需要对热电偶的冷端进行补偿,冷端温度即是MAX6675周围温度与0℃实际参考值之间的差值。对于K型热电偶, 电压变化率为41μ/℃, 电压可由线性公式Vout=(41μ/℃)×(tR-tAMB)来近似热电偶的特性。上式中, Vout为热电偶输出电压(mV), tR是测量点温度,tAMB是周围温度。 (2)冷端补偿 热电偶的功能是检测热、冷两端温度的差值,热电偶热节点温度可在0℃~+1023.75℃范围变化。冷端即安装MAX6675的电路板周围温度,比温度在-20℃~+85℃范围内变化。当冷端温度波动时,MAX6675仍能精确检测热端的温度变化。 (3) 热补偿 在测温应用中,芯片自热将降低MAX6675温度测量精度,误大小依赖于MAX6675封装的热传导性、安装技术和通风效果。为降低芯片自热引起的测量误差,可在布线时使用大面积接地技术提高MAX6675温度测量精度。 (4) 噪声补偿 MAX6675的测量精度对电源耦合噪声较敏感。为降低电源噪声影响,可在MAX6675的电源引脚附近接入1只0.1μF陶瓷旁路电容。 (5)测量精度的提高 热电偶系统的测量精度可通过以下预防措施来提高:①尽量采用不能从测量区域散热的大截面导线;②如必须用小截面导线,则只能应用在测量区域,并且在无温度变化率区域用扩展导线;③避免受能拉紧导线的机械挤压和振动;④当热电偶距离较远时,应采用双绞线作热电偶连线;⑤在温度额定值范围内使用热电偶导线;⑥避免急剧温度变化;⑦在严劣环境中,使用合适的保护套以保证热电偶导线;⑧仅在低温和小变化率区域使用扩展导线;⑨保持热电偶电阻的事件 (6) SPI串行接口 MAX6675采用标准的SPI串行外设总线与MCU接口,且MAX6675只能作为从设备。MAX6675 SO端输出温度数据的格式如图3所示,MAX6675 SPI接口时序如图4所示。MAX6675从SPI串行接口输出数据的过程如下:MCU使CS变低并提供时钟信号给SCK,由SO读取测量结果。CS变低将停止任何转换过程;CS变高将启动一个新的转换过程。一个完整串行接口读操作需16个时钟周期,在时钟的下降沿读16个输出位,第1位和第15位是一伪标志位,并总为0;第14位到第3位为以MSB到LSB顺序排列的转换温度值;第2位平时为低,当热电偶输入开放时为高,开放热电偶检测电路完全由MAX6675实现,为开放热电偶检测器操作,T-必须接地,并使能地点尽可能接近GND脚;第1位为低以提供MAX6675器件身份码,第0位为三态。
LCD12864显示原理 在数字电路中,所有的数据都是以0和1保存的,对LCD控制器进行不同的数据操作,可以得到不同的结果。对于显示英文操作,由于英文字母种类很少,只需要8位(一字节)即可。而对于中文,常用却有6000以上,于是我们的DOS前辈想了一个办法,就是将ASCII表的高128个很少用到的数值以两个为一组来表示汉字,即汉字的内码。而剩下的低128位则留给英文字符使用,即英文的内码。 那么,得到了汉字的内码后,还仅是一组数字,那又如何在屏幕上去显示呢?这就涉及到文字的字模,字模虽然也是一组数字,但它的意义却与数字的意义有了根本的变化,它是用数字的各位信息来记载英文或汉字的形状,如英文的'A'在字模的记载方式如图1所示: 图1 “A”字模图 而中文的“你”在字模中的记载却如图2所示: 图2 “你”字模图 根据芯片的不同取模的方式不同,有多种取模方式:单色点阵液晶字模,横向取模,字节正序,单色点阵液晶字模,横向取模,字节倒序,单色点阵液晶字模,纵向取模,字节正序,单色点阵液晶字模,纵向取模,字节倒序等等。 1.2 总体设计方案本系统采用的是K型热电偶采集温度,因此本设计有温度采集部分,数据处理部分,温度显示部分,故障显示并显示部分组成。AT89S52单片机以及单片机的外围电路由晶振电路,复位电路,温度采集电路,温度显示电路,报警电路组成。系统设计框图如下: 系统框图 温度采集部分 先使用K型热电偶对环境温度进行检查,再经过K型热电偶模数转换器—MAX6675,进行温度转换,将环境温度转换成12位二进制数据采集进单片机,以便单片机进行数据处理。在本系统中,由于是4路温度采集,因此使用串行的方式,依次对4路温度进行采集,并用单片机的P2口来传输与反馈数据。 数据处理部分 利用算法,在单片机中对采集到的数据进行处理,并转换成百、十、个位通过P0口进行输出。 温度显示部分 通过调用LCD的显示函数,将温度以两行的方式实时地显示在LCD上。 超限报警部分 通过软件算法,检测4路的温度是否超出人体正常体温,一旦超过这个范围,则进行报警,并在LCD上显示“发烧”,并且同时通过蜂鸣器以及LED灯,来进行声光报警。当检测到热电偶出现断耦时,在LCD上显示“断耦”,并且同时通过点亮对应的LED灯进行报警。
2 系统硬件设计2.1 信号采集电路2.1.1 传感器 该部分为四路温度采集,采用K型热电偶与K型热电偶数模转换器-MAX6675互相搭配的方式,如下图所示: 以其中一路为例,MAX6675的冷热接收端分别于热电偶的冷热端相连,其串行数据输出端分别与单片机的P2口相连。 Maxim公司新近推出的MAX6675是一复杂的单片热电偶数字转换器, 内部具有信号调节放大器、12位的模拟数字化热电偶转换器、冷端补偿传感和校正、数字控制器、1个SPI兼容接口和1个相关的逻辑控制。MAX6675内部集成有冷端补偿电路;带有简单的3位串行SPI接口;可将温度信号转换成12位数字量,温度分辨率达0.25℃;内含热电偶断线检测电路。冷端补偿的温度范围-20℃~80℃,它的温度分辨能力为0. 25 ℃,可以测量0℃~1023.75℃的温度,工作电压为3. 0~5. 5V。 MAX6675的主要特性如下: ①简单的SPI串行口温度值输出; ②0℃~+1024℃的测温范围; ③12位0.25℃的分辨率; ④片内冷端补偿; ⑤高阻抗差动输入; ⑥热电偶断线检测; ⑦单一+5V的电源电压; ⑧低功耗特性; ⑨工作温度范围-20℃~+85℃; ⑩2000V的ESD信号。 该器件采用8引脚SO帖片封装。引脚排列如图1所示,引脚功能如下表所列。  为了正确使用MAX6675芯片,设计时还必须注意以下几点: (1)利用输出数据中的D2进行断偶检测时,热电偶的输入负极T·必须接地,且应尽可能地靠近MX6675的引脚地(即PIN1) (2)由于冷端温度是由MAX6675本身检测的因此为了提髙测量的精确度电路板的地线尽可能地大; (3)由于热电偶信号为微弱信号,因此要尽可能地釆取措施防止噪声千扰。可在MAX675电源与地线之间接个0.1uF的陶瓷电容。 以下是具体电路:这里只给出一路
2.2 单片机系统电路AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低电压,高性能CMOS8位微处理器,俗称单片机。单片机的可擦除只读存储器可以反复擦除100次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。 主要特性:
1、与MCS-51 兼容 2、4K字节可编程闪烁存储器 3、1000写/擦循环数据保留时间10年 4、全静态工作,0Hz-24Hz·三级程序存储器锁定 5、128*8位内部RAM32可编程I/O线 6、两个16位定时器/计数器 7、5个中断源 8、可编程串行通道低功耗的闲置和掉电模式 9、片内振荡器和时钟电路 主要管脚说明: P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。 P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。 P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。 P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。 以下是单片机系统的电路图: 2.3 人机交互电路通过蜂鸣器和4颗红色LED可以判断被检测者体温是否发热。当体温状况是大于37.1℃即发烧时,蜂鸣器响,四颗LED灯亮,LCD显示发烧者的温度;人员可以通过SOUND和STOP/RESET来控制蜂鸣器和检测是否暂停;电源指示灯用来表示系统是否已经通电;当系统检测断耦时,四颗LED会对应四个热电偶,如果出现断耦,对应的LED会亮,LCD显示屏上也会显示“断耦”字符。 以下是各个人机交换电路的设计图: 2.4 温度显示电路该部分是通过LCD进行对温度数据的显示其使能端与P3口相连,数据输入端与P0口相连,如下图所示是仿真软件中的电路: 下图所示是实际电路中的设计,使用的是一个2.54间距20Pin的排针插座: 附系统原理图: 3 仿真电路及硬件分析仿真系统使用Protues 8 Professional软件进行仿真。仿真电路可以分为主控模块、温度采集模块、温度显示模块、声光警报模块和按键模块。温度采集模块使用四颗K型热电偶和四颗MAX6675芯片,声光报警系统使用一个蜂鸣器和四个红色LED,主控模块主要采用AT89C51芯片,温度显示模块使用一块不带中文字库的LCD12864显示屏,按键模块由两个带锁开关组成。 进过仿真测试,各个功能可以达到设计的要求。MAX6675的分辨率为0.25℃,在模拟中,可以测试出在此误差条件下,改测量系统对温度的采集符合设计要求。
仿真图1:系统开机初始界面: 仿真图2:正常测体温,未发现发热状况 仿真图3:正常测体温,发现发热状况,并发出声光报警 仿真图4:正常测体温,1路采集发生断耦,未发现发热状况,并发出光警报 4 系统软件设计4.1 软件设计思路程序开始后,先初始化LCE12864显示屏,在开机界面显示“欢迎使用 智能温度 检测系统 深圳大学”的文字,延时一定时间后进行清屏工作。 下面进入while循环。读取存储四个MAX6675芯片上测量的K型热电偶的温度值并进行标度转换,并且根据MAX6675输出数据上的D2位是否置1来判断是否短线,如果短线,则将输出数据置0,并且在热电偶对应的LED长亮,由此来判断哪只电偶出现断线。由于MAX6675的转换时间的典型值是0.17s,最大值是0.22s,所以在转换时,要加入一定时间的延迟。然后将标度转换后的温度数据在LCD显示屏上显示出。此时对4路温度进行判断,如果测量的体温已经大于37.1℃则说明被测者已经发热,37.3-38℃是低烧,38.1-40℃是高烧。此时,仪器产生声光警报,暂停测量,引入2个外部按键开关中断,如果STOP/RESET按键置低电位,则继续测量,置高电位表示保持暂停转态,方便人员进行数据记录; 如果SOUND按键置低电位,表示关闭蜂鸣器。如果在测量的过程中未发现发热状况,人员也可以对STOP/RESET按键置低电位,来暂停测量,对SOUND按键置低电位,表示关闭蜂鸣器。 4.2 程序流程图4.3 主要程序代码数据获取部分
由于MAX6675采用的是12位二进制的串行数据输出的方式,而且,其有效的数据分别在3~~14位,因此需要进行串行数据的移位操作,MAX6675最大数值为1023.75,而AD精度为12位,即2的12次方为4096,转换对应数,故要除4(*0.25)。转换公式是:实际温度=Temp_1*0.25-24.1。以下为部分软件算法:
/***********************************************************
函数名称:Re_Convert_1()
函数功能:读取第一颗MAX6675芯片上的原始数据
入口参数:
出口参数:温度Temp_1
***********************************************************/
float Re_Convert_1()
{
uchar i;
int cut_off_flag = 1;
unsigned int Temp_1;
Temp_1=0;
CS=1;
SCK=0;
_nop_();
_nop_();
CS=0;
for(i=0;i<16;i++) //获取16位MSB
{
Temp_1<<=1; //sck置低
_nop_();
SCK=1;
if(SO1==1)//取当前值
{
Temp_1=Temp_1|0x01;
}
else
Temp_1=Temp_1|0x00;
_nop_();
SCK=0;
_nop_();
}
cut_off_flag = (Temp_1>>2)&0x0001; //当断耦时,D2位置1
if(cut_off_flag == 1) //断偶标志是 0的话,断开
{
flag1 = 0;
}
else flag1 = 1;
Temp_1=Temp_1<<1; //去掉第15位
Temp_1=Temp_1>>4; //去掉第0~2位
return(Temp_1);
}
以上算法把数据左移移一位,然后再右移四位,从而得到完整的12位二进制温度数据。
数据显示部分
LCD上的汉字以及数据,都需要使用相应的字模软件来对汉字和数据进行编码,并存储在相应的数组中,通过相应的函数调用,将所需显示的数据,按照相应的格式显示在LCD上,以下为部分软件算法:
汉字显示函数:
void Display_HZ(uchar screen,uchar page,uchar column,uchar *p)
{
uchar i;
SelectScreen(screen);
Set_page(page); //写上半页:16*8
Set_column(column*16); //控制列
for(i=0;i<16;i++) //控制16列的数据输出,左右各64个点,可显示4个汉字
{
write_LCD_data(p); //汉字的上半部分
}
Set_page(page+1); //写下半页:16*8
Set_column(column*16); //控制列
for(i=0;i<16;i++) //控制16列的数据输出
{
write_LCD_data(p[i+16]); //汉字的下半部分
}
}
数字显示函数:
void Display_ASCII(uchar screen,uchar page,uchar column,uchar *p) //左右各64个点,可显示8个字符
{
uchar i;
SelectScreen(screen);
Set_page(page);
Set_column(column);
for(i=0;i<8;i++) //显示字符上半部分:8*8
{
write_LCD_data(p);
}
Set_page(page+1); //显示字符下半部分:8*8
Set_column(column);
for(i=0;i<8;i++)
{
write_LCD_data(p[i+8]);
}
}
调用方式如下:
Display_HZ(1,0,2,huan);
Display_HZ(1,0,3,ying);
Display_ASCII(1,0,0*8,shuzi[10]);
Display_ASCII(1,0,1*8,shuzi[1]);
以下为LCD显示测量温度函数部分:(以1路为例)
void Disp_temp()
{
temp1=(int)(wendu1*10);
if(wendu1)
{
fen1=temp1%10;
temp1=temp1/10;
ge1=temp1%10;
shi1=temp1/10;
Display_ASCII(1,0,5*8,shuzi[fen1]);
Display_ASCII(1,0,3*8,shuzi[ge1]);
Display_ASCII(1,0,2*8,shuzi[shi1]);
}
else if(wendu1==0)
{
Display_ASCII(1,0,5*8,shuzi[0]);
Display_ASCII(1,0,3*8,shuzi[0]);
Display_ASCII(1,0,2*8,shuzi[0]);
}
Display_HZ(1,0,0,fuhao_1);
Display_ASCII(1,0,4*8,shuzi[13]);
Display_HZ(1,0,3,fuhao_ssd);
}
断耦检测函数
如果热电偶发生断耦标志位wendu=1,则LED长亮。
void cut_off_flag()
{
if(flag1 == 0)
{
LED1 = 1;
wendu1 = 0;
Display_HZ(1,6,3,duan);
Display_HZ(2,6,0,ou);
}
if(flag2==0)
{
LED2 = 1;
wendu2 = 0;
Display_HZ(1,6,3,duan);
Display_HZ(2,6,0,ou);
}
if(flag3==0)
{
LED3 = 1;
wendu3= 0;
Display_HZ(1,6,3,duan);
Display_HZ(2,6,0,ou);
}
if(flag4==0)
{
LED4 = 1;
wendu4 = 0;
Display_HZ(1,6,3,duan);
Display_HZ(2,6,0,ou);
}
}
发烧检测函数
如果四个热电偶其中有一个检测到发烧,则暂停检测、LED长亮、蜂鸣器响、显示字符“发烧xx.x℃”;按STOP/RESET键可复位重新进行检测。
void fever_check()//发烧检测
{
float wendu_H;
int wenduH,fenH,geH,shiH;
if((wendu1<37.1) && (wendu2<37.1) && (wendu3<37.1) && (wendu4<37.1)) //检测是否发烧
{
SPEAKER = 0;//蜂鸣器不响,LED不亮
LED1 = 0;
LED2 = 0;
LED3 = 0;
LED4 = 0;
}
else
{
if(SOUND == 0) //外部按键中断,蜂鸣器的控制
{
SPEAKER =0;
}
else
SPEAKER = 1;//蜂鸣器响
LED1 = 1;//LED亮
LED2 = 1;
LED3 = 1;
LED4 = 1;
if((wendu1-wendu2)>0.0001)
{
wendu_H = wendu1;
}
else
{
wendu_H = wendu2;
}
if((wendu_H<wendu3)>0.001)
{
wendu_H = wendu3;
}
if((wendu_H<wendu4)>0.001)
{
wendu_H = wendu4;
}
wenduH=(int)(wendu_H*10);
fenH=wenduH%10;
wenduH=wenduH/10;
geH=wenduH%10;
shiH=wenduH/10;
Display_ASCII(1,4,6*8,shuzi[shiH]);
Display_ASCII(1,4,7*8,shuzi[geH]);
Display_ASCII(2,4,0*8,shuzi[13]);
Display_ASCII(2,4,1*8,shuzi[fenH]);
Display_HZ(1,4,1,fa);
Display_HZ(1,4,2,sao);
Display_HZ(2,4,1,fuhao_ssd);
for(;STOP == 1;) //当检测到发烧时,暂停
{
if(SOUND == 0) //外部按键中断,蜂鸣器的控制
{
SPEAKER =0;
}
else
SPEAKER = 1;//蜂鸣器响
}
ClearScreen(0);
}
for(;STOP == 0;) //外部按键中断,暂停
{
}
}
实验结果显示将实物连接起来后的PCB电路如下所示: 图5-1 实物图-正面 图5-1 实物图-背面 6 附录及元器件清单6.1 所用相关软件- Keil——51系列兼容单片机C语言软件开发系统
- ISIS——proteus仿真软件
- Altium——Altium Designer 9 PCB绘制软件
图6-1 本设计所用相关软件 6.2 元器件清单7 总结及体会(写下总结及体会,以及对授课方式等的意见和建议。) 刚开始对于体温检测传感器的选择,不是很正确,走了一下弯路。在老师指导后才知道使用热电堆进行体温的检测会更加准确合理。在热电偶的选择上也是查阅了好多资料,对比现存的很多设计方案,从系统的复杂性、精确度和原件价格入手,采用了采用K型热电偶与K型热电偶模数转换器—MAX6675的组合。显示器上也使用了LCD12864,可以实现中英文显示,使用方便。 确定好方案后,在对MAX6675的串行数据进行Protues仿真读取时,却出现了很多小问题。MAX6675与单片机的通讯中,对片选和时钟电平如果没有适当延时的话会出现错误的数据,并且花费了很多时间才解决掉这一问题,同时出现的问题还有MAX6675芯片的输出数据在Protues仿真和芯片数据手册的输出数据是不一样的,这一点原先不知道,也是花费了很长时间才意识到Protues仿真得出的结果和实际结果存在几十℃的偏差,这才解决掉输出温度误差很大的问题。起初温度数据的误差大不正常还以为是时序有问题,修改了很多遍SPI通讯的代码,在花费很长时间后才发现最初的代码没错,而是Protues的问题。 在LCD12864上显示数字和文字也出现了一个问题,本身代码没有问题,但是因为keil5的一个设置(Memory Model需要选择Small,否则会出错),会导致在代码成功的条件下运行出错,导致LCD显示屏一直乱码。也是花了一段时间梳理代码,确保代码没出错后,才解决问题。
全部资料51hei下载地址:
智能体温检测.7z
(2.18 MB, 下载次数: 266)
|