采用单片机STC12C5608AD设计一台数显温度表Word文档下载推荐.docx
《采用单片机STC12C5608AD设计一台数显温度表Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《采用单片机STC12C5608AD设计一台数显温度表Word文档下载推荐.docx(19页珍藏版)》请在冰豆网上搜索。
2)显示温度数值:
00-200℃;
3)采集板卡:
PCL-818HG;
4)报警显示:
灯亮;
第二章智能温度表硬件设计
2.1温度检测
这部分需用PT100热敏温度传感器,PT100是铂热电阻,它的阻值会随着温度的变化而改变。
PT上的100即表示它在0℃时阻值为100欧姆,在100℃时它的阻值约为138.5欧姆。
检测器件的温度信息经过单线接口送入电压跟随器的正极入口,然后输入运放的正极入口,经由运发放大后送入单片机的A/D采集口P1.0端口。
P1.0口连接处理过的温度传感器PT100采集来的信号,如图2-1所示。
图2-1温度检测电路
2.2实测温度显示
这部分由有4位LED数码显示器,由于LED静态显示需要占用较多的I/O口,且功耗较大,因此在大多数场合通常不采用静态显示,而采用动态扫描的方法来控制LED数码管的显示。
动态显示的特点是将所有位数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。
点亮数码管采用动态扫描显示。
所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,只要扫描显示速度够快,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。
动态显示的亮度比静态显示要差一些,所以在选择限流电阻时应略小于静态显示电路中的。
动态扫描显示时刷新频率最好大于50HZ,即没显示一轮的时间不超过20ms,每个数码管显示时间不能太长也不能太短,时间太长会影响刷新率,导致总体显示呈现闪烁的现象,时间太短发光二极管的电流导通时间也就短,会影响总体的显示亮度。
一般控制在1ms左右最佳。
显示部分的接线图如图2-2所示。
图2-2动态显示电路
2.3温度设定
这部分键盘只设置3个功能键,分别是K1--功能键,K2--移位键,K3加1键。
功能键有三个功能,分别为An设定放大倍数,Hi设定上限,Lo设定下限。
图2-3温度设定控制电路
2.4报警电路
报警电路如图2-4所示,由P3.3和P3.4端口控制,当实时检测的温度在上下限范围内时,控制指示灯亮。
当实时检测的温度超过上限或者低于下限时,报警输出指示灯亮。
图2-4报警电路
第三章智能温度表软件设计
3.1工作流程
启动系统,进行自检程序,用动态显示显示8.8.8.8.测试显示部分电路是否能正常工作。
初始状态,系统的放大倍数,上限和下限分别为0。
自检程序运行完成后,系统显示部分四个数码管轮流显示8.这一现象。
等待用户手动设定放大倍数、上限值和下限值。
设定完成之后,第四次按下功能键,退出设定模式进入温度采集和显示报警模式。
当采集的温度值在设定的上下限之间时,控制指示灯绿灯亮。
当采集的温度值高于上限值或低于下限值时,报警输出指示灯红灯亮。
当再次按下功能键时,可进入设定模式,重新设定放大倍数、上限值和下限值。
3.2功能模块
1、键盘管理:
检测键盘输入,接受温度设定,启动工作系统。
2、显示:
分时显示放大倍数、上限值、下限值和检测温度。
3、温度检测:
检查温度传感器电压信号,转换温度值。
4、报警:
3.3资源分配
STC12C5608AD的单片机的引脚分布使用图如下3-1所示,它是由P1.0-P1.7的八路的AD转换的。
图3-1STC12C5608AD引脚分布使用图
为了方便程序的编写,在写程序之前我们先对单片机的资源做一个分配,如下表3-1所示
表3-1单片机内部资源分配
单片机资源
资源使用情况
功能
初始化值
P1
使用
送位码与控制按键
0xff
P2
送段码
P3
控制指示灯
AD转换
进行模数转换
3.4功能软件设计
3.4.1主程序与中断服务子程序
图3-1主程序和中断服务子程序的流程图
按图3-1所示主程序和中断服务子程序流程图,可编写出主程序和中断服务子程序。
由于按键检测需要置零P1.7~P1.5这三个I/O口,致使三个数码管选通,所以在设定放大倍数、上限值、和下限值时,使用定时器中断来分时置零这三个端口。
当设定完成,关闭定时器中断。
3.4.2按键检测子程序
本系统共有三个按键,按键K1为功能键,功能为分别设定放大倍数、设定上限、设定下限、退出关定时器。
图3-2温度设定值检测与显示程序流程图
3.4.3按键键值处理子程序
按键检测为系统的核心部分。
图3-3为温度检测子程序流程图。
这里只给出部分的按键检测流程图。
每个按键按下,给相应的按键对应的标志变量自加1。
功能键每按下5次,标志位变量Functionflage清零。
第一次按下为设定放大倍数,第二次按下为设定上限值,第三次按下为设定下限值,第四次为退出设定模式。
移位键每按下4次,标志位变量KeyMoveflage清零。
每按下一次移位键,设定位移动一位。
自加键每按下4次,标志位变量KeyAddflage清零。
每按下一次自加键,显示数值加1。
图3-3部分按键键值处理子程序流程图
3.4.4显示子程序
在温度显示函数中,硬件电路为动态显示电路,断码为P2.0-P2.7,位码为P1.4-P1.7四个端口选择,写入独立按键的动态显示函数为Disp(),最后需要的时候调出刚写的显示函数即可。
第四章温度控制电路的LabVIEW实现
4.1LabVIEW简介
LabVIEW是一种程序开发环境,由美国国家仪器(NI)公司研制开发的,类似于C和BASIC开发环境,但是LabVIEW与其他计算机语言的显著区别是:
其他计算机语言都是采用基于文本的语言产生代码,而LabVIEW使用的是图形化编辑语言G编写程序,产生的程序是框图的形式。
与C和BASIC一样,LabVIEW也是通用的编程系统,有一个完成任何编程任务的庞大函数库。
LabVIEW的函数库包括数据采集、GPIB、串口控制、数据分析、数据显示及数据存储,等等。
LabVIEW也有传统的程序调试工具,如设置断点、以动画方式显示数据及其子程序(子VI)的结果、单步执行等等,便于程序的调试。
4.2研华板卡PCL-818HG
研华板卡PCL-818HG是PCL-818系列中的入门级板卡,该卡可提供要求低价位的用户使用,除了采样速率为40KHZ、以及只能接受双极性输入外,其他功能与PCL-818HG完全相同,这样就无需更改硬件和软件,就可以将应用升级到高性能数据采集卡上。
它能确保在在所有增益及再输入范围内可达到100kHZ的采样速率。
PLC-818HG提供与PCL-818HG相同的功能,但它带有一个可编程的信号放大器,可用来读取微弱输入信号(x0.5,1,5,10,50,100,500或1000)PCL-818HG附带一个带有DB-37接口和CJC电路的接线端子板(PCLD-8115)这种组合能够让您无需外部信号调理板就可以测量低电平的热电偶信号。
4.3温度控制系统
整个温度控制系统的软件部分是由LabVIEW来实现的,它提供了吩咐的空间,如各种旋钮、开关、仪表盘、模拟数字示波器等,并且可以根据实际需要指定控件,在用户通过点击鼠标发出指令后,主控模块通过统一调度各功能实现用户意图。
温度控制系统前面板如图4-1所示。
图4-1温度控制系统前面板
温度控制系统测温及控制部分程序如图4-2所示。
图4-2测温控制LabVIEW程序
4.3温度控制调试过程
观察液晶显示的温度是否为零度。
通过调节变位器当外接电阻为100欧姆时,显示为0度,当外接电阻为138.5欧姆时,显示为100度,通过软件程序调节放大倍数,从而使温度显示与外加测试结果对应。
设置上限报警100摄氏度,下限报警0摄氏度,完善智能温度表功能。
单片机课程设计总结
通过为期三周的单片机课程设计,我不仅加深了对单片机理论的理解,将理论很好地应用到实际当中去,而且我还学会了如何去培养我们的创新精神,从而不断地战胜自己,超越自己。
创新,是要我们学会将理论很好地联系实际,并不断地去开动自己的大脑,从为人类造福的意愿出发,做自己力所能及的,别人却没想到的事。
使之不断地战胜别人,超越前人。
同时,更重要的是,我在这一设计过程中,学会了坚持不懈,不轻易言弃。
设计过程,也好比是我们人类成长的历程,常有一些不如意,也许这就是在对我们提出了挑战,勇敢过,也战胜了,胜利的钟声也就一定会为我们而敲响。
经过近三周的努力,在老师和同学的帮助下,我基本上完成了设计任务。
通过这次课程设计,我充分认识到了自学的重要性,以及学以致用的道理,我在图书馆查阅了大量的资料,同时也认识到了图书馆的重作用。
在今后的学习过程,应该多到图书馆看一些专业方面的书籍,以丰富自己的知识。
也使我加深了对单片机知识的了解和应用。
由于知识水平局限和时间的仓促,设计中可能会存在着一些不足,我真诚的接受老师和同学的批评和指正。
最后衷心感谢老师的悉心指导和同学们的热心帮助!
总结人:
2014.6.06
参考文献
[1]吴微,文军.单片机原理与制作[M].武汉:
武汉大学出版社,1991年3月
[2]李勋,林广艳.单片微型计算机大学读本[M].北京:
北京航空航天大学出版社,1998年8月
[3]张志良.单片机原理与控制技术[M].机械工业出版社,2001年7月
[4]范立南.单片微型计算机控制系统设计[M].人民邮电出版社,2004年3月
[5]孙育才,苏学成.单片微型计算机应用系统设计与实现[M].南京:
东南大学出版社,1990年11月
[6]何立民编著.MCS-51系列单片机应用系统设计系统配置与接口技术.北京:
北京航空航天大学出版社,1999年
[7]蔡美琴等编著.MCS-51单片机系统及应用.北京:
高等教育出版社,1992年
附录
#include<
reg51.h>
#defineucharunsignedchar
#defineuintunsignedint
sfrP1M0=0x91;
sfrP1M1=0x92;
sfrA_CONTR=0xBC;
sfrA_DATA=0xBD;
sfrA_RESL=0xBE;
sfrA_P1ASF=0x9D;
sbitEADC=0xAD;
bitA_end;
uintLedPoint[]={0xef,0xdf,0xbf,0x7f};
ucharcodeS[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09};
ucharnum[4];
floatkeynum[4],max,min;
floattempur;
floatXY=1.86;
floatFD;
floattemp;
sbitKeyFunction=P1^7;
//定义功能键
sbitKeyMove=P1^6;
//定义最大最小选择键
sbitKeyAdd=P1^5;
//定义加数键
sbitSS=P3^7;
ucharKeyMoveflage=0;
ucharKeyAddflage=0;
ucharFunctionflage=0;
//延时函数
voidms(uintt)
{
uchari;
while(t--)
{
for(i=0;
i<
113;
i++)
{;
}
}
//自检程序
voidZJ()
for(i=0;
i<
4;
i++)
P2=0x00;
P1=0x00;
ms(5000);
}
//========================================================
voidSe(uintSa)
num[0]=Sa/1000;
num[1]=(Sa%1000)/100;
num[2]=((Sa%1000)%100)/10;
num[3]=Sa%10;
//函数功能:
独立按键对应的动态显示
voidDisp(uintDa)
//uchari;
Se(Da);
//for(i=0;
//{
//P2=S[num[i]];
//P1=LedPoint[i];
//ms
(2);
//}
//按键检测
voidKEYONE()
if(KeyFunction==0&
SS==1)
ms(50);
if(KeyFunction==0&
{
//=====================
P2=S[num[0]];
P1=LedPoint[0];
Functionflage++;
if(Functionflage==5)Functionflage=0;
}
}
voidKEYTWO()
if(KeyMove==0&
if(KeyMove==0&
P2=S[num[1]];
P1=LedPoint[1];
KeyMoveflage++;
if(KeyMoveflage==4)KeyMoveflage=0;
voidKEYTHREE()
if(KeyAdd==0&
if(KeyAdd==0&
P2=S[num[2]];
P1=LedPoint[2];
KeyAddflage++;
if(KeyAddflage==10)KeyAddflage=0;
}
//按键处理
voidCHULI()
if(Functionflage==1)
if(KeyMoveflage==0)
P1=0xef;
P2=S[KeyAddflage];
P1=0xff;
ms(10);
keynum[0]=KeyAddflage;
if(KeyMoveflage==1)
KeyAddflage=0;
P1=0xdf;
P2=S[KeyAddflage];
keynum[1]=KeyAddflage;
if(KeyMoveflage==2)
P1=0xbf;
keynum[2]=KeyAddflage;
if(KeyMoveflage==3)
P1=0x7f;
keynum[3]=KeyAddflage;
FD=keynum[3]*100+keynum[2]*10+keynum[1]+keynum[0]*0.1;
tempur=temp-35.8;
tempur=XY*tempur*10;
tempur=FD*tempur;
if(Functionflage==2)
max=keynum[3]*100+keynum[2]*10+keynum[1]+keynum[0]*0.1;
if(max>
100)max=100;
if(Functionflage==3)
P2=S[0];
keynum[3]=0;
min=keynum[2]*10+keynum[1]+keynum[0]*0.1;
if(min>
=max)min=max;
if(Functionflage==4)
KeyFunction=0;
//串口和AD采集初始化
voidIN()
P1M0=0x01;
P1M1=0x01;
A_P1ASF=0x01;
A_CONTR=0x80;
EADC=1;
EA=1;
//AD中断
voidADC()interrupt5
A_CONTR&
=0xe7;
temp=A_DATA;
A_end=1;
//主函数
main()
IN();
ZJ();
while
(1)
KEYONE();
KEYTWO();
KEYTHREE();
//CHULI();
Disp(1234);