基于18B20与1302温度测量和实时时钟设计书.docx
- 文档编号:7406379
- 上传时间:2023-01-23
- 格式:DOCX
- 页数:29
- 大小:137.52KB
基于18B20与1302温度测量和实时时钟设计书.docx
《基于18B20与1302温度测量和实时时钟设计书.docx》由会员分享,可在线阅读,更多相关《基于18B20与1302温度测量和实时时钟设计书.docx(29页珍藏版)》请在冰豆网上搜索。
基于18B20与1302温度测量和实时时钟设计书
温度测量设计
摘要
本设计采用80c51单片机、DS18B20、DS1302为核心设计温度显示以及年月日、星期和时间的显示。
单片机技术在设计中所体现在出来的优势越来越明显,它不仅是电子信息类专业的一个重要部分,而且在其它类专业工程中也是不可缺少的。
广泛地应用于家电、工业过程控制、仪器仪表、智能武器、航空和空间飞行器等领域发展更是迅速。
一、方案设计与论证
方案一:
用EDA技术及VHDL语言控制来实现显示及测温度,且显示也可以用数码管,但是数码管屏幕有限不是很方便的显示很多的数据以及文字等。
故不采用此方案。
方案二:
用C语言编程来控制单片机让它在传输数据及文字。
单片机结构简单、控制功能强、可靠性高、体积小、价格低等优点,以及液晶屏幕可以完整的同时显示数据及文字等内容。
综合上述方案的选择与比较,虽然都能实现但是考虑到实际应用中的经济、可靠运行,我们决定采用方案二。
二、系统设计
本次设计主要用1302时钟芯片及单片机控制程序让它在液晶上显示年、月、日、时、分、秒及星期,同时用18B20温度传感器来接受外面的信号,单片机将接受到的信号输出,且让它在液晶上显示测的温度。
时、分、秒的计数结果经过数据处理可直接送显示器显示。
当计时发生误差的时候可以用键盘校时电路进行校正。
时计数器计满24小时后自动向日计数器进一,日计数器由平年、闰年的28/30/31对大、小月和二月的判断应与当月相应的日期相一致,当日计数器计满时,向月计数器进位,月计数器计满12月时向年计数器进位,当年计数器计满100时计数器清零。
设计采用的是年、月、日和时、分、秒、星期以及温度的同时显示。
设计电路主要由五大模块构成:
温度采集模块,单片机控制电路,键盘,时钟芯片,显示电路。
单片机实现液晶显示万年历以及温度总框图
1、单片机接口电路
单片机接口电路原理图
单片机是由CPU、程序存储器、数据存储器、I/O接口、定时、计数器、中断系统等集成到一块芯片上,形成单片形态的计算机。
2、温度采集模块
温度传感器的种类众多,在应用与高精度、高可靠性的场合时DALLAS(达拉斯)公司生产的DS18B20温度传感器当仁不让。
超小的体积,超低的硬件开消,抗干扰能力强,精度高,附加功能强,使得DS18B20更受欢迎。
DS18B20的优势更是我们学习单片机技术和开发温度相关的小产品的不二选择。
3、显示模块
显示模块原理图
此次设计我们采用了字符型液晶显示,此模块是一种专门用于显示字母、数字、符号等点阵式LCD,目前常用16*1,16*2,20*2和40*2行等的模块。
1602字符型液晶显示器实物图。
1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的(说明:
1为高电平、0为低电平)。
芯片时序表如下:
读状态
输入
RS=L,R/W=H,E=H
输出
D0—D7=状态字
写指令
输入
RS=L,R/W=L,D0—D7=指令码,E=高脉冲
输出
无
读数据
输入
RS=H,R/W=H,E=H
输出
D0—D7=数据
写数据
输入
RS=H,R/W=L,D0—D7=数据,E=高脉冲
输出
无
4、键盘设置
为使时钟走时与标准时间一致,校时电路是必不可少的,键盘用来校正液晶上显示的时间。
键盘模块原理图
5、1302实时时钟芯片
DS1302与单片机的连接也仅需要3条线:
CE引脚、SCLK串行时钟引脚、I/O串行数据引脚,Vcc2为备用电源,外接32.768kHz晶振,为芯片提供计时脉冲。
1302电路原理图如图
6、蜂鸣器电路原理图
三、系统调试
1、软件调试
软件调试的任务是利用ISIS开发工具进行在线仿真调试,发现和纠正程序错误,同时也能发现仿真结果故障。
程序的调试应一个模块一个模块地进行,我们首先单独调试各功能子程序,检验程序是否能够实现预期的功能,接口电路的控制是否正常等;最后逐步将各子程序连接起来总调。
联调需要注意的是,各程序模块间能否正确传递参数,特别要注意各子程序的现场保护与恢复。
调试的基本步骤如下:
(1)、修改显示缓冲区内容,屏蔽拆字程序,调试动态扫描显示功能。
例如将DISP0~DISP5单元置为“012345”,应能在LCD上从左到右显示“012345”。
若显示不正确,可在中断子程序相应位置设置断点调试检查。
然后修改计时缓冲区内容,调用拆字程序,调试显示模块。
(2)、运行主程序调试模块,不按下任何键,检查是否能开始正确显示。
若不能正确显示,则应在定时器中断服务子程序中设置断点,检查HOUR、MIN、SEC单元是否随断点运行而变化。
然后屏蔽缓冲区初始化部分,用仿真器修改万年历显示缓冲区内容为2008年12月12日,运行主程序(调进位键),检验能否正确进位,以及试调时间看能否正确的进位,以及温度显示。
(3)、调试键盘扫描模块,先用延时5ms子程序代替显示子程序延时消抖,在求取键号后设置断点,中断后观察A累加器中的键号是否正确;然后恢复用显示子程序延时消抖,检验与显示模块能否正确连接。
(4)、调试时间设置模块。
首先屏蔽COMB子程序,单独调试键盘设置模块,观察显示缓冲区DISP0~DISP5单元的内容是否随键入的键号改变,以及键号能否在LCD上显示。
然后屏蔽子程序,单独调试合字模块。
(5)、运行主程序联调,检查能否用键盘修改当前万年历,时间,以及温度能否正确显示。
2、硬件调试
(1)元器件明细表:
参数
元件名
封装
参数
元件名
封装
1K
R5
AXIAL0.3
CON2
J1
SIP2.
1K
R1
AXIAL0.3
CON4
J3
SIP4
1K
R7
AXIAL0.3
CON9
J4
SIP9
1K
R6
AXIAL0.3
DIODE
D2
AXIAL0.4
4.7K
R3
AXIAL0.3
DS18B20
U2
SIP3
10k
R2
VR5
DS1302
U4
DIP8
11.0592MHZ
Y1
JZ
LCD1602
U3
1602
22u
C3
rb.2/.4
LED
D1
DIODE0.1
30p
C2
RAD0.3
PNP
Q1
VR5
30p
C1
RAD0.3
RES2
R9
AXIAL0.3
30p
C6
RAD0.3
SPEAKER
LS1
SP
30p
C7
RAD0.3
SW-PB
S1
AN
32.768KHz
Y2
DIODE0.1
SW-PB
S2
AN
200
R8
AXIAL0.3
SW-PB
S3
AN
(2)原理图的绘制和注意事项
①蜂鸣器驱动电路一般都包含以下几个部分:
一个三极管、一个蜂鸣器、一个续流二极管。
蜂鸣器本质上是一个感性元件,其电流不能瞬变,因此必须有一个续流二极管提供续流。
否则,在蜂鸣器两端会产生几十伏的尖峰电压,可能损坏驱动三极管,并干扰整个电路系统的其它部分。
②在设计原理图时注意上拉电阻,下拉电阻的使用,在必要时要加阻值合适的电阻,是电路更加完善。
(3)电路原理图:
(3)PCB的设计和注意事项
①在原理图定义元件封装的时候,要根据元器件实际大小进行定义,如果库里没有的话自己再绘制一个。
②在放置元器件时,一定要考虑元器件的实际尺寸大小(所占面积和高度)、元器件之间的相对位置,以保证电路板的电气性能和生产安装的可行性和便利性同时,应该在保证上面原则能够体现的前提下,适当修改器件的摆放,使之整齐美观,如同样的器件要摆放整齐、方向一致。
这个步骤关系到板子整体形象和下一步布线的难易程度,所以一定要花大力气去考虑。
PCB布线时要设定好焊盘的尺寸大小与实际器件相一致,信号线、电源线和地线的宽度要合适。
(4)PCB图
(5)焊接的注意事项
万年历的制作过程中焊接最容易出现问题,在焊接前,必须先对元器件的PCB图和原理图,以免防止元器件的正负极接反或者把元器件接错。
在焊接时要注意虚焊,根据焊接的经验,在焊点处焊锡是尖角的,一般都是焊实了;如果焊点处出现圆颗状,则容易出现虚焊,元器件的管脚可能没有焊实,出现接触不良的情况。
检查是否虚焊可以在完成焊接后,接上电源,看电路是否能正常工作,如果不行,则可以用数字万用表进行检测。
用数字万用表检测,可以很方便的检测出电路的通断,判断在做板的时候是否有断路,也很容易检测是否虚焊。
四、软件程序
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitDQ=P1^7;////18b20信号端定义
sbitRW=P2^3;////1602读写端定义
sbitRS=P2^2;////1602数据指令端定义
sbitE=P2^4;////1602使能端定义
sbitIO=P1^1;////1302数据端定义
sbitCLK=P1^0;////1302时钟端定义
sbitRST=P1^2;////1302复位端定义
sbitSPEAKER=P2^7;
sbitACC0=ACC^0;
sbitACC7=ACC^7;
uchartime,ge=0,shiwei=0,bai=0,xiaoshu=0,l,k;
ucharcodetab[]="0123456789.-NO18B20";
ucharcodetab1[]="day-:
";
ucharnian,nian1,nian2;
ucharyue,yue1,yue2;
ucharri,ri1,ri2;
ucharshi,shi1,shi2;
ucharfen,fen1,fen2;
ucharmiao,miao1,miao2;
ucharday,key=0;
sbittiaozheng=P3^1;//////时间调整模式及暂停按钮
sbitjia=P3^2;////////时间调整加按钮
sbitjian=P3^3;///////时间调整减按钮
sbitqidong=P3^4;/////定义时间启动按钮
bitflag,flagfu;////18b20检测标志位和负温度显示标志位
////////延时子函数///////
voiddelay(ucharz)
{
uchari,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
/////初始化18b20子函数////////
voidchushihua18b20()
{
DQ=1;
_nop_();
DQ=0;
for(time=0;time<200;time++);
DQ=1;
for(time=0;time<10;time++);
flag=DQ;
for(time=0;time<80;time++);
DQ=1;
for(time=0;time<120;time++);
}
//////向18b20写指令子函数///////
voidxiezhiling18b20(ucharzhiling)
{
uchari;
for(i=0;i<8;i++)
{
DQ=1;
_nop_();
DQ=0;
_nop_();
DQ=zhiling&0x1;
for(time=0;time<15;time++);
DQ=1;
zhiling>>=1;
_nop_();
}
}
///////读取18b20温度子函数////////
uchardu18b20(void)
{
uchari,wendu;
for(i=0;i<8;i++)
{
DQ=1;
_nop_();
DQ=0;
_nop_();
DQ=1;
for(time=0;time<2;time++);
wendu>>=1;
for(time=0;time<1;time++);
if(DQ==1)
{
wendu=wendu|0x80;
}
else
{
wendu=wendu|0x00;
}
for(time=0;time<10;time++);
}
return(wendu);
}
///////向1602写指令子函数/////////
voidxiezhiling1602(ucharzhiling)
{
RS=0;
E=0;
delay(5);
P0=zhiling;
E=1;
delay(5);
E=0;
}
//////向1602写数据子函数////////
voidxieshuju1602(ucharshuju)
{
RS=1;
E=0;
delay(5);
P0=shuju;
E=1;
delay(5);
E=0;
}
////显示查表子函数1/////////
voiddesplay(ucharweizhi,ucharshuju)
{
xiezhiling1602(0x80+weizhi);
xieshuju1602(tab[shuju]);
}
///////显示查表子函数2//////
voiddesplay2(ucharweizhi,ucharshuju)
{
xiezhiling1602(0x80+weizhi);
xieshuju1602(tab1[shuju]);
}
/////18b20到1602转换子函数//////
voidzhuanhuan()
{
ucharDL,DH,dat;
uinty;
DL=du18b20();
DH=du18b20();
if((DH&0xf0)!
=0xf0)
{
flagfu=0;
dat=(DH%8)*16+DL/16;
xiaoshu=DL%16*10/16;
}
else
{
y=DH*256+DL;
y=(~y)+1;
flagfu=1;
dat=(y%4096)/16;
xiaoshu=(y%16)*10/16;
}
if(flag==0)
{
if(dat>=38)
{
SPEAKER=0;
delay(200);
SPEAKER=1;
delay(200);
}
else
{
SPEAKER=1;
}
}
ge=dat%10;
shiwei=dat%100/10;
bai=dat/100;
}
/////初始化1602子程序///////
voidchushihua1602()
{
RW=0;
xiezhiling1602(0x38);
xiezhiling1602(0x0c);
xiezhiling1602(0x06);
xiezhiling1602(0x01);
}
////////向1302写一个字节//////////////
voidxie1bit1302(ucharxie)
{
uchari,zancun;
zancun=xie;
for(i=0;i<8;i++)
{
CLK=0;
IO=zancun&0x01;
CLK=1;
zancun=zancun>>1;
}
}
/////////读取1302一个字节///////////
uchardu1bit1302(void)
{
uchari;
for(i=0;i<8;i++)
{
ACC=ACC>>1;
CLK=1;
CLK=0;
ACC7=IO;
}
return(ACC);
}
//////////////1302写指令子函数//////////
voidxie1302(ucharzhiling,ucharshuju)
{
RST=0;
CLK=0;
RST=1;
xie1bit1302(zhiling);
xie1bit1302(shuju);
CLK=0;
RST=0;
}
////读取1302数据子函数/////
uchardu1302(ucharzhiling)
{
ucharshijian;
RST=0;
CLK=0;
RST=1;
xie1bit1302(zhiling);
shijian=du1bit1302();
CLK=0;
RST=0;
return(shijian);
}
/////////////////////1302初始化子程序////////////////////
voidchushihua1302()
{
xie1302(0x8e,0x00);//写保护关闭
xie1302(0x90,0xaa);
xie1302(0x80,0x00);//秒
xie1302(0x82,0x00);//分
xie1302(0x84,0x00);//时
xie1302(0x86,0x15);//日
xie1302(0x88,0x07);//月
xie1302(0x8a,0x05);//星期
xie1302(0x8c,0x10);//年
xie1302(0x8e,0x80);//打开写保护
}
///////////1302到1602数据的转换/////////
voidzhuanhuan1302()
{
nian=du1302(0x8d);//取年
nian1=nian&0x0f;
nian2=(nian>>4);
yue=du1302(0x89);//取月
yue1=yue&0x0f;
yue2=(yue>>4);
ri=du1302(0x87);//取日
ri1=ri&0x0f;
ri2=(ri>>4);
shi=du1302(0x85);//取时
shi1=shi&0x0f;
shi2=(shi>>4);
fen=du1302(0x83);//取分
fen1=fen&0x0f;
fen2=(fen>>4);
miao=du1302(0x81);//取秒
miao1=miao&0x0f;
miao2=(miao>>4);
day=du1302(0x8b);//取星期
day=day&0x0f;
}
voidkeycan()
{
//////进入调整//////
if(tiaozheng==0)
{
delay(3);
if(tiaozheng==0)
{
while(!
tiaozheng);
key++;
xie1302(0x8e,0x00);
xie1302(0x80,0x80);
}
}
/////////调整分/////
if((key%8)==1)
{
xiezhiling1602(0x0f);
xiezhiling1602(0x80+0x44);
if(jia==0)
{
delay(3);
if(jia==0);
{
while(!
jia);
fen++;
if((fen&0x0a)==0x0a)
fen=(fen&0xf0)+16;
if(fen==0x60)
fen=0x00;
delay(5);
xie1302(0x82,fen);
}
}
if(jian==0)
{
delay(3);
if(jian==0);
{
while(!
jian);
fen--;
if((fen&0xf0)==0xf0)
fen=fen-16;
if((fen&0x0a)==0x0a)
fen=fen&0xf9;
if(fen>0x60)
fen=0x59;
delay(5);
xie1302(0x82,fen);
}
}
}
///////////调整时///////////
if((key%8)==2)
{
xiezhiling1602(0x80+0x41);
if(jia==0)
{
delay(3);
if(jia==0);
{
while(!
jia);
shi++;
if((shi&0x0a)==0x0a)
shi=(shi&0xf0)+16;
if(shi==0x24)
shi=0x00;
delay(5);
xie1302(0x84,shi);
}
}
if(jian==0)
{
delay(3);
if(jian==0);
{
while(!
jian);
shi--;
if((shi&0xf0)==0xf0)
shi=shi-16;
if((shi&0x0a)==0x0a)
shi=shi&0xf9;
if(shi>0x24)
shi=0x23;
delay(5);
xie1302(0x84,shi);
}
}
}
///////////调整日///////////
if((key%8)==3)
{
xiezhiling1602(0x80+0x07);
if(jia==0)
{
delay(3);
if(jia==0);
{
while(!
jia);
ri++;
if((ri&0x0a)==0x0a)
ri=(ri&0xf0)+16;
if(ri==0x32)
ri=0x00;
delay(5);
xie1302(0x86,ri);
}
}
if(jian==0)
{
delay(3);
if(jian==0);
{
while(!
jian);
ri--;
if((ri&0xf0)==0xf0)
ri=ri-16;
if((ri&0x0a)==0x0a)
ri=ri&0xf9;
if(ri>0x32)
ri=0x31;
delay(5);
xie1302(0x86,ri);
}
}
}
///////////调整月///////////
if((key%8)==4)
{
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 18 B20 1302 温度 测量 实时 时钟 设计