版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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)/
14、 读取一个字节的数据 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;j1; /数据左移一位继续写一位数据if(testb) /写1 ds=0; i+;i+; ds=1; i=8;while(i
15、0)i-; else ds=0; /写0 i=8;while(i0)i-; ds=1; i+;i+; void tmpchange(void)/ 温度转变函数 dsreset();/初始化ds18b20delay(1); /延时tmpwritebyte(0xcc); /跳过序列号命令tmpwritebyte(0x44); /发送温度转换命令 unint tmp()获得温度 float tt; uchar a,b; dsreset(); delay(1); tmpwritebyte(0xcc); tmpwritebyte(0xbe); /发送读取数据命令a=tmpread(); b=tmprea
16、d();/连续读两个字节数据temp=b; temp0;a-) for(b=60;b0;b-); void display8(unint temp)/显示程序 uchar a1,a2,a2t,a3,ser; /定于局部变量 kk=0; oo=0; pp=0; ser=temp/10; /取温度值的整数部分 sbuf=ser; a1=temp/100; /整数部分取百位整数 a2t=temp%100; /取整数部分对100的余数部分 a2=a2t/10; /取十位数据 a3=a2t%10; /取个位数据 dula=0; /数码管位锁存器位选信号有效 p1=tablea3;/显示百位 dula=1
17、; /所存数据,位选信号置高delay(1); dula=0; p1=table1a2;/显示十位 wela=1; /所存数据delay(1); /延时函数 wela=0; /数码管段锁存器位选信号有效 p1=tablea1;/显示个位 jj=1; delay(1);jj=0; void delay4() /延时uchar m,n;for(m=5;m0;m-)for(n=100;n0;n-);void v_rtinputbyte(uchar ucda) /写1个字节的数据uchar i;acc=ucda;for(i=8;i0;i-) if(acc&0x01)=1) /t_io=acc0; /相
18、当于汇编中的rrc t_io=1; else t_io=0;/if(acc&0x01)=0) t_clk=1; t_clk=0; acc=acc1; uchar uc_rtoutputbyte(void)/输出一个字节uchar i,acc;acc=0;for(i=0;i1; / 相当于汇编中的rrc if(t_io=1) acc=acc|0x80; t_clk=1; t_clk=0;return(acc);/返回值void v_w1302(uchar ucaddr,uchar ucda)/向时钟寄存器写数据t_rst=0;t_clk=0;t_rst=1;v_rtinputbyte(ucadd
19、r); /地址,命令v_rtinputbyte(ucda); /写1byte数据t_clk=1;t_rst=0;uchar uc_r1302(uchar ucaddr)/读出数据unsigned char ucda,k;t_rst=0;t_clk=0;t_rst=1;v_rtinputbyte(ucaddr); /地址命令 ,输入一个字节的数据。 写入读地址的控制命令。ucda=uc_rtoutputbyte();/ 读取1byte数据t_clk=1;t_rst=0;k=ucda/16; /在将10进制的数转化为16进制的数。ucda=ucda%16;ucda=ucda+k*10;return
20、(ucda);void v_set1302()/时钟初始化uchar i,j;uchar ucaddr=0x80; v_w1302(0x8e,0x00); /控制命令,wp=0,写操作for(i=0;i7;i+)j=uccurtimei; v_w1302(ucaddr,j); /秒 分 时 日 月 星期 年 ucaddr +=2;v_w1302(0x8e,0x80); /控制命令,wp=1,写保护void v_get1302() /读1302里的数据。uchar i;uchar ucaddr=0x81;for (i=0;i7;i+)uccurtimei=uc_r1302(ucaddr);/格式
21、为: 秒 分 时 日 月 星期 年 ucaddr +=2;void t2_10()unint k; a5=dfdf/10; a4=dfdf%10; a3=temp/1000; k=temp%1000; a2=k/100; k=k%100; a1=k/10; a0=k%10; void t2_11()unint k; a0=dwdw%10; /*显示*/void display1() uchar c; t2_10(); c=a0; p1=ledkc;/不带小数点的共阴数码管的码值 gw=1; delay4(); gw=0; c=a1; p1=ledkc; sw=1; delay4(); sw=0
22、; c=a2; p1=ledk1c; /带小数点的共阴数码管的码值 bw=1; delay4(); bw=0; c=a3; p1=ledkc; qw=1; delay4(); qw=0; c=a4; p1=ledkc; ww=1; delay4(); ww=0; c=a5; p1=ledkc; sww=1; delay4(); sww=0;void display2() uchar c; t2_10(); c=a0; p1=ledkc; gw=1; delay4(); gw=0; c=a1; p1=ledkc; sw=1; delay4(); sw=0; c=a2; p1=ledkc; bw=
23、1; delay4(); bw=0; c=a3; p1=ledkc; qw=1; delay4(); qw=0; c=a4; p1=ledkc; ww=1; delay4(); ww=0; c=a5; p1=ledkc; sww=1; delay4(); sww=0;void display3() uchar c; t2_11(); c=a0; p1=ledkc; gw=1; delay4(); gw=0; void main1(void) v_get1302();temp=uccurtime1*100+uccurtime0; dfdf=uccurtime2; /temp里的值是为了显示到数码
24、管里而设定的值.display1();void main2(void) v_get1302();temp=uccurtime1*100+uccurtime0;dfdf=uccurtime2;display2();void main3(void) v_get1302();temp=uccurtime4*100+uccurtime3; dfdf=uccurtime6; /temp里的值是为了显示到数码管里而设定的值.display1();void main4(void) v_get1302();temp=uccurtime4*100+uccurtime3; dfdf=uccurtime6; /te
25、mp里的值是为了显示到数码管里而设定的值.display2();void main5(void) v_get1302(); dwdw=uccurtime5; /temp里的值是为了显示到数码管里而设定的值.display3();void main()unint k,i; for(i=0;i0;a-) / 调整亮度 display8(tmp();/七段数码管显示 while(a); m-; while(q)/显示时间小时、分、秒 buffer0=buffer0+1; if(buffer0=55) /小数点每隔一秒闪动一次 main1();/带小数点的数字亮 buffer0=0; else main2();/不带小数点亮
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论