- 1、本文档共14页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
单片机课程设计
基于数字温度计DS18B20的温度测量与显示系统
专业名称:航空自动化
专业班级:111141A
姓 名:郭赢
学 号:111141107
指导老师:常美华/赵淑舫
课程设计要求
·基本要求
1.利用1个DS18B20测量室内温度(误差小于?)
2.用数码管显示温度
3.显示精度为0.1℃
·扩展要求
1.多通道测量
2.LCD显示
3.生成印刷电路板
设计综述
本次设计使用DS18B20温度传感器,设计了一种基于单片机的数字温度计,克服了传统温度计读数麻烦、测量速度慢、精度低、误差大等缺点。该数字温度计设计电路简单,其输出温度采用数字显示,读数直接,分辨率高,为人们工作、科研、生活提供更好、更方便的电子产品设施。
1、温度传感器DS18B20电路
对DS18B20供电的一种传统办法是从VCC引脚接入一个外部电源,见图。这样做的好处是单总线上不需要强上拉。而且总线不用在温度转换期间总保持高电平;GND端接地;DQ端经上拉电阻与AT89C51相连。
2、显示电路
1、显示电路采用4位共阳极LED数码管,P0口由上拉电阻提高驱动能力,作为段码输出并作为数码管的驱动。P2口的低四位作为数码管的位选端。采用动态扫描的方式显示。
对于扩展部分,显示电路采用LCD1602显示,P0口由上拉电阻提高驱动能力。P2.4作为数据/指令寄存器选择短,P2.5为LCD1602的使能信号端。P3.7端为DS18B20与AT89C51连接段。
对于扩展部分,多通道并显示电路采用LCD1602显示,P0口由上拉电阻提高驱动能力。P2.4作为数据/指令寄存器选择短,P2.5为LCD1602的使能信号端。P3.6和P3.7分别为DS18B20与AT89C51的连接端。
3、AT89C51的连接电路
AT89C51的第18脚和第19脚外接由C1、C2和X1构成的石英晶体震荡器电路;AT89C51的第9脚外接由K1、R1、R2和C3构成的按钮复位电路;AT89C51的第31脚外接电源,以进行片内和片外程序存储器的选择控制。
主程序流程图和各个子程序的流程图
1、主程序流程图
主程序首先对DS18B20进行初始化,然后读出DS18B20中的温
度值并进行数据处理,之后再进行数码管显示。其程序流程见图。
=
2、温度读取子程序流程图
3、温度转换子程序流程图
1602显示程序及说明:
#includereg51.h
#includeabsacc.H
#include intrins.h
#includestdio.h
#define uchar unsigned char
#define uint unsigned int
#define LCD_DB P0//LCD的数据端
sbit ds=P3^7;//定义DS18B20数据线
sbit LCD_RS=P2^4;//数据/指令寄存器选择端
sbit LCD_E=P2^5;//使能
uchar v[]={0,0,0,0,0};//温度值存取数组
uchar busy_flag;//忙状态标志位
bit list_flag=0;//18b20初始化正确与否标志位
uchar temp_value;//小数部分
uchar flag;//正负号标志位
void delay(uint ms) //18b20的延时程序
{
while(ms--);
}
//DS18B20的初始化程序,給复位脉冲和存在脉冲,通过返回值status判断初始化是否成//功
uchar Init(void )//DS18B20初始化
{
uchar status;
ds=1;
delay(8);
ds=0;
delay(90);//延时
ds=1;
delay(8);//延时
status=ds; //如果为0,则初始化成功,如果为1,则初始化失败
delay(100);//延时
ds=1;
return(status);
}
//通过8次循环移位读出DS18B20中的数据
uchar tempread(void)//从DS18B20读取一个字节数据
{
uchar i=0;
uchar dat=0;
for(i=8;i0;i--)
{
ds=0;//给脉冲信号
dat=1;
ds=1;
_nop_();
_nop_()
文档评论(0)