单片机课设数字温度显示.docx
《单片机课设数字温度显示.docx》由会员分享,可在线阅读,更多相关《单片机课设数字温度显示.docx(21页珍藏版)》请在冰豆网上搜索。
单片机课设数字温度显示
单片机课程设计任务书——数字显示温度计
目录
一:
摘要3
二:
设计要求3
三:
系统整体功能说明3
四:
各功能模块说明3
(一)硬件电路3
4.1数码管显示电路3
4.2温度检测电路4
4.3键盘电路4
4.4报警电路4
4.5.时钟电路4
4.6.复位电路5
(二)系统软件分析5
4.7.主程序5
4.8.读出温度子程序5
4.9温度转换命令字程序6
4.10计算温度子程序6
4.11显示数据刷新子程序7
五:
系统使用说明7
5.1.静态调试7
5.2.软件调试7
5.3.动态调试7
六:
总结与体会7
七:
参考文献7
附件:
源程序7
一:
摘要:
温度测量在生产和生活中的作用是显而易见的。
如石化企业中,根据不同的温度可以分离出汽油、柴油、煤油等产品;日常生活中,需要根据气温加减衣物,如此等等。
本设计利用单片机和集成温度传感器设计一个可以测量温度的数字显示温度计,并达到一定的测量精度。
本设计用ds18b20智能温度传感器作为检测元件,用LED数码管显示检测温度,该数字温度计与传统的温度计相比较,具有读数方便,测量反围广,测温准确等优点,主要用于对温度要求比较准确的场所。
关键字:
单片机数字温度显示AT89C51DS18B20
二:
设计要求:
1.至少利用3位数码管进行测量值的显示;
2.温度测量范围:
-50℃~100℃;
3.测量误差≤0.5℃;
4.可以任意设置上下限报警温度
三:
系统整体功能说明
本文所设计的数字温度显示器主要是由硬件和软件两大部分组成。
而硬件是前提,是整个系统执行的基础,它主要是为软件提供程序运行的平台。
而软件部分是对硬件端口所体现的信号,加以采集、分析、处理,最终实现控制其所要实现的各项功能,达到控制器对温度的采集及显示和报警等功能。
复位电路LED显示
报警温度AT89C51报警电路
调整电路
时钟电路温度传感器
图3:
系统整体功能图
四:
各功能模块说明(附图)
(一)硬件电路:
4.1数码管显示电路
图4-1:
数码管显示电路
4.2温度检测电路
图4-2:
温度检测电路
4.3键盘电路
图4-3:
键盘电路
4.4报警电路
图4-4:
报警电路
4.5.时钟电路
本次设计采用的是12M的晶振,电路图如下图3,两只电容在20pF~100pF之间取值,其取值在60pF~70pF时振荡器频率稳定性较高,按照一般经验,外接晶体时两个电容的取值为30pF。
,时钟电路如下图:
图4-5:
时钟电路
4.6.复位电路
在时钟电路工作后,只要在单片机的RST引脚上出现24个时钟振荡脉冲(2个机器周期)以上的高电平,单片机便可实现初始化状态服务。
为保证应用系统可靠的复位在设计复位电路时,通常使RST引脚保持4ms以上的高电平,只要RST保持高电平,MCS-51单片机就会循环复位;当RST从高电平变为低电平时,MCS-51单片机就从0000H地址开始执行程序,在单片机复位的有效期间,ALE、PSEN引脚输出高电平。
本次设计采用的是手动复位,其电路图如下:
图4-6.复位电路
(二)系统软件算法分析:
4.7.主程序:
主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量的当前温度值,温度测量每1s进行一次。
其程序流程见图4-7所示。
图4-7主程序流程图图4-8读温度流程图
4.8.读出温度子程序
读出温度子程序的主要功能是读出RAM中的9字节,在读出时需进行CRC校验,校验有错时不进行温度数据的改写。
其程序流程图如图4-8示
图4-9温度转换流程图
4.9温度转换命令字程序
温度转换命令子程序主要是发温度转换开始命令,当采用12位分辨率时转换时间约为750ms,在本程序设计中采用1s显示程序延时法等待转换的完成。
温度转换命令子程序流程图如上图,图4-9所示
4.10计算温度子程序
计算温度子程序将RAM中读取值进行BCD码的转换运算,并进行温度值正负的判定,其程序流程图如图4-10所示。
图4-10 计算温度流程图图4-11 显示数据刷新流程图
4.11显示数据刷新子程序
显示数据刷新子程序主要是对显示缓冲器中的显示数据进行刷新操作,当最高显示位为0时将符号显示位移入下一位。
程序流程图如图4-11。
五:
系统使用说明:
单片机系统的调试应包括硬件及软件两部分,主要是通过调试发现硬件及软件中存在的问题,查看其运行结果是否符合设计要求。
在对系统进行实际调试时,首先应对硬件进行静态调试,同时对系统软件进行初步调试,此后再对软件和硬件进行动态调试,最后才能使系统进入正常工作.
1.静态调试:
静态调试主要是排除明显的硬件故障。
在将芯片、传感器等元件连接到电路板上时,要保证各处电源极性、电压正确,以防止因电源极性接反或电压过高损坏芯片或传感器。
此外,插入芯片必须在断电的情况下进行,特别注意芯片的方向不要插反。
2.软件调试:
在软件调试时采用在计算机上利用模拟软件实现对单片机的硬件模拟、指令模拟及运行状态模拟,从而完成应用软件开发的全过程。
调试过程中的运行状态、各寄存器状态、端口状态等都可以在指定的窗口区域显示出来,通过这些显示结果随时跟踪程序运行状态,以确定程序运行无错误。
3.动态调试:
控制系统的软件和硬件是密切相关的,由于软件模拟开发系统不能对硬件部分进行诊断,同时也不能实时在线仿真,所以用户程序还需跟硬件连接起来进行联调,同时对软件和硬件进行检查和诊断。
整个单片机系统进行在线调试时,需借助仿真开发工具来对用户软件及硬件电路进行诊断、调试。
在应用系统各模块电路调试成功后,将程序加载到在线仿真器上,这时就能单步或连续地执行目标程序,同时也可以根据需要分段设置断点执行程序。
而对于一些与硬件相关的用户程序,如接口驱动程序等,则需要配合硬件,进行在线调试,如果有逻辑错误,也要及时纠正修改。
程序调试完毕后,利用编程器将程序固化到单片机中,使整个系统运行起来。
六:
总结与体会:
经过上半学期对单片机的理论学习以及这三周的单片机的课程设计终于完成了我的数字温度计的设计,它的各方面性能基本上都已达到课程设计的要求。
在本次设计过程中,我发现了很多问题,这些问题在单纯的学习课本上的知识时所不能遇到的,比如51单片机的端口驱动能力较弱,用P0口送段代码时要接上拉电阻,还有就是比较深入的理解了数码管的动态显示以及键盘的显示原理,对汇编语言也有了较深入的理解,这次课程设计使我对单片机的兴趣有了很大提升,我决定以此次课程设计为起点,争取巩固我的单片机基础,学好单片机。
从这次的课程设计中,我真真切切的体会到了理论与实践的差别,所以在以后的学习中,我会更加注意理论与实践相结合,多亲自动手操作,把所学的理论知识运用到实践中去,在实践中验证理论知识,以此来加深对理论的理解和掌握,这是我在这次课程设计中的最大收获。
七:
参考文献:
[1]张毅刚《单片机原理运用》(第二版)高等教育出版社,2004年
[2]杨欣《51单片机应用从零开始》清华大学出版社,2007年
[3]方佩敏《新编传感器原理·应用·电路详解》电子工业出版社,1993
附件:
源程序:
#include
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
externuintMnDS18B20(void);
externvoiddisplay();
externvoidlcd_Init(void);
externbitDS18B20_Init();
voidmain(void)
{
lcd_Init();
DS18B20_Init();
while
(1)
{
MnDS18B20();
display();
}
}
#include
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineSkipROM0xcc//跳过ROM指令,此处不用读ROM中的序列号
#defineTempCvt0x44//温度转化命令
#defineReadTemp0xbe//读温度命令
/******************************接口定义***********************************/
sbitDQ=P3^4;//数据线接口
/******************************变量定义***********************************/
bitNP=0;//正负标志
uintTempReg=0;//16bit温度值
ucharIntgerL=0;//个位整数位
ucharIntgerM=0;//十位整数位
ucharIntgerH=0;//百位整数位
ucharDecimalL=0;//第一位小数
ucharDecimalH=0;//第二位小数
ucharDecimalML=0;//第三位小数
ucharDecimalMH=0;//第四位小数
uintcodeTempTab[]={0x0000,0x0625,0x1250,0x1875,//小数部分转换表
0x2500,0x3125,0x3750,0x4375,
0x5000,0x5625,0x6250,0x6875,
0x7500,0x8125,0x8750,0x9375
};
/******************************外部函数声明*******************************/
externvoiddelayus(ucharz);//us延时函数
externvoiddelay(uintz);//ms延时函数
externvoidwrite_com(ucharcom);//写命令函数
externvoidwrite_data(uchardate);//液晶写数据;
externvoidN_nop(uintt);//延时函数
/*****************************************************************
*函数名称:
18B20_Init
*功能描述:
DS18B20初始化函数
*入口参数:
None
*出口参数:
None
*返回值:
0\1
*****************************************************************/
bitDS18B20_Init()
{
DQ=0;//数据线拉低
N_nop(500);//延时480us
DQ=1;//数据线拉高
N_nop(7);//延时25us
if(DQ==1)
{
DQ=1;//数据线拉高
return(0);//初始化失败返回0
}
else
{
N_nop(240);//延时240us
DQ=1;//数据线拉高
return
(1);//初始化成功返回1(初始化成功则P3.4口被拉为低电平)
}
}
/*****************************************************************
*函数名称:
Write18B20
*功能描述:
向DS18B20写一个字节
*入口参数:
Data
*出口参数:
None
*返回值:
None
*****************************************************************/
voidWrite18B20(ucharData)
{
uchardatai;
for(i=8;i>0;i--)
{
DQ=0;
DQ=Data&0x01;//数据的发送时:
先发送低位,后发送高位
N_nop(10);
DQ=1;
Data>>=1;
}
}
/*****************************************************************
*函数名称:
Read18B20
*功能描述:
从DS18B20读数据
*入口参数:
None
*出口参数:
None
*返回值:
Data
*****************************************************************/
ucharRead18B20()
{
uchardatai=0;
uchardataData=0;
for(i=8;i>0;i--)
{
DQ=0;//给脉冲信号
Data>>=1;
DQ=1;//给脉冲信号,给一个低脉冲,接收一位数据
if(DQ)
Data|=0x80;//从低位开始接收
N_nop(10);
}
return(Data);
}
/*****************************************************************
*函数名称:
Read18B20
*功能描述:
从DS18B20读数据
*入口参数:
None
*出口参数:
None
*返回值:
Data
*****************************************************************/
voidGetTemp(void)
{
uchardataTempL,TempH;
while(!
DS18B20_Init());//初始化不成功则继续初始化
Write18B20(SkipROM);//发出跳过ROM指令
Write18B20(TempCvt);//发出温度转化命令
N_nop(800);//延时800us
while(!
DS18B20_Init());//初始化不成功则继续初始化
Write18B20(SkipROM);//发出跳过ROM指令
Write18B20(ReadTemp);//发出读温度命令
TempL=Read18B20();//调用读程序,读出两字节
TempH=Read18B20();
TempReg=TempH;//低八位与高八位复合
TempReg=TempReg<<8;
TempReg=TempReg|TempL;
if((TempReg&0x800)!
=0x800)//温度为正或负
NP=0;//正温度
else
{
TempReg=~TempReg+1;//负温度
NP=1;
}
}
/*****************************************************************
*函数名称:
DataCovt
*功能描述:
将读出的温度数据拆分为整数和小数部分,并转为ASIC码
*入口参数:
None
*出口参数:
None
*返回值:
Data
*****************************************************************/
voidDataCovt(void)//11位有效位
{
uchardataRwk1,Rwk2;//Rwk1为整数部分、Rwk2为小数部分
uintdataRwk3;//Rwk3
//ssss,sxxx,xxxx,dddd十六位数据结构
Rwk1=(TempReg&0x07f0)>>4;//正数与上0x07f0
Rwk2=TempReg&0x000f;//符号位|整数|小数(整数部分-55--125,为7位)
IntgerH=Rwk1/100;//整数部分百位
IntgerM=Rwk1%100/10;//整数部分十位
IntgerL=Rwk1%10;//整数部分个位
Rwk3=TempTab[Rwk2];
DecimalL=Rwk3&0x000f;//小数部分小数点后第四位
DecimalML=(Rwk3&0x00f0)>>4;//小数点后第三位
DecimalMH=(Rwk3&0x0f00)>>8;//小数点后第二位
DecimalH=(Rwk3&0xf000)>>12;//小数点后第一位
}
/*****************************************************************
*函数名称:
MnDS18B20
*功能描述:
DS18B20驱动函数
*入口参数:
None
*出口参数:
None
*返回值:
None
*****************************************************************/
voidMnDS18B20(void)
{
GetTemp();//温度采集
DataCovt();//采集值变换为BCD码
}
#include
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitRS=P3^5;//数据/命令选择写数据RS=1;RW=0;D0~D7数据;E高脉冲
sbitRW=P3^6;//读写选择写指令RS=0;RW=0;D0~D7指令码;E高脉冲;
sbitEn=P3^7;//使能信号;
/*******************变量*******************************************/
ucharcodeTeam1[]="NowTemperature:
";
ucharcodeTable[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
/*******************外部变量***************************************/
externbitNP;
externucharIntgerL;//个位整数位
externucharIntgerM;//十位整数位
externucharDecimalH;//第二位小数
externucharDecimalMH;//第四位小数
//ucharcodetable7[]="PressS4toset";
//ucharcodetable8[]="standardtemp!
";
/******************************变量的定义*********************************/
//ucharcodetable[8]={0x16,0x09,0x08,0x08,0x08,0x09,0x06,0x00};//自定义字符显示'C;
//ucharcodetable1[]="DS18B20OK!
";
//ucharcodetable2[]="TEMPIS:
.";
/*************************ms延时函数******************************/
voiddelay(uintz)
{
uinti,j;
for(i=z;i>0;i--)
for(j=113;j>0;j--);
}
///*************************us延时函数******************************/
//voiddelayus(ucharz)
//{
//while(z--);
//}
/*****************************************************************
*函数名称:
N_nop
*功能描述:
短延时函数
*入口参数:
a
*出口参数:
None
*返回值:
None
*****************************************************************/
voidN_nop(uintt)
{
uinti;
for(i=t;i>0;i--)
_nop_();
}
/***************************液晶写指令***************************/
voidwrite_com(ucharcom)
{
RS=0;
RW=0;
P1=com;
En=1;
delay(5);
En=0;
}
/***************************液晶写数据***************************/
voidwrite_data(uchardate)
{
RS=1;
RW=0;
P1=date;
En=1;
delay(5);
En=0;
}
/************************液晶初始化状态*****************