基于单片机数字时钟系统设计.doc_第1页
基于单片机数字时钟系统设计.doc_第2页
基于单片机数字时钟系统设计.doc_第3页
基于单片机数字时钟系统设计.doc_第4页
基于单片机数字时钟系统设计.doc_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

数字时钟系统设计软件部分作 者:罗旭东学 号:3082110109学院(系):电子与电气工程学院专 业:电气工程及其自动化题 目:基于单片机数字时钟系统设计指导者: 鲁庆 2011 年 11 月摘 要随着时代的进步和发展,单片机技术已经普及到生活、工作、科研等各个领域,已经成为一种比较成熟的技术。本文将介绍一种基于单片机控制的数字温度计和数字钟,本数字温度计属于多功能温度计,可以任意设置温度的上下限报警功能,当温度不在设定范围内时,可以报警;本数字钟可以同步显示时间日历,日期和时间都可通过按键校整。本系统采用的DS1302可为掉电保护电源提供可编程的充电功能,并且可以关闭充电功能。本系统显示部分采用LCD液晶显示屏显示,可通过按键切换工作界面,工作方便,外形美观。随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它给人带来的方便是不可否定的,其中数字温度计和数字钟就是一个典型的例子,但人们对它的要求越来越高,要为现代人工作、科研、生活提供更好的更方便的设施就需要从单片机技术入手,一切向着数字化、智能化控制的方向发展。本文所介绍的数字温度计与传统的温度计相比,具有读数方便,测温范围广,测温准确度高,其输出温度采用数字显示,主要适用于对测温要求比较准确的场所或科研实验室;本文所介绍的数字钟采用了低功耗实时时钟电路DS1302,它可以对年、月、日、周、时、分、秒进行计时,且具有闰年补偿等多种功能。同时可为掉电保护电源提供可编程的充电功能,并且可以关闭充电功能。本系统选用低功耗、高性能CMOS 8位微控制器AT89S52作为控制核心,采用温度传感器DS18B20准确测量温度,采用液晶显示屏LCD1604显示实时温度和同步的时间日历。经过反复测试,本系统能准确完成各项功能。关键词:单片机AT89S52;时间同步;DS18B20;DS1302 1、 方案论证1.1系统总体设计方案论证采用温度传感器DS18B20测量温度,采用LCD液晶显示屏显示实时温度和同步的时间日历。本系统可考虑选用一只温度传感器DS18B20,DS18B20不仅可以很容易直接读取被测温度值进行显示,而且温度传感器DS18B20具有独特的一线接口,只需要一条口线就可多点通信,无需外部元件,简化了分布式温度传感应用。本系统采用液晶显示屏LCD1604显示实时温度和同步的时间日历,电路简单,功耗低,显示信息量大,显示质量高,显示界面美观、友好,可以很好的满足设计要求。1.2系统总体设计框图数字温度计和数字钟电路的总体设计方框图如图1所示。主 控 制 器LCD显 示温 度 传 感 器复 位时钟振荡按键 图1 总体设计方框图本系统控制器采用单片机AT89S52,温度传感器采用DS18B20,采用DS1302实现掉电充电功能,用液晶显示屏LCD1604显示实时温度和同步的时间日历。1.2.1 主控制器单片机AT89S52具有低电压供电和体积小等特点,四个端口只需要两个口就能满足电路系统的设计需要,很适合便携手持式产品的设计使用,系统可用二节电池供电。1.2.2 显示电路显示电路采用液晶显示屏LCD1604进行显示,单片机从P0口传输温度和时间数据驱动LCD1604进行显示。 1.2.3温度传感器温度传感器DS18B20是一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,能直接读出被测温度,并且可根据实际要求通过简单的编程实现912位的数字值读数方式。DS18B20具有独特的单线接口,仅需一个端口引脚进行通信,并且多个DS18B20可并联在惟一的三线上,实现多点组网功能;用户还可根据需要定义报警设置,十分方便。1.2.3.1 DS18B20内部结构DS18B20采用3脚PR35封装或8脚SOIC封装,其内部结构框图如图2所示。 C64位ROM和单线接口高速缓存存储器控制逻辑辑辑温度传感器高温触发器TH低温触发器TL配置寄存器8位CRC发生器VddI/O图2 DS18B20内部结构1.2.3.2 DS18B20测温原理如图4所示,图中低温度系数晶振的振荡频率受温度的影响很小,用于产生固定频率的脉冲信号送给减法计数器1,高温度系数晶振随温度变化其振荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入。图中还隐藏着计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲进行计数,进而完成温度测量。计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将55所对应的一个基数分别置入减法计数器1和温度寄存器中,计数器1和温度寄存器被预置在55所对应的一个基数值。 图4 DS18B20测温原理图减法计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时,温度寄存器的值将加1,减法计数器1的预置将重新被装入,减法计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数。如此循环直到减法计数器2计数到0时,停止温度寄存器的累加,此时温度寄存器中的数值就是所测温度值。图4中的斜率累加器的输出用于修正减法计数器的预置值,只要计数器门仍未关闭就重复上述过程,直到温度寄存器值大致被测温度值。另外,由于DS18B20单线通信功能是分时完成的,它有严格的时隙概念,因此读写时序很重要。系统对DS18B20的各种操作按协议进行。操作协议为:初使化DS18B20(发复位脉冲)发ROM功能命令发存储器操作命令处理数据。2.系统整体硬件电路系统整体硬件电路包括:传感器数据采集电路,温度和时间显示电路,上下限报警调整电路,单片机主板电路等。单片机主板电路中有三个独立式按键可以调整温度计的上下限报警设置和数字钟时间校准,蜂鸣器可以在被测温度超出上下限范围内时,发出报警鸣叫声音,同时液晶显示屏LCD1604也将显示报警提示信息,这时可以调整报警上下限,从而测出被测的温度值。单片机主板电路中的按健复位电路是上电复位加手动复位,使用比较方便,在程序跑飞时,可以手动复位,这样就不用在重起单片机电源,就可以实现复位。DS18B20可以采用两种方式供电,一种是采用电源供电方式,此时DS18B20的1脚接地,2脚作为信号线,3脚接电源。另一种是寄生电源供电方式,如图7 所示单片机端口接单线总线,为保证在有效的DS18B20时钟周期内提供足够的电流,可用一个MOSFET管完成对总线的上拉。当DS18B20处于写存储器操作和温度A/D转换操作时,总线上必须有强的上拉,上拉开启时间最大为10us。采用寄生电源供电方式时VDD端接地。由于单线制只有一根线,因此发送接口必须是三态的。图7 系统整体硬件电路3.系统软件设计系统程序主要包括主程序,读出温度子程序,温度转换命令子程序,计算温度子程序,显示数据刷新子程序等。3.1主程序主程序的主要功能是负责温度和时间日历的实时显示,读出并处理DS18B20的测量的当前温度值,温度测量每1s进行一次。这样可以在一秒之内测量一次被测温度,其程序流程见图9所示。初始化调用显示子程序1S到?初次上电读温度值并处理显示数据刷新、显示时间日历发温度转换开始命令NYNY图9 主程序流程图一开始是初始化,然后调用显示子程序,然后就到判断1s到不到?如果是YES,就继续到初次上电,否则跳刀初始位置,如果是NO,就读出温度值并处理显示数据刷新、显示时间日历。最后,到发温度转换开始命令,再循环到初始化位置,这是整个整体框图。3.2读出温度子程序读出温度子程序的主要功能是读出RAM中的9字节,在读出时需进行CRC校验,校验有错时不进行温度数据的改写。其程序流程图如上图图10所示。Y发DS18B20复位命令发跳过ROM命令读取温度命令读取操作,CRC校验9字节完?CRC校验正?确?移入温度暂存器结束NNY图10 读温度流程图这是读温度的框图,先是发DS18B20的复位命令,然后发出跳过ROM的命令,然后发出读取温度命令,然后读取操作,crc进行校验,YES,就进行9字节,NO,就返回继续读取操作,如果YES,就进行CRC校验,同样,YSE,就移入温度暂存器,结束,NO,就继续进行校验,直到正确的为止。3.3温度转换命令子程序温度转换命令子程序主要是发温度转换开始命令,当采用12位分辨率时转换时间约为750ms,在本程序设计中采用1s显示程序延时法等待转换的完成。温度转换命令子程序流程图如上图,图11所示。发DS18B20复位命令发跳过ROM命令发温度转换开始命令 结束图11 温度转换流程图发出DS18B20的复位命令,跳过ROM的命令,发出温度装换的开始命令,结束。3.4 计算温度子程序计算温度子程序将RAM中读取值进行BCD码的转换运算,并进行温度值正负的判定,其程序流程图如图12所示。 开始温度零下?温度值取补码置“”标志计算小数位温度BCD值 计算整数位温度BCD值 结束置“+”标志NY图12计算温度流程图开始然后判断是否是零度以下,如果是,就进行温度取码补码置“一”标志,否则置“+”标志。然后计算小数位温度BCD值,计算整数位温度BCD值,结束。3.5 显示数据刷新子程序显示数据刷新子程序主要是对显示缓冲器中的显示数据进行刷新操作,当最高显示位为0时将符号显示位移入下一位。程序流程图如图13。温度数据移入显示寄存器十位数0?百位数0?十位数显示符号百位数不显示百位数显示数据(不显示符号) 结束NNYY图13显示数据刷新流程温度数据首相植入显示寄存器,看是否是十位数0? 如果是,继续查看是否是百位数0?如果是,就十位数显示符号百位数不显示,如果不是百位数0就百位数显示数据,不显示符号,结束。3.6定时器T0中断服务程序 定时器T0用于时间计时。中断进入后,时钟计时累计中断达1秒时,对秒计数单元进行加1操作。在计数单元中采用十进制BCD码计数,满60进位,T0中断服务程序执行流程见下图:4.功能调试与总结1、用一只精度为0.1的水银温度计作对照标准,把它和温度传感器DS18B20一起放入同一杯冷水中,水银温度计读数为4.0,调节数字温度计电位器,使其显示值也为4.0,然后逐次向烧杯加热水改变水温,记下每次两只温度计的读数1(标准值)与2(测试值),其数据表格如表1所示。表1 温度数据列表1/4.010.216.322.731.843.051.857.465.670.678.02/4.010.516.122.631.342.651.757.265.671.078.1经对对照,两只温度计读数相差最大为0.5,平均相差仅有0.26。总体上讲,符合设计要求。2、通过按键key1键、key2键(增1键)和key3键(减1键)可任意设定温度的上下限报警功能,当所测温度超出设定的上下限温度范围,则液晶显示屏会产生报警提示。3.本系统上电后,会以前一次的时间为基础显示同步时间,将此时间与北京时间相比,误差小于1秒钟,数字钟计时准确。4.若按下key1键,年份开始闪动,表示可以通过key2键(增1键)和key3键(减1键)校整年份,若再按下key1键,则选择月份可以校整,日期、时分、秒、周均可通过key1键选定后经key2键(增1键)和key3键(减1键)进行校整。经反复测试,本系统很好的完成了各项功能,完全符合系统设计要求。5.总结与体会因为单片机的种类多,而型号杂,也是我们学习中的困难,所以就89C52系列的产品来说,就是一个典型的学习方法。对于类似汇编的单片机编程过程,也是一个十分有趣的过程。为了更好的说明,我以上介绍先从应用电路切入,同时介绍它们的使用方法,以便能快速掌握它们的应用。通过本次的课程设计,我学会了单片机的一般设计过程,通常都要进行系统扩展与配置,因此,要完成一个单片机的设计工作,必须依次做到下述工作:1、硬件电路的设计、组装与调试;2、应用软件的编写、调试;3、完整应用软件的调试、固化和脱机运行。而在进行硬件系统设计时我们应当尽量做到:1、尽可能的选择典型电路,并符合单片机的常规使用方法;2、在充分满足系统功能要求前提下,留余地以便于二次开发;3、硬件结构设计应与软件设计方案一并考虑;4、整个系统相关器件要力求性能的匹配;5、硬件上要有可靠性与抗干扰设计;6、充分考虑单片机的带载驱动能力。所以我用单片机编写了上面的程序,因为基础知识学的不怎么好,如有错误之处,还望老师理解,并加以批改。通过这次设计使我对单片机有了更深入的了解。培养了我的动手实践能力。经过2周紧张的自主实习后,对单片机的编程软件89C52单片机有了进一步的熟悉,学会了自己分析,修改程序,以完成不同功能程序的编程,这次实验做的是数字钟,最后基本完成老师要求的功能,时间显示和调整,日期显示和调整及闹铃等功能。由于大家做的功能都差不多,所以自己就多添加了时间秒设置及闹钟秒设置功能,虽然在实际生活中用的数字钟没必要做到这个功能,但毕竟自己有去想,有去做,并且能够得到实现,也是对自己的进步的一个肯定。实习过程中知道了不只是要求做到什么结果,更重要的是从中学到了什么,这才能达到锻炼自己的目的,以及和同学们一起讨论,共同分析,学会吸取他人好的观点改正自己的不足,以及同他人的合作精神。通过实习这个平台特别让我们工科的学生学会了如何将所学的知识与实践相结合在一起,使得我们在以后的学习、工作中才会学以致用,学懂所用。 参考文献1全国大学生电子设计竞赛组委会.全国大学生电子设计竞赛获奖作品选编.北京:北京理工大学出版社,20072 陈永真.全国大学生电子设计竞赛试题精解选.北京:电子工业出版社,20073 李朝青.单片机原理及接口技术.北京:北京航空航天大学出版社,19984 张琳娜,刘武发.传感检测技术及应用.北京:中国计量出版社,19995 李广弟.单片机基础.北京:北京航空航天大学出版社,19946 李建民.单片机在温度控制系统中的应用.江汉大学学报,1996附录主程序/*/*时钟日历显示温度控制器*/*2009/1/6*/*/#include #include #include #define LCM_RS P2_0 /1602定义引脚#define LCM_RW P2_1#define LCM_E P2_2#define LCM_Data P0#define Busy 0x80 /用于检测LCM状态字中的Busy标识#define uchar unsigned charuchar id,timecount,dipsmodid;bit lmcinit_or_not;bit flag,sflag; /flag是时钟冒号闪烁标志,sflag是温度负号显示标志void Disp_line1(void); /显示屏幕第一行 void Disp_line2(void); /显示屏幕第二行void Disp_line3(void); /显示屏幕第二行void Disp_line4(void); /显示屏幕第二行void id_case1_key();void Dispmod_id_case_key(void);/选择显示模式void Disp_mod0(void);/显示模式0void Disp_mod1(void);/显示模式1/* DS1302 时间显示定义部分*sbit T_CLK=P13;sbit T_IO =P14;sbit T_RST=P15;sbit P3_3=P33;/显示模式键sbit P3_4=P34;/减少键sbit P3_5=P35;/增加键sbit P3_6=P36;/选择键,P04和 P05同时按:初始化sbit P2_0=P20;sbit P2_1=P21;sbit P2_2=P22;sbit ACC0=ACC0;sbit ACC7=ACC7;sbit P1_0=P10;/继电器1sbit P1_1=P11;/继电器2void Set(uchar,uchar); /根据选择调整相应项目void RTInputByte(uchar); /* 输入 1Byte */uchar RTOutputByte(void); /* 输出 1Byte */void W1302(uchar, uchar);/ 向DS1302写入一个字节uchar R1302(uchar); / 从DS1302读出一个字节void Set1302(unsigned char * ); /设置时间 bit sec,min,hour,year,mon,day,weekk; /闪烁标志位/初始化后设置为:04年12月2日星期4 0点0分0秒unsigned char inittime7=0x00,0x00,0x00,0x02,0x12,0x04,0x04;/ 秒 分钟 小时 日 月 年 星期/-18B20温度显示定义-sbit DQ=P37; /DS18B20 接P3.7口typedef unsigned char byte;typedef unsigned int word;Read_Temperature(char,char);void mychar(void);byte ow_reset(void);byte read_byte(void);void write_byte(char val);void adjust_res(char res); /res 分别等于 0x1f, 0x3f, 0x5f 温度读数分辨率分别对应 0.5, 0.25, 0.125 /-温度控制部分-bit tl_flash_flag; /下限闪烁标志bit th_flash_flag; /上限闪烁标志bit tl_flag; /下限越限标志 bit th_flag; /上限越限标志 bit tl_sign,th_sign; /温度零下标志 0:零上,1:零下char tempid;void Disp_Temp(void); /显示上下限温度void Set_TH_Temp(void); /设置温度上限void Set_TL_Temp(void); /设置温度下限signed char tl=20,th=25; /温度预设值void Compare_Temp(signed char l,signed char h);/比较温度void Tl_Al(void); /下限越限报警void Th_Al(void); /上限越限报警3 LCD1604驱动/* LCD1604驱动 *void WriteDataLCM(unsigned char WDLCM);void WriteCommandLCM(unsigned char WCLCM,BuysC);unsigned char ReadStatusLCM(void);void LCMInit(void);void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);void Delay5Ms(void);void Delay400Ms(void);unsigned char code week=Week:;void main(void) Delay400Ms(); /启动等待,等LCM讲入工作状态 LCMInit(); /LCM初始化 Delay5Ms(); /延时片刻(可不要) mychar(); TMOD=0x01; TH0=(65535-50000)/256; TL0=(65535-50000)%256; EA=1; TR0=1; ET0=1; W1302(0x90,0xa5);/打开充电二极管 一个二极管串联一个2K电阻 W1302(0x8e,0x80);/写保护,禁止写操作 adjust_res(0x5f); /调整18B20的分辨率 0x1f:0.5; 0x3f:0.25; 0x5f:0.125 while(1) if (P3_3=0) dipsmodid+; lmcinit_or_not=1; if(dipsmodid2) dipsmodid=0; while(P3_3=0); switch(dipsmodid) case 0: Disp_mod0(); break; case 1: Disp_mod1(); break; /选择显示模式void Dispmod_id_case_key()if (P3_3=0) dipsmodid+; if(dipsmodid1) dipsmodid=0; /显示模式0void Disp_mod0(void)if(lmcinit_or_not=1) LCMInit(); lmcinit_or_not=0; if (P3_4|P3_5)=0) /初始化 Delay5Ms(); if (P3_4|P3_5)=0) Set1302(inittime); /mychar(); /显示自定义字符if (P3_6=0) / 设置和选择项目键 Delay5Ms(); if(P3_6=0)id+;if(id7) id=0; while(P3_6=0); switch(id) case 0: sec=0; Disp_line1(); Disp_line2(); break; case 1:/年 year=1; Disp_line1(); Disp_line2(); id_case1_key(); break; case 2:/月 year=0;mon=1; Disp_line1(); Disp_line2(); id_case1_key(); break; case 3:/日 mon=0;day=1; Disp_line1(); Disp_line2(); id_case1_key(); break; case 4:/星期 day=0;weekk=1; Disp_line1(); Disp_line2(); id_case1_key(); break; case 5:/小时 weekk=0;hour=1; Disp_line1(); Disp_line2(); id_case1_key(); break; case 6:/分钟 hour=0;min=1; Disp_line1(); Disp_line2(); id_case1_key(); break; case 7:/秒 min=0;sec=1; Disp_line1(); Disp_line2(); id_case1_key(); break; /显示模式1void Disp_mod1(void)if(lmcinit_or_not=1) LCMInit(); lmcinit_or_not=0; Read_Temperature(1,0);DisplayOneChar(0,1,T);DisplayOneChar(1,1,L);DisplayOneChar(2,1,:);DisplayOneChar(7,1,T);DisplayOneChar(8,1,H);DisplayOneChar(9,1,:);if(P3_6=0) if(P3_6=0) tempid+; if(tempid2) tempid=0; while(P3_6=0); switch(tempid) case 0: tl_flash_flag=0; th_flash_flag=0; Disp_Temp(); break; case 1: tl_flash_flag=1; th_flash_flag=0; Disp_Temp(); Set_TL_Temp(); break; case 2: tl_flash_flag=0; th_flash_flag=1; Disp_Temp(); Set_TH_Temp(); break; Compare_Temp(tl,th);Tl_Al();Th_Al();/显示上下限温度void Disp_Temp(void)unsigned char tl_gw,tl_sw,tl_bw;/下限温度的个位,十位,百位unsigned char th_gw,th_sw,th_bw;/上限温度的个位,十位,百位tl_sign=tl7;if(tl_sign) tl_bw=(tl-1)/100;/计算百位 tl_sw=(tl-1)-tl_bw*100)/10;/计算十位 tl_gw=(tl-1)-tl_bw*100-tl_sw*10;/计算个位 else tl_bw=(tl)/100; tl_sw=(tl-tl_bw*100)/10; tl_gw=tl-tl_bw*100-tl_sw*10; if(tl_flash_flag=1) if(flag=1) if(tl_sign) DisplayOneChar(3,1,0x2d); DisplayOneChar(4,1,tl_sw+0x30); DisplayOneChar(5,1,tl_gw+0x30); else DisplayOn

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论