《基于单片机时钟显示的温度传感系统》由会员分享,可在线阅读,更多相关《基于单片机时钟显示的温度传感系统(15页珍藏版)》请在金锄头文库上搜索。
1、基于单片机时钟显示的温度传感系统摘要:详细介绍关于STC89C52与温度传感器DS18B20设计一个温度传感电路;包括时钟芯片DS1302、温度传感器DS18B20、反相器74LS240和七段数码管。组成智能数字温度功能系统。关键字:STC89C52;DS18B20;温度传感器一.原理概述1、STC89单片机具有在系统可编程(ISP)特性,ISP 的好处是:省去购买通用编程器,单片机在用户系统上即可下载/ 烧录用户程序,而无须将单片机从已生产好的产品上拆下,再用通用编程器将程序代码烧录进单片机内部。有些程序尚未定型的产品可以一边生产,一边完善,加快了产品进入市场的速度,减小了新产品由于软件缺陷
2、带来的风险。由于可以将程序直接下载进单片机看运行结果故也可以不用仿真器。引脚图如下: 2、DS1302的引脚排列,其中Vcc1为后备电源,VCC2为主电源。在主电源关闭的情况下,也能保持时钟的连续运行。DS1302由Vcc1或Vcc2两者中的较大者供电。当Vcc2大于Vcc10.2V时,Vcc2给DS1302供电。当Vcc2小于Vcc1时,DS1302由Vcc1供电。X1和X2是振荡源,外接32.768kHz晶振。RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或
3、多字节数据的传送手段。当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。上电运行时,在Vcc2.5V之前,RST必须保持低电平。只有在SCLK为低电平时,才能将RST置为高电平。I/O为串行数据输入输出端(双向),后面有详细说明。SCLK始终是输入端。 下图为DS1302的引脚功能图X1,X232.768kHz晶振引脚GND地RST复位I/O数据输入/输出SCLK串行时钟VCC1电池引脚VCC2主电源引脚3、DALLAS最新单线数字温度传感器DS18B20简介新的“一线器件”体积更小、适用电压更
4、宽、更经济 Dallas 半导体公司的数字化温度传感器DS1820是世界上第一片支持 “一线总线”接口的温度传感器。一线总线独特而且经济的特点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。DS18B20也 支持“一线总线”接口,测量温度范围为-55C+125C,在-10+85C范围内,精度为0.5C。DS1822的精度较差为 2C 。现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性,适合于恶劣环境的现场温度测量。DS18B20可以程序设定912位的分辨率,精度为0.5C。可选更小的封装方式,更宽的电压适用范围。分辨率设定,及用户设定的报警温度存储在EEPROM
5、中,掉电后依然保存。 DS18B20内部结构主要由四部分组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。DS18B20的管脚排列如右图:4、74LS240是一种芯片向EPROM2764写入程序机器码,通过程序固化器将下列程序中对应的机器码,依次写入到EPROM2764的0000H0015H地址单元中。 机器码 地址 程序 ORG 0000H ;表示程序从地址0000H存放 75 90 00 0000H START: MOV P1,#00H 11 17 0003H ACALL DELAY ;延时一段时间,便于观察 75 90 FF 0005H MOV P1,#0
6、FFH 11 17 0008H ACALL DELAY ;延时 80 E9 000AH SJMP START ;返回,从START开始重复 7B FF 000CH DELAY: MOV R3,#0FFH ;一段延时子程序 7C FF 000EH DEL2: MOV R4,#0FFH 00 0010H DEL1: NOP DC FD 0011H DJNZ R4,DEL1 DB F9 0013H DJNZ R3,DEL2 22 0015H RET ;子程序返回 END ;表示程序结束 由于单片机驱动能力太弱无法驱动七段数码管所以要用74LS240来增强其驱动能力。5、共阳管是指将所有发光二极管的阳
7、极接到一起形成公共阳极(COM)的数码管。共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。当某一字段的阴极为高电平时,相应字段就不亮。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管。共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮。当某一字段的阳极为低电平时,相应字段就不亮。二、实验电路图及功能介绍部分引脚连线如下:1、 P1.0P1.7分别接U2(74LS240)A1A4、B1B4;2、P2.2P2.7分别接U3(74LS240)A1A4、B1、B2;2、
8、U2(74LS240)的1Y11Y4、2Y12Y4分别接数码管a、b、c、d、e、f、g、dp。电路功能: 显示周围坏境温度;然后时钟显示小时、分、秒;再显示年、月、日最后显示星期。四个过程循环显示。 其中初始时钟设为09 02 28(09年02月28日);23 59 30(23时59分30秒);7(星期日)。三程序代码:#include /定义头文件#include /定义头文件#include /定义头文件sbit dula=P24;/定义dula代表P2.4口sbit wela=P25; sbit jj=P26;sbit kk=P22;sbit oo=P23;sbit pp=P27;sb
9、it DS=P21;#define uchar unsigned char#define unint unsigned intunint temp;/? / variable of temperature uchar flag1;/?/ sign of the result positive or negative /* 时钟程序*/sbit T_CLK=P32; /实时时钟的时钟线引脚sbit T_IO=P33; /* 实时时钟的数据线*/sbit T_RST=P34; /实时时钟的复位线引脚sbit gw=P22; /个位sbit sw=P23; /十位sbit bw=P24; /百位sb
10、it qw=P25; /千位sbit ww=P26; /数码管选通位sbit yt=P32; sbit sww=P27; /数码管选通位unint a6;/=0,0,0,0; /*位段的数字*/uchar code ledk10=0xC0,0xF9,0xA4,0xB0,0x99 ,0x92,0x82,0xF8, 0x80,0x90;/不加小数点 uchar code ledk110=0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10;/加了小数点unint ucCurtime7=30,59,23,28,2,0x07,0x09; / 秒 分 时 日
11、 月 星期 年 unint temp,dfdf,dwdw;uchar data BUFFER1=0; P2_0=0;/选通74LS240unsigned char code table= 0xC0,0xF9,0xA4,0xB0, 0x99 ,0x92,0x82,0xF8, 0x80,0x90,0x88,0x83, 0xC6,0xA1,0x86,0x8E,0x00; /温度传感器位段的数字unsigned char code table1=0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10 ;/加了小数点温度传感器位段的数字void delay(u
12、nint count)/定义延时子函数 unint i; /初始化while(count) i=200; while(i0) i-; count-; void Init_Com(void) /温度传感器初始化程序 TMOD = 0x20; /定时器1工作在模式2的方式下 PCON = 0x00; /初始化电源管理寄存器 SCON = 0x50; /串口工作在模式1的方式下 TH1 = 0xfd;/定时器高位寄存器初始化 TL1 = 0xfd; /定时器低位寄存器初始化 TR1 = 1;/启动定时器 void dsreset(void)/ DS18B20发送命令和初始化函数 unint i; /
13、初始化DS=0; /产生秒冲,用于初始化i=103; /用于延时使用while(i0)i-; /产生精确的延时大于470usDS=1; /产生脉冲。这期间可以用于数据的采集和发送命令等i=4; while(i0)i-; /稍微延时一下 bit tmpreadbit(void) / 读一位数据 unint i; bit dat; /读取到的数据值 DS=0;i+;/产生脉冲并延时 DS=1;i+;i+; /产生脉冲延时 dat=DS; /将总线上的数据存入到dat中 i=8;while(i0)i-;/依次读8位数据 return (dat); /返回数据 uchar tmpread(void)/ 读取一个字节的数据 uchar i,j,dat; dat=0; for(i=1;i=8;i+) /读8位数据 j=tmpreadbit(); /将读取到每一位的数据存储在j中dat=(j1); /读出的数据最低位在最前面,这样刚好一个字节在DAT里 return(dat); /返回读取到的数据 void tmpwritebyte(uchar dat)/ 写一个字节到DS18B20里 unint i; uchar j; bit testb; /定义一位变量for(j=1;j=8;j+