单片微型计算机原理与接口技术课程设计报告温度测量Word文件下载.docx
《单片微型计算机原理与接口技术课程设计报告温度测量Word文件下载.docx》由会员分享,可在线阅读,更多相关《单片微型计算机原理与接口技术课程设计报告温度测量Word文件下载.docx(24页珍藏版)》请在冰豆网上搜索。
当接到上位机发的AAH时,则将当前温度发给上位机
当接到上位机发的55H时,则小灯亮,提示修改上、下限
2、方案论证
由于本设计是于AT89C51单片机的温度测量系统,可以使用热敏电阻之类的器件利用其感温效应,在将随被测温度变化的电压或电流采集过来,进行A/D转换后,就可以用单片机进行数据的处理,在显示电路上将被测温度显示出来。
但是这种设计需要用到A/D转换电路,还要涉及到电阻与温度的对应值的计算,比较麻烦。
所以采用DS18B20温度传感器,这样可以很容易直接读取被测温度值,进行转换,电路简单,精度高,软硬件都容易实现,而且使用单片机的接口便于系统的再扩展,满足设计要求。
步进电机模块,由于步进电机的额定工作电流过大,单片机无法独立驱动其工作,因而在接口电路与步进电机之间加入ULN2003A驱动芯片,利用驱动芯片的电流放大作用,使步进电机可靠的运转。
总体设计方框图如图2.1所示。
图2.1总体设计方框图
3、硬件系统设计及原理图
3.1单片机主控电路
本设计中采用美国Atmel公司的8位单片机AT89C51作为单片机控制模块的核心部件,该型单片机在本设计中的应用如下:
晶振采用12MHZ,复位电路采用上电加按钮复位。
图3.1.2复位电路
3.2显示电路
显示电路采用4位共阴极LED数码管,P0口由上拉电阻提高驱动能力,作为段码输出并作为数码管的驱动。
P2口的低四位作为数码管的位选端。
采用动态扫描的方式显示。
图3.2数码管显示电路
3.3温度传感器
DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9-12位的数字值读数方式。
图3.3温度传感器与单片机的连接
3.4温度上下限调整按键
本系统设计三个按键,采用查询方式,一个用于选择切换设置温度上下限和当前温度,另外两个分别用于设置报警温度的加和减。
均采用软件消抖。
图3.4按键电路
3.5步进电机
3.5.1步进电机驱动电路
本设计选用驱动芯片ULN2003驱动四相步进电机。
ULN2003是高耐压、大电流达林顿陈列,由七个硅NPN达林顿管组成。
ULN2003的每一对达林顿都串联一个2.7K的基极电阻,在5V的工作电压下它能与TTL和CMOS电路直接相连,可以直接处理原先需要标准逻辑缓冲器来处理的数据。
ULN2003工作电压高,工作电流大,灌电流可达500mA,并且能够在关态时承受50V的电压,输出还可以在高负载电流并行运行。
图3.5.2.1ULN2003方框图
表3.5.2ULN2003极限值参数
ULN2003与单片机连接驱动步进电机原理图如下:
图3.5.2.2步进电机驱动电路
3.6双机通信
利用单片机串行口实现两个单片机(主机、从机)之间的通信,其中一个单片机作为主机(发送方),另一个为从机(接收方),主机读入按键值并将相应命令发送给从机,从机收到命令后执行相应的功能。
双机通信示意图如下:
图3.6双机通信示意图
4、软件清单
系统程序主要包括主程序和通信程序。
其中主程序包括延时函数、扫描显示函数、DS18B20复位函数、DS18B20写命令函数、DS18B20读1字节函数、读出温度函数、温度数据处理函数、报警函数、步进电机函数、设置温度显示转换函数、按键查询程序、主函数。
通信上位机程序包括延时函数、扫描显示函数、初始化函数、按键查询程序、主函数。
下位机函数包括初始化、接收程序、主函数。
上位机软件清单:
#include"
reg51.h"
intrins.h"
//_nop_();
延时函数用
#definedmP0//段码输出口
#defineucharunsignedchar
#defineuintunsignedint
uinth;
sbitw0=P2^0;
//数码管4
sbitw1=P2^1;
//数码管3
sbitw2=P2^2;
//数码管2
sbitw3=P2^3;
//数码管1
sbitaa=P1^0;
sbitbb=P1^1;
sbitcc=P1^2;
ucharidatabuf[1];
ucharcodetable_dm[15]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40,0x38,0x76,0x39};
//共阴LED段码表"
0"
"
1"
2"
3"
4"
5"
6"
7"
8"
9"
不亮"
-"
'
L'
H'
C'
uchardatadisplay[4]={0x00,0x00,0x00,0x00};
//显示单元数据,共4个数据和一个运算暂用
/******11us延时函数*******/
voiddelay(uintt)
{
for(;
t>
0;
t--);
}
/************scan*************/
voidscan()
intj;
for(j=0;
j<
4;
j++)
switch(j)
case0:
dm=table_dm[display[0]];
w0=0;
delay(50);
w0=1;
case1:
dm=table_dm[display[1]];
w1=0;
w1=1;
case2:
dm=table_dm[display[2]];
w2=0;
w2=1;
case3:
dm=table_dm[display[3]];
w3=0;
w3=1;
/**********初始化函数***********/
voidinit()
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
PCON=0x00;
TR1=1;
SCON=0x50;
/*************keyscan***********/
voidkeyscan()
if(aa==0)
SBUF=0x06;
do{}while(TI==0);
TI=0;
elseif(bb==0)
SBUF=0xaa;
elseif(cc==0)
{SBUF=0x55;
display[3]=0x0d;
display[2]=0x0d;
display[1]=0x0d;
display[0]=0x0d;
else;
/************main***************/
voidmain()
init();
dm=0x00;
//初始化端口
for(h=0;
h<
h++)//开机显示"
0000"
display[h]=0;
while
(1)
scan();
keyscan();
if(RI==1)
RI=0;
buf[0]=SBUF;
if(buf[0]==0x55)
}
elseif(buf[0]==0x06)
display[3]=0x0a;
display[2]=0x0a;
display[1]=buf[0]%100/10;
display[0]=buf[0]%10;
else
display[2]=0x0e;
}
下位机软件清单
ucharcodeTable[4]={0x03,0x06,0x0c,0x09};
ucharcodeTable1[4]={0x09,0x0c,0x06,0x03};
sbitDQ=P2^7;
//温度输入口
sbitbeep=P3^7;
//蜂鸣器和指示灯
sbitset=P2^6;
//温度设置切换键
sbitadd=P2^4;
//温度加
sbitdec=P2^5;
//温度减
sbitlig=P3^6;
inttemp1=0;
//显示当前温度和设置温度的标志位为0时显示当前温度
uinttemp;
ucharr;
ucharhigh=35,low=20;
ucharsign;
ucharq=0;
uchartt=0;
ucharscale;
ucharidatabuf[1]={0x00};
intnum=0;
intnum1=0;
//*****温度小数部分用查表法****//
ucharcodeditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
//小数断码表
ucharcodetable_dm[15]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40,0x38,0x76,0x39};
uchartable_dm1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
//个位带小数点的断码表
uchardatatemp_data[2]={0x00,0x00};
//读出温度暂放
uchardatadisplay[5]={0x00,0x00,0x00,0x00,0x00};
/**********延时函数************/
//********扫描显示函数******//