基于DS18b20的温度测量和秒表设计单片机最小系统实验报告Word文件下载.docx
《基于DS18b20的温度测量和秒表设计单片机最小系统实验报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《基于DS18b20的温度测量和秒表设计单片机最小系统实验报告Word文件下载.docx(34页珍藏版)》请在冰豆网上搜索。
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
//拉高总线
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)
i>
i--)
DQ=dat&
0x01。
delay_18B20(5)。
dat>
•执行/数据
ReadTemperature(void)
uchara=0。
ucharb=0。
uintt=0。
Init_DS18B20()。
WriteOneChar(0xCC)。
//跳过读序号列号地操作
WriteOneChar(0x44)。
//启动温度转换
delay_18B20(100)。
//跳过读序号列号地操作
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:
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<
reg51.h>
#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>
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()。
/*****************主函数*************************/
init()。
//初始化
while
(1)
{
if(k==0)//时间
{
LED1=1。
//点亮第一个灯,辨别是工作在时间模式下地
LED2=0。
LED3=0。
keyscan()。
display(m0,s0,w0)。
//显示时间
}
if(k==1)//倒计时
LED1=0。
LED2=1。
//点亮第二个灯,辨别是工作在秒表模式下地
display(m,s,w)。
}
if(k==2)//温度
LED3=1。
//点亮第三个灯,辨别是工作在温度模式下地
wendu()。
}
}
voiddelay_18B20(uinti)//延时函数
while(i--)。
/*****************18b20初始化*********************/
/*****************读一个字节***********************/
/*****************写一个字节***********************/
/*****************读取温度***********************/
return(