1、多功能数字钟设计报告多功能数字钟设计报告摘 要本设计采用一块单片机(AT89S52)作为多功能数字钟的控制核心,加以温度传感器、红外接收管、蜂鸣器、液晶显示器(LCD1602)、电源电路及其他电路构成。实现了时间设置、闹铃设置、闹铃开和关的功能;LCD显示小时、分钟,有AM、PM指示灯,闹钟就绪灯,闹钟到点蜂鸣器报警,220V供电基本功能。另外,本设计还实现了通过切换键盘显示现场温度,红外停止闹铃的功能。 AbstractThis design uses a single chip (AT89S52) as the core controller of a multi-functional d
2、igital clock,complemented by temperature sensor,infrared receiver,buzzer,liquid crystal display(LCD1602),power circuit and other circuit. It implementes time setting,alarm setting,and alarm on/off functions.Moreover, it has some basic functions such as displaying hour and minute,AM/PM indicator ligh
3、t,alarm clock ready light,buzzer alarm and 220V power supply.In the end,this design also can show the scene temperature through switching the keyboards,and stop the alarm by infrared circuit. 一、 方案比较与设计1、 数字时钟显示器的选择与控制方案一:采用5只7段共阴极数码管,分别显示小时、及分钟(如23-30),P0口连接数码管的段选端(a、b、c、d、e、f、g),P2口(0-4端)控制数码管位选端(
4、cs1-cs5)。方案二:采用一块液晶显示器(LCD1602),显示内容多,可以显示AM(PM)、小时、“:”、分钟及秒钟(如PM 23:30:30),另外控制也较为方便,只用两个控制线(lcdrs、lcden)。方案一编程较简单,但硬件电路较乱;方案二编程与硬件电路实现都较为方便。考虑到本设计的需要,采用方案二。2、 按键的选择与控制方案一:采用4只轻触按键完成各项功能的设置,分别为功能键、增加键、减少键、开关闹铃键,采用按键复用的设计思路。此种方案硬件简单,软件实现困难。方案二:采用6只轻触按键完成各项功能的设置,分别为设置时间、设置闹铃、调整小时、调整分钟、开闹铃、关闹铃,采用分模块的设
5、计思路。此种方案必第一种只多2只按键,软件实现较为方便。所以采用方案二。二、 系统设计1、 系统框图 电路说明: AM、PM、闹铃就绪LED指示灯部分,三只LED发光二极管分别作为AM、PM、闹铃就绪指示灯。 LCD1602液晶显示器部分,作为本系统的显示器,显示时间、闹钟与温度。 蜂鸣器、温度传感器、红外接收部分,分别用来闹铃到点报警,显示现场温度及非接触时停止闹铃。 键盘部分,作为本系统的控制部分,用来设置时间、闹铃与显示温度。2、 方案实现1) 电源电路本系统采用5V直流电源作为整个电路的供电模块,电路如下:电容滤波,LED电源指示灯。2) 系统电路图。除电源模块外,由单片机复位电路,单
6、片机晶振电路,LED指示灯电路,温度传感器(DS18B20),蜂鸣器,LCD1602,红外接收电路,键盘接口电路组成。系统整体电路如下图所示3) 系统电路说明: LED指示灯电路:分别用3只发光二极管作为AM、PM和闹铃就绪的指示的灯。 LCD1602液晶显示器接口电路:将单片机的P2.7和P2.6分别连接LCD的RS和EN端,P0口接LCD的数据端(DB0-DB7)。LCD1602显示时间、闹铃、温度。 温度传感器接口电路:将单片机的P1.5与温度传感器的数据口相连。用单片机控制温度传感器,采集实时温度,并通过LCD显示。 蜂鸣器接口电路:通过一个PNP三极管放大电路,将单片机的P3.6与三
7、极管的基极相接,实现单片机控制蜂鸣器发声。 键盘接口电路:本系统共用6只接触式按键,分别与单片机的P2.0-P2.5相连,实现单片机控制键盘。 红外接口电路:红外接收管的数据端与单片机的P3.2相连,通过中断实现单片机对红外的控制,进而实现非接触式停止闹铃功能。4) 键盘功能说明: 本系统共用到6只按键,分别用来设置时间、设置闹铃、调整小时、调整分钟、开闹铃、关闹铃。 实时时间显示在LCD的第二行,闹钟时间与温度显示在第一行。 设置时间与设置闹铃处于同一优先级,不可同时有效。当设置完闹铃时,闹钟时间在第一行消隐掉。 调整小时与调整分钟必须在设置时间或设置闹铃按下时才有效。 开闹铃与关闹铃相对独
8、立,不受其他按键的影响。 调整小时的按键作为切换显示温度的开关,当他作为第二功能用时,设置时间与设置闹铃的功能无效。三、 理论分析与计算1、时间的控制与计算。用定时器实现单片机的时间走动,定时器0定时50ms,经20次中断就过了1s,每过1s在中断服务程序中,通过软件编程让秒、分、时显示在LCD上。单片机不停的扫描键盘,当有按键按下时,就进入相应的服务程序。如:当设置时间键按下时,时间停止,进入调整时间状态,通过调时与调分两个按键可调整时间,再按下设置时间键就推出设置,时间继续。2、温度的采集与计算。通过温度传感器采集实时温度,由于室温大于0度小于100度,本系统对温度不要求特别精确,故保留两
9、位整数,一位小数显示在LCD上。通过调时按键的第二功能,可切换键盘将温度显示在LCD的第一行。3、蜂鸣器报警的设计。当闹铃到点时,蜂鸣器就发出“滴滴”的声音以报时。软件实现方法就是:当闹钟的时间与实施时间对应相等就代表闹铃到点。若不打开闹铃,蜂鸣器就不发声;在蜂鸣器发声的过程中,若关掉闹铃,蜂鸣器就停止发声。4、红外止闹的设计。本系统只利用红外接收管,通过单片机的外部中断0作为红外的控制入口。在蜂鸣器发声过程中,按下遥控器的任意一个键,单片机就可控制蜂鸣器使其停止发声。软件实现方法就是:在外部中断0的服务程序中,关闭蜂鸣器。四、 测试方法与调试本系统为多功能数字钟,一切功能的测试均通过6只按键
10、来完成。可分别设置时间、设置闹铃、调整小时、调整分钟、开闹铃、关闹铃。本程序较大,采用C51语言编写。先调试各功能模块,在调试整个系统。具体电路见附件。程序见附页。程序:/DS18B20.h#include#define uint unsigned int#define uchar unsigned charuchar lsb,msb;uchar disbuf7;uchar t1,t2;sbit dq=P15;bit presence;void delay(uint z) uint x,y; for(x=z;x0;x-) for(y=110;y0;y-);void delay1(uint i)
11、/延时14us,12MHzwhile(-i);bit rst_ds18b20()/dq复位;没有检测从机 dq=1 ; _nop_(); /稍做延时 dq=0 ; /单片机将dq拉低 delay1(60); /延时480us-960us,主要是此延时要长最好800us以上 dq=1 ; /拉高总线 delay1(5); /延时16-60us,等待从机发存在信号 presence=dq; /从机发送60-240us的低脉冲作为存在脉冲 delay(30); /至少延时(480us-720us),等待dq拉为高电平(自动的) return presence; uchar rd_byte() /读时
12、,先拉低数据线至少1us,再释放。每两次读至少有1us的间隔 uchar i,dat; dq=1; for(i=0;i=1; /该句4us dq=1; / 给脉冲信号 delay1(1);/主机马上释放总线,并延时至少14us,等待数据送上 if(dq) dat|=0x80; delay1(5);/保持数据至少(60us-15us),等待上拉电阻将dq拉高 return dat; void wr_byte(uchar dat)/数据线由高拉低产生写信号 uchar i; dq=1; for(i=0;i=1; void rd_temperature() /读取温度 rst_ds18b20();
13、wr_byte(0xCC) ; / 只有一个从机,跳过读序列号的操作 wr_byte(0x44) ; /启动温度转换 rst_ds18b20(); / 复位 wr_byte(0xCC) ; /跳过读序号列号的操作 wr_byte(0xBE) ; /读取温度寄存器 lsb=rd_byte() ; /温度低8位 msb=rd_byte() ; /温度高8位 void process_temperature()/处理温度 uchar flagdat,flag; if(msb&0xf0) flag=1; msb=msb; lsb=lsb+1; flagdat=-; else flag=0; /0表示温
14、度为正 flagdat= ; t1=msb4); t2=(lsb&0x0f)*0.0625*10; disbuf0=T; disbuf1=:; disbuf2=t1%100/10+0; disbuf3=t1%10+0; disbuf4=.; disbuf5=t2+0; disbuf6=0; if(disbuf2=0x30) disbuf2= ; if(disbuf3=0x30) disbuf3= ; /main.c/开闹铃时显示闹铃符号,关时不显示/设置闹铃按1下进入 设置状态;按2下,退出设置状态;/设置时间按1下进入设置状态,并停止计时;按2下,推出设置状态,并开始计时/当设置闹铃、时间没
15、按下时,调时、调分不起作用/不可以在设置时间的过程中设置闹铃,不可以在设置闹铃的过程中设置时间/设置闹铃后,闹铃时间在第一行显示/切换温度用到了调时键,为避免冲突,看温度与设置时间、设置闹铃不可同时有效/每当设置闹铃时,闹铃都初始化为00:00,设置完后,闹铃消失/lcd1602有64B的CGRAM,可用来写入自定义字符,5*8点阵的可写8个(每个占8字节),5*11点阵的可写4个(每个占16字节)/写命令wcmd(0x40),显示所写入字符,送入数据0x00-0x07(对应显示8个字符)。#include#include#define uint unsigned int #define uc
16、har unsigned charvoid inc_second();void inc_minute();void inc_hour();void beep();void wdscan();void disp_sfm(uchar x,uchar y,uchar dat);#define PORT P0sbit lcdrs=P27;/LCD数据命令选择端sbit lcden=P26;/LCD使能端sbit setsj=P20;/设置时间sbit setnl=P21;/设置闹铃sbit ts=P22;/调整小时sbit tf=P23;/调整分钟sbit knl=P24;/开闹铃sbit gnl=P
17、25;/关闹铃sbit lam=P10;/AM指示灯sbit lpm=P11;/PM指示灯sbit lnl=P12;/闹铃就绪指示灯sbit fm=P36;/蜂鸣器端口/sj为设置时间按下的标志,nlflag为闹铃键按下的标志;tzflag为调时(1)、分按下(2)的标志uchar sj,tzflag,nlflag,tznl,wdnum;uchar hour,minute,second,tcnt,nlhour,nlminute,nldk;uchar code table= 23:59:50;uchar code bmp=0x0e,0x11,0x1f,0x00,0x0a,0x00,0x00,0x
18、00,0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00;/闹铃符号与温度符号;void wcmd(uchar cmd) lcden=0; lcdrs=0; PORT=cmd; delay(5); lcden=1; delay(5); lcden=0;void wdata(uchar dat) lcden=0; lcdrs=1; PORT=dat; delay(5); lcden=1; delay(5); lcden=0;void goxy(uchar x,uchar y) if(x=1) wcmd(0x80+y); else wcmd(0x80+0x40+y);v
19、oid disp_str(uchar *str) while(*str) wdata(*str); str+; void disp_bmp(uchar x,uchar y,uchar dat) goxy(x,y); wdata(dat);void lcd_init() uchar i ; wcmd(0x38);/显示模式设置:16*2,5*7,8位数据接口 wcmd(0x0c);/开显示,不显光标,光标不闪烁 wcmd(0x06);/地址自动加1 wcmd(0x01);/清屏 wcmd(0x40);/写CGRAM for (i=0;i16;i+) wdata(bmpi); goxy(2,0);
20、 disp_str(table); void timer0_init() TMOD=0X01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1; ET0=1; TR0=1;void timer0() interrupt 1 TH0=(65536-50000)/256; TL0=(65536-50000)%256; tcnt+; if(tcnt=20) tcnt=0; inc_second(); disp_sfm(2,4,hour); disp_sfm(2,7,minute); disp_sfm(2,10,second); wdata( );
21、 wdata( ); wdata( ); wdata( ); wdata( ); inc_minute_nop() minute+; if(minute=60) minute=0;void inc_second() second+; if(second=60) second=0; inc_minute(); void inc_minute() minute+; if(minute=60) minute=0; inc_hour(); void inc_hour() hour+; if(hour=24) hour=0; void inc_nlminute() nlminute+; if(nlmin
22、ute=60) nlminute=0;void inc_nlhour() nlhour+; if(nlhour=24) nlhour=0;void disp_sfm(uchar x,uchar y,uchar dat) uchar shi,ge; shi=dat/10+0; ge=dat%10+0; goxy(x,y); wdata(shi); wdata(ge);void led_apm() if(hour12) lpm=1; lam=0; goxy(2,0); wdata(A); wdata(M); else lam=1; lpm=0; goxy(2,0); wdata(P); wdata
23、(M); void tzsjfun() if(nlflag=0)/若闹铃没按下,则可设置时间,否则无效 if(wdnum=0)/若切换温度也没按下,则可设置时间 if(setsj=0) delay(2); while(!setsj); delay(2); if(setsj=1) /表示按下了设置时间,且已经消抖 sj+; if(sj=1) TR0=0;/按下1次停止计时 if(sj=2) /第2次按下表示设置完毕 TR0=1; sj=0; if(sj)/要调整时间 if(ts=0) delay(2); while(!ts); delay(2); if(ts=1) tzflag=1; if(tf
24、=0) delay(2); while(!tf); delay(2); if(tf=1) tzflag=2; if(tzflag) if(tzflag=1) tzflag=0; inc_hour(); disp_sfm(2,4,hour); if(tzflag=2) tzflag=0; inc_minute_nop(); disp_sfm(2,7,minute); void nl0() nlhour=0; nlminute=0; disp_sfm(1,4,nlhour); wdata(:); disp_sfm(1,7,nlminute); void nldisappear() uchar i;
25、 goxy(1,0); for(i=0;i9;i+) wdata( ); delay(2);void tznlfun() if(sj=0)/若设置时间没按下,则可设置闹铃,否则无效 if(wdnum=0) if(setnl=0) while(!setnl); delay(5); if(setnl=1) nlflag+; if(nlflag=1) nl0(); if(nlflag=2)/按下1次闹铃键,设置闹铃;按下2次,设置完毕; nlflag=0; nldisappear(); if(nlflag)/要设置闹铃 if(nlhour12) goxy(1,0); wdata(A); wdata(
26、M); else goxy(1,0); wdata(P); wdata(M); if(ts=0) while(!ts); delay(5); if(ts=1) tznl=1; if(tf=0) while(!tf); delay(5); if(tf=1) tznl=2; if(tznl) if(tznl=1) tznl=0; inc_nlhour(); disp_sfm(1,4,nlhour); if(tznl=2) tznl=0; inc_nlminute(); disp_sfm(1,7,nlminute); void kgnlfun() if(knl=0) while(!knl); delay(5); i
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1