资源描述
课程设计
课程名称: 基于单片机的温度监测系统设计
学 院: 明德学院 专 业: 电自10152
姓 名: 郭贵方 号: 102003110228
年 级: 大三 任课教师: 杨靖
2013年 7月 6日
目 录
前 言
第一章 单片机概述**********************************************3
第二章 总体方案设计********************************************5
2.1 课题的意义*********************************************5
2.2 系统整体硬件电路***************************************5
2.2.1 芯片简介**********************************************5
2.2.2 硬件电路设计及描述************************************6
第三章 系统软件算法设计***************************************11
心得体会******************************************************20
参考文献******************************************************21
第一章 单片机概述
单片机诞生于20世纪70年代末,经历了SCM、MCU、SoC三大阶段。单片机由运算器、控制器、存储器、输入输出设备构成。
单片机是一种集成在电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的计算机系统。早期单片机主要由于工艺及设计水平不高、功耗高和抗干扰性能差等原因,所以采取稳妥方案:即采用较高的分频系数对时钟分频,使得指令周期长,执行速度慢。以后的 CMOS单片机虽然采用提高时钟频率和缩小分频系数等措施,但这种状态并未被彻底改观(51以及51兼容)。此间虽有某些精简指令集单片机(RISC)问世,但依然沿袭对时钟分频的作法。单片机问世以来所走的路与微处理器是不同的。微处理器向着高速运算、数据分析与处理能力、大规模容量存储等方向发展,以提高通用计算机的性能。其接口界面也是为了满足外设和网络接口而设计的 。单片机则是从工业测控对象、环境、接口特点出发,向着增强控制功能、提高工业环境下的可靠性、灵活方便的构成应用计算机系统的界面接口的方向发展。因此,单片机有着自已的特点,主要是:〔1〕〔2 〕
·品种多样,型号繁多。品种型号逐年扩充以适应各种需要。使系统开发者有很大的选择自由。
·提高性能,扩大容量。集成度已达200万个晶体管以上。总线工作速度已达数十微秒。工作频率达到30MHz甚至40MHz。指令执行周期减到数十微秒。存储器容量RAM发展到1K、2K,RO M发展到32K、64K;
·增加控制功能,向外部接口延伸。把原属外围芯片的功能集成到本芯片内。现今的单片机已发展到在一块含有CPU的芯片上,除嵌入RAM、ROM存储器和I/O接口外,还有A/D、PWM、U ART、Timer/Counter、DMA、Watchdog、Serial Port、Sensor、driver、还有显示驱动、键盘控制、函数发生器、比较器等,构成一个完整的功能强的计算机应用系统;
·低功耗。供电电压从5V降到3V、2V甚至1V左右。工作电流从mA级降到μA级。在生产工艺上以CMOS代替NMOS,并向HCMOS过渡;
·应用软件配套。提供了软件库,包括标准应用软件,示范设计方法。使用户开发单片机应用系统时更快速、方便。使有可能做到用一周时间开发一个新的应用产品;
·系统扩展与配置。有供扩展外部电路用的三总线结构DB、AB、CB,以方便构成各种应用系统。根据单片机网络系统、多机系统的特点专门开发出单片机串行总线。此外,还特别配置有传感器,人机对话 、网络多通道等接口,以便构成网络和多机系统。
目前单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹全保障系统,录像机、摄像机、全自动洗衣机的控制,以及程控玩具、电子宠物等等,这些都离不开单片机。更不用说自动控制领域的机器人、智能仪表、。导弹的导航装置,飞机上各种仪表的控制,计算机的网络通讯与数据传输,工业自动化过程的实时控制和数据处理,广泛使用的各种智能IC卡,民用豪华轿车的安医疗器械以及各种智能机械了。因此,单片机的学习、开发与应用将造就一批计算机应用与智能化控制的科学家、工程师。单片机广泛应用于仪器仪表、家用电器、医用设备、航空航天、专用设备的智能化管理及过程控制等领域。
第二章 总体方案设计
2.1 课题设计的意义
一:消化与巩固《单片机原理及接口技术》课程所学的知识。
一切问题来源于书本,在做课题的时候,有很多的问题都需要在课本中找到答案,这就使得把这学期的《单片机原理及接口技术》有了一次系统的复习,对所学的知识进行了巩固与消化。
二:理论联系实际,用理论知识解决实际的问题。
三:培养设计能力,初步掌握设计的步骤和方法。
四:设计一个具有一定功能的温度检测系统,该系统上电或按键复位后监测准备状态,按监测启动键,系统开始监测温度,并将温度通过串行口方式传送给计算机,按下停止键,系统停止监测。要求使用DS18B20监测温度,有上电复位和按键复位,要有声光报警。
2.2 系统整体硬件电路
2.2.1 芯片介绍
本次设计一共用到了以下几个芯片:80C51、DS18B20、74LS138、LED数码管显示器。
80C51的介绍:MCS-51系列单片机的硬件结构基本相同,主要区别在于芯片上ROM的形式和配置。8051的基本结构由:1个8位的CPU、1个片内时钟振荡器、4KB的片内程序存储器、128个字节的片内数据存储器、4个并行的I/O口,具有32个双向的、可独立操作的I/O线、2个16位的定时/计数器、1个全双工的串行口、5个中断源,可设置成2个优先级、21个特殊功能寄存器、具有很强的布尔处理功能有机结合在一起,共有40 个引脚。
DS-18B20 数字温度传感器的介绍:DS18B20可组网数字温度传感器芯片封装而成,具有耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域。独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。 测温范围 -55℃~+125℃,固有测温分辨率0.5℃,支持多点组网功能,多个DS18B20可以并联在唯一的三线上,最多只能并联8个,实现多点测温,如果数量过多,会使供电电源电压过低,从而造成信号传输的不稳定。DS18B20数字温度计提供9位二进制温度读数,指示器件的温度,信息经过单线接口送入BS1820,因此从主机CPU到DS1820仅需一条线盒地线,DS1820的电源可以由数据线本身提供而不需要外部电源。
74LS138的介绍:74LS138是一种常用的3-8译码器芯片。其中,A、B、C为数据输入端,/G2A.、/G2B、和G1为数据输入允许端,/YO-/Y7为译码器的输出端,低电平有效,显然,当输入C、B和A的状态确定时,译码器输出/Y0~Y7只有1个为低电平,其余为高电平。
LED数码显示器的介绍:LED数码显示管是单片机应用产品中常用的廉价输出设备,它是由若干个发光二极管组成显示字段,当二极管导通时,相应的一个点或一个笔画发光,就能显示出各种字符,常用的8段LED显示a~g和dp为显示字段控制端。
2.2.2硬件电路的描述及设计
二 硬件电路的描述
1. 温度采集系统功能说明及总体方案的介绍
(1)温度测量功能
利用DS18B20数字温度传感器实现对温度进行精确测量,是温度值显示在数码管上。
(2)温度采集功能
利用DS18B20数字传感器对温度进行采集,单片机作为控制器件,数据通过串行口传至计算机,进行温度的采集。
(3)系统工作流程
附图一
(4)总体方案的介绍
利用DS18B20对温度进行下采集,通过单片机的处理,在LED上显示出数据,利用两个开关控制,开始键按下,开始测试,停止按键,按下后停止检测,数码管显示最近一次检测值。超过60度,声光报警。
2 绘制硬件电路图,
3 温度检测系统的原件清单
器件名称
数量
80C51单片机
1个
DS18B20
1个
74LS138
1个
LED数码管
3个
蜂鸣器
1个
二极管
1个
电容
若干
电阻
若干
开关
若干
4 详细介绍温度检测系统电路主要部分的工作原理
(1) 单片机型号的选择及引脚的工作情况
本设计用到了80C51共有40个引脚,其中用到的引脚有:控制引脚、RESET、/EA、P0、P1、P2口,还用到了XTAL1、和XTAL2的晶整信号的输入、输出引脚。
RESET引脚:复位信号,在RESET引脚上保持2个机器周期以上的高电平,单片机复位,通过按键上电复位电路输入信号,控制单片机。
/EA引脚:内外程序存储器选择控制端,/EA接高电平,CPU对程序存储器的操作从单片机内部程序存储器开始,并可延伸到单片机的外部程序存储器。
P0口引脚:8位双向的三态I/O口,单片机有外部扩展时,作为低8位地址线和数据总线使用,可以驱动8个TTL负载,在设计中P0.0和P0.1控制开关K1和K2,P0.2、P0.3、P0.4控制74LS138译码器的选通。
P1口引脚:8位准双向I/O口,可以驱动4个TTL负载,在设计中P1.0接的是GND接地引脚,P1.1和P1.2接的是声光报警器,P1.3接的是DS18B20的温度检测器。
P2口引脚:8位准双向的I/O口,当单片机有外部扩展时,作为高8位的地址线使用,可以驱动4个TTL负载,设计中用P2口控制三个共阴级的LED。
XTAL1、XTAL2引脚:晶体振荡器信号输入输出引脚,用来控制设计中的晶振电路。
(2)复位电路的原理
复位电路的目的是产生持续时间小于2个机器周期的高电平。通常,在设计时,使复位电路在单片机上能产生1~10MS的高电平,保证可靠的实现复位。
按键开关及上电自动复位电路:上图为按键开关及上电自动复位电路,当按键开关S按下时,+5V电源通过S接通电阻R和R1构成电路网咯,设计时使电阻R1上的分压达到高电平的值,就可以是单片机复位,因为按动按钮开关使其闭合的时间远远大于单片机复位随需要的时间,通常把上电复位和按钮开关复位电路综合在一起,这样就可以在每一次电源接通时系统复位,也可以满足强制复位的要求,C取22uf,R取1000,R1取200左右。
(3)74LS138译码器的工作原理
原理:当一个选通端G为高电平,另外两个选通端/G2A、/G2B为低电平时可以将地址端(A、B、C)的二进制编码在一个对应的输出端以低电平输出。其真值表如下:
/G
/G2A
/G2B
C
B
A
/Y0
/Y1
/Y2
1
0
0
0
0
0
0
1
1
1
0
0
0
0
1
1
0
1
1
0
0
0
1
0
1
1
0
当C、B、A输出为000时,74LS138选中LED1,LED1管发亮,输出001时,LED2管发亮,输出为010时,LED3管发亮。
(4)晶振电路
利用单片机芯片上提供的反相放大器电路,在XTAL1和XTAL2引脚之间外接振荡源构成单片机的时钟电路,有振荡源OSC和 电容C1和C2构成了并联谐振回路作为定时元件,振荡源QSC晶体振荡器或陶瓷振荡器,频率为1.2~~12MHz,电容C1、C2为30pF,起频率微调作用,在单片机的应用系统中,晶振的频率越高,单片机的运行速度越快。
(5)声光报警系统
声光报警器的主要源器件是由感应器,发光二极管、蜂鸣器等构成整个报警器,当温度超过60是,就自动报警。
(6)DS18B20温度检测器的原理
DS18B20工作过程中的协议如下:初始化,ROM操作指令,存储器操作指令,数据处理。
多路测量,当每一片DS18B20在其ROM中都存有其唯一的48位系列号,在出厂前,与写入片内ROM,主机在进入操作程序前必须接入1820用读,ROM命令将1820的系列号读出并登陆,在1820组成的测温系统中,主机在发出跳过ROM命令之后,再发出系统的温度转换启动码,就可以实现所有1820的统一转换,在经过一秒后,就可以用很少的时间逐一读取。
第三章:系统软件算法设计
由于汇编语言学的时间太短,所以用C语言。望老师谅解!
#include <reg52.h>
#include <intrins.h>
#include <stdio.h>
#include <math.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
sbit key1 = P1^1; //按下开始检测
sbit key2 = P1^3; //按下显示
sbit le = P2^3;
sbit oe = P2^4;
sbit beep=P1^6;
sbit DQ=P1^7; //DS18B20数据I/O口
#define COMMAND_UNKNOW 8 //不可识别的返回类型
//=============================================================================
// 基本的常用常量
//=============================================================================
#define TRUE 1 //正确
#define FALSE 0 //错误
unsigned char num;
uchar code dispcode[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0xff,0x6f
}; //共阴极显示代码
uchar disp_buf[3]={0x00,0x00,0x00}; //显示数据缓冲区
uchar dp0=0,dp1=0,dp2=0;
#define NOP _nop_()
uchar temp_h,temp_l; /*温度值变量*/
uchar flag1; /*正负标志位*/
sbit tem_in=P1^7; /*温度读取端口1*/
uchar Tem_H,Tem_L; //用于存储温度转换值高8位和低8位
bit Flag=0; //正、负温度值符号标志位,0为正,1为负
void delay1ms(uchar x); //延时约1ms程序
/************************函数声明***********************/
void delay(int us); //延时函数
bit Init_DS18B20(void); //DS18b20初始化函数
uchar Read_bit(void); //DS18b20读一个字节
void Write_bit(uchar val_bit); //DS18b20写一个字节
uchar Read_byte(void); //DS18B20读字节函数
void Write_byte(uchar com); //DS18B20写字节函数
int ReadTemperature(); //DS18b20读取温度
void display_temp(void); //显示函数
void adj_dat(); //显示字节调整函数
void l_delay(int n); //延时函数
void delay(unsigned int count)
{
unsigned int i;
while(count)
{
i=200;
while(i>0)i--;
count--;
}
}
void Delay_us(uchar n)
{
uchar i;
i=0;
while(i<n)
{i++;}
return;
}
void dsreset(void)
{
unsigned int i;
tem_in=0; //温度输入端口
i=103;
while(i>0)i--;
tem_in=1;
i=4;
while(i>0)i--;
}
/*====================================
函数功能:向B20写一字节
入口参数:待写数据
说 明 :
=====================================*/
void tmpwrite(unsigned char dat)
{ unsigned int i;
unsigned char j;
bit testb;
for(j=1;j<=8;j++)
{ testb=dat&0x01;
dat=dat>>1;
if(testb)
{ tem_in=0;i++;i++;
tem_in=1;
i=8;while(i>0)i--;
}
else
{
tem_in=0;
i=8;while(i>0)i--;
tem_in=1;i++;i++;
}
}
}
/*====================================
函数功能:直接读一字节程序
入口参数:无
说 明 :返回结果
=====================================*/
uchar ReadByte(void){
uchar i,k;
i=8;
k=0;
while(i--)
{
tem_in=1;
Delay_us(1);
tem_in=0;
k=k>>1;
tem_in=1;
NOP;
if(tem_in)k |= 0x80;
Delay_us(4);
}
return(k);
}
void tmpchange(void)
{
dsreset(); /*复位*/
delay(1);
tmpwrite(0xcc); //跳过序列号命令
tmpwrite(0x44); //转换命令
delay(1);
}
void tmp(void)
{
float dis;
// uchar tempbuf;
dsreset();
delay(1);
tmpwrite(0xcc);
tmpwrite(0xbe);
temp_l=ReadByte(); //低位在前
temp_h=ReadByte(); //高位在后
flag1=temp_h&0xf8;
if(flag1)
{
temp_h=~temp_h;
if(temp_l==0)temp_h++; //若低8位全为0且温度为负,取补时就要向高位进1
temp_l=~temp_l+1;
}
dis=(temp_h*256+temp_l)/16;
if((int)dis<0||(int)dis>60)
disp_buf[0]=dispcode[(int)dis%1000/100]; //显示百位
disp_buf[1]=dispcode[(int)dis%100/10]; //显示十位
disp_buf[2]=dispcode[(int)dis%10]; //显示个位
}
/***************温度检测*****************/
void tmp_test(void)
{
float dis;
dsreset();
delay(1);
tmpwrite(0xcc);
tmpwrite(0xbe);
temp_l=ReadByte(); //低位在前
temp_h=ReadByte(); //高位在后
flag1=temp_h&0xf8;
if(flag1)
{
temp_h=~temp_h;
if(temp_l==0)temp_h++; //若低8位全为0且温度为负,取补时就要向高位进1
temp_l=~temp_l+1;
}
dis=(temp_h*256+temp_l)/16;
if(dis<0||(int)dis>60)//超出温度极限报警
beep=1;
else beep=0;
}
/***********主程序***************/
void main (void)
{
dp0=dispcode[0];
dp1=dispcode[0];
dp2=dispcode[0];//初始化数码管显示0
delay1ms(2000); //延时2S
while(1)
{
tmpchange();
delay(10);
tmp_test();//检测温度并报警
if(!key1)
{
delay1ms(10); //去抖动
tmpchange(); // 启动温度转换
delay(10);//采集温度
}
if(!key2)
{
delay1ms(10);
dp0=disp_buf[0];
dp1=disp_buf[1];
dp2=disp_buf[2];//将采集温度赋给显示变量
}
//分段显示数码管数字
P2=0x00;
P0 =dp0;
delay1ms(1);
P2=0x01;
P0 =dp1;
delay1ms(1);
P2=0x02;
P0 =dp2;
delay1ms(1);
}
}
/**********************延时函数**************************/
void l_delay(int n)
{
int i,j;
for(i=0;i<n;i++)
for(j=0;j<1000;j++);
}
/*******************DS18B20复位函数***********************/
bit Init_DS18B20(void)
{
bit res;
DQ=0; //拉低DQ线
delay(29); //延时480us
DQ=1; //DQ线置高
delay(10); //延时
res=DQ; //读取复位响应信号
delay(10);
return(res); //返回响应值
}
/*******************DS18B20读位函数***********************/
uchar Read_bit(void)
{
uchar i;
DQ=0; //拉低DQ线
DQ=1; //DQ线置高
for(i=0;i<3;i++); //延时15us
return(DQ); //返回当前读取值
}
/*******************DS18B20写位函数***********************/
void Write_bit(uchar val_bit)
{
DQ=0; //拉低DQ
if(val_bit==1)DQ=1; //从DQ线发送1
delay(5); //延时
DQ=1;
}
/********************DS18B20读字节函数*********************/
uchar Read_byte(void)
{
uchar i;
uchar temp=0;
for(i=0;i<8;i++)
{
if(Read_bit())temp|=0x01<<i; //向temp写入读取位
delay(6);
}
return(temp); //返回读取字节
}
/*********************DS18B20写字节函数*******************/
void Write_byte(uchar com)
{
uchar i,temp;
for(i=0;i<8;i++)
{
temp=com>>i; //右移i次取低位发送
temp&=0x01;
Write_bit(temp);
}
delay(5);
}
/*****************温度值正负判断程序******************/
uint Get_Tem(uchar dath,uchar datl)
{
uint temp=0,temp_h=0,temp_l;
temp_h=(uint)dath;
temp=temp_h&0x00ff;
temp_l=(uint)datl;
temp_l&=0x00ff;
temp=(temp<<8)|temp_l; //去掉符号值后合并成16位数据
if((dath&0x80)==0x80)
{
Flag=1;
temp=~temp+1; //负数时求补
}
else
{
Flag=0;
}
return(temp);
}
/***************************温度读取函数****************************/
int ReadTemperature()
{
uint temp=0;
float temp1=0;
while(!(Init_DS18B20()));
Write_byte(0xCC); //跳过读序号列号的操作
Write_byte(0x44); //启动温度转换
while(!(Init_DS18B20()));
// Match_ROM(n);
Write_byte(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
Tem_L=Read_byte(); //低位
Tem_H=Read_byte(); //高位
temp=Get_Tem(Tem_H,Tem_L);
temp1=temp*0.0625;
temp=temp1*10+0.5;
return(temp);
}
/***************************显示数据处理函数**************************/
void adj_dat()
{
uint temp;
temp=ReadTemperature(); //读温度
//temp=345;
disp_buf[0]=dispcode[temp%1000/100]; //显示百位
disp_buf[1]=dispcode[temp%100/10]; //显示十位
disp_buf[2]=dispcode[temp%10]; //显示个位
}
void delay1ms(uchar x) //延时约1ms程序
{
uchar Time,Time1;
for(Time=0;Time<x;Time++)
for(Time1=0;Time1<120;Time1++);
}
心得体会
通过这次单片机课程设计,我不仅加深了对单片机理论和汇编语言的理解,将理论很好地应用到实际当中去,而且我还学会了如何去培养我们的创新精神,从而不断地战胜自己,超越自己。创新可以使自己在原有的基础上进行改进,使之功能不断完善,使之成为自己的东西。
杨靖老师严格要求虽然给我带来的很大的压力,但是给我们的收益也是成正比的,从开始的浮躁、不认真到最后的努力专研;我们的态度从根本上发生了变化;
在这里深深的感谢杨老师的教导,让我们认识到自己的不足、浮躁、
展开阅读全文