1、将单片机的P2.7和P2.6分别连接LCD的RS和EN端,P0口接LCD的数据端(DB0-DB7)。LCD1602显示时间、闹铃、温度。 温度传感器接口电路:将单片机的P1.5与温度传感器的数据口相连。用单片机控制温度传感器,采集实时温度,并通过LCD显示。 蜂鸣器接口电路:通过一个PNP三极管放大电路,将单片机的P3.6与三极管的基极相接,实现单片机控制蜂鸣器发声。 键盘接口电路:本系统共用6只接触式按键,分别与单片机的P2.0-P2.5相连,实现单片机控制键盘。 红外接口电路:红外接收管的数据端与单片机的P3.2相连,通过中断实现单片机对红外的控制,进而实现非接触式停止闹铃功能。4) 键盘
2、功能说明: 本系统共用到6只按键,分别用来设置时间、设置闹铃、调整小时、调整分钟、开闹铃、关闹铃。 实时时间显示在LCD的第二行,闹钟时间与温度显示在第一行。 设置时间与设置闹铃处于同一优先级,不可同时有效。当设置完闹铃时,闹钟时间在第一行消隐掉。 调整小时与调整分钟必须在设置时间或设置闹铃按下时才有效。 开闹铃与关闹铃相对独立,不受其他按键的影响。 调整小时的按键作为切换显示温度的开关,当他作为第二功能用时,设置时间与设置闹铃的功能无效。三、 理论分析与计算1、时间的控制与计算。用定时器实现单片机的时间走动,定时器0定时50ms,经20次中断就过了1s,每过1s在中断服务程序中,通过软件编程
3、让秒、分、时显示在LCD上。单片机不停的扫描键盘,当有按键按下时,就进入相应的服务程序。如:当设置时间键按下时,时间停止,进入调整时间状态,通过调时与调分两个按键可调整时间,再按下设置时间键就推出设置,时间继续。2、温度的采集与计算。通过温度传感器采集实时温度,由于室温大于0度小于100度,本系统对温度不要求特别精确,故保留两位整数,一位小数显示在LCD上。通过调时按键的第二功能,可切换键盘将温度显示在LCD的第一行。3、蜂鸣器报警的设计。当闹铃到点时,蜂鸣器就发出“滴滴”的声音以报时。软件实现方法就是:当闹钟的时间与实施时间对应相等就代表闹铃到点。若不打开闹铃,蜂鸣器就不发声;在蜂鸣器发声的
4、过程中,若关掉闹铃,蜂鸣器就停止发声。4、红外止闹的设计。本系统只利用红外接收管,通过单片机的外部中断0作为红外的控制入口。在蜂鸣器发声过程中,按下遥控器的任意一个键,单片机就可控制蜂鸣器使其停止发声。在外部中断0的服务程序中,关闭蜂鸣器。四、 测试方法与调试本系统为多功能数字钟,一切功能的测试均通过6只按键来完成。可分别设置时间、设置闹铃、调整小时、调整分钟、开闹铃、关闹铃。本程序较大,采用C51语言编写。先调试各功能模块,在调试整个系统。具体电路见附件。程序见附页。程序:/DS18B20.h#include#define uint unsigned int#define uchar uns
5、igned 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;yy-);void delay1(uint i)/延时14us,12MHzwhile(-i);bit rst_ds18b20()/dq复位;没有检测从机 dq=1 ; _nop_(); /稍做延时 dq=0 ; /单片机将dq拉低 delay1(60); /延时480us-960us,主要是此延时要长最好800us以上 /拉高总线 dela
6、y1(5); /延时16-60us,等待从机发存在信号 presence=dq; /从机发送60-240us的低脉冲作为存在脉冲 delay(30); /至少延时(480us-720us),等待dq拉为高电平(自动的) return presence;uchar rd_byte() /读时,先拉低数据线至少1us,再释放。每两次读至少有1us的间隔 uchar i,dat; dq=1; for(i=0;i=1; /该句4us delay1(1);/主机马上释放总线,并延时至少14us,等待数据送上 if(dq) dat|=0x80; delay1(5);/保持数据至少(60us-15us),等
7、待上拉电阻将dq拉高 return dat;void wr_byte(uchar dat)/数据线由高拉低产生写信号 uchar i; dq=0;/dq由高拉低后,在15内期间采样dq状态 dq=dat&0x01; delay1(8);/写数据要维持60us-120us /然后拉高dq datvoid rd_temperature() /读取温度 rst_ds18b20(); wr_byte(0xCC) ; / 只有一个从机,跳过读序列号的操作 wr_byte(0x44) ; /启动温度转换 rst_ds18b20(); / 复位 /跳过读序号列号的操作 wr_byte(0xBE) ; /读取
8、温度寄存器 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表示温度为正 t1=msb4); t2=(lsb&0x0f)*0.0625*10; disbuf0=T disbuf1=: disbuf2=t1%100/10+0 disbuf3=t1%10+ disbuf4=. disbuf5=t2+ disbuf6=0
9、if(disbuf2=0x30) disbuf2= if(disbuf3=0x30) disbuf3=/main.c/开闹铃时显示闹铃符号,关时不显示/设置闹铃按1下进入 设置状态;按2下,退出设置状态;/设置时间按1下进入设置状态,并停止计时;按2下,推出设置状态,并开始计时/当设置闹铃、时间没按下时,调时、调分不起作用/不可以在设置时间的过程中设置闹铃,不可以在设置闹铃的过程中设置时间/设置闹铃后,闹铃时间在第一行显示/切换温度用到了调时键,为避免冲突,看温度与设置时间、设置闹铃不可同时有效/每当设置闹铃时,闹铃都初始化为00:00,设置完后,闹铃消失/lcd1602有64B的CGRAM,
10、可用来写入自定义字符,5*8点阵的可写8个(每个占8字节),5*11点阵的可写4个(每个占16字节)/写命令wcmd(0x40),显示所写入字符,送入数据0x00-0x07(对应显示8个字符)。reg52.hds18b20.h#define uint unsigned int void 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数据命令选择端s
11、bit lcden=P26;/LCD使能端sbit setsj=P20;/设置时间sbit setnl=P21;/设置闹铃sbit ts=P22;/调整小时sbit tf=P23;/调整分钟sbit knl=P24;/开闹铃sbit gnl=P25;/关闹铃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 ho
12、ur,minute,second,tcnt,nlhour,nlminute,nldk;uchar code table= 23:59:50uchar code bmp=0x0e,0x11,0x1f,0x00,0x0a,0x00,0x00,0x00,0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00;/闹铃符号与温度符号;void wcmd(uchar cmd) lcden=0; lcdrs=0; PORT=cmd; delay(5); lcden=1;void wdata(uchar dat) lcdrs=1; PORT=dat;void goxy(uchar x,
13、uchar y) if(x=1) wcmd(0x80+y); wcmd(0x80+0x40+y);void 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)
14、;/写CGRAM for (i=0;16;i+) wdata(bmpi); goxy(2,0); 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 tcnt+; if(tcnt=20) tcnt=0; inc_second(); disp_sfm(2,4,hour); disp_sfm(2,7,minute); disp_sfm(2,10,second); wdata();
15、 inc_minute_nop() minute+; if(minute=60) minute=0;void inc_second() second+; if(second=60) second=0; inc_minute();void inc_minute() inc_hour();void inc_hour() hour+; if(hour=24) hour=0;void inc_nlminute() nlminute+; if(nlminute=60) nlminute=0;void inc_nlhour() nlhour+; if(nlhour=24) nlhour=0;void di
16、sp_sfm(uchar x,uchar y,uchar dat) uchar shi,ge; shi=dat/10+ ge=dat%10+ wdata(shi); wdata(ge);void led_apm() if(hour12) lpm=1; lam=0; goxy(2,0);AM lam=1; lpm=0;Pvoid tzsjfun() if(nlflag=0)/若闹铃没按下,则可设置时间,否则无效 if(wdnum=0)/若切换温度也没按下,则可设置时间 if(setsj=0) delay(2); while(!setsj); if(setsj=1) /表示按下了设置时间,且已经消
17、抖 sj+; if(sj=1) TR0=0;/按下1次停止计时 if(sj=2) /第2次按下表示设置完毕 TR0=1; sj=0; if(sj)/要调整时间 if(ts=0) delay(2); while(!ts); if(ts=1) tzflag=1; if(tf=0)tf); if(tf=1) tzflag=2; if(tzflag) if(tzflag=1) tzflag=0; inc_hour(); disp_sfm(2,4,hour); if(tzflag=2) inc_minute_nop(); disp_sfm(2,7,minute); void nl0() nlhour=0
18、; nlminute=0; disp_sfm(1,4,nlhour); wdata( disp_sfm(1,7,nlminute);void nldisappear() goxy(1,0);9; delay(2);void tznlfun() if(sj=0)/若设置时间没按下,则可设置闹铃,否则无效 if(wdnum=0) if(setnl=0)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( else goxy(1,0); delay(5); if(ts=1) tznl=1; tznl=2; if(tznl) if(tznl=1) tznl=0; inc_nlhour(); disp_sfm(1,4,nlhour); if(tznl=2) inc_nlminute(); disp_sfm(1,7,nlminute);void kgnlfun() if(knl=0) while(!knl); delay(5); i
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1