基于DS18b20的温度测量和秒表设计单片机最小系统实验报告 精品.docx
- 文档编号:23013295
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:39
- 大小:798.74KB
基于DS18b20的温度测量和秒表设计单片机最小系统实验报告 精品.docx
《基于DS18b20的温度测量和秒表设计单片机最小系统实验报告 精品.docx》由会员分享,可在线阅读,更多相关《基于DS18b20的温度测量和秒表设计单片机最小系统实验报告 精品.docx(39页珍藏版)》请在冰豆网上搜索。
基于DS18b20的温度测量和秒表设计单片机最小系统实验报告精品
单片机最小系统实验报告
——基于DS18b20的温度测量和秒表设计
目录
单片机最小系统实验报告1
一、单片机3
1.单片机简介3
2.最小系统3
3.AT89C51单片机引脚说明4
二、18B20介绍5
三、最小系统硬件设计8
1、设计结构框图8
2、系统时钟电路8
3、复位电路8
四、实验具体内容9
1、实现LED显示器的选通并显示字符9
2、基于DS18b20的温度测量和秒表设计16
五、总结29
一、单片机
1.单片机简介
单片微型计算机简称单片机,是典型的嵌入式微控制器(MicrocontrollerUnit),常用英文字母的缩写MCU表示单片机,单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。
单片机由运算器,控制器,存储器,输入输出设备构成,相当于一个微型的计算机,和计算机相比,单片机只缺少了I/O设备。
概括的讲:
一块芯片就成了一台计算机。
它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。
同时,学习使用单片机是了解计算机原理与结构的最佳选择。
它最早是被用在工业控制领域
AT89C51提供以下标准功能:
8K字节Falsh闪速存储器,256字节内部RAM,32个I/O口线,3个16位定时/计数器,一个6向量两级中断结构,一个全双工串行通信口,片内震荡器及时钟电路,同时AT89C51可降至0HZ的静态逻辑操作,并支持两种软件可选的节电工作模式。
空闲方式停止CPU的工作,但允许RAM,时/计数器,串行通信口及中断系统持续工作。
掉电方式保存RAM中的内容,但震荡器停止工作并禁止其他所有部件工作直到下一个硬件复位。
AT89C51单片机主要功能特性:
•兼容MCS51指令系统
•4k可反复擦写(>1000次)Flash ROM
•32个双向I/O口
•8个中断源
•三个16位可编程定时/计数器
•2.7-6.V的宽工作电压范围
•时钟频率0-24MHz
•128x8bit内部RAM
•五个外部中断源
•两个串行中断
•可直接驱动LED
•两级加密位
•低功耗睡眠功能
•内置一个模拟比较放大器
•可编程UARL通道
•软件设置睡眠和唤醒功能
2.最小系统
单片机最小系统,或者称为最小应用系统,是指用最少的元件组成的单片机可以工作的系统.对51系列单片机来说,单片机+晶振电路+复位电路,便组成了一个最小系统.但是一般我们在设计中总是喜欢把按键输入、显示输出等加到上述电路中,成为小系统。
3.AT89C51单片机引脚说明
VCC:
供电电压。
GND:
接地。
P0口:
P0口为一个8位漏级开路双向I/O口,内部无上拉电阻每脚可吸收8TTL门电流。
当P1口的管脚第一次写1时,被定义为高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。
P1口:
P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。
P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。
在FLASH编程和校验时,P1口作为第八位地址接收。
P2口:
P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。
并因此作为输入时,P2口的管脚被外部拉低,将输出电流。
P3口:
P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。
当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。
作为输入,由于外部下拉为低电平,P3口将输出电流,这是由于上拉的缘故。
P3口也可作为AT89C51的一些特殊功能口,如下表所示:
P3.0RXD(串行输入口)
P3.1TXD(串行输出口)
P3.2/INT0(外部中断0)
P3.3/INT1(外部中断1)
P3.4T0(记时器0外部输入)
P3.5T1(记时器1外部输入)
P3.6/WR(外部数据存储器写选通)
P3.7/RD(外部数据存储器读选通)
P3口同时为闪烁编程和编程校验接收一些控制信号。
RST:
复位输入。
当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG:
当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。
在FLASH编程期间,此引脚用于输入编程脉冲。
在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。
因此它可用作对外部输出的脉冲或用于定时目的。
然而要注意的是:
每当用作外部数据存储器时,将跳过一个ALE脉冲。
如想禁止ALE的输出可在SFR8EH地址上置0。
此时,ALE只有在执行MOVX,MOVC指令是ALE才起作用。
另外,该引脚被略微拉高。
如果微处理器在外部执行状态ALE禁止,置位无效。
/PSEN:
外部程序存储器的选通信号。
在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。
但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
/EA/VPP:
当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。
注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。
在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
XTAL1:
反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:
来自反向振荡器的输出。
二、18B20介绍
DS18B20数字温度传感器接线方便,封装成后可应用于多种场合,如管道式,螺纹式,磁铁吸附式,不锈钢封装式,型号多种多样,有LTM8877,LTM8874等等。
主要根据应用场合的不同而改变其外观。
封装后的DS18B20可用于电缆沟测温,高炉水循环测温,锅炉测温,机房测温,农业大棚测温,洁净室测温,弹药库测温等各种非极限温度场合。
耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域。
(1)DS18B20
(a)通过单线总线端口访问DS1820的协议如下:
•初始化
voidInit_DS18B20()
{
ucharx=0;
DQ=1;//DQ复位
delay_18B20(8);//稍做延时
DQ=0;//单片机将DQ拉低
delay_18B20(80);//精确延时大于480us
DQ=1;//拉高总线
delay_18B20(14);
x=DQ;//稍做延时后如果x=0则初始化成功x=1则初始化失败
delay_18B20(20);
}
•ROM操作命令
intReadOneChar(void)
{
uchari=0;
uchardat=0;
for(i=8;i>0;i--)
{
DQ=0;//给脉冲信号
dat>>=1;
DQ=1;//给脉冲信号
if(DQ)
dat|=0x80;
delay_18B20(4);
}
return(dat);
}
•存储器操作命令
WriteOneChar(uchardat)
{
uchari=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
delay_18B20(5);
DQ=1;
dat>>=1;
}
}
•执行/数据
ReadTemperature(void)
{
uchara=0;
ucharb=0;
uintt=0;
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0x44);//启动温度转换
delay_18B20(100);
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0xBE);//读取温度寄存器等(共可读9个寄存器)前两个就是温度
a=ReadOneChar();
b=ReadOneChar();
//传感器返回值除16得实际温度值
//为了得到2位小数位,先乘100,再除16,考虑整型数据长度,
//技巧处理后先乘25,再除4,除4用右移实现
b<<=8;
t=a+b;
return(t);
}
DS1820需要严格的协议以确保数据的完整性。
协议包括几种单线信号类型:
复位脉冲、存在脉冲、写0、写1、读0和读1。
所有这些信号,除存在脉冲外,都是由总线控制器发出的。
和DS1820间的任何通讯都需要以初始化序列开始,初始化序列见下图。
一个复位脉冲跟着
一个存在脉冲表明DS1820已经准备好发送和接收数据(适当的ROM命令和存储器操作命令)
(b)当总线上只有一个器件时,DS18B20读温度的流程为:
复位→发0CCHSKIPROM命令→发44H开始转换命令→延时→复位→发0CCHSKIPROM命令→发0BEH读存储器命令→连续读出两个字节数据(即温度)→结束。
ØConvertT[44h]
这条命令启动一次温度转换而无需其他数据。
温度转换命令被执行,而后DS1820保持等待状态。
如果总线控制器在这条命令之后跟着发出读时间隙,而DS1820又忙于做时间转换的话,DS1820将在总线上输出“0”,若温度转换完成,则输出“1”。
如果使用寄生电源,总线控制器必须在发出这条命令后立即起动强上拉,并保持500ms。
ØReadScratchpad[BEh]
这个命令读取暂存器的内容。
读取将从字节0开始,一直进行下去,直到第9(字节8,CRC)
字节读完。
如果不想读完所有字节,控制器可以在任何时间发出复位命令来中止读取。
(c)DS18b20用12位存贮温值度最高位为符号位,下图为18b20的温度存储方式,负温度S=1正温度S=0
LSB:
D7D6D5D4D3D2D1D0
23
22
21
20
2-1
2-2
2-3
2-4
MSB:
D7D6D5D4D3D2D1D0
S
S
S
S
S
27
26
25
三、最小系统硬件设计
1、设计结构框图
2、系统时钟电路
单片机内部具有一个高增益反相放大器,用于构成振荡器。
通常在引脚XTALl和XTAL2跨接石英晶体和两个补偿电容构成自激振荡器,系统时钟电路结构如图:
3、复位电路
单片机小系统采用上电自动复位和手动按键复位两种方式实现系统的复位操作。
上电复位要求接通电源后,自动实现复位操作。
手动复位要求在电源接通的条件下,在单片机运行期间,用按钮开关操作使单片机复位。
显示电路、键盘以及外部RAM的扩展根据具体电路的不同而不同
四、实验具体内容
1、实现LED显示器的选通并显示字符
电路图的绘制
(1)打开PROTEUS将所需元器件加入到对象选择器窗口。
PickingComponentsintotheSchematic单击对象选择器按钮
,如图所示
弹出“PickDevices”页面,在“Keywords”输入AT89C51,系统在对象库中进行搜索查找,并将搜索结果显示在“Results”中,如图所示。
在“Results”栏中的列表项中,双击“AT89C51”,则可将“AT89C51”添加至对象选择器窗口。
(2)接着在“Keywords”栏中重新输入7SEG,如图所示。
双击“7SEG-MPX6-CA-BLUE”,则可将“7SEG-MPX6-CA-BLUE”(6位共阳7段LED显示器)添加至对象选择器窗口。
(3)最后,在“Keywords”栏中重新输入RES,选中“MatchWholeWords”,如图所示。
在“Results”栏中获得与RES完全匹配的搜索结果。
双击“RES”,则可将“RES”(电阻)添加至对象选择器窗口。
单击“OK”按钮,结束对象选择。
经过以上操作,在对象选择器窗口中,已有了7SEG-MPX6-CA-BLUE、AT89C51、RES三个元器件对象,若单击AT89C51,在预览窗口中,见到AT89C51的实物图,如图所示;若单击RES或7SEG-MPX6-CA-BLUE,在预览窗口中,见到RES和7SEG-MPX6-CA-BLUE的实物图,如图所示。
此时,我们已注意到在绘图工具栏中的元器件按钮
处于选中状态。
(4)放置元器件至图形编辑窗口PlacingComponentsontotheSchematic
在对象选择器窗口中,选中7SEG-MPX6-CA-BLUE,将鼠标置于图形编辑窗口该对象的欲放位置、单击鼠标左键,该对象被完成放置。
同理,将AT89C51和RES放置到图形编辑窗口中。
如图所示。
(5)放置总线至图形编辑窗口
单击绘图工具栏中的总线按钮
,使之处于选中状态。
将鼠标置于图形编辑窗口,单击鼠标左键,确定总线的起始位置;移动鼠标,屏幕出现粉红色细直线,找到总线的终了位置,单击鼠标左键,再单击鼠标右键,以表示确认并结束画总线操作。
此后,粉红色细直线被蓝色的粗直线所替代,如图所示。
(6)元器件之间的连线
Proteus的智能化可以在你想要画线的时候进行自动检测。
下面,我们来操作将电阻R1的右端连接到LED显示器的A端。
当鼠标的指针靠近R1右端的连接点时,跟着鼠标的指针就会出现一个“×”号,表明找到了R1的连接点,单击鼠标左键,移动鼠标(不用拖动鼠标),将鼠标的指针靠近LED显示器的A端的连接点时,跟着鼠标的指针就会出现一个“×”号,表明找到了LED显示器的连接点,同时屏幕上出现了粉红色的连接,单击鼠标左键,粉红色的连接线变成了深绿色,同时,线形由直线自动变成了90º的折线,这是因为我们选中了线路自动路径功能。
Proteus具有线路自动路径功能(简称WAR),当选中两个连接点后,WAR将选择一个合适的路径连线。
WAR可通过使用标准工具栏里的“WAR”命令按钮
来关闭或打开,也可以在菜单栏的“Tools”下找到这个图标。
同理,我们可以完成其它连线。
在此过程的任何时刻,都可以按ESC键或者单击鼠标的右键来放弃画线。
(7)元器件与总线的连线
画总线的时候为了和一般的导线区分,我们一般喜欢画斜线来表示分支线。
此时我们需要自己决定走线路径,只需在想要拐点处单击鼠标左键即可,如图所示。
(8)给与总线连接的导线贴标签PARTLABELS
单击绘图工具栏中的导线标签按钮
,使之处于选中状态。
将鼠标置于图形编辑窗口的欲标标签的导线上,跟着鼠标的指针就会出现一个“×”号,如图所示。
表明找到了可以标注的导线,单击鼠标左键,弹出编辑导线标签窗口,如图所示。
在“string”栏中,输入标签名称(如a),单击“OK”按钮,结束对该导线的标签标定。
同理,可以标注其它导线的标签,如图所示。
注意,在标定导线标签的过程中,相互接通的导线必须标注相同的标签名。
至此,我们便完成了整个电路图的绘制。
KeilC与Proteus连接调试
进入KeilCμVision2开发集成环境,创建一个新项目(Project),并为该项目选定合适的单片机CPU器件(如:
Atmel公司的AT89C51)。
并为该项目加入KeilC源程序。
实验仿真图:
源程序如下:
#include
#defineLEDS6//led灯选通信号
unsignedcharcodeSelect[]={0x01,0x02,0x04,0x08,0x10,0x20};
unsignedcharcodeLED_CODES[]=
{0xc0,0xF9,0xA4,0xB0,0x99,//0-4
0x92,0x82,0xF8,0x80,0x90,//5-9
0x88,0x83,0xC6,0xA1,0x86};
voidmain()
{
chari=0,j=0;
longintk;
while
(1)
{
P2=0;
P1=LED_CODES[i];
P2=Select[j];
for(k=3000;k>0;k--);
//该LED模型靠脉冲点亮,第i位靠脉冲点亮后,会自动熄来头。
//修改循环次数,改变点亮下一位之前的延时,可得到不同的显示效果。
i++;
j++;
if(j>5)j=0;
if(i>14)i=0;
}
}
2、基于DS18b20的温度测量和秒表设计
设计方案:
通过功能键(外部中断)选择进入不同的模式工作。
当K=0时,工作在时间显示模式,当k=1时,工作在秒表模式,其中开关1、2、3时调节自己需要倒计时的时间,没按下时,对应的数值加一。
开关4为开始/暂停按键。
当k=4时,显示采集回来的温度。
LED1、LED2、LED3灯是用来更直观的看本设计工作在什么下的,LED4为是闪烁,闪烁频率为1s.
(1)、硬件部分
(2)软件部分
源程序:
#include
#defineDataPortP0//定义数据端口程序中遇到DataPort则用P0替换
#defineucharunsignedchar
#defineuintunsignedint
/*****************位定义***********************/
sbitmenu=P3^2;//位声明,外部中断口,功能键
sbitLED1=P1^5;//LED灯
sbitLED2=P1^6;
sbitLED3=P1^7;
sbitLED4=P1^4;
sbitadd_m=P1^0;//按键,调分
sbitadd_s=P1^1;//按键,调秒
sbitadd_us=P1^2;//按键,调微秒
sbitreset=P1^3;//清零,秒表状态下也是清零
sbitLATCH1=P2^0;//定义锁存使能端口段锁存
sbitLATCH2=P2^1;//位锁存
sbitDQ=P2^2;//定义18b20的通信端口
/*****************参数定义***********************/
uinta,b,j;
ucharTempData[8];
uintm,s,w,//时钟
m0,s0,w0,//秒表
k;//状态转换标志
ucharcodeweima[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//位码
ucharcodeduanma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//段码
/*****************函数声明***********************/
voiddelay_18B20(uinti);
voidInit_DS18B20();
intReadOneChar();
WriteOneChar(uchardat);
ReadTemperature(void);
voidDisplay1();
voidinit();
voidkeyscan();
voiddisplay(uchara,ucharb,ucharc);
voiddelay(ucharz);
voidwendu();
/*****************主函数*************************/
voidmain()
{
init();//初始化
while
(1)
{
if(k==0)//时间
{
LED1=1;//点亮第一个灯,辨别是工作在时间模式下的
LED2=0;
LED3=0;
keyscan();
display(m0,s0,w0);//显示时间
}
if(k==1)//倒计时
{
LED1=0;
LED2=1;//点亮第二个灯,辨别是工作在秒表模式下的
LED3=0;
keyscan();
display(m,s,w);
}
if(k==2)//温度
{
LED1=0;
LED2=0;
LED3=1;//点亮第三个灯,辨别是工作在温度模式下的
wendu();
}
}
}
voiddelay_18B20(uinti)//延时函数
{
while(i--);
}
/*****************18b20初始化*********************/
voidInit_DS18B20()
{
ucharx=0;
DQ=1;//DQ复位
delay_18B20(8);//稍做延时
DQ=0;//单片机将DQ拉低
delay_18B20(80);//精确延时大于480us
DQ=1;//拉高总线
delay_18B20(14);
x=DQ;//稍做延时后如果x=0则初始化成功x=1则初始化失败
delay_18B20(20);
}
/*****************读一个字节***********************/
intReadOneChar(void)
{
uchari=0;
uchardat=0;
for(i=8;i>0;i--)
{
DQ=0;//给脉冲信号
dat>>=1;
DQ=1;//给脉冲信号
if(DQ)
dat|=0x80;
delay_18B20(4);
}
return(dat);
}
/*****************写一个字节***********************/
WriteOneChar(uchardat)
{
uchari=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
delay_18B20(5);
DQ=1;
dat>>=1;
}
}
/*****************读取温度***********************/
ReadTemperature(void)
{
uchara=0;
ucharb=0;
uintt=0;
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0x44);//启动温度转换
de
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于DS18b20的温度测量和秒表设计单片机最小系统实验报告 精品 基于 DS18b20 温度 测量 秒表 设计 单片机 最小 系统 实验 报告