第一章 确定系统功能与性能
本系统的功能主要有数据采集、数据处理、输出控制。能对0~1000 �0�2c范围内的各种电加热炉的温度进行精密测量,同时,四位LED显示器直接跟踪显示被控对象的温度值,准确度高,显示清晰,稳定可靠,使用方便(在具体设计编程、调试过程中,为了调试方便,编程把温度范围设在0~100 �0�2c)。
本系统的原理框图如下图所示。
数据采集部分能完成对被测信号的采样,显示分辨率0.1�0�2c,测量精度0.1�0�2c,控制精度0.1�0�2c,可以实现采集信号的放大及A/D转换,并自动进行零漂校正,同时按设定值、所测温度值、温度变化速率,自动进行FID参数自整定和运算,并输出0~10mA控制电流,配以主回路实现温度的控制。数据处理分为预处理、功能性处理、抗干扰等子功能。输出控制部分主要是数码管显示控制。
第二章 确定系统基本结构及硬件设计
本单片机应用系统结构是以单片机为核心外部扩展相关电路的形式。确定了系统中的单片机、存储器分配及输入/输出方式就可大体确定出单片机应用系统的基本组成。
1)单片机选用MCS-51系统的8031
8031是INTEL公司MCS-51系列单片机中最基本的产品,它采用INTEL公司可靠的CHMOS工艺技术制造的高性能8位单片机,属于标准的MCS-51的HCMOS产品。它结合了HMOS的高速和高密度技术及CHMOS的低功耗特征,标准MCS-51单片机的体系结构和指令系统。
8031内置中央处理单元、128字节内部数据存储器RAM、32个双向输入/输出(I/O)口、2个16位定时/计数器和5个两级中断结构,一个全双工串行通信口,片内时钟振荡电路。但80C31片内并无程序存储器,需外接ROM。
此外,8031还可工作于低功耗模式,可通过两种软件选择空闲和掉电模式。在空闲模式下冻结CPU而RAM定时器、串行口和中断系统维持其功能。掉电模式下,保存RAM数据,时钟振荡停止,同时停止芯片内其它功能。8031有PDIP(40pin)和PLCC(44pin)两种封装形式。
主要功能特性:
· 标准MCS-51内核和指令系统
· 外部程序存储器ROM地址空间64kB
· 32个可编程双向I/O口
· 128x8bit内部RAM(可扩充64kB外部存储器)
· 2个16位可编程定时/计数器
· 时钟频率3.5-16MHz
· 5个中断源
· 5.0V工作电压
· 全双工串行通信口
· 布尔处理器
· 2层优先级中断结构
· 兼容TTL和CMOS逻辑电平
· PDIP(40)和PLCC(44)封装形式
单片机课程设计任务书
题目:基于单片机的温度数据采集系统设计
一.设计要求
1.被测量温度范围:0~500℃,温度分辨率为0.5℃。
2.被测温度点:4个,每2秒测量一次。
3.显示器要求:通道号1位,温度4位(精度到小数点后一位)。
显示方式为定点显示和轮流显示。
4.键盘要求:
(1)定点显示设定;(2)轮流显示设定;(3)其他功能键。
二.设计内容
1.单片机及电源管理模块设计。
单片机可选用AT89S51及其兼容系列,电源管理模块要实
现高精密稳压输出,为单片机及A/D转换器供电。
2.传感器及放大器设计。
传感器可以选用镍铬—镍硅热电偶(分度号K),放大器要实现热电偶输出的mV级信号到A/D输入V级信号放大。
3.多路转换开关及A/D转换器设计。
多路开关可以选用CD4052,A/D可选用MC14433等。
4.显示器设计。
可以选用LED显示或LCD显示。
5.键盘电路设计。
实现定点显示按键;轮流显示按键;其他功能键。
6.系统软件设计。
系统初始化模块,键盘扫描模块,显示模块,数据采集模块,标度变换模块等。
引言:
在生产和日常生活中,温度的测量及控制十分重要,实时温度检测系统在各个方面应用十分广泛。消防电气的非破坏性温度检测,大型电力、通讯设备过热故障预知检测,各类机械组件的过热预警,医疗相关设备的温度测试等等都离不开温度数据采集控制系统。
随着科学技术的发展,电子学技术也随之迅猛发展,同时带动了大批相关产业的发展,其应用范围也越来越广泛。近年来单片机发展也同样十分迅速,单片机已经渗透到工业、农业、国防等各个领域,单片机以其体积小,可靠性高,造价低,开发周期短的特点被广泛推广与应用。传统的温度采集不仅耗时而且精度低,远不能满足各行业对温度数据高精度,高可靠性的要求。温度的控制及测量对保证产品质量、提高生产效率、节约能源、生产安全、促进国民经济的发展起到重要作用。在单片机温度测量系统中关键是测量温度,控制温度和保持温度。温度测量是工业对象的主要被控参数之一。本此题目的总体功能就是利用单片机和热敏原件实现温度的采集与读数,利用五位LED显示温度读数和所选通道号,实现热电转化,实现温度的精确测量。本设计是以Atmel公司的AT89S51单片机为控制核心,通过MC14433模数转换对所测的温度进行数字量变化,且通过数码管进行相应的温度显示。采用微机进行温度检测,数字显示,信息存储及实时控制,对于提高生产效率和产品质量、节约能源等都有重要作用。
目录:
一、系统总体功能及技术指标的描述........................................ 5
二、各模块电路原理描述............................................................. 5
2.1单片机及电源模块设计...................................................... 5
2.2、AT89S51引脚说明.......................................................... 7
2.3、数据采集模块设计........................................................ 11
2.4、多路开关......................................................................... 12
2.5、放大器............................................................................. 15
2.6、A/D转换器..................................................................... 16
2.7、显示器设计..................................................................... 21
2.8、键盘电路设计................................................................. 22
2.9、电路总体设计图........................................................... 22
三、软件流程图 ...................................................................... 24
四、程序清单.............................................................................. 25
五、设计总结及体会.................................................................... 31
六、参考资料................................................................................ 32
一、系统总体功能及技术指标的描述
1. 系统的总体功能:
温度数据采集系统,实现温度的采集与读书,利用五位LED显示温度读数和所选通道号,实现热电转化的原理过程。
被测量温度范围:0~500℃,温度分辨率为0.5℃。被测温度点4个,每2秒测量一次。显示器要求:通道号1位,温度4位(精度到小数点后一位)。显示方式为定点显示和轮流显示,可以通过按键改变显示方式。
2. 技术指标要求:
1.被测量温度范围:0~500℃,温度分辨率为0.5℃。
2.被测温度点:4个,每2秒测量一次。
3.显示器要求:通道号1位,温度4位(精度到小数点后一位)。
显示方式为定点显示和轮流显示。
4.键盘要求:
(1)定点显示设定;(2)轮流显示设定;(3)其他功能键。
二、各模块电路原理描述
2.1单片机及电源模块设计
如图所示为AT89S51芯片的引脚图。兼容标准MCS-51指令系统的AT89S51单片机是一个低功耗、高性能CHMOS的单片机,片内含4KB在线可编程Flash存储器的单片机。它与通用80C51系列单片机的指令系统和引脚兼容。
AT89S51单片机片内的Flash可允许在线重新编程,也可用通用非易失性存储编程器编程;片内数据存储器内含128字节的RAM;有40个引脚,32个外部双向输入/输出(I/O)端口;具有两个16位可编程定时器;中断系统是具有6个中断源、5个中断矢量、2级中断优先级的中断结构;震荡器频率0到33MHZ,因此我们在此选用12MHZ的晶振是比较合理的;具有片内看门狗定时器;具有断电标志POF等等。AT89S51具有PDIP、TQFP和PLCC三种封装形式[8]。
图5.1-1 AT89S51引脚图
上图就是PDIP封装的引脚排列,下面介绍各引脚的功能。
2.2、AT89S51引脚说明
P0口:8位、开漏级、双向I/O口。P0口可作为通用I/O口,但须外接上拉电阻;作为输出口,每各引脚可吸收8各TTL的灌电流。作为输入时,首先应将引脚置1。P0也可用做访问外部程序存储器和数据存储器时的低8位地址/数据总线的复用线。在该模式下,P0口含有内部上拉电阻。在FLASH编程时,P0口接收代码字节数据;在编程效验时,P0口输出代码字节数据(需要外接上拉电阻)。
P1口:8位、双向I/0口,内部含有上拉电阻。P1口可作普通I/O口。输出缓冲器可驱动四个TTL负载;用作输入时,先将引脚置1,由片内上拉电阻将其抬到高电平。P1口的引脚可由外部负载拉到低电平,通过上拉电阻提供电流。在FLASH并行编程和校验时,P1口可输入低字节地址。在串行编程和效验时,P1.5/MO-SI,P1.6/MISO和P1.7/SCK分别是串行数据输入、输出和移位脉冲引脚。
P2口:具有内部上拉电阻的8位双向I/O口。P2口用做输出口时,可驱动4各TTL负载;用做输入口时,先将引脚置1,由内部上拉电阻将其提高到高电平。若负载为低电平,则通过内部上拉电阻向外部输出电流。CPU访问外部16位地址的存储器时,P2口提供高8位地址。当CPU用8位地址寻址外部存储时,P2口为P2特殊功能寄存器的内容。在FLASH并行编程和校验时,P2口可输入高字节地址和某些控制信号。
P3口:具有内部上拉电阻的8位双向口。P3口用做输出口时,输出缓冲器可吸收4各TTL的灌电流;用做输入口时,首先将引脚置1,由内部上拉电阻抬位高电平。若外部的负载是低电平,则通过内部上拉电阻向输出电流。在与FLASH并行编程和校验时,P3口可输入某些控制信号。P3口除了通用I/O口功能外,还有替代功能,如表5.3-1所示。
表5.3-1 P3口的替代功能
引脚
符号
说明
P3.0
RXD
串行口输入
P3.1
TXD
串行口输出
P3.2
/INT0
外部中断0
P3.3
/INT1
外部中断1
P3.4
T0
T0定时器的外部的计数输入
P3.5
T1
T1定时器的外部的计数输入
P3.6
/WR
外部数据存储器的写选通
P3.7
/RD
外部数据存储器的读选通
RST:复位端。当振荡器工作时,此引脚上出现两个机器周期的高电平将系统复位。
ALE/ :当访问外部存储器时,ALE(允许地址锁存)是一个用于锁存地址的低8位字节的书粗脉冲。在Flash 编程期间,此引脚也可用于输入编程脉冲()。在正常操作情况下,ALE以振荡器频率的1/6的固定速率发出脉冲,它是用作对外输出的时钟,需要注意的是,每当访问外部数据存储器时,将跳过一个ALE脉冲。如果希望禁止ALE操作,可通过将特殊功能寄存器中位地址为8EH那位置的“0”来实现。该位置的“1”后。ALE仅在MOVE或MOVC指令期间激活,否则ALE引脚将被略微拉高。若微控制器在外部执行方式,ALE禁止位无效。
:外部程序存储器读选取通信号。当AT89S51在读取外部程序时, 每个机器周期 将PSEN激活两次。在此期间内,每当访问外部数据存储器时,将跳过两个信号。
/Vpp:访问外部程序存储器允许端。为了能够从外部程序存储器的0000H至FFFFH单元中取指令,必须接地,然而要注意的是,若对加密位1进行编程,则在复位时,的状态在内部被锁存。
执行内部程序应接VCC。不当选择12V编程电源时,在Flash编程期间,这个引脚可接12V编程电压。
XTAL1:振荡器反向放大器输入端和内部时钟发生器的输入端。
XTAL2:振荡器反相放大器输出端[9]。
电源模块设计
在影响单片机系统可靠性的诸多因素中,电源干扰可谓首屈一指,据统计,计算机应用系统的运行故障有90%以上是由电源噪声引起的。为了提高系统供电可靠性,交流供电应采用交流稳压器,防止电源的过压和欠压,直流电源抗干扰措施有采用高质量集成稳压电路单独供电,采用直流开关电源,采用DC-DC变换器。本次设计决定采用MAXim公司的高电压低功耗线性变换器MAX 1616作为电压变换,采用该器件将输入的24V电压变换为5V电压,给外围5V的器件供电。MAX1616具有如下特点:
1.4~28V电压输入范围。
2.最大80uA的静态工作电流。
3.3V/5V电压可选输出。
4.30mA输出电流。
5.2%的电压输出精度。
电源管理模块电路图如下:
本电路采用该器件将输入的24V电压变成5V电压,给外围5V的器件供电,其中二极管D1是保护二极管,防止输入电压接反可能带来的对电路的影响和破坏。
pic单片机应用系统开发典型实例〉〉有差不多的例子,不过 是数码显示,不是液晶显示。液晶程序上网上找就行啊,上有很多程序,或许有现成的。
简单描述一下吧:
不知道你用的传感器型号,如果用热电偶药主要好温度补偿,传感器经过A\D把信息传给单片机,显示部分用动态数码管就可以了,
下面有两种思路:
1.用LM35去采集温度信息,根据其输出电压转化为温度信息,最好用自带AD的单片机,输出到数码管就可以了。
2.不用AD,用比较常用的18b20,接上单片机显示出温度就可以了,18b20网上有很多参考的程序。
其实不管用热电偶还是热电阻都要注意好其稳定性。
用DS18B20做的电子温度计,非常简单。
#include reg51.h
#include\"AscLed.h\"
#include intrins.h
#include stdio.h
//********************************************************
#define Seck (500/TK) //1秒中的主程序的系数
#define OffLed (Seck*5*60) //自动关机的时间5分钟!
//********************************************************
#if (FHz==0)
#define NOP_2uS_nop_()
#else
#define NOP_2uS_nop_();_nop_()
#endif
//**************************************
#define SkipK 0xcc //跳过命令
#define ConvertK 0x44 //转化命令
#define RdDs18b20K 0xbe //读温度命令
//*******************************************
extern LedOut(void);
//*************************************************
sbit PNP1=P3^4;
sbit PNP2=P3^5;
sbit BEEP=P3^2;
//***********************************
#defineDQ PNP2 //原来的PNP2 BEEP
//***********************************
static unsigned char Power=0;
//************************************
union{
unsigned char Temp[2]; //单字节温度
unsigned int Tt; //2字节温度
}T;
//***********************************************
typedef struct{
unsigned char Flag; //正数标志 0;1==》负数
unsigned char WenDu; //温度整数
unsigned int WenDuDot; //温度小数放大了10000
}WENDU;
//***********************************************
WENDU WenDu;
unsigned char LedBuf[3];
//----------------------------------
//功能:10us 级别延时
// n=1=== 6Mhz=14uS 12MHz=7uS
//----------------------------------
void Delay10us(unsigned char n){
do{
#if (FHz==1)
NOP_2uS;NOP_2uS;
#endif
}while(--n);
}
//-----------------------------------
//功能:写18B20
//-----------------------------------
void Write_18B20(unsigned char n){
unsigned char i;
for(i=0;i8;i++){
DQ=0;
Delay10us(1);//延时13us 左右
DQ=n 0x01;
n=n1;
Delay10us(5);//延时50us 以上
DQ=1;
}
}
//------------------------------------
//功能:读取18B20
//------------------------------------
unsigned char Read_18B20(void){
unsigned char i;
unsigned char temp;
for(i=0;i8;i++){
temp=temp1;
DQ=0;
NOP_2uS;//延时1us
DQ=1;
NOP_2uS;NOP_2uS;//延时5us
if(DQ==0){
temp=temp0x7F;
}else{
temp=temp|0x80;
}
Delay10us(5);//延时40us
DQ=1;
}
return temp;
}
//-----------------------------------
void Init (void){
DQ=0;
Delay10us(45);//延时500us
DQ=1;
Delay10us(9);//延时90us
if(DQ){ //0001 1111b=1f
Power =0; //失败0
}else{
Power++;
DQ=1;
}
}
//----------------------------------
void Skip(void){
Write_18B20(SkipK);
Power++;
}
//----------------------------------
void Convert (void){
Write_18B20(ConvertK);
Power++;
}
//______________________________________
void Get_Ds18b20L (void){
T.Temp[1]=Read_18B20(); //读低位
Power++;
}
//______________________________________
void Get_Ds18b20H (void){
T.Temp[0]=Read_18B20(); //读高位
Power++;
}
//------------------------------------
//规范化成浮点数
// sssss111;11110000
// sssss111;1111(0.5,0.25,0.125,0.0625)
//------------------------------------
void ReadTemp (void){
unsigned char i;
unsigned intF1=0;
char j=1;
code int Code_F[]={6250,1250,2500,5000};
WenDu.Flag=0;
if (T.Temp[0] 0x80){ //负温度
T.Tt =~T.Tt+1; //取反+1=源吗 +符号S
WenDu.Flag=-1;
}
T.Tt = 4; //左移4位
WenDu.WenDu=T.Temp[0]; // 温度整数
//**************************************************
T.Temp[1]=4;
//---------------------------
for (i=0;i4;i++){ //计算小数位
F1 +=(T.Temp[1] 0x01)*Code_F;
T.Temp[1]=1;
}
WenDu.WenDuDot=F1; //温度的小数
Power=0;
}
//----------------------------------
void Delay1S (void){
static unsigned int i=0;
if (++i==Seck) {i=0ower++;}
}
//----------------------------------
void ReadDo (void){
Write_18B20(RdDs18b20K);
Power++;
}
/**********************************
函数指针定义
***********************************/
code void (code *SubTemp[])()={
Init,Skip,Convert,Delay1S,Init,Skip,ReadDo,Get_Ds18b20L,
Get_Ds18b20H,ReadTemp
};
//**************************************
void GetTemp(void){
(*SubTemp[Power])();
}
//---------------------------------------------------
//将温度显示,小数点放大了10000.
void GetBcd(void){
LedBuf[0]=WenDu.WenDu / 10;
LedBuf[1]=WenDu.WenDu % 10 +DotK;
LedBuf[2]=(WenDu.WenDuDot/1000)%10;
if(LedBuf[0]==0)LedBuf[0]=Black;
if(WenDu.Flag==0) return;
if(LedBuf[0] !=Black){
LedBuf[2]=LedBuf[1];
LedBuf[1]=LedBuf[0];
LedBuf[0]=Led_Pol; //'-'
}else{
LedBuf[0]=Led_Pol; //'-'
}
}
/*
//---------------------------------------------------
void JbDelay (void){
static long i;
if (++i=OffLed){
P1=0xff;
P2=0xff;
PCON=0x02;
}
}
*/
/*****************************************************
主程序开始
1:2002_10_1 设计,采用DS18B20测量
2:采用函数数组读取DS18B20.LED数码管显示正常!
3:改变FHz可以用6,12MHz工作!
******************************************************/
code unsigned char Stop[3] _at_ 0x3b;
void main (void){
P1=0xff;
WenDu.WenDu=0;
while (1){
GetTemp();
GetBcd();
// JbDelay();
LedOut();
}
}
复制代码
20091012_8b1ef92155560c13b5807ZmoDVSacjwD[1].jpg (12 KB)
2009-10-21 23:21 上传
下载次数:0
利用温度传感器DS18B20检测环境温度并直接输出数字温度信号给单片机AT89C52进行处理。
在LCD液晶上显示当前环境温度值、预设温度值、使用者设定的温度差以及目前风扇所处的档位。其中预设温度值只能为整数形式,检测到的当前环境温度可精确到小数点后一位。
同时采用PWM脉宽调制方式来改变直流风扇电机的转速。
并通过两个按键改变预设温度值,一个提高预设温度,另一个降低预设温度值。通过另一个按键控制温度差的大小。
设有红外热释传感器检测环境范围内是否有人,如果有人确定出风方向,如果无人,降低转速或一定时间内自动关闭。
回答
正如你所说的,一共用了DS18B20模块,LCD模块,红外传感模块,按键,直流电机模块,程序方面只有一个PWM。现在一一为你分析:
DS18B20模块:
下图是它的原理图,采用单总线来进行开发,不像电赛的哪个温度传感器需要AD转换,它是可以直接传出数字信号的。
单片机设计温度测量系统设计的介绍就聊到这里吧,感谢您花时间阅读,谢谢。
本文标签:单片机设计温度测量系统设计