《课程设计(论文)基于单片机的电子钟设计 .doc》由会员分享,可在线阅读,更多相关《课程设计(论文)基于单片机的电子钟设计 .doc(39页珍藏版)》请在三一办公上搜索。
1、摘要回看历史长河,从以前的沙漏到现在的电子钟,人们计时的工具伴随着社会的进步和科技的日新月异而更新着,我们不得不感叹人类的智慧!的确,电子钟是一种利用数字电路来实现时间的显示,与传统的机械钟相比,它具有走时准确、显示直观、无机械传动等优点,因而得到广泛使用。随着人们生活环境的不断改善和美化,我们可以在很多场合看到电子钟。数字钟已成为人们日常生活中必不可少的必需品,广泛用于个人家庭以及车站、码头、剧场、办公室等公共场所,给人们的生活、学习、工作、娱乐带来极大的方便。由于数字集成电路技术的发展和采用了先进的石英技术,使数字钟具有走时准确、性能稳定、携带方便等优点,它还用于计时、自动报时及自动控制等
2、各个领域。电子钟的唯一缺点是具有辐射,不过电子产品都是有辐射的,电子钟的辐射很小不会造成什么危害。别人设计的电子有可能不符合自己的风格,所以如果能自己亲自动手设计一个符合自己的风格的电子钟将会很有意义。这次的课程设计给了我一个机会。本设计是基于单片机进行的电子万年历设计,可以显示年月日时分秒及周信息,具有可调整日期和时间功能。在设计的同时对单片机的理论基础和外围扩展知识进行了比较全面准备。在硬件与软件设计时,没有良好的基础知识和实践经验会受到很大限制,每项功能实现时需要那种硬件,程序该如何编写,算法如何实现等,没有一定的基础就不可能很好的实现。具体实现功能:(1)可以准确显示年、月、日、时、分
3、、秒、星期、温度;(2)可以对时间进行设置;(3)可以设置4个闹钟。目 录方案选择31.1 单片机芯片的选择方案31.2 显示模块选择方案31.3 始终芯片的选择方案41.4 电路设计最终方案决定系统的硬件设计与实现2.1 电路设计框图2.2 系统硬件概述2.3 主要单元电路的设计2.3.1 单片机主控制模块52.3.2 时钟电路模块72.3.3 显示模块92.3.4 按键模块102.3.5 温度传感模块10系统的软件设计3.1 程序流程框图123.2 程序设计13Proteus仿真134.1 Keil C51使用介绍134.2 Proteus 使用介绍144.3 Proteus 仿真结果15
4、4.4 仿真过程出现的问题17课程设计总结与体会176参考文献187附录191 方案选择 1.1 单片机芯片的选择方案方案一: 采用AT89C51芯片作为硬件核心,采用Flash ROM,内部具有4KB ROM 存储空间,能于3V的超低压工作,而且与MCS-51系列单片机完全兼容,但是运用于电路设计中时由于不具备ISP在线编程技术, 当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,对芯片的多次拔插会对芯片造成一定的损坏。方案二: 采用AT89C52,AT89C52是一个低电压,高性能CMOS 8位单片机,片内含8k bytes的可反复擦写的Flash只读程序存储器和2
5、56 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,功能强大的AT89C52单片机可为我们提供许多较复杂系统控制应用场合。硬件实体电路一般会采用功能和优点更为突出的AT89C52单片机。1.2 显示模块选择方案方案一: 采用LED数码管动态扫描,LED数码管价格适中,但要显示比较多的数字时数码管的使用必然会增多,连线方面会很麻烦,编程上也会相应的复杂。考虑到效率的因素不采用数码管显示。方案二: 采用点阵式数码管显示,点阵式数码管是由八行八列的发光二极管组成,在很多场合可
6、以看到这种显示方式,但是在电子钟显示时间这一块不适合,一来点阵显示文字上有优势,但显示数字存在一定的劣势,一来不够直观,二来显得有点浪费。综合考虑各种因素排除这种方案。方案三: 采用LCD液晶显示屏,液晶显示屏的显示功能强大,可显示大量文字,图形,显示多样,清晰可见。与数码管显示相比,在直观程度和亮度清晰度上都存在很多优势,并且现在液晶显示已经成为主流,被人们普遍接受,符合大众的口味。虽然没学过液晶显示这一块,但查看相关资料应该可以把硬件电路图接好。1.3 时钟芯片的选择方案方案一: 直接采用单片机定时计数器提供秒信号,使用程序实现年、月、日、星期、时、分、秒计数。采用此种方案虽然减少芯片的使
7、用,节约成本,但是,实现的时间误差较大,所以不采用此方案。方案二: 采用DS1302时钟芯片实现时钟,DS1302芯片是一种高性能的时钟芯片, 实时时钟可提供秒、分、时、日、星期、月和年,一个月小于31天时可以自动调整,且具有闰年补偿功能。计时更加准确,使用起来更加方便,与成本相比起来利大于弊,物超所值。1.4 电路设计最终方案决定综上各方案所述,对此次作品的方案选定: 采用AT89C52作为主控制系统; DS1302提供时钟;LCD液晶显示屏作为显示。2 系统的硬件设计与实现2.1 电路设计框图 电路设计框图如图1所示:温度传感模块AT89C52主控制模 块LCD液晶显示屏显示模块按键模块
8、DS1302时钟模块闹铃模块图1系统原理图2.2 系统硬件概述本电路是由AT89C52单片机为控制核心,驱动DS1302时钟提供年、月、日、时、分、秒、星期,时间精确;外接温度传感器DS18B20,可以感应外界温度,经过AT89C52单片机控制转换后以数字形式显示出来,这一设计显得很人性化;显示模块采用LMO16L显示,直观、清晰、非常人性化;按键模块包含时间设置按钮和闹钟设置按钮,按键的操作符合人们的思维习惯,很容易进行设置;闹铃使用sounder,声音能起到提醒时间的效果,而且听起来清脆悦耳。总的来说,硬件考虑的比较周全,尽量做到最好。2.3 主要单元电路的设计及器件介绍2.3.1 单片机
9、主控制模块一、模块介绍单片机控制模块的核心是AT89C52,此外还包括它的供电电路、复位电路、时钟电路,它的模块图如图一所示 图一 单片机控制模块 二 AT89C52的介绍 AT89C52有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2个读写口线,AT89C52可以按照常规方法进行编程,但不可以在线编程(S系列的才支持在线编程)。其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发成本。 2.3.2时钟电路模块 一、模块介绍时钟电路模块的核心是DS1302,DS1302
10、由Vcc1或Vcc2两者中的较大者供电。当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。当Vcc2小于Vcc1时,DS1302由Vcc1供电。X1和X2是振荡源,外接32.KHz晶振。RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据的传送手段。当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。如果在传送过程中RSTS置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。上电动行时,在Vcc大于等于2.5V之前,R
11、ST必须保持低电平。中有在SCLK 为低电平时,才能将RST置为高电平,I/O为串行数据输入端(双向)。SCLK始终是输入端。 图2 DS1302的时钟电路 图3 DS1302的管脚图二、DS1302的介绍 (1) 时钟芯片DS1302的工作原理: DS1302在每次进行读、写程序前都必须初始化,先把SCLK端置 “0”,接着把RST端置“1”,最后才给予SCLK脉冲;读/写时序如下图4所示。DS1302的控制字的位7必须置1,若为0则不能把对DS1302进行读写数据。对于位6,若对程序进行读/写时RAM=1,对时间进行读/写时,CK=0,位1至位5指操作单元的地址。位0是读/写操作位,进行读
12、操作时,该位为1;该位为0则表示进行的是写操作。控制字节总是从最低位开始输入/输出的。表.2为DS1302的日历、时间寄存器内容:“CH”是时钟暂停标志位,当该位为1时,时钟振荡器停止,DS1302处于低功耗状态;当该位为0时,时钟开始运行。“WP”是写保护位,在任何的对时钟和RAM的写操作之前,WP必须为0。当“WP”为1时,写保护位防止对任一寄存器的写操作。(2) DS1302的控制字节:DS1302控制字节的高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)
13、如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出(3) 数据输入输出(I/O)在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。(4) DS1302的寄存器DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式。此外,DS1302 还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。 DS
14、1302与RAM相关的寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0HFDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。 2.3.3 显示模块 一、模块介绍图3为LCD显示模块,液晶显示的连线需熟悉它的工作原理。图4 显示模块二、LMO16L的介绍 1602LCD分为带背光和不带背光两种,基控制器大部分为HD44780,带背光的比不带背光的厚,是否带背光在应用中并无差别。1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各
15、引脚接口说明如表所示:编号符号引脚说明编号符号引脚说明1VSS电源地9D2数据2VDD电源正极10D3数据3VL液晶显示偏压11D4数据4RS数据/命令选择12D5数据5R/W读/写选择13D6数据6E使能信号14D7数据7D0数据15BLA背光源正极8D1数据16BLK背光源负极2.3.4按键模块 按键模块由7个按键组成,每个按键都有自己的功能。图5 按键模块2.3.5 温度传感模块一、模块介绍该模块的核心是温度传感器DS18B20 图6 温度传感器二、DS18B20的介绍1. DS18B20的特性 9 (1)适应电压范围更宽,电压范围:3.05.5V,寄生电源方式下可由数据线供。(2)独特
16、的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。(3)DS18B20支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组网多点测温。(4)DS18B20在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内。(5)温范围55125,在-10+85时精度为0.5。(6)可编程的分辨率为912位,对应的可分辨温度分别为0.5、0.25、0.125和0.0625,可实现高精度测温。(7)在9位分辨率时最多在93.75ms内把温度转换为数字,12位分辨率时最多在750ms内把温度值转换为数字,速度更快。
17、(8)测量结果直接输出数字温度信号,以“一线总线”串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力。(9)负压特性:电源极性接反时,芯片不会因发热而烧毁,但不能正常工作。2.DS18B20内部结构及DS18B20的管脚排列64位光刻ROM是出厂前被光刻好的,它可以看作是该DS18B20的地址序列号。不同的器件地址序列号不同。DS18B20内部结构主要由四部分组成:64位光刻ROM,温度传感器,非挥发的温度报警触发器TH和TL,高速暂存器。 DS18B20的引脚定义:(1)DQ为数字信号输入/输出端(2)GND为电源地(3)VDD为外接供电电源输入端(在寄生电源接线方式时接地)
18、3系统的软件设计开始初始化 读日期、时间 写日期、时间时间、温度显示子程序时间、闹钟设置子程序日期修改子程序显示结果返回 开关控制子程序3.1程序流程框图3.2 程序设计(见附录一)4 Proteus仿真4.1 Keil C51的使用介绍由于程序的编写语言是C语言,所以只能在Keil C51软件上编写与编译,因此我们必须熟悉Keil C51.Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具,全windo
19、ws界面。Keil C51的使用步骤如下:(1) 驱动软件(2) 新建工程(3) 选择CPU(4) 添加源程序文件(5) 编写程序(6) 设置开发环境参数(7) 编译源程序,烧录文件编译成功后会生成HEX文件,该文件可以被载入并最终烧录到具体芯片中。本次设计用的是C语言,用C51编程有很多优点:(1) C51可管理内部寄存器和存储器,编程时,无须考虑不同存储器的寻址和数据类型等细节问题;(2) 程序由若干函数组成,具有良好的模块化结构;(3) 有丰富的子程序库可直接引用,从而大大减少用户编程的工作量。4.2 Proteus 的使用介绍 Proteus ISIS是英国Labcenter公司开发的
20、电路分析与实物仿真软件。它运行于Windows操作系统上,可以仿真、分析(SPICE)各种模拟器件和集成电路。该软件的特点是:(1)全部满足我们提出的单片机软件仿真系统的标准,并在同类产品中具有明显的优势。(2)具有模拟电路仿真、数字电路仿真、单片机及其外围电路组成的系统的仿真、RS232动态仿真、I2 C调试器、SPI调试器、键盘和LCD系统仿真的功能;有各种虚拟仪器,如示波器、逻辑分析仪、信号发生器等。(3)目前支持的单片机类型有:ARM7系列、68000系列、8051系列、AVR系列、PIC12系列、PIC16系列、PIC18系列、Z80系列、HC11系列以及各种外 围芯片。(4)支持大
21、量的存储器和外围芯片。总之,该软件是一款集单片机和SPICE分析于一身的仿真软件,功能极其强大 ,可仿真ARM、51、AVR、PIC。Proteus启动画面:如图7所示图7 Proteus启动画面4.3Proteus仿真结果图8为上电后后LED显示: 图8图9为调节秒钟:图9图10为调节分钟: 图10图11为调整时钟:图12调节日期:图12图13为调节闹钟:图13图14为调节星期: 图14 4.4仿真过程出现的问题 仿真时液晶显示出现问题,一直在闪没有固定显示时间,而simulation log中一直在提示controller received command whilst busy。后来从程
22、序入手,修改了闹钟设置的子程序,经过反复试验解决了问题。我觉得仿真出现问题并不可怕,关键是要敢于去调试,很少有编程不会出一点差错的,在差错的过程中很能锻炼人,考验的不仅是知识还有意志。5课程设计总结与体会本次课程设计的时间不长,只有短短的几天,但这几天却过得很不寻常,也收获了许多。从选题那刻开始,我就投入了课程设计之中,反复思考后从最初的电压表到最后选择电子钟,因为我喜欢看到实际性的东西,想想看到一个能准确显示时间的时钟,而这个时钟又是自己设计的,那该多高兴多么有意义的一件事。于是我搜索了不少书籍和网站,积累了基本的设计时钟的方法和思路,还有很多器件的使用资料,我才知道DS1302的功能是很强
23、大的。但后来发现程序的编写才是一个大难关,由于还没用过C语言编写程序,根本不懂得怎么下手,一筹莫展,我都快有点想放弃了!后来我给自己一个台阶下,自己的水平有限为什么不参考别人的程序呢?在别人的基础上增加自己的东西就好。我便从网上找了个很好的程序,慢慢的去读去理解,由于程序很长很复杂,理解起来也很费劲。天气的寒冷,更是我觉得难熬,但最终坚持了下来,再它的基础上增加了闹钟功能,当看到闹钟能在设定时间响起闹铃时我甭提多高兴了。课程设计考验我们掌握的知识,包括单片机的基本知识、C语言或者汇编语言的程序编写、Keil C51的使用和Proteus的使用。另一方面也考验我们的动手能力和意志。课设过程中由于
24、各种因素的影响我们不可能一帆风顺,我们需要一颗坚定的心再加上细心,这样才能克服种种困难,完成老师布置的任务。在设计过程中,我遇到问题首先想到的是从书本或者网上解决问题,一般的问题也总能解决。在遇到很难解决的问题时又会想到老师如果在身边多好啊,但是我知道老师也很忙,不能照顾到每个同学。后来我有难题就会去请教张辉其同学,在此感谢他。同时感谢陈老师平时的悉心教导,感谢学校和学院给我们这么一次课设的机会锻炼我们。6参考文献1侯玉宝编基于Proteus的51系列单片机设计与仿真电子工业出版社2秦实宏、徐春辉主编MCS-51单片机原理及应用华中科技大学出版社3陈正振 编 电子电路设计与制作 广西交通职业技
25、术学院信息工程系 20074Proteus 仿真论坛 附录一#include #include intrins.h#include 24c02.h#define uchar unsigned char#define uint unsigned intuchar code tabe1=20 - -; /液晶一直显示的字符uchar code tabe2= : : ;uchar code tabe3=Alarm set:;uchar miao,fen,shi,nian,yue,ri,week,wendu_shi,wendu_ge,wendu_shu,variate,alarm_shi,alarm_
26、fen,alarm_miao;uchar flag=1,count=0,flag_up=0,flag_down=0,flag_alarm=0,alarm_on,alarm_count=0,done=0;uint wendu;sbit DQ = P10; /ds18b20温度传送数据IO口sbit ds1302_rst = P11; /1302复位sbit ds1302_io = P12; /数据输入输出sbit ds1302_sclk= P13; /串行时钟sbit alarm_out = P36;sbit lcd1602_rs = P20; / 1602命令、数据选择sbit lcd1602
27、_rw = P21; / 1602写sbit lcd1602_e = P22; / 1602使能sbit set = P24;/选择按键sbit up = P25;/加sbit down= P26;/减sbit nao1= P27;sbit nao2=P30;sbit nao3=P31;sbit nao4=P32;sbit ACC0=ACC0;sbit ACC7=ACC7;/延时void delay(uchar x)uchar y,z;for(z=x;z0;z-)for(y=110;y0;y-);void delay1()_nop_();_nop_();ds18b20_delay(uchar
28、xus) /延时xuswhile(xus-);/*ds18b20*/void ds18b20_init() /DS18B20初始化uchar x=0; DQ=1;ds18b20_delay(8);DQ=0;ds18b20_delay(80);DQ=1;ds18b20_delay(14);x=DQ;ds18b20_delay(20);void write_onechar(uchar dat) /写一字节uchar i;for(i=8;i0;i-)DQ=0;if(dat&0x01=0x01)DQ=1;elseDQ=0;ds18b20_delay(5);DQ=1;ds18b20_delay(1);d
29、at=1;uchar read_onechar()/读一字节uchar value=0,i;for(i=8;i0;i-)value=1;DQ=0;ds18b20_delay(1);DQ=1;if(DQ=1)value|=0x80;elsevalue&=0x7f;ds18b20_delay(4);return value;uint read_wendu() /DS18B20读温度 uchar a=0,b=0;uint wen=0x0000;ds18b20_init();/初始化write_onechar(0xcc);/ 跳过读序号列号的操作write_onechar(0x44);/ 启动温度转换
30、ds18b20_delay(150);ds18b20_init();/初始化write_onechar(0xcc);/跳过读序号列号的操作write_onechar(0xbe);/读取温度寄存器等(共可读9个寄存器) 前两个就是温度ds18b20_delay(150);b=read_onechar();/读取温度值低位a=read_onechar();/读取温度值高位wen=a;wen=(wen0;k-) ds1302_io=ACC0;ds1302_sclk=0; /拉低sclkds1302_sclk=1; /拉高sclkACC=1;uchar read_byte() uchar k; for
31、(k=8;k0;k-) ACC7=ds1302_io;ds1302_sclk=1; /拉高sclkds1302_sclk=0; /拉低sclkACC=1;return ACC; void ds1302_write(uchar add,uchar date)ds1302_rst=0;ds1302_sclk=0; /在rst没拉高之前先把sclk置0ds1302_rst=1;write_byte(add);write_byte(date);ds1302_sclk=1; ds1302_rst=0; uchar ds1302_read(uchar add)uchar temp;ds1302_rst=0
32、;ds1302_sclk=0; /在rst没拉高之前先把sclk置0ds1302_rst=1;write_byte(add);temp=read_byte();ds1302_sclk=1; ds1302_rst=0;return temp;void ds1302_init() /ds1302初始化 ds1302_rst=0;ds1302_sclk=1; ds1302_write(0x8e,0x00);/写允许ds1302_write(0x80,0x58);ds1302_write(0x82,0x56);ds1302_write(0x84,0x23);ds1302_write(0x86,0x21
33、);ds1302_write(0x88,0x12);ds1302_write(0x8a,0x02);ds1302_write(0x8c,0x10);ds1302_write(0x8e,0x80);/写保护 /*lcd1602*/void lcd_write_com(uchar com) /命令字写入lcd单元中 lcd1602_rw=0; delay1(); lcd1602_rs=0; / RW=1,RS=0,写LCD命令字 delay1(); P0=com; /将com中的命令字写入LCD数据口 delay1(); lcd1602_e=1; /E端时序 delay1(); lcd1602_e
34、=0; delay1(); lcd1602_rw=1; delay(5);void lcd_write_date(uchar date) /数据写入lcd单元中 lcd1602_rw=0; delay1(); lcd1602_rs=1; / RW=0,RS=1,写LCD命令字 delay1(); lcd1602_e=1; / E端时序 delay1(); P0=date; / 将dat中的显示数据写入LCD数据口 delay1(); lcd1602_e=0; delay1(); lcd1602_rw=1; delay(5);void lcd1602_init() /LCD初始化函数uchar
35、lcdnum;P3=0xdf;lcd_write_com(0x38);lcd_write_com(0x0c);lcd_write_com(0x06);lcd_write_com(0x01);lcd_write_com(0x80);for(lcdnum=0;lcdnum8;lcdnum+) /写第一行数据 lcd_write_date(tabe1lcdnum);delay(2);lcd_write_com(0x80+0x40); /写入第二行数据 for(lcdnum=0;lcdnum4;decimal=decimal*10+(bcd&=0x0f);return decimal; void we
36、ndu_decimal(uint dat) /温度转换后送显示float temp;temp=dat*0.625; /dat*0.0625*10wendu_shi=temp/100; /取十位 temp除不用定义类型wendu_ge =(uint)temp)%100/10; /取个位 temp求模要定义类型,为16位,故定义uintwendu_shu=(uint)temp)%100%10; /取小数lcd_write_com(0x80+0x40+10); /送显示lcd_write_date(0x30+wendu_shi);lcd_write_date(0x30+wendu_ge);lcd_write_date(0x2e); lcd_write_date(0x30+wendu_shu);lcd_write_date(0xdf); /温度符号lcd_write_date(0x43);void write_week(uchar we) /星期送显示lcd_write_com(0x80+0x0d);switch(we)case 1: lcd_write_date(M);lcd_write_date(0); lcd_write_date(N); break;case 2: lcd_write_date(T);lcd_write_date(U); lcd_write_date(