基于单片机液晶定时闹钟的设计方案.docx
- 文档编号:13828674
- 上传时间:2023-06-17
- 格式:DOCX
- 页数:31
- 大小:149.78KB
基于单片机液晶定时闹钟的设计方案.docx
《基于单片机液晶定时闹钟的设计方案.docx》由会员分享,可在线阅读,更多相关《基于单片机液晶定时闹钟的设计方案.docx(31页珍藏版)》请在冰点文库上搜索。
基于单片机液晶定时闹钟的设计方案
基于单片机液晶定时闹钟的设计方案
1设计方案论证
1.1应用
近几年,单片机在各个领域得到广泛的应用。
从工业到人们的日常生活,大部分的科技产品都是通过单片机来控制。
在它问世之前,自动控制设备不能被广泛的应用,这是因为控制设备的体积庞大,耗电量大,价格昂贵。
在第一台微处理器成功研制不久,第一个单片机就问世了。
因为其小巧的体积,低功耗,以及高效的性能,单片机受到了大家的欢迎。
今天,单片机成为了解决低复杂度,中等复杂度控制问题的传统选择。
我们选择的方法是单片机开发设计使用的传统方法,通过本次设计,可以了解整个单片机开发的流程。
利用STC89C52单片机结合七段显示器完成的简易的定时闹铃时钟,干电路系统由秒信号发生器、“时、分、秒”计数器、译码器及显示器、校时电路、闹钟电路组成。
秒信号产生器是整个系统的时基信号,它直接决定计时系统的精度,一般用石英晶体振荡器加分频器来实现。
译码显示电路将“时”、“分”、“秒”计数器的输出送到七段显示译码驱动器译码驱动,通过LCD液晶显示屏显示出来。
闹钟电路是用比较器来比较计时系统和定时系统的输出状态,如果计时系统和定时系统的输出状态相同,则发出一个脉冲信号,再和一个高频信号混合,送到放大电路驱动扬声器发声,从而实现定时闹响的功能。
通过设置现在的时间及显示闹铃设置时间,并在定时时间发出一阵声响,可以进—步扩充控制电器的启停等。
1.2方案选择
用单片机来设计数字钟,软件实现各种功能比较方便,但因软件的执行需要一定的时间,所以就会出现误差。
因此我进一步努力,通过对比实际的时钟,查找出误差的来源,并作出调整,使得误差尽可能减小,达到实际数字钟系统的允许误差范围。
在程序设计中,采用模块化的程序设计思想,对整个设计划分了若干个模块,先对各个模块分别进行设计,然后整合各个模块,进行仿真模拟,对出现的错误进行分析,然后找出问题的所在,改进程序,再仿真模拟,观察结果、分析结果,直至最终结果满足设置要求。
电子闹钟应包括秒信号发生器、时间显示电路、按键电路、供电电源以及闹铃指示电路等几部分。
按键功能说明:
K1,设置时间和闹钟的小时;K2,设置小时以及设置闹钟的开关;K3,设置分钟和闹钟的分钟;K4;设置完成退出。
1.3总设计框图及分析
液晶显示器显示电路
闹铃声指示电路
电源系统
复位、时钟等电路
按钮电路
CPU
图1
电子闹钟的主电路指的是图1中CPU线框内部分,主要涉及到CPU电路和按键按钮电路。
主机的设计具体地说有:
1)系统时钟电路设计;2)系统复位电路设计;3)按键与按钮电路设计;4)闹铃声指示电路设计。
本设计是定时闹钟的设计,由单片机STC89C52芯片和LCD显示器为核心,辅以必要的电路,构成的一个单片机电子定时闹钟。
电子钟设计可采用数字电路实现,也可以采用单片机来完成。
数字电子钟是用数字集成电路构成的,用数码管显示“时”,“分”,“秒”的现代计时装置。
若用数字电路完成,所设计的电路相当复杂,大概需要十几片数字集成块,其功能也主要依赖于数字电路的各功能模块的组合来实现,焊接的过程比较复杂,成本也非常高。
若用单片机来设计制作完成,由于其功能的实现主要通过软件编程来完成,那么就降低了硬件电路的复杂性,而且其成本也有所降低,所以在该设计中采用单片机利用STC89C52,它是低功耗、高性能的CMOS型8位单片机。
片内带有4KB的Flash存储器,且允许在系统内改写或用编程器编程。
另外,STC89C52的指令系统和引脚与8051完全兼容,片内有128B的RAM、32条I/O口线、2个16位定时计数器、5个中断源、一个全双工串行口等。
STC89C52单片机结合七段显示器设计的简易定时闹铃时钟,可以设置现在的时间及显示闹铃设置时间,若时间到则发出一阵声响,进—步可以扩充控制电器的启停。
设计内容包括了秒信号发生器、时间显示电路、按键电路、供电电源以及闹铃指示电路等几部分的设计。
采用四个开关来控制定时闹钟的工作状态,分别为:
K1、设置时间和闹钟的小时;K2、设置小时以及设置闹钟的开关;K3、设置分钟和闹钟的分钟;K4、设置完成退出。
设计完成的定时闹钟达到课程设计的要求,在到达到定时的时间时就会立即发出蜂鸣声音,持续一分钟。
显示采用的六位数码管电路,如果亮度感觉不够,可以通过提升电阻来调节,控制程序中延迟时间的长短,可以获得不同的效果。
也可以改蜂鸣器为继电器,通过控制继电器从而进一步扩展的来控制一些家电开关。
2硬件电路设计
2.1系统时钟电路设计
对于时间要求不是很高的系统,只要按图进行设计就能使系统可靠起振并稳定运行。
但由于原理图中的C1、C2电容起着系统时钟频率微调和稳定的作用,因此,在本闹钟系统的实际应用中一定要注意正确选择参数(30±10PF),并保证对称性(尽可能匹配),选用正牌厂家生产的瓷片或云母电容,如果可能的话,温度系数要尽可能低。
实验表明,这2个电容元件对闹钟的走时误差有较大关系。
2.2系统复位电路的设计
智能系统一般应有手动或上电复位电路。
复位电路的实现通常有两种方式:
1)RC复位电路;2)专用µF监控电路。
前者实现简单,成本低,但复位可靠性相对较低;后者成本较高,但复位可靠性高,尤其是高可靠重复复位。
对于复位要求高、并对电源电压进行监视的场合,大多采用这种方式。
2.3闹钟指示电路设计
闹铃指示可以有声或光两种形式。
本系统采用声音指示。
关键元件是蜂鸣器。
蜂鸣器有无源和有源两种,前者需要输入声音频率信号才能正常发声,后者则只需外加适当直流电源电压即可,元件内部已封装了音频振荡电路,在得电状态下即起振发声。
市场上的有源蜂鸣器分为3V、5V、6V等系列,以适应不同的应用需要。
闹钟电路是用比较器来比较计时系统和定时系统的输出状态,如果计时系统和定时系统的输出状态相同,则发出一个脉冲信号,再和一个高频信号混合,送到放大电路驱动扬声器发声,从而实现定时闹响的功能。
其电路设计参见系统原理图。
2.4电子闹钟的显示电路设计
本次课程设计采用了液晶显示电路。
液晶显示是一种被动式的显示器,即液晶本身不发光,而是利用液晶处理后能够改变光纤传输方向的特性,达到显示字符或者图形的目的。
这类显示器具有体积小、重量轻、功耗较低、显示内容丰富等特点。
LCD显示模块把LCD显示屏、背景光源、线路板和驱动集成电路等部件构成一个整体,作为一个独立部件使用,具有功能较强、易于控制、接口简单等优点。
LCD显示模块按显示功能可分为:
LCD段式显示模块、LCD字符型显示模块、LCD图形式显示模块三类,在本设计中将会采用字符型显示模块。
LCD显示器内部共有14个引脚,包括:
8个数据引脚,3个控制引脚,3个电源引脚。
利用该显示器来显示“时”、“分”、“秒”计数器的输出状态。
到达定时电路时根据计时系统的输出状态产生一脉冲信号,然后去触发一音频发生器实现闹铃。
校时电路时用来对“时”、“分”、“秒”显示数字进行校对调整的。
2.5仿真图
运行仿真图
3程序设计
3.1概述
软件设计的重点在于秒脉冲信号的产生、显示的实现、以及按键的处理等方面。
基于软件的秒脉冲信号通常有延时法和定时中断法。
延时法一般采用查询方式,在延时子程序前后必然需要查询和处理的程序,导致误差的产生,因此其秒脉冲的精度不高;中断法的原理是,利用单片机内部的定时器溢出中断来实现。
例如,设定某定时器每100ms中断1次,则10次的周期为1s。
这种实现法的特点是精度高,秒脉冲的发生和其他处理可以并行进行。
本系统中所使用的晶振频率为12MHZ。
3.2主模块的设计
主模块是系统软件的主框架。
结构化程序设计一般有“自上而下”和“自下而上”两种方式,“自上而下”法的核心就是主框架的构建。
它的合理与否关系到程序最终的功能的多少和性能的好坏。
本系统的主模块的程序框图如下图2所示:
图2
3.3基本显示模块设计
基本显示模块设计的重点是由显示代码取得相应的段码,显示段码数据的并行发送,高精度的计时工具大多数都使用了石英晶体振荡器,由于电子钟,石英表,石英钟都采用了石英技术,因此走时精度高,稳定性好,使用方便,不需要经常调校,数字式电子钟用集成电路计时时,译码代替机械式传动,用LCD显示器代替显示器代替指针显示进而显示时间,减小了计时误差,这种表具有时,分,秒显示时间的功能,还可以进行时和分的校对,片选的灵活性好。
程序流程如图3所示
关显示以免显示抖动
通过串口将时分秒数据传入数码管
打开显示
图3
3.4时间设定模块设计
时间设定模块的设计要点是按键的去抖处理与“一键多态”的处理。
即只涉及4个键完成了6位时间参数的设定。
软件法去抖动的实质是软件延时,即检测到某一键状态变化后延时一段时间,再检测该按键的状态是否还保持着,如是则作为按键处理,否则,视为抖动,不予理睬。
去抖中的延时时间一般参考资料多描述为10ms左右,实际应用中,应大于20ms,否则,会导致按一次作多次处理,影响程序正常执行。
“一键多态”即多功能键的实现思想是,根据按键时刻的系统状态,决定按键采取何种动作,即何种功能。
其流程图如下图4所示:
图4
3.5闹铃功能的实现
闹铃功能的实现涉及到两个方面:
闹铃时间设定和是否闹铃判别与相应处理。
闹铃时间设定模块的设计可参照时间设定模块,这里着重阐述闹铃判别与处理模块的设计问题。
闹铃判别与闹铃处理的关键在于判别何时要进行闹铃。
当时十位、时个位、分十位、分个位中任一位发生改变(进位)时,就必须进行闹铃判别。
译码显示电路将“时”、“分”、“秒”计数器的输出送到七段显示译码驱动器译码驱动,通过六个七段LCD显示器显示出来。
闹铃电路根据计时系统的输出状态产生一脉冲信号,然后加上一个高频或低频信号送到放大电路驱动蜂鸣器发声实现报时。
校时电路是直接加一个脉冲信号到时计数器或者分计数器或者秒计数器来对“时”、“分”、“秒”显示数字进行校对调整。
其流程图如下所示:
时十位、个位,分十位、个位改变了
设置闹铃标志
是否设置了闹铃
清除闹铃标志
判当前时间是设定时间
中断返回
中断返回
Y
N
Y
闹铃判别处理
图5.1
图5.2
虑到实用性,在该电子钟的设计中修改定时或调整时间时采用了闪烁,而且以定时20组闹钟。
在编程上,首先进行了初始化定义了程序的入口地址以及中断的入口地址,在主程序的开始定义了一组固定单元用来存储计数的秒,分,时以及定时时间的序号等。
在显示程序段中主要进行了闪烁的处理,采用定时器中断置标志位,再与位选相互结合的方法来控制调时或定时中的闪烁。
时,分,秒显示则是用了软件译码(查表)的方式,再用了一段固定的程序段进行进制转化。
初始化之后,用中断方式对其计数,计数的同时采用了定时器比较的方法,比较当前计数时间与定时时间是否相等,若相等则将闹铃标志位置数。
由于定义了定时闹钟组,在这里采用中断组次,每中断一次比较一组闹钟,避免了一次比较中断时间过长,影响下次中断时间。
显示之后查询闹铃标志位是否与前面所置数相等,若相等则响铃。
为了避免响铃影响显示,采用了每显示几屏以后在显示程序中出现脉冲,驱动喇叭,不会影响显示。
之后用查询方式对按键进行判断,若有键按下,则进行软件延时消抖,避免了抖动引起的干扰,执行相应的定时,选时或调时程序段。
对当前时间或定时时间修改后又返回到最初的显示程序段,如此循环下去。
3.6程序
*版本号01*/
/*
模块构成:
*/
#include
#include"hdy.h"
#include"hs.c"
#include"iap_ds1302.h"
#include"lcd1602.h"
#include"zd.h"
#include"isp_52.h"
//#include"szxt.h"
#include"ajjc.h"
#definebgsjcl30//背光时间
#definexssjcl100//显示时间
#definejbjcyssj2//警报解除延时
//定义端口
sbitfmqdk=P0^3;//闹钟端口
sbitlcd_bg=P3^2;//背光
//时间相关变量
ucharmmzc=0;//秒暂存
ucharnzsj
[4][2]={0,0,0,0,0};//警戒时间
bitbjsnbzw=0;
charxlys_t=0;
structnzjg//定义结构体闹钟数据结构
{//包含:
ucharnzsj_ss;//闹钟时间_时
ucharnzsj_ff;//闹钟时间_分
ucharnzsnbz;//闹钟标志0:
禁止1:
允许
ucharxlsj;//响铃时间
};
structnzjgnz1,nz2,nz3,nz4,nz5,nz6;
//模式菜单相关变量显示相关变量
charmsbz=0,xxbz=0;//模式标志位,选项标志位
bitxsgxbzw=0,xscshbzw=0,xssnbzw=1,bgsnbzw=1;//显示更新标志位,显示初始化标志位,
charbgsj_t=bgsjcl,xssj_t=xssjcl;//显示相关显示使能时间,背光使能时间
//调试用变量
inta_ts=50,b_ts=50,c_ts=0,d_ts=0,e_ts=0,f_ts=0;
bitbzw_ts=0;
/***********************************************************************************************************************/
/***********************************************************************************************************************/
voidcsmk()
{
//ksdqsj();
//lcd1602xssz(2,0x1e,mm);
}
////测试模块////测试模块////测试模块////测试模块////测试模块////测试模块////测试模块////测试模块////测试模块
/***********************************************************************************************************************/
/***********************************************************************************************************************/
//设定基础程序
//功能加减设定
//参数1:
设定变量指针uchar*sdbl
//参数2:
加上限ucharshang
//参数3:
减下线ucharxia
//返回值:
是否越界char上限越界:
1下线越界-1否则:
0
ucharjjcl(ucharsdbl,ucharshang,ucharxia)
{
chara=0;
if(k1bzw==1)
{
k1bzw=0;
if(sdbl>=shang)
{
(sdbl)++;
sdbl=xia;
a=1;
}
else
(sdbl)++;
}
if(k2bzw==1)
{
k2bzw=0;
if(sdbl<=xia)
{
(sdbl)--;
sdbl=shang;
a=-1;
}
else
(sdbl)--;
}
returnsdbl;
}
//时间设定
voidajsd2()
{
ucharsx,xx,*szbl;
if(xxbz!
=0)
{
switch(xxbz)
{
case1:
sx=99;xx=0;szbl=&nnn;break;
case2:
sx=12;xx=1;szbl=&yyy;break;
case3:
sx=31;xx=1;szbl=&rrr;break;
case4:
sx=23;xx=0;szbl=&sss;break;
case5:
sx=59;xx=0;szbl=&fff;break;
case6:
sx=0;xx=0;szbl=&mmm;break;
}
*szbl=jjcl(*szbl,sx,xx);
}
}
//闹钟时间设定
voidajsd3()//
{
structnzjg*nzzz;
if(xxbz!
=0)
{
switch(msbz)
{
case2:
nzzz=&nz1;break;
case3:
nzzz=&nz2;break;
case4:
nzzz=&nz3;break;
case5:
nzzz=&nz4;break;
case6:
nzzz=&nz5;break;
case7:
nzzz=&nz6;break;
}
if(xxbz==1)
{
nzzz->nzsj_ss=jjcl(nzzz->nzsj_ss,23,0);
}
elseif(xxbz==2)
{
nzzz->nzsj_ff=jjcl(nzzz->nzsj_ff,59,0);
}
elseif(xxbz==3)
{
nzzz->xlsj=jjcl(nzzz->xlsj,99,5);
}
elseif(xxbz==4)
{
if((k2bzw==1)||(k1bzw==1))
{
k2bzw=0;
k1bzw=0;
if(nzzz->nzsnbz==1)
nzzz->nzsnbz=0;
else
nzzz->nzsnbz=1;
}
}
}
}
//按键处理模块
voidajclmk()
{
ajjc();
if((k0bzw==1)||(k1bzw==1)||(k2bzw==1)||(k3bzw==1))
{
if(xssj_t==0)
{
k0bzw=0;
msbz=0;
}
xsgxbzw=1;
bgsj_t=bgsjcl;//使能显示相关变量
xssj_t=xssjcl;
if(k0bzw==1)
{
k0bzw=0;
xxbz=0;
xscshbzw=0;//标记为未初始化
msbz++;
if(msbz==8)
msbz=0;
}
if(k3bzw==1)
{
k3bzw=0;
xsgxbzw=1;
xxbz++;
if(msbz==1)
{
if(xxbz==7)
{
xxbz=0;
ksxrsj();
ksdqsj();
msbz=0;
xscshbzw=0;
}
}
elseif(msbz>1)
{
if(xxbz==5)
{
xxbz=0;
msbz=0;
xscshbzw=0;
//iap_jjsjcc();
}
}
}
switch(msbz)
{
case1:
ajsd2();break;//时间设定
case2:
case3:
case4:
case5:
case6:
case7:
ajsd3();break;//警戒设定
}
}
}
/***********************************************************************************************************************/
////显示模块////显示模块////显示模块////显示模块////显示模块////显示模块////显示模块////显示模块////显示模块////显示模块////显示模块
/////////显示模块////显示模块////显示模块////显示模块////显示模块////显示模块////显示模块////显示模块////显示模块////显示模块////显示模块
//显示模式0时间显示
//显示时间
voidxsms0()
{
if(xscshbzw==0)
{
xscshbzw=1;//标记为已初始化
lcd1602csh();//lcd初始化
xsgxbzw=1;//标记为等待显示
//显示时间初屏
lcd1602xszfc(16,0x10,"2013-12-15");
lcd1602xszfc(16,0x20,"18:
16:
20");
}
if(xsgxbzw==1)
{
xsgxbzw=0;
lcd1602xssz(2,0x14,nn);
lcd1602xssz(2,0x17,yy);
lcd1602xssz(2,0x1a,rr);
lcd1602xssz(2,0x22,ss);
lcd1602xssz(2,0x25,ff);
lcd1602xssz(2,0x28,mm);
if((nz1.nzsnbz==1)||(nz2.nzsnbz==1)||(nz3.nzsnbz==1)||(nz4.nzsnbz==1)||(nz5.nzsnbz==1)||(nz6.nzsnbz==1))
lcd1602xszfc(2,0x2c,"@@");
else
lcd1602xszfc(2,0x2c,"");
}
}
//显示模式2时间设定显示
voidxsms2()
{
if(xscshbzw==0)
{
xscshbzw=1;//标记为已初始化
lcd1602csh();//lcd初始化
xsgxbzw=1;//标记为等待显示
//显示时间初屏
lcd1602xszfc(16,0x10,"2013-12-15");
lcd1602xszfc(16,0x20,"18:
16:
20");
//载入设定值
nnn=nn;yyy=yy;rrr=rr;sss=ss;fff=ff;mmm=mm;
}
if(xsgxbzw==1)
{
xsgxbzw=0;
lcd1602xssz(2,0x14,nnn);
lcd1602xssz(2,0x17,yyy);
lcd1602xssz(2,0x1a,rrr);
lcd1602xssz(2,0x22,sss);
lcd1602xssz(2,0x25,fff);
lcd1602xssz(2,0x28,mmm);
switch(xxbz)
{
case0:
lcd1602gbkz(lcd1602_ggb,0x14);break;
case1:
lcd16
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 单片机 液晶 定时 闹钟 设计方案