温度采集与显示系统Word文件下载.docx
《温度采集与显示系统Word文件下载.docx》由会员分享,可在线阅读,更多相关《温度采集与显示系统Word文件下载.docx(30页珍藏版)》请在冰豆网上搜索。
![温度采集与显示系统Word文件下载.docx](https://file1.bdocx.com/fileroot1/2022-11/26/0d2bbb83-cda5-49c6-9da3-fd47f5b0ba23/0d2bbb83-cda5-49c6-9da3-fd47f5b0ba231.gif)
3)将ALE由低电平置为高电平,从而将ADDA-ADDC送进的通道代码锁存,经译码后通道0的模拟量送给内部转换单元。
4)给START一个正脉冲。
当上升沿时,所有内部寄存器清零。
下降沿时,开始进行A/D转换;
在转换期间,START保持低电平。
5)EOC为转换结束信号。
在上述的A/D转换期间,可以对EOC进行不断测量,当EOC为高电平时,表明转换结束。
否则,表明正在进行A/D转换.
6)当A/D转换结束后,将OE设置为1,这时D0-D7的数据便可以读取了。
OE=0,D0-D7输出端为高阻态,OE=1,D0-D7端输出转换的数据.
3、数据处理部分-—--查表和线性插值法
热敏电阻为一种阻值随温度变化的电阻,按其变化关系可分为两类:
正温度系数(简称PTC)和负温度系数(简称NTC)。
PTC元件的阻值随温度的上升而上升,NTC元件的阻值随温度的上升而下降.本模块中使用的为NTC型热敏电阻,在常温(25℃)下其阻值为10K,其阻值与温度的关系、阻值与电压的关系、电压值与电压AD值得关系如下表所示:
温度(℃)
-30
—20
—10
10
20
25
30
40
50
阻值(K)
176.0
96。
29
54。
85
32.41
19。
80
12.47
10。
00
8.066
5。
342
3。
618
电压(V)
0。
26881720
47041113
0.77101002
1.17896722
1.67785234
2.22518914
2。
5
76762980
25902750
67161110
电压AD
14
24
39
60
86
114
128
142
167
188
70
90
100
110
120
130
140
150
502
1。
763
1.265
0.9226
6834
0.5158
0.3942
3048
0.2382
1881
3.99936010
4.25061633
4.43852640
4。
57766465
68015800
75474999
4.81037501
85210775
4.88367095
90768641
205
218
228
235
240
244
247
249
250
252
在上面列的表格中,温度与阻值的关系是已知的,电压是根据式3-1得出的,电压的AD值是根据式2—1得出的。
电压V与电压AD的关系:
(2—1)
4电压AD值与温度关系折线图
根据图2。
4可用线性插值法在线性区间建立函数关系,随着电压的改变输出温度值.
三、硬件电路图
图3。
1热敏电阻温度采集电路图
图3.1中J1、J2、J3分别对应于模块上的V1、Vzero、Vout插孔,R3对应与ZERO电位器,用于偏置电压调节;
R9对应于GAIN电位器,用于增益调节.使用时,可先将电路增益调节为1,具体做法如下:
调节ZERO电位器,使Vzero=0V,用万用表分别测量V1、Vout端电压,调节GAIN电位器,使V1=Vout,此时电路增益为1。
由此可得出电压与电阻之间的关系:
(3-1)
四、程序设计流程图
图4。
1主函数程序流程图
2LCD显示流程图
3A/D转换流程图
3中断服务程序
五、问题和不足
出现的问题及解决方法:
在数据处理部分,之前是建立电压值V与温度值T的关系来显示温度,发现再怎么细分线性部分,输出的温度误差还是很大,而且显示的温度值一直在跳变。
于是决定找电压值AD与温度之间的关系,这样减小了误差,显示的温度值也几乎不再跳变了。
不足之处:
实验台提供的可调输出电压的范围是0-4.5V,正确来说显示的温度范围应为-35
至90
。
这样选定的线性区间才能较小误差,更趋近与表格提供的数值.所以,更细分的取线性部分得到的数值会更好。
六、总结
通过此次实习,使我对所学知识进行了实践。
掌握了A/D转换芯片性能及编程方法、单片机系统中扩展LCD显示的方法以及温度传感器和LCD的工作原理及综合应用。
在数据处理部分学会了线性插值法。
在编写程序时,也发现对一些程序中的函数的处理不够合理,在自己的多次运行下,还是能够实现温度监控的功能.本次单片机实训让我很有成就感,并对以前所学的单片机知识做了一个小结。
附件
#include〈reg51。
h〉
#include〈stdio.h〉
#include<
intrins.h>
#include〈absacc.h>
#defineucharunsignedchar
#defineulongunsignedlong
#defineuintunsignedint
#definePort_addressXBYTE[0X0CFA0]
sbitREQ=P3^5;
//请求信号,高电平有效
sbitBUSY=P3^4;
//忙检测
sbitEOC=P3^2;
//转换结束信号,EOC=1—转换结束,EOC=0—正在转换
voiddelay1ms(uinttime)//延迟子程序1
{
uintii;
uintjj;
for(ii=0;
ii〈time;
ii++)
for(jj=0;
jj<
200;
jj++);
}
voiddelay(uinttime)//延迟子程序2
{
uintii;
for(ii=0;
for(jj=0;
110;
jj++);
}
voidwrite_dat(uchardat)//OCMJ2X8写时序操作
if(BUSY==0)
{
delay1ms
(1);
P1=dat;
REQ=1;
REQ=0;
}
}
voidwrite_chinese(ucharx,uchary,ucharh,ucharl)//OCMJ2X8写汉字操作
write_dat(0xF0);
//写汉字命令
write_dat(x);
//写横坐标(取值范围:
00—07,02-09,00-09)
write_dat(y);
//写纵坐标(取值范围:
00—01,00—03,00-04)
write_dat(h);
//写汉字码—高位
write_dat(l);
//写汉字码-低位
}
voidwrite_ASCII_8x16(ucharx,uchary,uchara)//OCMJ2X8写ASCII字符(8x16)操作
write_dat(0xF9);
//写ASCII字符(8x16)命令
00—0F,04-13,00-13)
00-1F,00—3F,00—4F)
write_dat(a);
//写ASCII码
}
voidwrite_point(ucharx,uchary)//OCMJ2X8画点(1x1)操作
write_dat(0xF2);
//写画点命令
write_dat(x);
00—7F,20-9F,00-9F)
write_dat(y);
00—40,00-40,00-40)
voidclear_lcd()//OCMJ2X8清屏操作
write_dat(0xF4);
voidlcd_init()
REQ=0;
BUSY=1;
clear_lcd();
/********电压AD显示函数*******/
voiddisplay_digit(uintdate)//分离任意三位数,给LCD送数
{
ucharbai,shi,ge;
bai=date/100;
shi=date%100/10;
ge=date%10;
write_ASCII_8x16(0,16,0x41);
//显示"
AD”
write_ASCII_8x16(1,16,0x44);
write_ASCII_8x16(2,16,0x3A);
//显示”:
"
write_ASCII_8x16(3,16,0x30+bai);
write_ASCII_8x16(4,16,0x30+shi);
write_ASCII_8x16(5,16,0x30+ge);
/*******电压V显示函数*********/
voiddisplay_voltage(uintdate)//分离任意五位数,给LCD送数
ucharwan,qian,bai,shi,ge;
wan=date/10000;
qian=date%10000/1000;
bai=date%10000%1000/100;
shi=date%10000%1000%100/10;
write_chinese(0,0,18,41);
//显示”采集电压"
write_chinese(1,0,28,15);
write_chinese(2,0,21,71);
write_chinese(3,0,49,25);
write_ASCII_8x16(8,0,0x3A);
:
write_ASCII_8x16(9,0,0x30+wan);
write_ASCII_8x16(10,0,0x2E);
//显示小数点
write_ASCII_8x16(11,0,0x30+qian);
write_ASCII_8x16(12,0,0x56);
//显示电压符号V
/******温度值显示函数**********/
voiddisplay_temperature(intdate)//分离任意四位数,方便给LCD送数
{
ucharqian,bai,shi,ge;
write_chinese(3,1,46,34);
write_chinese(4,1,22,40);
//显示"
温度"
if(date>
=0)
qian=date/1000;
bai=date%1000/100;
shi=date%1000%100/10;
ge=date%10;
write_ASCII_8x16(10,16,0x2b);
//显示正号+
write_ASCII_8x16(11,16,0x30+qian);
write_ASCII_8x16(12,16,0x30+bai);
write_ASCII_8x16(13,16,0x2E);
//显示小数点
write_ASCII_8x16(14,16,0x30+shi);
write_ASCII_8x16(15,16,0x30+ge);
}
if(date<
0)
date=-date;
qian=date/1000;
bai=date%1000/100;
shi=date%1000%100/10;
ge=date%10;
write_ASCII_8x16(10,16,0x2d);
//显示负号—
write_ASCII_8x16(11,16,0x30+qian);
write_ASCII_8x16(12,16,0x30+bai);
write_ASCII_8x16(13,16,0x2E);
write_ASCII_8x16(14,16,0x30+shi);
write_ASCII_8x16(15,16,0x30+ge);
/*****中断初始化函数*********/
voidconfig(void)
IT0=1;
//INT0下降沿中断
EX0=1;
//允许INT1中断
EA=1;
voidAD_init(void)
Port_address=0x00;
//虚写一次,启动通道0
/***********AD转换函数**********/
ucharAD(void)
ucharad_date;
//保存经AD转换后的数据
ad_date=Port_address;
returnad_date;
//返回数据
/*******温度处理函数***********/
intdeal_wendu()
intv,t;
uintda;
da=AD();
v=da*195;
if(da〉=14&
&da<
=24)
t=da*100-4400;
if(da〉=24&
&
da〈=39)
t=67*da-3600;
}
if(da〉=39&
da〈=60)
t=48*da—2800;
}
if(da〉=60&
da〈=86)
{
t=38*da-2300;
if(da〉=86&
=142)
t=36*da—2100;
}
if(da〉=142&
da〈=167)
t=40*da—2700;
if(da>
=167&
=188)
t=48*da—4000;
if(da〉=188&
=209)
t=da*59—5341;
if(da〉=209&&da<
=248)
t=46*da-3341;
t=15000;
returnt;
voidmain()
intr=0;
uintv,da;
config();
//中断初始化
lcd_init();
//显示屏初始化
AD_init();
//启动通道0
delay(700);
clear_lcd();
delay(700);
write_chinese(0,0,46,34);
//显示"
温度采集系统"
write_chinese(1,0,22,40);
write_chinese(2,0,18,41);
write_chinese(3,0,28,15);
write_chinese(4,0,47,21);
write_chinese(5,0,45,19);
while
(1)
if(r==0)
v=da*195;
display_voltage(v);
display_digit(da);
display_temperature(deal_wendu());
voidint0(void)interrupt0
intr=1;
EX0=0;
EX0=1;