单片机课程设计之万年历闹钟与温度显示设计Word格式文档下载.docx
- 文档编号:21831504
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:25
- 大小:296.08KB
单片机课程设计之万年历闹钟与温度显示设计Word格式文档下载.docx
《单片机课程设计之万年历闹钟与温度显示设计Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《单片机课程设计之万年历闹钟与温度显示设计Word格式文档下载.docx(25页珍藏版)》请在冰豆网上搜索。
我们采用DS1302作为主要计时芯片,主要为了提高计时精度,更重要的就是DS1302可以在很小的后备电源下继续计时,并可编程选择充电电流来对后备电源进行充电,可以保证后备电源基本不耗电。
我们设计硬件电路时,采用一个纽扣电池进行对时钟芯片供电,达到断电后,时钟继续运行的目的。
时钟芯片与单片机的连接如图3-3所示。
4、温度传感器
采用DS18B20作为温度检测的芯片,DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。
由于DS18B20采用的是1-Wire总线协议方式,即在一根数据线实现数据的双向传输,而对STC89C52单片机来说,硬件上并不支持单总线协议,因此,我们必须采用软件的方法来模拟单总线的协议时序来完成对DS18B20芯片的访问。
由于DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求。
DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。
该协议定义了几种信号的时序:
初始化时序、读时序、写时序。
所有时序都是将主机作为主设备,单总线器件作为从设备。
而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。
数据和命令的传输都是低位在先。
电路图如图3-4所示。
5、复位电路设计
由电容串联电阻构成,由图并结合"
电容电压不能突变"
的性质,可以知道,当系统一上电,RST脚将会出现高电平,并且,这个高电平持续的时间由电路的RC值来决定.典型的51单片机当RST脚的高电平持续两个机器周期以上就将复位,所以,适当组合RC的取值就可以保证可靠的复位.一般教科书推荐C
取10u,R取8.2K.当然也有其他取法的,原则就是要让RC组合可以在RST脚上产生不少于2个机周期的高电平。
如图3-5所示。
6、数码管显示电路设计
数码管内部是由7个条形发光二极管与一个小圆点发光二极管组成,根据这八个二极管的亮暗组成不同的字符。
本系统采用八位数码管作为显示模块,数码管相对其他LCD类的显示器来说,成本比较低廉,省电。
两个四位共阴0.56英寸的数码管作为显示屏。
如图3-6所示。
7、按键控制电路设计
本系统采用四个按键作为键盘控制实现界面切换的功能,如图3-7所示。
能够实现界面切换、时间校正、闹钟设置等功能。
机械式按键再按下或释放时,由于机械弹性作用的影响,通常伴随有一定时间的触点机械抖动,然后其触点才稳定下来。
其抖动过程如图3-8所示。
抖动时间的长短与开关的机械特性有关,一般为5-10ms。
故软件编程时需要注意消除抖动。
图3-8按键抖动过程
8、制作电路板
制作电路板的过程如下:
①打印底稿(喷墨/激光打印胶片,或使用光绘菲林)②曝光(太阳光30-180秒;
紫外线灯4-5分钟)③显影(专用显像剂)④蚀刻(用热水化开的三氯化铁液体)⑤钻孔(小电钻),焊接。
如图3-9所示。
图3-9腐蚀与钻孔
9、元件清单
我们设计的这个系统主要用到STC89C52单片机作为主控芯片,还有时钟芯片作为计算时间的芯片,温度测量的温度传感器DS18B20,并用数码管来显示,所以本系统用到的主要元件如表3-1.
元器件
数量
单片机
1块
电阻
若干个
DS1302
纽扣电池
1个
DS18B20
电容
74LS573
蜂鸣器
晶振
(12M、32.768K)
按键
数码管
2块
表3-1元件清单
四、软件设计
1、系统软件设计流程图
系统主程序首先对系统进行初始化,包括设置定时器、中断和端口;
然后数码管显示省电模式。
由于单片机没有停止指令,所以可以设计系统程序不断地循环执行上述显示效果。
下图是系统的流程图。
2、按键控制子程序
本系统按键可以实现的数码管界面切换,系统时钟的校正、闹钟的设定,按键的程序需要进行软件的消抖。
按键功能如下图4-2所示。
3、主程序
主程序是系统运行的主要程序,包括时钟芯片、温度传感器的读取以及数码管显示的程序。
主程序开始时要对定时计数器进行初始化以及一些变量的初始化。
其流程图如图4-2所示。
图3-2主程序流程图
4、时钟设置子程序
时钟设置子程序主要是由时钟芯片DS1302计算时间并用数码管显示时间。
时钟设计主要函数如下:
voidread_rtc()
{
unsignedchari;
for(i=0;
i<
7;
i++)
{
time_data[i]=read_ds1302_byte(read_add[i]);
_nop_();
read_ds1302_byte(read_add[0]);
_nop_();
td[i]=time_data[i]/16*10+time_data[i]%16;
}
}
5、定时器中断子程序与数码管显示程序
定时器的开启需要五个步骤:
首先是设置定时计数器的工作模式与工作方式,这里设置为定时器模式0工作模式1。
然后给定时器设置初值。
接着是把总中断打开(EA=1);
再接着是ET0=1;
最后是把定时器打开(TR0=1)。
其程序如下程序所示:
voidinit()
TMOD=0x01;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
EA=1;
ET0=1;
TR0=1;
}
7、温度传感器DS18B20主程序
主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量温度值,温度测量每1s进行一次,流程图如图4-4。
读出温度子程序的主要功能是读出RAM中的9个字节,在读出时需进行CRC校验,校验有错时不进行温度数据的改写。
如图4-5所示。
图4-4DS18B20主程序流程图图4-5读出温度子程序流程图
五、调试与功能说明
1、系统性能测试与功能说明
先检查印制板及焊接的质量是否符合要求,有无虚焊点及线路间有无短路、断路。
然后用万用表测试,通电检测,检查个芯片电压是否正常,检查无误后,可通电检查数码管亮度情况,一般情况下取背光电压为4~5.5V即可得到满意的效果。
数码管时钟温度系统能够实现预想的功能:
①用DS1302进行时钟的运行;
②能够实现界面的切换;
③能够实现温度检测与显示功能;
④能够实现设置闹钟与关闭闹钟的功能;
⑤能够实现断电后时间继续运行的目的。
2、系统时钟误差分析
数码管时钟温度系统存在一定的时间误差,但误差非常小,可以忽略;
即使由于时间的累计会照成较大的误差,我们可以通过按键去校正时间。
3、硬件调试
子程序调试包括:
DS1302的计时和读写程序、显示程序;
DS18B20读出温度子程序、温度转换命令子程序、计算温度子程序、显示数据刷新子程序。
根据程序各部份子程序先进行独立调试。
由于采用了DS1302作为计时器使用,其计时精度相对来说比较高。
用制作的成品与万年历计时比较,基本没有误差。
3.根据实验要求记录并显示某些时间的温度值及一天当中的最高、最低温度。
硬件测试与方案设计一样,具有一定的稳定性,快速性与准确性。
4、软件调试问题及解决
①由于硬件设计按键太少,调整时间时只能加、不能减;
②某些芯片不是焊固定在电路板上的,故可能会出现接触不良的问题;
③若两处电源都断开,则出现“死机”现象;
此时要将P1^6接低电平
六、心得体会
通过本次的课程设计,我们完成了本课程设计方案设计的要求,能够实现了数码管时钟温度显示系统的基本功能,达到了完成一个小作品,小产品的目的。
数码管时钟温度显示系统的实现让我们学会了编程与使用51单片机,时钟芯片ds1302的控制与温度传感器ds18b20的读取与在数码管上显示。
完成了以下功能:
1、数码管显示“时分秒”;
2、数码管显示“年月日”;
3、数码管显示“时分温度”;
4、设置以及校正时间;
5、设置闹钟功能;
6、来电无需校正。
本系统的开发我们是从方案论证开始,在硬件方面:
用protel99画电路板,制作电路板,焊接电路板,基本调试。
在软件方面:
用keil软件进行编程与用STC_ISP软件烧入测试,编程调试等步骤。
最后时钟的最终测试与误差分析;
得出精确的时间。
在完成这个课程设计的过程中,我们遇到了不少问题,然后通过问老师、师兄、同学最终完成了课程设计。
问题如下:
问题
解决方案
1、数码管亮度不够
驱动电路,用74LS573驱动
2、P0口没有上拉电阻
在P0口接上上拉电阻
3、数码管显示有闪烁的情况
把数码管显示时间减少
4、温度显示出现乱码
读取温度时,先把定时器关了,读完后马上开了定时器
5、C语言编程
.c文件不能包含.c文件;
可以包含.h文件
6、两个电源都断了,会出现“死机”现象
上电后,把P1^6拉低,然后设置时间
7、设置时,参数只能加、不能减
预想时没想好,下次实验一定要先想好再制作硬件
8、蜂鸣器种类
有两种:
有源与无源两种
参考文献
[1]谭浩强著.C程序设计(第二版).北京:
清华大学出版社,2005
[2]丁元杰著.单片微机原理及应用.北京:
机械工业出版社,2005
[3]郭天祥著.新概念51单片机C语言教程:
入门、提高、开发、拓展全攻略.北京:
电子工业出版社,2009
附程序:
#include<
reg52.h>
#include"
jianpan.h"
ds1302.h"
ds18b20.h"
sbitkey16=P1^6;
sbitbuzz=P1^7;
//蜂鸣器定义
unsignedcharsmg_weigao[]={0xfe,0xfd,0xfb,0x7f};
//,0xf7,0xef,0xdf,0xbf
unsignedcharsmg_weidi[]={0xf7,0xef,0xdf,0xbf};
//0xfe,0xfd,0xfb,0x7f,
unsignedcharsmg_duangao[]={0xeb,0x88,0xb3,0xba,0xd8,0x7a,0x7b,0xa8,0xfb,0xfa,0x10,0x00,0xff};
unsignedcharsmg_duandi[]={0xfa,0x22,0xb9,0xab,0x63,0xcb,0xdb,0xa2,0xfb,0xeb,0x01,0x00,0xff};
unsignedchardisp[8];
unsignedcharaclock[8];
unsignedchartt;
bitttflag;
//18b20标志位定义
unsignedcharkey16num=0;
voidshifenzhen();
voidnianyueri();
voidaclockset();
voidmain()
init();
//set_rtc();
//若有则读取全部年月日时分秒;
若无则直接是保存的(年月日时分秒)
ds18b20();
//第一次读取温度,显示时不会出现一开始乱码的情况
while
(1)
/*****遇到死机时,P1^6口接地,则可以继续**********/
if(key16==0)
{
delay(100);
if(key16==0)
{
key16num++;
while(!
key16);
}
}
if(key16num==1)
{
ds1302();
write_ds1302(0x8e,0x00);
//关写保护
write_ds1302(write_add[0],0x14);
//把数据写入相应的地址中,比如:
write_ds1302(write_add[1],0x03);
write_ds1302(write_add[2],0x01);
write_ds1302(write_add[3],0x15);
write_ds1302(write_add[4],0x22);
write_ds1302(write_add[5],0x22);
write_ds1302(write_add[6],0x22);
write_ds1302(0x8e,0x80);
//开写保护
}
if(key16num==2)
key16num=0;
}
jianpan();
ds1302();
/*******一般是省电模式*********/
if(kn1flag==0)
disp[0]=11;
disp[1]=11;
disp[2]=11;
disp[3]=11;
disp[4]=11;
disp[5]=11;
disp[6]=11;
disp[7]=11;
/******第一次按下按键1显示“时分秒”*******/
if(kn1flag==1)
disp[0]=td[4]/10;
//time_data[4]/16;
disp[1]=td[4]%10;
//time_data[4]%16;
disp[2]=10;
disp[3]=td[5]/10;
//time_data[5]/16;
disp[4]=td[5]%10;
//time_data[5]%16;
disp[5]=10;
disp[6]=td[6]/10;
//time_data[6]/16;
disp[7]=td[6]%10;
//time_data[6]%16;
/*******第二次按下按键1切换到年月日****************/
if(kn1flag==2)
disp[0]=td[0]/10;
disp[1]=td[0]%10;
disp[3]=td[2]/10;
disp[4]=td[2]%10;
disp[6]=td[3]/10;
disp[7]=td[3]%10;
/*******第三次按下按键1切换到温度显示的界面******/
if(kn1flag==3)
{
if(ttflag==1)
TR0=0;
//关闭定时器0;
以免影响温度18b20的读取
ttflag=0;
ds18b20();
//读取温度
TR0=1;
//读取完毕后打开定时器0
disp[6]=shu/100;
disp[7]=shu%100/10;
/*******第四次按下按键1进入时间设置,设置正确的“时分”时间*************/
if(kn1flag==4)
shifenzhen();
//设置正常的时分时间
disp[6]=10;
disp[7]=10;
/*******第五次按下按键1进入时间设置,设置正确的“月日”时间*************/
if(kn1flag==5)
nianyueri();
//设置正常的年月时间
disp[0]=10;
disp[1]=10;
/*****第六次按下按键1回到正常显示,显示时分秒*************/
if(kn1flag==6)
kn1flag=0;
//返回正常界面
/*****第一次按下按键2,进入闹钟设置界面************/
if(kn2flag==1)
//进入界面“省电”
//设置闹钟的响应的时间
disp[3]=aclock[4]/10;
disp[4]=aclock[4]%10;
disp[6]=aclock[5]/10;
disp[7]=aclock[5]%10;
aclockset();
//闹钟设置程序
///*******第二次按下按键2**********/
if(kn2flag==2)
kn1flag=1;
//界面显示时分秒
kn2flag=0;
/*******闹钟响应函数*********/
if((td[4]==aclock[4])&
&
(td[5]==aclock[5])&
(aclock[4]!
=0)&
(td[6]<
30))//
buzz=0;
//有缘蜂鸣器只需要低电平
delay
(1);
//当闹钟响后,第二次按下按键2关闭闹钟
if(kn2flag==1)
{
kn1flag=1;
//进入界面“时分秒”
kn2flag=0;
buzz=1;
//关闭蜂鸣器
aclock[4]=0;
//凌晨0点不响
/*****如果第一次闹钟响不按下闹钟按键2,则2分钟后再次响******/
elseif((td[4]==aclock[4])&
(td[5]==aclock[5]+3)&
30))//
//有缘蜂鸣器只要低电平
//当闹钟响后,第二次按下按键2关闭闹钟
else
buzz=1;
/********设置正确的时分时间***************/
voidshifenzhen()//设置正确的时间
td[4]=time_data[4]
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 课程设计 万年历 闹钟 温度 显示 设计