单片微型计算机原理与接口技术课程设计报告温度测量.docx
《单片微型计算机原理与接口技术课程设计报告温度测量.docx》由会员分享,可在线阅读,更多相关《单片微型计算机原理与接口技术课程设计报告温度测量.docx(24页珍藏版)》请在冰豆网上搜索。
![单片微型计算机原理与接口技术课程设计报告温度测量.docx](https://file1.bdocx.com/fileroot1/2022-11/16/b3752319-8e7b-42a8-bac3-fb1161a5dbc9/b3752319-8e7b-42a8-bac3-fb1161a5dbc91.gif)
单片微型计算机原理与接口技术课程设计报告温度测量
单片微型计算机原理与接口技术课程设计报告
题目:
温度测量
班级:
学号:
姓名:
指导老师:
实习日期:
6.27~7.1
1、课程设计要求
(1)通过按键设置温度上、下限
(2)读入A/D转换数据:
若数据<下限,则显示温度并显示L、报警并使步进电机正转;
若数据>上限,则显示温度并显示H、报警并使步进电机反转;
若下限<数据<上限,则显示C
(3)本机地址为06H,当接到上位机发的06H时,则回发06H
当接到上位机发的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"
#include"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;delay(50);w1=1;
case2:
dm=table_dm[display[2]];w2=0;delay(50);w2=1;
case3:
dm=table_dm[display[3]];w3=0;delay(50);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;
do{}while(TI==0);TI=0;
}
elseif(cc==0)
{SBUF=0x55;
display[3]=0x0d;
display[2]=0x0d;
display[1]=0x0d;
display[0]=0x0d;
do{}while(TI==0);TI=0;
}
else;
}
/************main***************/
voidmain()
{
init();
dm=0x00;//初始化端口
w0=0;
w1=0;
w2=0;
w3=0;
for(h=0;h<4;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[3]=0x0a;
display[2]=0x0e;
display[1]=buf[0]%100/10;
display[0]=buf[0]%10;
}
}
}
}
下位机软件清单
#include"reg51.h"
#include"intrins.h"//_nop_();延时函数用
#definedmP0//段码输出口
#defineucharunsignedchar
#defineuintunsignedint
ucharcodeTable[4]={0x03,0x06,0x0c,0x09};
ucharcodeTable1[4]={0x09,0x0c,0x06,0x03};
sbitDQ=P2^7;//温度输入口
sbitw0=P2^0;//数码管4
sbitw1=P2^1;//数码管3
sbitw2=P2^2;//数码管2
sbitw3=P2^3;//数码管1
sbitbeep=P3^7;//蜂鸣器和指示灯
sbitset=P2^6;//温度设置切换键
sbitadd=P2^4;//温度加
sbitdec=P2^5;//温度减
sbitlig=P3^6;
inttemp1=0;//显示当前温度和设置温度的标志位为0时显示当前温度
uinth;
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};
//共阴LED段码表"0""1""2""3""4""5""6""7""8""9""不亮""-"'L''H''C'
uchartable_dm1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//个位带小数点的断码表
uchardatatemp_data[2]={0x00,0x00};//读出温度暂放
uchardatadisplay[5]={0x00,0x00,0x00,0x00,0x00};//显示单元数据,共4个数据和一个运算暂用
/**********延时函数************/
voiddelay(uintt)
{
for(;t>0;t--);
}
//********扫描显示函数******//
voidscan()
{
intj;
for(j=0;j<4;j++)
{