首页 基于单片机的万年历设计课程设计

基于单片机的万年历设计课程设计

举报
开通vip

基于单片机的万年历设计课程设计物理与电子工程学院2011级本科课程设计 物理与电子工程学院2011级本科课程设计 基于单片机的万年历设计课程设计 摘 要 电子万年历是一种非常广泛的日常计时工具,它不仅能够对时间技术,还能够对日期、温度、湿度等进行显示,所以在现代社会受到广泛应用。 本设计是一个基于AT89C51单片机的多功能日历显示系统,本设计能显示公历年、月、日,以及时、分、秒、温度、星期等信息,而且还具有日期调整、时间校准以及温度采集等功能。系统所用的时钟日历芯片DS1302和数字式温度传感器DS18B20具有高性能、低功耗、接...

基于单片机的万年历设计课程设计
物理与电子工程学院2011级本科课程 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 物理与电子工程学院2011级本科课程设计 基于单片机的万年历设计课程设计 摘 要 电子万年历是一种非常广泛的日常计时工具,它不仅能够对时间技术,还能够对日期、温度、湿度等进行显示,所以在现代社会受到广泛应用。 本设计是一个基于AT89C51单片机的多功能日历显示系统,本设计能显示公历年、月、日,以及时、分、秒、温度、星期等信息,而且还具有日期调整、时间校准以及温度采集等功能。系统所用的时钟日历芯片DS1302和数字式温度传感器DS18B20具有高性能、低功耗、接口简单的特点,使本系统电路简化,编程方便,同时功能也很强。采用AT89C51单片机的万年历系统可以很好的改善传统采用模拟电路引起的计时不准确,不可靠,一致性差等问题。 本文设计是用单片机为主控制,通过电路仿真而实现的。在Proteus7软件绘制硬件电路原理图,用Keil软件进行编程与调试,最终生成hex文件,载入单片机,从而实现仿真效果。 本文设计经过最终调试,能够正确显示年、月、日、周、时、分、秒以及温度等所需信息,并能正常使用对日期与时间的调整与校正功能。系统使用1602LCD液晶屏显示信息,界面简洁、直观、易于操作。 关键词:万年历;单片机;AT89C51;DS1302;DS18B20 目 录 11 引言 11.1研究的目的和意义 11.2本系统主要研究的内容 22 系统方案论证 22.1控制部分的选择方案与论证 22.2显示部分的选择方案与论证 22.3时钟芯片的选择方案与论证 32.4温度传感器的选择方案与论证 32.5电路设计最终方案系统原理及总体结构图 43 系统设计 43.1 系统硬件仿真原理图 43.2 单片机89C51控制模块的设计 73.3 LCD液晶显示模块设计 93.4 DS1302时钟模块的设计 123.5 DS18B20温度采集模块的设计 154 系统调试 154.1硬件调试 154.2软件调试 155 结论 16参 考 文 献 17附 录 1 引言 人类的日常生活离不开时间,任何具有周期变化的自然现象都可用来测量时间。而现在人们日常生活中广泛使用的是机械表、电子表、电子中等。 随着科技的发展,电子技术和计算机应用领域不断扩大,特别是单片机的出现,是近代计算机技术发展史上的一个重要里程碑。基于单片机的万年历结合了时钟和日立的功能,将其二者融为一体,在现实时间的同时还能显示日期和年月,它主要通过单片机来读取时钟芯片的时间、日期,然后送给显示设备显示出来。 本系统的万年历除了显示年月日外还能准确显示温度它所处环境的温度。本设计采用的测温元件是美国DALLAS半导体公司生产的一种智能温度传感器DS18B21,测温范围为-55~125C,最高分辨率达到0.0625C。 1.1研究的目的和意义 随着电子技术的迅速发展,特别是大规模集成电路出现,给人类生活带来了根本性的变化,尤其是单片机技术的应用产品已经走进了千家万户。近年来,我国科技不断发展,我国经济发展的支柱产业——电子产业获得长足发展,各种电子产品琳琅满目,随处可见,随着电子产品的更新速度的加快,各种功能强大,款式新颖的电子产品不断问世。 万年历便是这一发展趋势中的代表,万年历则顺应了人们对时间方面的要求。它的出现给人们的生活带来的诸多方便,在时间极显宝贵的现代生活中,起作用更是不言而喻的。他在学校、车站、码头、剧院、医院、办公室等公共场所的应用非常广泛。但传统的万年历除了显示时间之外,功能较为单一,逐渐失去了市场。顺应技术发展和人们生产生活需求,各种功能的新式万年历不断涌现,且功能不断更新。 万年历作为电子类的小产品以其方便、实用等优势成为市场上的宠儿,同时也成为单片机设计培训中一个很实用的课题。因为这个课题有很好的开发性和可发挥性,因此对设计者的要求比较高,不仅考察了队单片机的掌握能力更加强调了对单片机扩展的应用。而且要求设计的万年历在操作上力求简洁,功能上尽量齐全,显示界面也要出色。所以万年历不论从实用角度还是培养能力角度都很有价值。 1.2本系统主要研究的内容 本系统的主要研究内容是: (1)选用电子万年历芯片时,应重点考虑功能实在、使用方便、单片存储、低功耗、抗断电的器件。 (2)根据选用的电子万年历芯片设计外围电路和单片机的接口电路。 (3)在硬件设计时,结构要尽量简单实用,易于实现,是系统电路尽量简单。 (4)根据硬件电路,编写控制AT89C51芯片的单片机程序。 (5)通过编程、编译、调试,把程序下载到单片机上运行,并实现本设计的功能。 2 系统方案论证 2.1控制部分的选择方案与论证 方案一:用可编程逻辑器件设计 可采用PLD器件,设计起来结构清晰,各个模块从硬件上设计起来相对简单,控制与显示的模块间连接也会比较方便。但是考虑到本设计的特点,EDA在能够扩展上比较受局限,占用的资源也多。从成本上讲,可编程逻辑器件价格比较高。 方案二:用单片机设计 用 单片机芯片作为控制部分,单片机有丰富的中断源,它的准确度相当高,并且C语言的灵活运用,给编程带来了方便。单片机I/O功能也比较强大,容易对其进行扩展,使设计更加完善,此外单片机的成本也比较低。 综上所述, 资源丰富,程序编写也灵活简单,可移植性强,性价比也高,所以选择 作为主控芯片。 2.2显示部分的选择方案与论证 方案一:采用点阵式数码管显示 点阵式数码管是由八行八列的发光二极管组成,对于显示文字比较合适,但是基于电子万年历主要是显示数字,就显得太浪费了,且价格相对较高。 方案二:采用LCD液晶显示屏 LCD液晶显示屏的显示功能特别强大,可以显示大量文字、图形,显示多样清晰可见,使得万年历的内容更加丰富,加上动态显示效果,更加吸引观众的眼球。 2.3时钟芯片的选择方案与论证 方案一:直接采用单片机定时计数器 直接采用单片机定时计数器提供时间单位秒,使用程序实现年、月、日、星期、时、分、秒计数。采用此种方案虽然减少芯片的使用,节约成本,但是,实现时间误差较大,而且不具有实时性,必须用到断电存贮资料,否则一断电,时钟就不会准确,误差太大。 方案二:采用DS1302时钟芯片实现时钟 DS1302时钟芯片是一种高性能的时钟芯片,可自动对秒、时、分、日、周、月、年以及闰年补偿的年进行计数,而且精度高的RAM作为数据暂存区,工作电压2.5V~5.5V范围内,2.5V时耗电小于300mA。此外可以外接电池,具有实时性,断电后时间还会走,比较精准。 2.4温度传感器的选择方案与论证 方案一:使用热敏电阻作为传感器 用热敏电阻与一个相应该阻值相串联分压,用热敏电阻随温度变化的特性,采集这两个电阻变化的分压值,并用A/D转换。此设计方案需用A/D转换电路,增加硬件成本而且热敏电阻的温性曲线并不是严格线性的,会产生较大测量误差。 方案二:采用数字式温度传感器DS18B20 此类传感器为数字式传感器,而且仅需要一条数据线进行数据传输,易于与单片机连接,可以去除A/D模块,降低硬件成本,简化系统电路,测量温度精度高。 2.5电路设计最终方案系统原理及总体结构图 本系统包括主控模块,显示模块,时钟模块,温度采集模块,综上各方案所述,电路设计最终方案:采用 作为主控制系统,1602LCD液晶作为显示部分,DS1302作为时钟模块,DS18B20传感器来采集温度信息。 根据上述电路设计最终方案,系统总体设计方案如图2-1所示 设计的电路主要由四大模块构成:温度传感器电路,单片机控制电路,显示电路以及校正电路。 图2-1 系统总体结构图 当温度传感器接受到外面的信号,送入单片机,单片机将接受到的信号输出,让它在液晶上显示。 同时由单片机控制的万年历以及时间显示,当时间及秒计数计满60时就向分进位,分计数器计满60分后向时计数器进位,小时计数器按“24翻1”规律计数。时、分、秒的计数结果经过数据处理可直接送显示器显示。当计时发生误差的时候可以用校时电路进行校正。时计数器计满24小时后自动向日计数器进一,日计数器由平年、闰年的28/30/31对大、小月和二月的判断应与当月相应的日期相一致,当日计数器计满时,向月计数器进位,月计数器计满12月向年计数器进位, 当年计数器计满100时所以计数器清零。设计采用的是年、月、日和时、分、星期显示,所以在单片机通过对数据处理进行同时在液晶上显示。 3 系统设计 3.1 系统硬件仿真原理图 本次设计是在Proteus软件绘制的硬件图,如下图3-1所示 图3-1 硬件仿真原理图 3.2 单片机89C51控制模块的设计 AT89C51是美国ATMEL公司生产的低电压、高性能CMOS8位单片机,片内含4KB的可反复擦除的只读程序存储器(PEROM)和128B随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产兼容 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 MCS-51指令系统,片内置通用8位中央处理器(CPU)和FLASH存储单元,功能强大AT89C51单片机可为您提供许多高性价比的应用场合。 主要性能参数: ①与MCS-51产品指令系统完全兼容 ②4K字节可重擦写FLASH闪速存储器 ③1000次擦写周期 ④全静态操作:0HZ-24MHZ ⑤三级加密程序存储器 ⑥128 8字节内部RAM ⑦32个可编程I/O口线 ⑧2个16位定时/计数器 ⑨6个中断源 ⑩可编程串行UART通道 图3-2 AT89C51 引脚封装图 芯片引脚介绍: (1)主电源引脚 ① VCC:+5 V电源 ② VSS:地线。 (2)时钟电路引脚 XTAL1和XTAL2:外接晶体引线端。当使用芯片内部时钟时,此二引线端用于外接石英晶体和微调电容;当使用外部时钟时,用于接外部时钟脉冲信号。 (3)控制信号引脚 ① RST/VPD:复位信号。当输入的复位信号延续两个机器周期以上的高电平时即为有效,用以完成单片机的复位初始化操作;当单片机掉电时,此引脚上可接备用电源,由VPD向片内RAM提供备用电源,一保持片内RAM中的数据不丢失。 ② ALE/PROG:地址锁存控制信号。在系统扩展时,ALE用于控制把P0口输出的低8位地址锁存起来,以实现低位地址和数据的隔离。此外,由于ALE是以晶振1/6的固定频率输出的正脉冲,因此,可作为外部时钟或外部定时脉冲使用。 对于EPROM型单片机,在EPRAM编程期间,此引脚接收编程脉冲。 ③ PSEN:片外程序存储器读选通信号输出端。 ④ EA/VPP:访问程序存储控制信号。当EA信号为低电平时,对ROM的读操作限定在外部程序存储器;当EA信号为高电平时,对ROM的读操作是从内部程序存储器开始,并可延至外部程序存储器。 对于EPROM型单片机,在EPRAM编程期间,此引脚接上加21V EPROM编程电源VPP。 (4)I/O引脚 P0.0 ~ P0.7: P0口8位双向口线,P1.0 ~ P1.7 :P1口8位双向口线, P2.0 ~ P2.7 :P2口8位双向口线,P3.0 ~ P3.7 :P3口8位双向口线。 P3口线的第二功能。P3的8条口线都定义有第二功能,详见表3-21。 表3-1 P3口各引脚与第二功能表 引脚 第二功能 信号名称 P3.0 RXD 串行数据接收 P3.1 TXD 串行数据发送 P3.2 INT0 外部中断0申请 P3.3 INT1 外部中断1申请 P3.4 T0 定时/计数器0的外部输入 P3.5 T1 定时/计数器1的外部输入 P3.6 WR 外部RAM写选通 P3.7 RD 外部RAM读选通 以上把8051单片机的全部信号引脚分别以第一功能和第二功能的形式列出。对于各种型号的芯片,其引脚的第一功能信号是相同的,所不同的只在引脚的第二功能信号。对于9、30和31三个引脚,由于第一功能信号与第二功能信号是单片机在不同工作方式下的信号,因此不会发生使用上的矛盾。但是P3口的情况却有所不同,它的第二功能信号都是单片机的重要控制信号。因此,在实际使用时,都是先按需要选用第二功能信号,剩下的才以第一功能的身份作数据位的输入/输出使用。 图3-3 单片机控制模块 3.3 LCD液晶显示模块设计 显示模块主要是用来显示公历年、月、日以及时、分、秒、温度、星期等信息。LCD智能型显示模块则是一种低功耗、低价值、低损耗的显示器件,它不但可以显示各式各样的字符、汉子和图形,同时具有可编程能力,且与单片机接口方便,基于以上优点,LCD智能型显示模块获得了广泛的应用。1602LCD点阵液晶显示模块是由16*2个液晶显示点组成的一个16列*2行的阵列。每个显示点对应一位二进制数,1表示亮,0表示灭。存储这些点阵信息的RAM称为显示数据存储器,要显示某个图形或汉字就是将相应的点阵信息写入到相应的存储单元中。图形或汉字的点阵信息当然有自己设计,问题的关键就是显示点在液晶屏上的位置(行或列)与其在存储器中的地址之间的关系。每个存储单元存储8个液晶点的显示信息。 下面是关于1602LCD液晶相关信息: (1)引脚说明如下表所示 表3-2 1602LCD引脚说明 引脚 符号 功能说明 1 VSS 一般接地 2 VDD 接电源(+5V) 3 V0 液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。 4 RS RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。 5 R/W R/W为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。 6 E E(或EN)端为使能(enable)端,下降沿使能。 7 DB0 底4位三态、 双向数据总线 0位(最低位) 8 DB1 底4位三态、 双向数据总线 1位 9 DB2 底4位三态、 双向数据总线 2位 10 DB3 底4位三态、 双向数据总线 3位 11 DB4 高4位三态、 双向数据总线 4位 12 DB5 高4位三态、 双向数据总线 5位 13 DB6 高4位三态、 双向数据总线 6位 14 DB7 高4位三态、 双向数据总线 7位(最高位)(也是busy flag) 15 BLA 背光电源正极 16 BLK 背光 电源负极 ①请在DB0~DB7数据线中加入10K上拉电阻,特别是使用单片机中的三态I/O口时。 ② V0需要一个外部的0V~10V负压输入,是液晶显示,可串入电位器调整液晶灰度。 (2) 下面为1602LCD的指令集表: 表3-3 1602LCD指令集 3.4 DS1302时钟模块的设计 DS1302 是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后备电源双电源引脚,同时提供了对后备电源进行涓细电流充电的能力。 ⑴ DS1302的引脚排列 其中Vcc1为后备电源,VCC2为主电源。在主电源关闭的情况下,也能保持时钟的连续运行。DS1302由Vcc1或Vcc2两者中的较大者供电。当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。当Vcc2小于Vcc1时,DS1302由Vcc1供电。X1和X2是振荡源,外接32.768kHz晶振。RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据的传送手段。当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。上电运行时,在Vcc>2.0V之前,RST必须保持低电平。只有在SCLK为低电平时,才能将RST置为高电平。I/O为串行数据输入输出端(双向),后面有详细说明。SCLK为时钟输入端。 下图为DS1302的引脚功能图: 图3-4 DS1302的引脚功能图 ⑵ DS1302的控制字节 DS1302 的控制字如表3-4所示。控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。 表3-4 DS1302的控制字格式 ⑶ DS1302数据的输入输出 在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。 图3-5 DS1302读写时序图 ⑷ DS1302的寄存器 DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式,其日历、时间寄存器及其控制字见下表。 此外,DS1302 还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。 DS1302与RAM相关的寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。 表3-5 DS1302的日历、时钟寄存器及其控制字 寄存器 名 命令字 取值 范围 各位内容 写操作 读操作 7 6 5 4 3 2 1 0 秒寄存器 80H 81H 00-59 CH 10SEC SEC 分钟寄存器 82H 83H 00-59 0 10MIN MIN 小时 寄存器 84H 85H 01- 12或 00-23 12/ 24 0 10 AP HR HR 日期 寄存器 86H 87H 01-28,29, 30,31 0 0 10DATE DATE 月份寄存器 88H 89H 01-12 0 0 0 IOM MONTH 周日寄存器 8AH 8BH 01-07 0 0 0 0 0 DAY 年份寄存器 8CH 8DH 00-99 10YEAR YEAR DS1302时钟芯片与AT89C51的连接图如下: 图3-6 DS1302时钟芯片与AT89C51的连接图 3.5 DS18B20温度采集模块的设计 采用数字式温度传感器DS18B20,有DALLAS半导体公司生产的DS18B20型单线智能温度传感器,属于新一代适配微处理器的智能温度传感器,可广泛用于工业、民用、军事领域的温度测量及控制仪器、测量系统和大型设备中。 (1)DS18B20的性能特点可归纳如下: 1)独特的单线接口仅需一个端口引脚进行通信; 2)DS18B20支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组网多点测温; 3)DS18B20在使用中不需要任何外围元件,全部 传感元件及转换电路集成在形如一只三极管的集成电路内; 4)测温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃; 5)可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温; 6)在9位分辨率时最多在 93.75ms内把温度转换为数字,12位分辨率时最多在750ms内把温度值转换为数字,速度更快; 7)测量结果直接输出数字温度信号,以"一 线总线"串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力; 8)负压特性:电源极性接反时,芯片不会因发热而烧毁, 但不能正常工作。 (2)电路设计 如下图所示。采用数字式温度传感器DS18B20,它是数字式温度传感器,具有测量精度高,电路连接简单等特点,此类传感器仅需要一条数据线进行数据传输,使用AT89C51单片机芯片的P2.7端口与DS18B20的I/O口连接,加一个上拉电阻,Vcc接电源,Vss接地。 图3-7 DS18B20温度采集 (3)DS18B20工作时序 1.复位时序图 图3-8 复位时序图 2.读时序图 图3-9 读时序图 3.写时序图 图3-10 写时序图 4 系统调试 4.1硬件调试 硬件调试是测试焊接完成后的成品的硬件电路的功能,发现及排除相关故障,主要包括主控芯片的调试以及各模块电路的调试。 由于本次设计仅仅处于软件仿真阶段,并没有去设计焊接电路,故该部分略。在不久的毕业设计 论文 政研论文下载论文大学下载论文大学下载关于长拳的论文浙大论文封面下载 中一定会完善该部分。 4.2软件调试 本设计的软件编译是在Keil uVision4上进行的,此软件可以生成HEX文件用于下载到单片机上工作。生成HEX文件后可以在PROTEUS上进行仿真调试。 5 结论 经过将近三周的时间,课程设计终于完成了,心里顿时轻松不少,这段时间经历了从茫然不知从哪里下手到收集资料,小组讨论,有了些头绪再到理出思路,开始设计各部分电路,再到调试解决各个问题,期间经过老师的指导又修改电路,最后完成整个电路设计,心情也跟着起起伏伏,有调试成功的喜悦,有试了好多次却不知道哪儿出了问题的迷惑,也有突然有了新想法想尝试的冲动,总之,从畏惧渐渐喜欢上了设计,从设计中学到了好多实用的知识。 参 考 文 献 [1] 蔡美琴等.MCS-51系列单片机系统极其应用.北京:高等教育出版社,2004 [2] 林伸茂.8051单片机彻底研究实习篇.北京:人民邮电出版社,2004 [3] 胡学海.单片机原理极其应用系统设计.北京:电子工业出版社,2005 [4] 张毅刚.单片机原理极其应用.哈尔滨:哈尔滨工业大学出版社,2004 [5] 韩志军等.单片机应用系统设计.北京:机械工业出版社,2005 [6] 舒怀林.单片机原理与接口技术.武汉:华中科技大学出版社,2001 附 录 课程设计中的程序如下: #include #include #include "SoundPlay.h" #define uchar unsigned char #define uint unsigned int sbit SCK=P3^6; //时钟 sbit SDA=P3^4; //数据 sbit RST=P3^5; // DS1302复位 sbit lcdrs=P2^6; sbit lcdrw=P2^5; sbit lcden=P2^7; sbit key1=P1^0; //开调时键 sbit key2=P1^1; //调时加键 sbit key3=P1^2; //调时减键 sbit key4=P1^3; //开设定闹铃键 sbit key5=P1^4; //返回正常显示键 sbit key6=P1^5; //闹铃开关键 sbit DQ=P3^7; //温度传感器数据通信位 sbit beep = P2^1; //蜂鸣器控制IO口 sbit led1 = P2^0; //led灯,闹铃响标志 bit ReadRTC_Flag,Display_Flag,Alarm_Flag,flag; //定义标志位 uchar miao,fen,shi,ri,yue,week,nian,T,C=0,k=0,m=0,n=0; uchar set_miao,set_fen,set_shi,set_ri,set_yue,set_nian,TempBuffer[5],temp_value; char l_tmpdate[7]={0x50,0x08,0x011,0x07,0x10,0x01,0x12};//设置初始时间,秒分时日月周年12-10-07 01:08:50 uchar code write_rtc_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //秒分时日月周年 最低位写位 uchar code read_rtc_address[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d}; //秒分时日月周年 最低位读位 uchar code table1[]="SUN"; //星期字表 uchar code table2[]="MON"; uchar code table3[]="TUE"; uchar code table4[]="WED"; uchar code table5[]="THU"; uchar code table6[]="FRI"; uchar code table7[]="SAT"; uchar code tab1[]="20 - - "; uchar code tab2[]=" : :"; uchar code tab3[14]=" Set Alarm! "; char tab4[]={0,0,12}; //两只蝴蝶 unsigned char code Music_Two[] ={ 0x17,0x03, 0x16,0x03, 0x17,0x01, 0x16,0x03, 0x17,0x03, 0x16,0x03, 0x15,0x01, 0x10,0x03, 0x15,0x03, 0x16,0x02, 0x16,0x0D, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x10,0x03, 0x10,0x0E, 0x15,0x04, 0x0F,0x01, 0x17,0x03, 0x16,0x03, 0x17,0x01, 0x16,0x03, 0x17,0x03, 0x16,0x03, 0x15,0x01, 0x10,0x03, 0x15,0x03, 0x16,0x02, 0x16,0x0D, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x10,0x03, 0x15,0x03, 0x16,0x01, 0x17,0x03, 0x16,0x03, 0x17,0x01, 0x16,0x03, 0x17,0x03, 0x16,0x03, 0x15,0x01, 0x10,0x03, 0x15,0x03, 0x16,0x02, 0x16,0x0D, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x10,0x03, 0x10,0x0E, 0x15,0x04, 0x0F,0x01, 0x17,0x03, 0x19,0x03, 0x19,0x01, 0x19,0x03, 0x1A,0x03, 0x19,0x03, 0x17,0x01, 0x16,0x03, 0x16,0x03, 0x16,0x02, 0x16,0x0D, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x10,0x03, 0x10,0x0D, 0x15,0x00, 0x19,0x03, 0x19,0x03, 0x1A,0x03, 0x1F,0x03, 0x1B,0x03, 0x1B,0x03, 0x1A,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x03, 0x16,0x0D, 0x17,0x01, 0x17,0x03, 0x17,0x03, 0x19,0x03, 0x1A,0x02, 0x1A,0x02, 0x10,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x01, 0x17,0x03, 0x19,0x03, 0x19,0x03, 0x17,0x03, 0x19,0x02, 0x1F,0x02, 0x1B,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04, 0x17,0x02, 0x1A,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04, 0x1A,0x03, 0x19,0x03, 0x17,0x03, 0x16,0x03, 0x17,0x0D, 0x16,0x03, 0x17,0x03, 0x19,0x01, 0x19,0x03, 0x19,0x03, 0x1A,0x03, 0x1F,0x03, 0x1B,0x03, 0x1B,0x03, 0x1A,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x03, 0x16,0x03, 0x17,0x01, 0x17,0x03, 0x17,0x03, 0x19,0x03, 0x1A,0x02, 0x1A,0x02, 0x10,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x01, 0x17,0x03, 0x19,0x03, 0x19,0x03, 0x17,0x03, 0x19,0x03, 0x1F,0x02, 0x1B,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04, 0x17,0x02, 0x1A,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04, 0x17,0x16, 0x1A,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04, 0x1A,0x03, 0x19,0x03, 0x17,0x03, 0x16,0x03, 0x0F,0x02, 0x10,0x03, 0x15,0x00, 0x00,0x00 }; /******************************************************************/ /* 函数声明 */ /******************************************************************/ void Init_DS18B20(void); unsigned char ReadOneChar(void); void WriteOneChar(uchar dat); void ReadTemp(void); void temp_to_str(); //温度数据转换成液晶字符显示 void Write_Ds1302_byte(uchar temp); void Write_Ds1302( uchar address,uchar dat ); uchar Read_Ds1302 ( uchar address ); void Read_RTC(void); void Set_RTC(void); void delay(uchar a); void delay1(uchar a); void di(); void lcd_mang(); void write_lcd1602(uchar cmd,uchar i); void ini_lcd1602(); void write_week(uchar xq); void write_nyr(uchar add,uchar dat); void write_sfm(uchar add,uchar dat); void display(); void keyscan(); void alarm(); /******************************************************************/ /* 主函数 */ /******************************************************************/ void main(void) { ini_lcd1602(); Init_DS18B20(); Set_RTC(); //写入时钟值,如果使用备用电池时候,不需要没每次上电写入,此程序应该屏蔽 while(1) { ReadTemp(); temp_to_str(); keyscan(); if(ReadRTC_Flag==0) { Read_RTC(); if(Display_Flag==0) { display(); } if(flag==1) { alarm(); } } } } /******************************************************************/ /* 毫秒级延时函数 */ /******************************************************************/ void delay(uchar a) { uchar i; while(a--) { for(i=0;i<250;i++) { _nop_(); _nop_(); _nop_(); _nop_(); } } } void delay1(uchar a) { uchar i; while(a--) { for(i=0;i<5;i++) {} } } /******************************************************************/ /* 蜂鸣器发声函数 */ /******************************************************************/ void di() { uchar i; while(key1==0||key2==0||key3==0||key4==0||key5==0||key6==0) { for(i=0;i<50;i++) { delay1(4); beep=~beep; } } } /******************************************************************/ /* ds18b20延迟子函数(晶振12MHz) */ /******************************************************************/ void delay_18B20(unsigned int i) { while(i--); } /******************************************************************/ /* ds18b20初始化函数 */ /******************************************************************/ void Init_DS18B20(void) { unsigned char x=0; DQ = 1; //DQ复位 delay_18B20(8); //稍做延时 DQ = 0; //单片机将DQ拉低 delay_18B20(80); //精确延时 大于 480us DQ = 1; //拉高总线 delay_18B20(14); x = DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败 delay_18B20(20); DQ = 1; } /******************************************************************/ /* ds18b20读一个字节 */ /******************************************************************/ unsigned char ReadOneChar(void) { uchar i=0; uchar dat = 0; for (i=8;i>0;i--) { DQ = 0; // 给脉冲信号 dat>>=1; DQ = 1; // 给脉冲信号 if(DQ) dat|=0x80; delay_18B20(4); } return(dat); } /******************************************************************/ /* ds18b20写一个字节 */ /******************************************************************/ void WriteOneChar(uchar dat) { unsigned char i=0; for (i=8; i>0; i--) { DQ = 0; DQ = dat&0x01; delay_18B20(5); DQ = 1; dat>>=1; } } /******************************************************************/ /* 读取ds18b20当前温度 */ /******************************************************************/ void ReadTemp(void) { unsigned char a=0; unsigned char b=0; unsigned char t=0; Init_DS18B20(); WriteOneChar(0xCC); // 跳过读序号列号的操作 WriteOneChar(0x44); // 启动温度转换 delay_18B20(100); // this message is wery important Init_DS18B20(); WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度 delay_18B20(100); a=ReadOneChar(); //读取温度值低位 b=ReadOneChar(); //读取温度值高位 temp_value=b<<4; temp_value+=(a&0xf0)>>4; } /******************************************************************/ /* 温度数据转换 */ /******************************************************************/ void temp_to_str() //温度数据转换成液晶字符显示 { TempBuffer[0]=temp_value/10+'0'; //十位 TempBuffer[1]=temp_value%10+'0'; //个位 //TempBuffer[2]=0xdf; //温度符号 //TempBuffer[3]='C'; //TempBuffer[4]='\0'; } /******************************************************************/ /* LCD1602判忙函数 */ /******************************************************************/ void lcd_mang() { lcdrs=0; lcdrw=1; lcden=1; _nop_(); _nop_(); _nop_(); _nop_(); while(P0&0x80); lcden=0; } /******************************************************************/ /* LCD1602写指令(i=0)、数据(i=1)函数 */ /******************************************************************/ void write_lcd1602(uchar cmd,uchar i) { lcd_mang(); lcdrs=i; lcdrw=0; lcden=0; _nop_(); _nop_(); lcden=1; _nop_(); _nop_(); P0=cmd; _nop_(); _nop_(); _nop_(); _nop_(); lcden=0; } /******************************************************************/ /* LCD1602初始化函数 */ /******************************************************************/ void ini_lcd1602() { uchar i; led1=1; Alarm_Flag=0; write_lcd1602(0x38,0); delay(1); write_lcd1602(0x0c,0); delay(1); write_lcd1602(0x06,0); delay(1); write_lcd1602(0x01,0); delay(1); write_lcd1602(0x80+1,0); for(i=0;i<8;i++) { write_lcd1602(tab1[i],1); } write_lcd1602(0x80+0x40+2,0); for(i=0;i<6;i++) { write_lcd1602(tab2[i],1); } write_lcd1602(0x80+0x40+14,0); write_lcd1602(0xdf,1); write_lcd1602('C',1); } /******************************************************************/ /* BCD转换成LCD1602能显示的16进制数,秒、分、时 */ /******************************************************************/ void write_sfm(uchar add,uchar dat) { uchar gw,sw; gw=dat%10; sw=dat/10; write_lcd1602(0x80+0x40+add,0); write_lcd1602(sw+'0',1); write_lcd1602(gw+'0',1); } /******************************************************************/ /* BCD转换成LCD1602能显示的16进制数,日、月、年 */ /******************************************************************/ void write_nyr(uchar add,uchar dat) { uchar gw,sw; gw=dat%10; sw=dat/10; write_lcd1602(0x80+add,0); write_lcd1602(sw+'0',1); write_lcd1602(gw+'0',1); } /******************************************************************/ /* 显示星期 */ /******************************************************************/ void write_week(uchar xq) { uchar x; write_lcd1602(0x80+12,0); switch(xq) { case 1: for(x=0;x<3;x++) { write_lcd1602(table1[x],1); } break; case 2: for(x=0;x<3;x++) { write_lcd1602(table2[x],1); } break; case 3: for(x=0;x<3;x++) { write_lcd1602(table3[x],1); } break; case 4: for(x=0;x<3;x++) { write_lcd1602(table4[x],1); } break; case 5: for(x=0;x<3;x++) { write_lcd1602(table5[x],1); } break; case 6: for(x=0;x<3;x++) { write_lcd1602(table6[x],1); } break; case 7: for(x=0;x<3;x++) { write_lcd1602(table7[x],1); } break; } write_lcd1602(0x80+12,0); } /******************************************************************/ /* 显示函数 */ /******************************************************************/ void display() { uchar i; Read_RTC(); write_sfm(8,miao); write_sfm(5,fen); write_sfm(2,shi); write_nyr(3,nian); write_nyr(6,yue); write_nyr(9,ri); write_week(week); ReadTemp(); temp_to_str(); write_lcd1602(0x80+0x40+12,0); for(i=0;i<2;i++) { write_lcd1602(TempBuffer[i],1); } } /******************************************************************/ /* DS1302写一个字节 */ /******************************************************************/ void Write_Ds1302_Byte(uchar temp) { uchar i; for (i=0;i<8;i++) //循环8次 写入数据 { SCK=0; SDA=temp&0x01; //每次传输低字节 temp>>=1; //右移一位 SCK=1; } } /******************************************************************/ /* 写入DS1302 */ /******************************************************************/ void Write_Ds1302( uchar address,uchar dat ) { RST=0; _nop_(); SCK=0; _nop_(); RST=1; _nop_(); //启动 Write_Ds1302_Byte(address); //发送地址 Write_Ds1302_Byte(dat); //发送数据 RST=0; //恢复 } /******************************************************************/ /* 读出DS1302数据 */ /******************************************************************/ uchar Read_Ds1302 ( uchar address ) { uchar i,temp=0x00; RST=0; _nop_(); _nop_(); SCK=0; _nop_(); _nop_(); RST=1; _nop_(); _nop_(); Write_Ds1302_Byte(address); for (i=0;i<8;i++) //循环8次 读取数据 { if(SDA) temp|=0x80; //每次传输低字节 SCK=1; temp>>=1; //右移一位 _nop_(); _nop_(); _nop_(); SCK=0; } RST=0; _nop_(); //以下为DS1302复位的稳定时间 _nop_(); RST=0; SCK=0; _nop_(); _nop_(); _nop_(); _nop_(); SCK=1; _nop_(); _nop_(); SDA=0; _nop_(); _nop_(); SDA=1; _nop_(); _nop_(); return (temp); //返回 } /******************************************************************/ /* 读时钟数据 */ /******************************************************************/ void Read_RTC(void) //读取 日历 { uchar i,*p; p=read_rtc_address; //地址传递 for(i=0;i<7;i++) //分7次读取 秒分时日月周年 { l_tmpdate[i]=Read_Ds1302(*p); p++; miao=((l_tmpdate[0]&0x70)>>4)*10 + (l_tmpdate[0]&0x0f); fen =((l_tmpdate[1]&0x70)>>4)*10 + (l_tmpdate[1]&0x0f); shi =((l_tmpdate[2]&0x70)>>4)*10 + (l_tmpdate[2]&0x0f); ri =((l_tmpdate[3]&0x70)>>4)*10 + (l_tmpdate[3]&0x0f); yue =((l_tmpdate[4]&0x70)>>4)*10 + (l_tmpdate[4]&0x0f); week=((l_tmpdate[5]&0x70)>>4)*10 + (l_tmpdate[5]&0x0f); nian=((l_tmpdate[6]&0x70)>>4)*10 + (l_tmpdate[6]&0x0f); } } /******************************************************************/ /* 设定时钟数据 */ /******************************************************************/ void Set_RTC(void) //设定 日历 { uchar i,*p; /*for(i=0;i<7;i++) { //BCD处理 tmp=l_tmpdate[i]/10; l_tmpdate[i]=l_tmpdate[i]%10; l_tmpdate[i]=l_tmpdate[i]+tmp*16; }*/ Write_Ds1302(0x8E,0X00); //允许写,禁止写保护 p=write_rtc_address; //传地址 for(i=0;i<7;i++) //7次写入 秒分时日月周年 { Write_Ds1302(*p,l_tmpdate[i]); p++; } Write_Ds1302(0x8E,0x80); //打开写保护 } /******************************************************************/ /* 键盘扫描函数 */ /******************************************************************/ void keyscan() { uchar i; if(Display_Flag==0) { if(key1==0) //调时功能键 { delay(9); if(key1==0) { di(); while(!key1); //松手检测 ++n; ReadRTC_Flag=1; //停止走时 switch(n) { case 1: write_lcd1602(0x80+0x40+9,0); //按一次功能键秒闪烁 write_lcd1602(0x0f,0); Write_Ds1302(0x8e,0x00); //允许写,禁止写保护 Write_Ds1302(0x80,((miao/10)*16+miao%10)); //写入DS1302秒位 Write_Ds1302(0x8e,0x80); //打开写保护 break; case 2: write_lcd1602(0x80+0x40+6,0); //按两次功能键分闪烁 break; case 3: write_lcd1602(0x80+0x40+3,0); //按三次功能键时闪烁 break; case 4: write_lcd1602(0x80+10,0); //按四次功能键日闪烁 break; case 5: write_lcd1602(0x80+7,0); //按五次功能键月闪烁 break; case 6:write_lcd1602(0x80+4,0); //按六次功能键年闪烁 break; case 7: write_lcd1602(0x80+12,0); //按七次功能键周闪烁 break; case 8: n=0; //按八次功能键开始走时,停止闪烁 ReadRTC_Flag=0; write_lcd1602(0x0c,0); Write_Ds1302(0x8e,0x00); Write_Ds1302(0x80,((miao/10)*16+miao%10)); Write_Ds1302(0x8e,0x80); C=0; break; } } } } if(key4==0) //闹铃功能键 { delay(9); if(key4==0) { di(); while(!key4); m++; Display_Flag=1; //屏蔽调时功能键,进入调闹铃功能 Alarm_Flag=0; //初始化闹铃标志位,闹铃不响 flag=1; //开启闹钟检测 write_lcd1602(0x80+0x40,0); //在时间前面显示闹钟开启标志‘A’ write_lcd1602('A',1); switch(m) { case 1: n=0; ReadRTC_Flag=0; //开显示 write_lcd1602(0x0c,0); //停止闪烁 Write_Ds1302(0x8e,0x00); Write_Ds1302(0x80,((miao/10)*16+miao%10)); Write_Ds1302(0x8e,0x80); write_lcd1602(0x80+1,0); //首行写入Set Alarm! for(i=0;i<14;i++) { write_lcd1602(tab3[i],1); } write_lcd1602(0x80+0x40+2,0); //第二行写入设定的时间 for(i=0;i<6;i++) { write_lcd1602(tab2[i],1); } write_lcd1602(0x80+0x40+8,0); write_lcd1602(tab4[0]/10+'0',1); write_lcd1602(tab4[0]%10+'0',1); write_lcd1602(0x80+0x40+5,0); write_lcd1602(tab4[1]/10+'0',1); write_lcd1602(tab4[1]%10+'0',1); write_lcd1602(0x80+0x40+2,0); write_lcd1602(tab4[2]/10+'0',1); write_lcd1602(tab4[2]%10+'0',1); break; case 2: write_lcd1602(0x80+0x40+9,0); //开始设定闹铃,秒位闪烁可调 write_lcd1602(0x0f,0); break; case 3: write_lcd1602(0x80+0x40+6,0); //分位闪烁可调 break; case 4: write_lcd1602(0x80+0x40+3,0); //时位闪烁可调 break; case 5: Display_Flag=0; //关闭对调时功能间的屏蔽 m=0; //关闭更更改闹铃时间 C=0; //屏蔽掉在正常显示时间时key5复位键对显示的影响 write_lcd1602(0x0c,0); write_lcd1602(0x80+1,0); //清掉Set Alarm for(i=0;i<11;i++) { write_lcd1602(tab1[i],1); } display(); //返回时间显示 } } } if(n!=0||m!=0) //功能加键 { if(key2==0) { delay(9); if(key2==0) { di(); while(!key2); if(Display_Flag==0) { switch(n) { case 1: miao++; if(miao==60) miao=0; write_lcd1602(0x80+0x40+8,0); //使LCD1602在秒位上显示“加”设好的秒数 write_lcd1602((miao/10)+'0',1); //十进制转换成LCD1602能显示的字符,显示出来 write_lcd1602((miao%10)+'0',1); T=(miao/10)*16+(miao%10); //十进制转换成DS1302能写的BCD码 Write_Ds1302(0x8e,0x00); //允许写,禁止写保护 Write_Ds1302(0x80,T); //写入DS1302 Write_Ds1302(0x8e,0x80); //打开写保护 //Read_RTC(); write_lcd1602(0x80+0x40+9,0); //写完数据后光标自动右移,所以要归位 break; case 2: fen++; if(fen==60) fen=0; write_lcd1602(0x80+0x40+5,0); write_lcd1602((fen/10)+'0',1); write_lcd1602((fen%10)+'0',1); T=(fen/10)*16+(fen%10); Write_Ds1302(0x8e,0x00); Write_Ds1302(0x82,T); Write_Ds1302(0x8e,0x80); write_lcd1602(0x80+0x40+6,0); break; case 3: shi++; if(shi==24) shi=0; write_lcd1602(0x80+0x40+2,0); write_lcd1602((shi/10)+'0',1); write_lcd1602((shi%10)+'0',1); T=(shi/10)*16+(shi%10); Write_Ds1302(0x8e,0x00); Write_Ds1302(0x84,T); Write_Ds1302(0x8e,0x80); write_lcd1602(0x80+0x40+3,0); break; case 4: ri++; if(ri==32) ri=1; write_lcd1602(0x80+9,0); write_lcd1602((ri/10)+'0',1); write_lcd1602((ri%10)+'0',1); T=(ri/10)*16+(ri%10); Write_Ds1302(0x8e,0x00); Write_Ds1302(0x86,T); Write_Ds1302(0x8e,0x80); write_lcd1602(0x80+10,0); break; case 5: yue++; if(yue==13) yue=1; write_lcd1602(0x80+6,0); write_lcd1602((yue/10)+'0',1); write_lcd1602((yue%10)+'0',1); T=(yue/10)*16+(yue%10); Write_Ds1302(0x8e,0x00); Write_Ds1302(0x88,T); Write_Ds1302(0x8e,0x80); write_lcd1602(0x80+7,0); break; case 6: nian++; if(nian==100) nian=0; write_lcd1602(0x80+3,0); write_lcd1602((nian/10)+'0',1); write_lcd1602((nian%10)+'0',1); T=(nian/10)*16+(nian%10); Write_Ds1302(0x8e,0x00); Write_Ds1302(0x8c,T); Write_Ds1302(0x8e,0x80); write_lcd1602(0x80+4,0); break; case 7: week++; if(week==8) week=1; write_week(week); T=(week/10)*16+(week%10); Write_Ds1302(0x8e,0x00); Write_Ds1302(0x8a,T); Write_Ds1302(0x8e,0x80); break; } } else switch(m) { case 2: tab4[0]++; if(tab4[0]==60) tab4[0]=0; set_miao=tab4[0]; write_lcd1602(0x80+0x40+8,0); write_lcd1602(tab4[0]/10+'0',1); write_lcd1602(tab4[0]%10+'0',1); write_lcd1602(0x80+0x40+9,0); break; case 3: tab4[1]++; if(tab4[1]==60) tab4[1]=0; set_fen=tab4[1]; write_lcd1602(0x80+0x40+5,0); write_lcd1602(tab4[1]/10+'0',1); write_lcd1602(tab4[1]%10+'0',1); write_lcd1602(0x80+0x40+6,0); break; case 4: tab4[2]++; if(tab4[2]==24) tab4[2]=0; set_shi=tab4[2]; write_lcd1602(0x80+0x40+2,0); write_lcd1602(tab4[2]/10+'0',1); write_lcd1602(tab4[2]%10+'0',1); write_lcd1602(0x80+0x40+3,0); break; } } } } if(key3==0) //功能减键 { delay(9); if(key3==0) { di(); while(!key3); if(Display_Flag==0) { switch(n) { case 1: miao--; if(miao==-1) miao=59; write_lcd1602(0x80+0x40+8,0); write_lcd1602((miao/10)+'0',1); write_lcd1602((miao%10)+'0',1); T=(miao/10)*16+(miao%10); Write_Ds1302(0x8e,0x00); Write_Ds1302(0x80,T); Write_Ds1302(0x8e,0x80); write_lcd1602(0x80+0x40+9,0); break; case 2: fen--; if(fen==-1) fen=59; write_lcd1602(0x80+0x40+5,0); write_lcd1602((fen/10)+'0',1); write_lcd1602((fen%10)+'0',1); T=(fen/10)*16+(fen%10); Write_Ds1302(0x8e,0x00); Write_Ds1302(0x82,T); Write_Ds1302(0x8e,0x80); write_lcd1602(0x80+0x40+6,0); break; case 3: shi--; if(shi==-1) shi=23; write_lcd1602(0x80+0x40+2,0); write_lcd1602((shi/10)+'0',1); write_lcd1602((shi%10)+'0',1); T=(shi/10)*16+(shi%10); Write_Ds1302(0x8e,0x00); Write_Ds1302(0x84,T); Write_Ds1302(0x8e,0x80); write_lcd1602(0x80+0x40+3,0); break; case 4: ri--; if(ri==0) ri=31; write_lcd1602(0x80+9,0); write_lcd1602((ri/10)+'0',1); write_lcd1602((ri%10)+'0',1); T=(ri/10)*16+(ri%10); Write_Ds1302(0x8e,0x00); Write_Ds1302(0x86,T); Write_Ds1302(0x8e,0x80); write_lcd1602(0x80+10,0); break; case 5: yue--; if(yue==0) yue=12; write_lcd1602(0x80+6,0); write_lcd1602((yue/10)+'0',1); write_lcd1602((yue%10)+'0',1); T=(yue/10)*16+(yue%10); Write_Ds1302(0x8e,0x00); Write_Ds1302(0x88,T); Write_Ds1302(0x8e,0x80); write_lcd1602(0x80+7,0); break; case 6: nian--; if(nian==-1) nian=99; write_lcd1602(0x80+3,0); write_lcd1602((nian/10)+'0',1); write_lcd1602((nian%10)+'0',1); T=(nian/10)*16+(nian)%10; Write_Ds1302(0x8e,0x00); Write_Ds1302(0x8c,T); Write_Ds1302(0x8e,0x80); write_lcd1602(0x80+4,0); break; case 7: week--; if(week==0) week=7; write_week(week); T=(week/10)*16+(week%10); Write_Ds1302(0x8e,0x00); Write_Ds1302(0x8a,T); Write_Ds1302(0x8e,0x80); break; } } else switch(m) { case 2: tab4[0]--; if(tab4[0]==-1) tab4[0]=59; set_miao=tab4[0]; write_lcd1602(0x80+0x40+8,0); write_lcd1602(tab4[0]/10+'0',1); write_lcd1602(tab4[0]%10+'0',1); write_lcd1602(0x80+0x40+9,0); break; case 3: tab4[1]--; if(tab4[1]==-1) tab4[1]=59; set_fen=tab4[1]; write_lcd1602(0x80+0x40+5,0); write_lcd1602(tab4[1]/10+'0',1); write_lcd1602(tab4[1]%10+'0',1); write_lcd1602(0x80+0x40+6,0); break; case 4: tab4[2]--; if(tab4[2]==-1) tab4[2]=23; set_shi=tab4[2]; write_lcd1602(0x80+0x40+2,0); write_lcd1602(tab4[2]/10+'0',1); write_lcd1602(tab4[2]%10+'0',1); write_lcd1602(0x80+0x40+3,0); break; } } } if(key5==0) //返回显示时间功能键 { delay(9); if(key5==0) { di(); while(!key5); ReadRTC_Flag=0; Display_Flag=0; Alarm_Flag=0; led1=1; m=0; write_lcd1602(0x0c,0); write_lcd1602(0x80+1,0); for(i=0;i<11;i++) { write_lcd1602(tab1[i],1); } display(); } } if(key6==0) { delay(9); if(key6==0) { di(); while(!key6); k++; Alarm_Flag=0; led1=1; switch(k) { case 1: flag=1; write_lcd1602(0x80+0x40,0); write_lcd1602('A',1); break; case 2: k=0; flag=0; write_lcd1602(0x80+0x40,0); write_lcd1602(' ',1); break; } } } } /******************************************************************/ /* 闹钟函数 */ /******************************************************************/ void alarm() { uchar i; if( (miao==set_miao)&&(fen==set_fen)&&(shi==set_shi)/*&& (ri==set_ri)&&(yue==set_yue)&&(nian==set_nian)*/) { //Read_RTC(); InitialSound(); Alarm_Flag=1; //闹铃响标志位 led1=0; while(Alarm_Flag) { for(i=0;i<2;i++) { delay1(4); Play(Music_Two,0,3,360); //两只蝴蝶 } // delay(50); // for(i=0;i<2;i++) // { // delay1(4); // Play(Music_Two,0,3,360); // } // delay(50); // for(i=0;i<2;i++) // { // delay1(4); // Play(Music_Two,0,3,360); // } delay(500); Read_RTC(); //边响边走时 display(); keyscan(); } } } /************************************************************************** SOUND PLAY FOR 51MCU COPYRIGHT (c) 20014 BY JJJ. -- ALL RIGHTS RESERVED -- *******************************************************************************/ /*说明************************************************************************** 曲谱存贮格式 unsigned char code MusicName{音高,音长,音高,音长...., 0,0}; 末尾:0,0 表示结束(Important) 音高由三位数字组成: 个位是表示 1~7 这七个音符 十位是表示音符所在的音区:1-低音,2-中音,3-高音; 百位表示这个音符是否要升半音: 0-不升,1-升半音。 音长最多由三位数字组成: 个位表示音符的时值,其对应关系是: |数值(n): |0 |1 |2 |3 | 4 | 5 | 6 |几分音符: |1 |2 |4 |8 |16 |32 |64 音符=2^n 十位表示音符的演奏效果(0-2): 0-普通,1-连音,2-顿音 百位是符点位: 0-无符点,1-有符点 调用演奏子程序的格式 Play(乐曲名,调号,升降八度,演奏速度); |乐曲名 : 要播放的乐曲指针,结尾以(0,0)结束; |调号(0-11) : 是指乐曲升多少个半音演奏; |升降八度(1-3) : 1:降八度, 2:不升不降, 3:升八度; |演奏速度(1-12000): 值越大速度越快; ***************************************************************************/ #ifndef __SOUNDPLAY_H_REVISION_FIRST__ #define __SOUNDPLAY_H_REVISION_FIRST__ //************************************************************************** #define SYSTEM_OSC 12000000 //定义晶振频率12000000HZ #define SOUND_SPACE 4/5 //定义普通音符演奏的长度分率,//每4分音符间隔 sbit BeepIO = P2^1; //定义输出管脚 unsigned int code FreTab[12] = { 262,277,294,311,330,349,369,392,415,440,466,494 }; //原始频率表 unsigned char code SignTab[7] = { 0,2,4,5,7,9,11 }; //1~7在频率表中的位置 unsigned char code LengthTab[7]= { 1,2,4,8,16,32,64 }; unsigned char Sound_Temp_TH0,Sound_Temp_TL0; //音符定时器初值暂存 unsigned char Sound_Temp_TH1,Sound_Temp_TL1; //音长定时器初值暂存 //************************************************************************** void InitialSound(void) { BeepIO = 0; Sound_Temp_TH1 = (65535-(1/1200)*SYSTEM_OSC)/256; // 计算TL1应装入的初值 (10ms的初装值) Sound_Temp_TL1 = (65535-(1/1200)*SYSTEM_OSC)%256; // 计算TH1应装入的初值 TH1 = Sound_Temp_TH1; TL1 = Sound_Temp_TL1; TMOD |= 0x11; ET0 = 1; ET1 = 0; TR0 = 0; TR1 = 0; EA = 1; } void BeepTimer0(void) interrupt 1 //音符发生中断 { BeepIO = !BeepIO; TH0 = Sound_Temp_TH0; TL0 = Sound_Temp_TL0; } //************************************************************************** void Play(unsigned char *Sound,unsigned char Signature,unsigned Octachord,unsigned int Speed) { unsigned int NewFreTab[12]; //新的频率表 unsigned char i,j; unsigned int Point,LDiv,LDiv0,LDiv1,LDiv2,LDiv4,CurrentFre,Temp_T,SoundLength; unsigned char Tone,Length,SL,SH,SM,SLen,XG,FD; for(i=0;i<12;i++) // 根据调号及升降八度来生成新的频率表 { j = i + Signature; if(j > 11) { j = j-12; NewFreTab[i] = FreTab[j]*2; } else NewFreTab[i] = FreTab[j]; if(Octachord == 1) NewFreTab[i]>>=2; else if(Octachord == 3) NewFreTab[i]<<=2; } SoundLength = 0; while(Sound[SoundLength] != 0x00) //计算歌曲长度 { SoundLength+=2; } Point = 0; Tone = Sound[Point]; Length = Sound[Point+1]; // 读出第一个音符和它时时值 LDiv0 = 12000/Speed; // 算出1分音符的长度(几个10ms) LDiv4 = LDiv0/4; // 算出4分音符的长度 LDiv4 = LDiv4-LDiv4*SOUND_SPACE; // 普通音最长间隔标准 TR0 = 0; TR1 = 1; while(Point < SoundLength) { SL=Tone%10; //计算出音符 SM=Tone/10%10; //计算出高低音 SH=Tone/100; //计算出是否升半 CurrentFre = NewFreTab[SignTab[SL-1]+SH]; //查出对应音符的频率 if(SL!=0) { if (SM==1) CurrentFre >>= 2; //低音 if (SM==3) CurrentFre <<= 2; //高音 Temp_T = 65536-(50000/CurrentFre)*10/(12000000/SYSTEM_OSC);//计算计数器初值 Sound_Temp_TH0 = Temp_T/256; Sound_Temp_TL0 = Temp_T%256; TH0 = Sound_Temp_TH0; TL0 = Sound_Temp_TL0 + 12; //加12是对中断延时的补偿 } SLen=LengthTab[Length%10]; //算出是几分音符 XG=Length/10%10; //算出音符类型(0普通1连音2顿音) FD=Length/100; LDiv=LDiv0/SLen; //算出连音音符演奏的长度(多少个10ms) if (FD==1) LDiv=LDiv+LDiv/2; if(XG!=1) if(XG==0) //算出普通音符的演奏长度 if (SLen<=4) LDiv1=LDiv-LDiv4; else LDiv1=LDiv*SOUND_SPACE; else LDiv1=LDiv/2; //算出顿音的演奏长度 else LDiv1=LDiv; if(SL==0) LDiv1=0; LDiv2=LDiv-LDiv1; //算出不发音的长度 if (SL!=0) { TR0=1; for(i=LDiv1;i>0;i--) //发规定长度的音 { while(TF1==0); TH1 = Sound_Temp_TH1; TL1 = Sound_Temp_TL1; TF1=0; } } if(LDiv2!=0) { TR0=0; BeepIO=0; for(i=LDiv2;i>0;i--) //音符间的间隔 { while(TF1==0); TH1 = Sound_Temp_TH1; TL1 = Sound_Temp_TL1; TF1=0; } } Point+=2; Tone=Sound[Point]; Length=Sound[Point+1]; } BeepIO = 0; } //************************************************************************** #endif 毕业设计(论文)原创性声明和使用授权说明 原创性声明 本人郑重承诺:所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。尽我所知,除文中特别加以标注和致谢的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得 及其它教育机构的学位或学历而使用过的材料。对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了谢意。 作 者 签 名:       日  期:        ​​​​​​​​​​​​ 指导教师签名:        日  期:        使用授权说明 本人完全了解 大学关于收集、保存、使用毕业设计(论文)的规定,即:按照学校要求提交毕业设计(论文)的印刷本和电子版本;学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不以赢利为目的前提下,学校可以公布论文的部分或全部内容。 作者签名:        日  期:        ​​​​​​​​​​​​ 学位论文原创性声明 本人郑重声明:所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果。除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。本人完全意识到本声明的法律后果由本人承担。 作者签名: 日期: 年 月 日 学位论文版权使用授权书 本学位论文作者完全了解学校有关保留、使用学位论文的规定,同意学校保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。本人授权      大学可以将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。 涉密论文按学校规定处理。 作者签名: 日期: 年 月 日 导师签名: 日期: 年 月 日 指导教师评阅书 指导教师 评价 LEC评价法下载LEC评价法下载评价量规免费下载学院评价表文档下载学院评价表文档下载 : 一、撰写(设计)过程 1、学生在论文(设计)过程中的治学态度、工作精神 □ 优 □ 良 □ 中 □ 及格 □ 不及格 2、学生掌握专业知识、技能的扎实程度 □ 优 □ 良 □ 中 □ 及格 □ 不及格 3、学生综合运用所学知识和专业技能分析和解决问题的能力 □ 优 □ 良 □ 中 □ 及格 □ 不及格 4、研究方法的科学性;技术线路的可行性;设计方案的合理性 □ 优 □ 良 □ 中 □ 及格 □ 不及格 5、完成毕业论文(设计)期间的出勤情况 □ 优 □ 良 □ 中 □ 及格 □ 不及格 二、论文(设计)质量 1、论文(设计)的整体结构是否符合撰写规范? □ 优 □ 良 □ 中 □ 及格 □ 不及格 2、是否完成指定的论文(设计)任务(包括装订及附件)? □ 优 □ 良 □ 中 □ 及格 □ 不及格 三、论文(设计)水平 1、论文(设计)的理论意义或对解决实际问题的指导意义 □ 优 □ 良 □ 中 □ 及格 □ 不及格 2、论文的观念是否有新意?设计是否有创意? □ 优 □ 良 □ 中 □ 及格 □ 不及格 3、论文(设计说明书)所体现的整体水平 □ 优 □ 良 □ 中 □ 及格 □ 不及格 建议成绩:□ 优 □ 良 □ 中 □ 及格 □ 不及格 (在所选等级前的□内画“√”) 指导教师: (签名) 单位: (盖章) 年 月 日 评阅教师评阅书 评阅教师评价: 一、论文(设计)质量 1、论文(设计)的整体结构是否符合撰写规范? □ 优 □ 良 □ 中 □ 及格 □ 不及格 2、是否完成指定的论文(设计)任务(包括装订及附件)? □ 优 □ 良 □ 中 □ 及格 □ 不及格 二、论文(设计)水平 1、论文(设计)的理论意义或对解决实际问题的指导意义 □ 优 □ 良 □ 中 □ 及格 □ 不及格 2、论文的观念是否有新意?设计是否有创意? □ 优 □ 良 □ 中 □ 及格 □ 不及格 3、论文(设计说明书)所体现的整体水平 □ 优 □ 良 □ 中 □ 及格 □ 不及格 建议成绩:□ 优 □ 良 □ 中 □ 及格 □ 不及格 (在所选等级前的□内画“√”) 评阅教师: (签名) 单位: (盖章) 年 月 日 教研室(或答辩小组)及教学系意见 教研室(或答辩小组)评价: 一、答辩过程 1、毕业论文(设计)的基本要点和见解的叙述情况 □ 优 □ 良 □ 中 □ 及格 □ 不及格 2、对答辩问题的反应、理解、表达情况 □ 优 □ 良 □ 中 □ 及格 □ 不及格 3、学生答辩过程中的精神状态 □ 优 □ 良 □ 中 □ 及格 □ 不及格 二、论文(设计)质量 1、论文(设计)的整体结构是否符合撰写规范? □ 优 □ 良 □ 中 □ 及格 □ 不及格 2、是否完成指定的论文(设计)任务(包括装订及附件)? □ 优 □ 良 □ 中 □ 及格 □ 不及格 三、论文(设计)水平 1、论文(设计)的理论意义或对解决实际问题的指导意义 □ 优 □ 良 □ 中 □ 及格 □ 不及格 2、论文的观念是否有新意?设计是否有创意? □ 优 □ 良 □ 中 □ 及格 □ 不及格 3、论文(设计说明书)所体现的整体水平 □ 优 □ 良 □ 中 □ 及格 □ 不及格 评定成绩:□ 优 □ 良 □ 中 □ 及格 □ 不及格 (在所选等级前的□内画“√”) 教研室主任(或答辩小组组长): (签名) 年 月 日 教学系意见: 系主任: (签名) 年 月 日 学位论文原创性声明 本人郑重声明:所呈交的学位论文,是本人在导师的指导下进行的研究工作所取得的成果。尽我所知,除文中已经特别注明引用的内容和致谢的地方外,本论文不包含任何其他个人或集体已经发表或撰写过的研究成果。对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式注明并表示感谢。本人完全意识到本声明的法律结果由本人承担。 学位论文作者(本人签名): 年 月 日 学位论文出版授权书 本人及导师完全同意《中国博士学位论文全文数据库出版章程》、《中国优秀硕士学位论文全文数据库出版章程》(以下简称“章程”),愿意将本人的学位论文提交“中国学术期刊(光盘版)电子杂志社”在《中国博士学位论文全文数据库》、《中国优秀硕士学位论文全文数据库》中全文发表和以电子、网络形式公开出版,并同意编入****《中国知识资源总库》,在《中国博硕士学位论文评价数据库》中使用和在互联网上传播,同意按“章程”规定享受相关权益。 论文密级: □公开 □保密(___年__月至__年__月)(保密的学位论文在解密后应遵守此 协议 离婚协议模板下载合伙人协议 下载渠道分销协议免费下载敬业协议下载授课协议下载 ) 作者签名:_______ 导师签名:_______ _______年_____月_____日 _______年_____月_____日 独 创 声 明 本人郑重声明:所呈交的毕业设计(论文),是本人在指导老师的指导下,独立进行研究工作所取得的成果,成果不存在知识产权争议。尽我所知,除文中已经注明引用的内容外,本设计(论文)不含任何其他个人或集体已经发表或撰写过的作品成果。对本文的研究做出重要贡献的个人和集体均已在文中以明确方式标明。 本声明的法律后果由本人承担。   作者签名: 二〇一〇年九月二十日   毕业设计(论文)使用授权声明 本人完全了解**学院关于收集、保存、使用毕业设计(论文)的规定。 本人愿意按照学校要求提交学位论文的印刷本和电子版,同意学校保存学位论文的印刷本和电子版,或采用影印、数字化或其它复制手段保存设计(论文);同意学校在不以营利为目的的前提下,建立目录检索与阅览服务系统,公布设计(论文)的部分或全部内容,允许他人依法合理使用。 (保密论文在解密后遵守此规定)   作者签名: 二〇一〇年九月二十日 致 谢 时间飞逝,大学的学习生活很快就要过去,在这四年的学习生活中,收获了很多,而这些成绩的取得是和一直关心帮助我的人分不开的。 首先非常感谢学校开设这个课题,为本人日后从事计算机方面的工作提供了经验,奠定了基础。本次毕业设计大概持续了半年,现在终于到结尾了。本次毕业设计是对我大学四年学习下来最好的检验。经过这次毕业设计,我的能力有了很大的提高,比如操作能力、分析问题的能力、合作精神、严谨的工作作风等方方面面都有很大的进步。这期间凝聚了很多人的心血,在此我表示由衷的感谢。没有他们的帮助,我将无法顺利完成这次设计。 首先,我要特别感谢我的知道***老师对我的悉心指导,在我的论文书写及设计过程中给了我大量的帮助和指导,为我理清了设计思路和操作方法,并对我所做的课题提出了有效的改进方案。***老师渊博的知识、严谨的作风和诲人不倦的态度给我留下了深刻的印象。从他身上,我学到了许多能受益终生的东西。再次对周巍老师表示衷心的感谢。 其次,我要感谢大学四年中所有的任课老师和辅导员在学习期间对我的严格要求,感谢他们对我学习上和生活上的帮助,使我了解了许多专业知识和为人的道理,能够在今后的生活道路上有继续奋斗的力量。 另外,我还要感谢大学四年和我一起走过的同学朋友对我的关心与支持,与他们一起学习、生活,让我在大学期间生活的很充实,给我留下了很多难忘的回忆。 最后,我要感谢我的父母对我的关系和理解,如果没有他们在我的学习生涯中的无私奉献和默默支持,我将无法顺利完成今天的学业。 四年的大学生活就快走入尾声,我们的校园生活就要划上句号,心中是无尽的难舍与眷恋。从这里走出,对我的人生来说,将是踏上一个新的征程,要把所学的知识应用到实际工作中去。 回首四年,取得了些许成绩,生活中有快乐也有艰辛。感谢老师四年来对我孜孜不倦的教诲,对我成长的关心和爱护。 学友情深,情同兄妹。四年的风风雨雨,我们一同走过,充满着关爱,给我留下了值得珍藏的最美好的记忆。 在我的十几年求学历程里,离不开父母的鼓励和支持,是他们辛勤的劳作,无私的付出,为我创造良好的学习条件,我才能顺利完成完成学业,感激他们一直以来对我的抚养与培育。 最后,我要特别感谢我的导师***老师、和研究生助教***老师。是他们在我毕业的最后关头给了我们巨大的帮助与鼓励,给了我很多解决问题的思路,在此表示衷心的感激。老师们认真负责的工作态度,严谨的治学精神和深厚的理论水平都使我收益匪浅。他无论在理论上还是在实践中,都给与我很大的帮助,使我得到不少的提高这对于我以后的工作和学习都有一种巨大的帮助,感谢他耐心的辅导。在论文的撰写过程中老师们给予我很大的帮助,帮助解决了不少的难点,使得论文能够及时完成,这里一并表示真诚的感谢。 致 谢 这次论文的完成,不止是我自己的努力,同时也有老师的指导,同学的帮助,以及那些无私奉献的前辈,正所谓你知道的越多的时候你才发现你知道的越少,通过这次论文,我想我成长了很多,不只是磨练了我的知识厚度,也使我更加确定了我今后的目标:为今后的计算机事业奋斗。在此我要感谢我的指导老师——***老师,感谢您的指导,才让我有了今天这篇论文,您不仅是我的论文导师,也是我人生的导师,谢谢您!我还要感谢我的同学,四年的相处,虽然我未必记得住每分每秒,但是我记得每一个有你们的精彩瞬间,我相信通过大学的历练,我们都已经长大,变成一个有担当,有能力的新时代青年,感谢你们的陪伴,感谢有你们,这篇论文也有你们的功劳,我想毕业不是我们的相处的结束,它是我们更好相处的开头,祝福你们!我也要感谢父母,这是他们给我的,所有的一切;感谢母校,尽管您不以我为荣,但我一直会以我是一名农大人为荣。 通过这次毕业设计,我学习了很多新知识,也对很多以前的东西有了更深的记忆与理解。漫漫求学路,过程很快乐。我要感谢信息与管理科学学院的老师,我从他们那里学到了许多珍贵的知识和做人处事的道理,以及科学严谨的学术态度,令我受益良多。同时还要感谢学院给了我一个可以认真学习,天天向上的学习环境和机会。 即将结束*大学习生活,我感谢****大学提供了一次在**大接受教育的机会,感谢院校老师的无私教导。感谢各位老师审阅我的论文。 毕业设计(论文)原创性声明和使用授权说明 原创性声明 本人郑重承诺:所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。尽我所知,除文中特别加以标注和致谢的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得 及其它教育机构的学位或学历而使用过的材料。对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了谢意。 作 者 签 名:       日  期:        ​​​​​​​​​​​​ 指导教师签名:        日  期:        使用授权说明 本人完全了解 大学关于收集、保存、使用毕业设计(论文)的规定,即:按照学校要求提交毕业设计(论文)的印刷本和电子版本;学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不以赢利为目的前提下,学校可以公布论文的部分或全部内容。 作者签名:        日  期:        ​​​​​​​​​​​​ 学位论文原创性声明 本人郑重声明:所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果。除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。本人完全意识到本声明的法律后果由本人承担。 作者签名: 日期: 年 月 日 学位论文版权使用授权书 本学位论文作者完全了解学校有关保留、使用学位论文的规定,同意学校保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。本人授权      大学可以将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。 涉密论文按学校规定处理。 作者签名: 日期: 年 月 日 导师签名: 日期: 年 月 日 独 创 声 明 本人郑重声明:所呈交的毕业设计(论文),是本人在指导老师的指导下,独立进行研究工作所取得的成果,成果不存在知识产权争议。尽我所知,除文中已经注明引用的内容外,本设计(论文)不含任何其他个人或集体已经发表或撰写过的作品成果。对本文的研究做出重要贡献的个人和集体均已在文中以明确方式标明。 本声明的法律后果由本人承担。   作者签名: 年 月 日   毕业设计(论文)使用授权声明 本人完全了解**学院关于收集、保存、使用毕业设计(论文)的规定。 本人愿意按照学校要求提交学位论文的印刷本和电子版,同意学校保存学位论文的印刷本和电子版,或采用影印、数字化或其它复制手段保存设计(论文);同意学校在不以营利为目的的前提下,建立目录检索与阅览服务系统,公布设计(论文)的部分或全部内容,允许他人依法合理使用。 (保密论文在解密后遵守此规定)   作者签名: 年 月 日 基本要求:写毕业论文主要目的是培养学生综合运用所学知识和技能,理论联系实际,独立分析,解决实际问题的能力,使学生得到从事本专业工作和进行相关的基本训练。毕业论文应反映出作者能够准确地掌握所学的专业基础知识,基本学会综合运用所学知识进行科学研究的方法,对所研究的题目有一定的心得体会,论文题目的范围不宜过宽,一般选择本学科某一重要问题的一个侧面。 毕业论文的基本教学要求是: 1、培养学生综合运用、巩固与扩展所学的基础理论和专业知识,培养学生独立分析、解决实际问题能力、培养学生处理数据和信息的能力。2、培养学生正确的理论联系实际的工作作风,严肃认真的科学态度。3、培养学生进行社会调查研究;文献资料收集、阅读和整理、使用;提出论点、综合论证、总结写作等基本技能。 毕业论文是毕业生总结性的独立作业,是学生运用在校学习的基本知识和基础理论,去分析、解决一两个实际问题的实践锻炼过程,也是学生在校学习期间学习成果的综合性总结,是整个教学活动中不可缺少的重要环节。撰写毕业论文对于培养学生初步的科学研究能力,提高其综合运用所学知识分析问题、解决问题能力有着重要意义。 毕业论文在进行编写的过程中,需要经过开题报告、论文编写、论文上交评定、论文答辩以及论文评分五个过程,其中开题报告是论文进行的最重要的一个过程,也是论文能否进行的一个重要指标。 撰写意义:1.撰写毕业论文是检验学生在校学习成果的重要措施,也是提高教学质量的重要环节。大学生在毕业前都必须完成毕业论文的撰写任务。申请学位必须提交相应的学位论文,经答辩通过后,方可取得学位。可以这么说,毕业论文是结束大学学习生活走向社会的一个中介和桥梁。毕业论文是大学生才华的第一次显露,是向祖国和人民所交的一份有份量的答卷,是投身社会主义现代化建设事业的报到书。一篇毕业论文虽然不能全面地反映出一个人的才华,也不一定能对社会直接带来巨大的效益,对专业产生开拓性的影响。但是,实践证明,撰写毕业论文是提高教学质量的重要环节,是保证出好人才的重要措施。 2.通过撰写毕业论文,提高写作水平是干部队伍“四化”建设的需要。党中央要求,为了适应现代化建设的需要,领导班子成员应当逐步实现“革命化、年轻化、知识化、专业化”。这个“四化”的要求,也包含了对干部写作能力和写作水平的要求。 3.提高大学生的写作水平是社会主义物质文明和精神文明建设的需要。在新的历史时期,无论是提高全族的科学文化水平,掌握现代科技知识和科学管理方法,还是培养社会主义新人,都要求我们的干部具有较高的写作能力。在经济建设中,作为领导人员和机关的办事人员,要写指示、通知、总结、调查报告等应用文;要写说明书、广告、解说词等说明文;还要写科学论文、经济评论等议论文。在当今信息社会中,信息对于加快经济发展速度,取得良好的经济效益发挥着愈来愈大的作用。写作是以语言文字为信号,是传达信息的方式。信息的来源、信息的收集、信息的储存、整理、传播等等都离不开写作。 论文种类:毕业论文是学术论文的一种形式,为了进一步探讨和掌握毕业论文的写作规律和特点,需要对毕业论文进行分类。由于毕业论文本身的内容和性质不同,研究领域、对象、方法、表现方式不同,因此,毕业论文就有不同的分类方法。 按内容性质和研究方法的不同可以把毕业论文分为理论性论文、实验性论文、描述性论文和设计性论文。后三种论文主要是理工科大学生可以选择的论文形式,这里不作介绍。文科大学生一般写的是理论性论文。理论性论文具体又可分成两种:一种是以纯粹的抽象理论为研究对象,研究方法是严密的理论推导和数学运算,有的也涉及实验与观测,用以验证论点的正确性。另一种是以对客观事物和现象的调查、考察所得观测资料以及有关文献资料数据为研究对象,研究方法是对有关资料进行分析、综合、概括、抽象,通过归纳、演绎、类比,提出某种新的理论和新的见解。 按议论的性质不同可以把毕业论文分为立论文和驳论文。立论性的毕业论文是指从正面阐述论证自己的观点和主张。一篇论文侧重于以立论为主,就属于立论性论文。立论文要求论点鲜明,论据充分,论证严密,以理和事实服人。驳论性毕业论文是指通过反驳别人的论点来树立自己的论点和主张。如果毕业论文侧重于以驳论为主,批驳某些错误的观点、见解、理论,就属于驳论性毕业论文。驳论文除按立论文对论点、论据、论证的要求以外,还要求针锋相对,据理力争。 按研究问题的大小不同可以把毕业论文分为宏观论文和微观论文。凡届国家全局性、带有普遍性并对局部工作有一定指导意义的论文,称为宏观论文。它研究的面比较宽广,具有较大范围的影响。反之,研究局部性、具体问题的论文,是微观论文。它对具体工作有指导意义,影响的面窄一些。 另外还有一种综合型的分类方法,即把毕业论文分为专题型、论辩型、综述型和综合型四大类: 1.专题型论文。这是分析前人研究成果的基础上,以直接论述的形式发表见解,从正面提出某学科中某一学术问题的一种论文。如本书第十二章例文中的《浅析领导者突出工作重点的方法与艺术》一文,从正面论述了突出重点的工作方法的意义、方法和原则,它表明了作者对突出工作重点方法的肯定和理解。2.论辩型论文。这是针对他人在某学科中某一学术问题的见解,凭借充分的论据,着重揭露其不足或错误之处,通过论辩形式来发表见解的一种论文。3.综述型论文。这是在归纳、总结前人或今人对某学科中某一学术问题已有研究成果的基础上,加以介绍或评论,从而发表自己见解的一种论文。4.综合型论文。这是一种将综述型和论辩型两种形式有机结合起来写成的一种论文。如《关于中国民族关系史上的几个问题》一文既介绍了研究民族关系史的现状,又提出了几个值得研究的问题。因此,它是一篇综合型的论文。 写作步骤:毕业论文是高等教育自学考试本科专业应考者完成本科阶段学业的最后一个环节,它是应考者的 总结 性独立作业,目的在于总结学习专业的成果,培养综合运用所学知识解决实际 问题 的能力。从文体而言,它也是对某一专业领域的现实问题或 理论 问题进行 科学 研究 探索的具有一定意义的论说文。完成毕业论文的撰写可以分两个步骤,即选择课题和研究课题。 首先是选择课题。选题是论文撰写成败的关键。因为,选题是毕业论文撰写的第一步,它实际上就是确定“写什么”的问题,亦即确定科学研究的方向。如果“写什么”不明确,“怎么写”就无从谈起。 教育部自学考试办公室有关对毕业论文选题的途径和要求是“为鼓励理论与工作实践结合,应考者可结合本单位或本人从事的工作提出论文题目,报主考学校审查同意后确立。也可由主考学校公布论文题目,由应考者选择。毕业论文的总体要求应与普通全日制高等学校相一致,做到通过论文写作和答辩考核,检验应考者综合运用专业知识的能力”。但不管考生是自己任意选择课题,还是在主考院校公布的指定课题中选择课题,都要坚持选择有科学价值和现实意义的、切实可行的课题。选好课题是毕业论文成功的一半。 第一、要坚持选择有科学价值和现实意义的课题。科学研究的目的是为了更好地认识世界、改造世界,以推动社会的不断进步和发展 。因此,毕业论文的选题,必须紧密结合社会主义物质文明和精神文明建设的需要,以促进科学事业发展和解决现实存在问题作为出发点和落脚点。选题要符合科学研究的正确方向,要具有新颖性,有创新、有理论价值和现实的指导意义或推动作用,一项毫无意义的研究,即使花很大的精力,表达再完善,也将没有丝毫价值。具体地说,考生可从以下三个方面来选题。首先,要从现实的弊端中选题,学习了专业知识,不能仅停留在书本上和理论上,还要下一番功夫,理论联系实际,用已掌握的专业知识,去寻找和解决工作实践中急待解决的问题。其次,要从寻找科学研究的空白处和边缘领域中选题,科学研究。还有许多没有被开垦的处女地,还有许多缺陷和空白,这些都需要填补。应考者应有独特的眼光和超前的意识去思索,去发现,去研究。最后,要从寻找前人研究的不足处和错误处选题,在前人已提出来的研究课题中,许多虽已有初步的研究成果,但随着社会的不断发展,还有待于丰富、完整和发展,这种补充性或纠正性的研究课题,也是有科学价值和现实指导意义的。 第二、要根据自己的能力选择切实可行的课题。毕业论文的写作是一种创造性劳动,不但要有考生个人的见解和主张,同时还需要具备一定的客观条件。由于考生个人的主观、客观条件都是各不相同的,因此在选题时,还应结合自己的特长、兴趣及所具备的客观条件来选题。具体地说,考生可从以下三个方面来综合考虑。首先,要有充足的资料来源。“巧妇难为无米之炊”,在缺少资料的情况下,是很难写出高质量的论文的。选择一个具有丰富资料来源的课题,对课题深入研究与开展很有帮助。其次,要有浓厚的研究兴趣,选择自己感兴趣的课题,可以激发自己研究的热情,调动自己的主动性和积极性,能够以专心、细心、恒心和耐心的积极心态去完成。最后,要能结合发挥自己的业务专长,每个考生无论能力水平高低,工作岗位如何,都有自己的业务专长,选择那些能结合自己工作、发挥自己业务专长的课题,对顺利完成课题的研究大有益处。 致 谢 这次论文的完成,不止是我自己的努力,同时也有老师的指导,同学的帮助,以及那些无私奉献的前辈,正所谓你知道的越多的时候你才发现你知道的越少,通过这次论文,我想我成长了很多,不只是磨练了我的知识厚度,也使我更加确定了我今后的目标:为今后的计算机事业奋斗。在此我要感谢我的指导老师——***老师,感谢您的指导,才让我有了今天这篇论文,您不仅是我的论文导师,也是我人生的导师,谢谢您!我还要感谢我的同学,四年的相处,虽然我未必记得住每分每秒,但是我记得每一个有你们的精彩瞬间,我相信通过大学的历练,我们都已经长大,变成一个有担当,有能力的新时代青年,感谢你们的陪伴,感谢有你们,这篇论文也有你们的功劳,我想毕业不是我们的相处的结束,它是我们更好相处的开头,祝福你们!我也要感谢父母,这是他们给我的,所有的一切;感谢母校,尽管您不以我为荣,但我一直会以我是一名农大人为荣。 通过这次毕业设计,我学习了很多新知识,也对很多以前的东西有了更深的记忆与理解。漫漫求学路,过程很快乐。我要感谢信息与管理科学学院的老师,我从他们那里学到了许多珍贵的知识和做人处事的道理,以及科学严谨的学术态度,令我受益良多。同时还要感谢学院给了我一个可以认真学习,天天向上的学习环境和机会。 即将结束*大学习生活,我感谢****大学提供了一次在**大接受教育的机会,感谢院校老师的无私教导。感谢各位老师审阅我的论文。 _1234567891.unknown _1234567893.unknown _1234567894.unknown _1234567892.unknown _1234567890.unknown
本文档为【基于单片机的万年历设计课程设计】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: ¥11.9 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
不系舟红枫
从教近30年,经验丰富,教学水平较高
格式:doc
大小:1MB
软件:Word
页数:66
分类:工学
上传时间:2019-01-23
浏览量:54