采用单片机STC12C5608AD设计一台数显温度表

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

随着社会的进步和工业技术的发展,人们越来越重视温度因素,许多产品对温度范围要求严格,而且目前市场上普遍存在的温度检测仪器大都是单点测量,同时有温度信息传递不及时、精度不够的缺点,不利于工业控制者根据温度变化及时做出决定。

本设计是利用STC12C5608AD 实现对温度的采集。

在设计中采用了PT100热电阻温度传感器,其具有较高的精确度,可完成对温度的精准测量;在显示部分采用动态显示,对于放大倍数和上下限的设定我们采用分时显示。

关键词:STC12C5608AD单片机、PT100、LabVIEW、研华板卡PCL-818HG
第一章课程设计内容与要求分析 (1)
1.1 课程设计内容 (1)
1.2 课程设计要求 (1)
第二章智能温度表硬件设计 (2)
2.1 温度检测 (2)
2.2 实测温度显示 (2)
2.3 温度设定 (3)
2.4 报警电路 (4)
第三章智能温度表软件设计 (5)
3.1 工作流程 (5)
3.2 功能模块 (5)
3.3 资源分配 (5)
3.4功能软件设计 (7)
3.4.1主程序与中断服务子程序 (7)
3.4.2按键检测子程序 (8)
3.4.3按键键值处理子程序 (8)
3.4.4 显示子程序 (9)
第四章温度控制电路的LabVIEW实现 (10)
4.1 LabVIEW简介 (10)
4.2 研华板卡PCL—818HG (10)
4.3 温度控制系统 (11)
4.3 温度控制调试过程 (12)
单片机课程设计总结 (13)
参考文献 (14)
附录 (15)
第一章课程设计内容与要求分析
第一章课程设计内容与要求分析
1.1 课程设计内容
1、采用单片机STC12C5608AD设计一台数显温度表
2、采用研华板卡PCL—818HG 设计一台虚拟温度表
1.2 课程设计要求
1、数显温度表(应用protel画出电路原理图,应用keil完成软件编程)
1)传感器:热电阻PT100;
2)显示器:数码管4位(LED);
3)键盘:功能键、移位键和加一键;
4)范围:0-200℃;
5)精度:≤1℃;
6)电源:AC 220V;
7)变送器:DC 0-20mA;
8)报警:超上限LED闪烁;
2、虚拟温度表(应用LabVIEW和PCL-818HG完成温度表前面板设计)
1)输入温度信号:DC 0-4V;
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-1 STC12C5608AD引脚分布使用图
为了方便程序的编写,在写程序之前我们先对单片机的资源做一个分配,如下表3-1所示
表3-1单片机内部资源分配
单片机资源资源使用情况功能初始化值P1 使用送位码与控制按键0xff
P2 使用送段码0xff
P3 使用控制指示灯0xff AD转换使用进行模数转换0xff
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.1 LabVIEW简介
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>
#define uchar unsigned char
#define uint unsigned int
sfr P1M0=0x91;
sfr P1M1=0x92;
sfr A_CONTR=0xBC;
sfr A_DATA=0xBD;
sfr A_RESL=0xBE;
sfr A_P1ASF=0x9D;
sbit EADC=0xAD;
bit A_end;
uint LedPoint[]={0xef,0xdf,0xbf,0x7f};
uchar code S[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09}; uchar num[4];
float keynum[4],max,min;
float tempur;
float XY=1.86;
float FD;
float temp;
sbit KeyFunction = P1^7; // 定义功能键
sbit KeyMove = P1^6; // 定义最大最小选择键
sbit KeyAdd = P1^5; //定义加数键
sbit SS=P3^7;
uchar KeyMoveflage=0;
uchar KeyAddflage=0;
uchar Functionflage=0;
//延时函数
void ms(uint t)
{
uchar i;
while(t--)
{
for(i=0;i<113;i++)
{;}
}
}
//自检程序
void ZJ()
{
uchar i;
for(i = 0;i < 4;i++)
{
P2 = 0x00;
P1 = 0x00;
ms(5000);
}
}
//======================================================== void Se(uint Sa)
{
num[0] = Sa / 1000;
num[1] = (Sa % 1000) / 100;
num[2] = ((Sa % 1000) % 100) / 10;
num[3] = Sa % 10;
}
//函数功能:独立按键对应的动态显示
void Disp(uint Da)
{
// uchar i;
Se(Da);
// for(i = 0;i < 4;i++)
// {
// P2 = S[num[i]];
// P1 = LedPoint[i];
// ms(2);
// }
}
//按键检测
void KEYONE()
{
if(KeyFunction==0&SS==1)
{
ms(50);
if(KeyFunction==0&SS==1)
{
//=====================
P2 = S[num[0]];
P1 = LedPoint[0];
//=====================
Functionflage++;
if(Functionflage==5)Functionflage=0;
}
}
}
void KEYTWO()
{
if(KeyMove==0&SS==1)
{
ms(50);
if(KeyMove==0&SS==1)
{
//=====================
P2 = S[num[1]];
P1 = LedPoint[1];
//=====================
KeyMoveflage++;
if(KeyMoveflage==4)KeyMoveflage=0;
}
}
}
void KEYTHREE()
{
if(KeyAdd==0&SS==1)
{
ms(50);
if(KeyAdd==0&SS==1)
{
//=====================
P2 = S[num[2]];
P1 = LedPoint[2];
//=====================
KeyAddflage++;
if(KeyAddflage==10)KeyAddflage=0;
}
}
}
//按键处理
void CHULI()
{
if(Functionflage==1)
{
if(KeyMoveflage==0)
{
P1=0xef;
P2=S[KeyAddflage];
P1=0xff;
ms(10);
P1=0xef;
keynum[0]=KeyAddflage;
}
if(KeyMoveflage==1)
{
KeyAddflage=0;
P1=0xdf;
P2 = S[KeyAddflage];
keynum[1]=KeyAddflage;
}
if(KeyMoveflage==2)
{
KeyAddflage=0;
P1=0xbf;
P2 = S[KeyAddflage];
keynum[2]=KeyAddflage;
}
if(KeyMoveflage==3)
{
KeyAddflage=0;
P1=0x7f;
P2 = S[KeyAddflage];
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)
{
if(KeyMoveflage==0)
{
P1=0xef;
P2 = S[KeyAddflage];
keynum[0]=KeyAddflage;
}
if(KeyMoveflage==1)
{
KeyAddflage=0;
P1=0xdf;
P2 = S[KeyAddflage];
keynum[1]=KeyAddflage;
}
if(KeyMoveflage==2)
{
KeyAddflage=0;
P1=0xbf;
P2 = S[KeyAddflage];
keynum[2]=KeyAddflage;
}
if(KeyMoveflage==3)
{
KeyAddflage=0;
P1=0x7f;
P2 = S[KeyAddflage];
keynum[3]=KeyAddflage;
}
max=keynum[3]*100+keynum[2]*10+keynum[1]+keynum[0]*0.1;
if(max>100)max=100;
}
if(Functionflage==3)
{
if(KeyMoveflage==0)
{
P1=0xef;
P2 = S[KeyAddflage];
keynum[0]=KeyAddflage;
}
if(KeyMoveflage==1)
{
KeyAddflage=0;
P1=0xdf;
P2 = S[KeyAddflage];
keynum[1]=KeyAddflage;
}
if(KeyMoveflage==2)
{
KeyAddflage=0;
P1=0xbf;
P2 = S[KeyAddflage];
keynum[2]=KeyAddflage;
}
if(KeyMoveflage==3)
{
KeyAddflage=0;
P1=0x7f;
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采集初始化void IN()
{
P1M0=0x01;
P1M1=0x01;
A_P1ASF=0x01;
A_CONTR=0x80;
EADC=1;
EA=1;
}
//AD中断
void ADC() interrupt 5 {
A_CONTR&=0xe7;
temp=A_DATA;
A_end=1;
}
//主函数
main()
{
IN();
ZJ();
while(1)
{
KEYONE();
KEYTWO();
KEYTHREE();
//CHULI();
Disp(1234);
}
}。

相关文档
最新文档