单片机万年历DS12C887实现程序

合集下载

DS12C887与单片机制作万年历带汇编程序

DS12C887与单片机制作万年历带汇编程序

;**************************************;DS12C887:1脚MOT 接VCC(按MOTO时序); 4~11脚总线接89C2051(对应P1.0~P1.7脚); 13脚CS 接P3.2; 14脚AS 接P3.3; 15脚RW 接P3.5; 17脚DS 接P3.7; 18脚RESET 接VCC; 19~23脚悬空;74HC595:11脚SRCLK 时钟接P3.4; 12脚RCLK 副时钟与SRCLK 电平相反接P3.0; 13脚允许端高电平禁止,但数据可传入并锁存,可等所有位写入数据后允许输出,可改善显示; 14脚SER 数据接P3.1;74HC14P:六反相器,用于单片机P口输出缓冲,提高抗干扰能力;**************************************org 0000hacall delay1T_SEC EQU 40H ;存秒T_MIN EQU 41H ;存分T_HOUR EQU 42H ;存时T_WEEK EQU 43H ;存星期T_DAY EQU 44H ;存日T_MON EQU 45H ;存月T_YEAR EQU 46H ;存年CS EQU p3.2 ;片选低有效AS EQU p3.3 ;地址锁存,下降沿有效RW EQU p3.5 ;低电平写,高电平读DSRD EQU p3.7 ;低电平写,高电平读KEY EQU p3.4mov p1,#0ffhmov p3,#0ffhmov r0,#3Dh ;位值暂存(31~3Dh)mov r3,#8 ;字节传输(8段)mov r4,#13 ;LED 位数传输(13位)MIAO:star: ;初始化芯片MOV B,#0BH ;芯片内B控制器SET位为1,停止芯片MOV A,#82HACALL WADMOV B,#0AH ;芯片内A控制器MOV A,#0A0HACALL WADMOV B,#0CHMOV A,#00HACALL WADMOV B,#0DHACALL RDT;===============================MOV B,#00H ;秒MOV A,#30HACALL WADMOV B,#02H ;分MOV A,#51HACALL WADMOV B,#04H ;时MOV A,#20HACALL WADMOV B,#06H ;周MOV A,#02H ;置时间初值ACALL WADMOV B,#07H ;日MOV A,#11HACALL WADMOV B,#08H ;月MOV A,#11HACALL WADMOV B,#09H ;年MOV A,#08HACALL WAD;================================MOV B,#0AHMOV A,#020HACALL WADMOV B,#0BH ;启动芯片MOV A,#02HACALL WAD;=====================MOV B,#0AH ;A控制器ACALL RDT ;该段有效时芯片不能更新时间初值JB ACC.7,MIAO ;但可以手动复位单片机进行更新;=====================MOV B,#00H ;读秒寄存器ACALL RDTMOV 78H,ALCALL DELAY1 ;解决闪烁问题,但每秒出现闪烁MOV B,#00H ;读秒寄存器ACALL RDTCJNE A,78H,XAJMP MIAO;===================== X: MOV 60H,AANL 60H,#0FHSWAP AANL A,#0FHMOV 3DH,60HMOV 3CH,AFEN:MOV B,#02H ;读分寄存器ACALL RDTMOV 60H,AANL 60H,#0FHSWAP AANL A,#0FHMOV 3BH,60HMOV 3AH,ASHI:MOV B,#04H ;读时寄存器ACALL RDTMOV 60H,AANL 60H,#0FHSWAP AANL A,#0FHMOV 39H,60HMOV 38H,AZHOU:MOV B,#06H ;读周寄存器ACALL RDTMOV 60H,AANL 60H,#0FHMOV 37H,60HRII:MOV B,#07H ;读日寄存器ACALL RDTMOV 60H,AANL 60H,#0FHSWAP AANL A,#0FHMOV 36H,60HMOV 35H,AYUE:MOV B,#08H ;读月寄存器ACALL RDTMOV 60H,AANL 60H,#0FHSWAP AANL A,#0FHMOV 34H,60HMOV 33H,ANIAN:MOV B,#09H ;读年寄存器ACALL RDTMOV 60H,AANL 60H,#0FHSWAP AANL A,#0FHMOV 32H,60HMOV 31H,AACALL DISPACALL DELAY1AJMP MIAOWAD: ;时钟芯片写地址MOV P3,#0FFHMOV P1,B ;送地址CLR CS ;片选有效低电平CLR RW ;低电平为写前半期CLR DSRDACALL DELAYCLR AS ;下降沿锁存地址BSETB DSRDACALL DELAY ;延时大于5uSMOV P1,A ;送数据CLR DSRDNOPCLR CSRETRDT: ;从芯片读数据MOV P3,#0FFHMOV P1,B ;送地址CLR CS ;片选有效低电平CLR RW ;低电平为写前半期CLR DSRDACALL DELAYCLR AS ;下降沿锁存地址BMOV P1,#0FFHSETB RWSETB DSRDNOPMOV A,P1NOPCLR CSRETdisp: m ov a,@r0mov dptr,#tabmovc a,@a+dptrdisp1: clr crlc amov p3.1,c ;数据,高低电平值clr p3.0setb p3.4CLR P3.4 ;时钟,下降沿有效setb p3.0djnz r3,disp1dec r0mov r3,#8djnz r4,dispmov p3,#0ffhMOV R0,#3DHMOV R4,#13retdelay: mov r5,#1loop: mov r6,#3djnz r6,$djnz r5,loopretdelay1: mov r5,#200loop1: mov r6,#200LOOP2: MOV R7,#1DJNZ R7,$djnz r6,LOOP2djnz r5,loop1rettab: db 3h,9fh,25h,0dh,99h,49h,41h,1fh,1h,9h end。

基于DS12C887时钟芯片的多功能万年历设计概要

基于DS12C887时钟芯片的多功能万年历设计概要

一、系统的结构和工作原理 1.系统结构此次课程设计的万年历,以AT89S52单片机为主控核心,由LCD 显示屏、DS12C887时钟芯片、温度传感器DS18B20、蜂鸣器、功能键盘、复位电路、晶振、电源模块等组成,系统结构框图如图1所示。

AT89S52单片机温度传感器DS18B20DS12C887时钟芯片LCD 显示屏(1602)蜂鸣器复位电路功能键盘电源模块图1 系统结构框图2.工作原理主控制器每隔一段时间(小于一秒钟)读一次时钟芯片的内部寄存器的值,将读出的时间、星期、温度等值实时显示在LCD 液晶屏上。

同时,主控制器不断的扫描按键电路和温度测量电路,当有按键按下时,识别出按键的值并调整相应的时间、星期值再写入时钟芯片内部。

温度数据由测量电路获得的环境温度值送人显示电路。

二、硬件设计1.主控核心—AT89S52单片机AT89S52是一个低功耗,高性能CMOS8位单片机,具有8K 在系统可编程Flash 存储器。

采用ATMEL 公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构。

2.DS12C887时钟电路DS12C887与计算机常用的时钟芯片MC146818和DS12887管脚兼容,可直接替换。

采用DS12C887芯片设计的时钟电路无需任何外围电路和器件,并且有良好的微机接口。

DS12C887芯片内有微功耗,外围接口简单,精度高,工作稳定可靠等优点,广泛用于各种需要较高精度的实时时钟系统中。

DS12C887主要功能如下:(1)内含一个锂电池,断电后运行十年以上不丢失数据; (2)计秒、分、时、天、星期、日、月、年、并有闰年补偿功能;(3)二进制数码或BCD 码表示时间,日历和定闹;(4)12小时或24小时制,12小时时钟模式带有PM 和AM 指示,有夏令时功能; (5)Motorola 和Intel 总线时序选择;(6)有128个字节RAM 单元与软件接口,其中14个字节作为时钟和控制寄存器,114 字节为通用RAM ,所有RAM 单元数据都具有掉电保护功能; (7)可编程方波信号输出;(8)中断信号输出(IRQ )和总线兼容、定闹中断、周期性中断、时钟更新周期、结束 中断可分别由软件屏蔽,也可分别进行测试; DS12C887时钟芯片和单片机的硬件连接如下图2 :EA/VPP 31XTAL119XTAL218RESET 9P3.7/RD 17P3.6/WR 16P3.2/INT012P3.3/INT113P3.4/T014P3.5/T115P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78P0.039P0.138P0.237P0.336P0.435P0.534P0.633P0.732P2.021P2.122P2.223P2.324P2.425P2.526P2.627P2.728PSEN 29ALE/PROG 30P3.1/TXD 11P3.0/RXD 10VCC 40GND 20U1AT89S52VCC+C1210u FR910KS17Y112MHzC930p FC1030p FP00P01P02P03P04P05P06P07VCCP20P21P22P23P24P25P27P26P10P11P12P04P13P14P15P16P00P17P01P32P02P30P03P31P05P33P06P34P07P35P20P35WR P37P32P34242322212019181716151413121110987654321DS12C887CSASR/WNCDSRESETIRQNCNCNCSQWVCCGND AD7AD6AD5AD4AD3AD2AD1AD0NC MOT NC 123456789RP1RESPACKVCCU3P36P37图2 DS12C887与单片机的连接3.DS18B20温度传感器采用数字式温度传感器DS18B20,其仅需一条数据线进行数据传输,易于与单片机连接,可以去除A/D 模块,降低硬件成本,简化系统电路。

新型时钟日历芯片DS12C887的应用设计

新型时钟日历芯片DS12C887的应用设计

收 稿 日期 :0 0 0 — 2 2 1- 7 0
W Wed.n 2 1.2 电 子 元 嚣 件 焘 硐 2 W . ac 0 01 c 1
第 1卷 2
第 l 期 2
电 手 元 器 件 主 用
Elcr ni mp ne t& De ie App iai n e to cCo o n vc lc to s
杨 伟 强 张振 东 ,张 朋 ’ , ,刘 炳翔
(. 海理 工 大学 汽车 工程研 究所 ,上 海 2 0 9 ; 1上 0 0 3
2 上 海 由 乐电子 有 限公 司 ,上海 2 10 ) . 0 19
摘 要 : 介 绍 了 时 钟 日 历 芯 片 D 1 C 8 S 2 8 7的 主 要 功 能 、特 点 和 内部 地 址 分 布 . 给 出 了
◇ 可 用 二 进 制 或 B D码 表 示 日历 和 闹 钟 信 C 息:
MO 引 脚接 地 ,以选 用MO O O A 线 时序 。本 T TR L总
设 计 把 D 1 C 8 的 R M作 为 C 0 1 0 0 t 存 储 S2 87 A 85 F 2 # 部 ,
器 进 行 读 写 , 因而 程 序 简单 ,指 令 执 行 时 间 短 。
◇ 可 编程 方波 输 出 :
◇ 总线 兼 容 中断 f Q ; I ) R
◇ 具有 三 种可 编程 中断 。 D 1 C 8 实 时 时 钟 日历 芯 片 的地 址 分 布 如 S 2 87
图 1 示 , 芯 片 内 部 的 所 有 地 址 都 包 括 1 3 节 的 所 1字
芯 片 ,该 芯 片功 能 多 、可 靠性 高 ,使 用 简单 。通 过D 1 C 8 的 寄存 器 读 写 ,可 以很 容 易 的 获 取 S287 时间 信息 。因此 ,此 芯 片 在各 种设 备 、家 电 、仪

基于单片机的电子万年历的设计与制作

基于单片机的电子万年历的设计与制作

郑州航空工业管理学院毕业论文(设计)题目基于单片机的电子万年历的设计与制作二О一三年五月二十三日摘要单片机应用技术飞速发展,从导弹的导航装置到飞机上各种仪表的控制,从计算机的网络通讯与数据传输到工业自动化过程的实时控制和数据处理,以及生活中广泛使用的各种智能IC卡、电子宠物等,这些都离不开单片机。

单片机是集CPU、RAM、ROM 、定时、计数和多种接口于一体的微控制器。

它体积小,成本低,功能强,广泛应用于智能产业和工业自动化上。

本文通过对一个基于单片机的能实现万年历功能电子时钟的设计,系统由主控制器STC89C52为控制中心,DS12C887产生时钟,DS18B20产生温度,12864液晶显示对日期、时间等进行显示,按键可以设置时间、闹钟等。

能实现时钟、日历、时间和温度显示的功能。

今后万年历将会朝着精准度更高,外观更加美丽,价格更加实惠的方向发展,并且将会出现更多的辅助功能。

关键词:单片机,农历查询,万年历,温度显示ABSTRACTAs the rapid development of Single-chip Microcomputer Application technology, from the navigation device of missile to the various instruments on the aircraft control and from computer communication network and data transmission to industrial real-time automation process control and data processing, as well as the extensive use of the smart card and electronic pets in live, All of this is inseparable from the microcontroller. SCM is set to CPU, RAM, ROM, timing, counting and multiple interfaces in one microcontroller. It has the advantages of small volume, low cost, strong function, widely used in smart industries, and industrial automation.This paper designed a electronic clock which can achieve calendar function based on microcontroller, the system consists of main controller STC89C52, clock circuit, display circuit, DS12C887circuit, and a reset circuit components,the main control system as the control center, DS12C887 generates a clock, DS18B20 generates temperature, a 12864 LCD display the date and time, the key can set the time, alarm clock, achieved the clock calendar and time display function.In the future, the calendar will be more accurate, look more beautiful; more affordable prices of the direction of development, and will appear more auxiliary function.Keywords: Monolithic single-chip,lunar calendar demand, perpetual calendars display temperature目录摘要 (I)ABSTRACT (II)第1章绪论 (1)1.1 课题的背景 (1)1.2 电子万年历的发展 (1)1.3 电子万年历设计 (1)第2章设计要求与方案论证 (3)2.1 设计要求 (3)2.2 方案论证 (3)2.2.1 控制部分方案设计 .......................................... .32.2.2 显示部分的设计 ........................................... ..42.2.3 单片机芯片的选择方案和论证 (4)2.2.4 时钟芯片的选择方案和论证 (4)2.2.5 温度传感器的选择方案和论证 (5)2.2.6 电源的选择方案 (5)第3章硬件设计 (6)3.1 电路的设计框图 (6)3.2 主要单元电路的设计 (6)3.2.1 单片机主控电路设计 (6)3.2.2 时钟振荡电路设计 (8)3.2.3 复位电路设计 (9)3.2.4 温度传感器电路设计 (9)3.2.5 时钟电路设计 (12)3.2.6 显示电路设计 (13)3.2.7 按键电路设计 (16)3.2.8 报警电路设计 (16)第4章软件设计 (17)4.1 程序流程图 (17)4.1.1 主程序流程 (17)4.1.2 时间调整程序流程图 (18)4.1.3 时钟芯片读写程序流程 (20)4.1.4 温度测量元件控制程序流程 (20)4.1.4 公历转换成农历的基本原理 (21)4.2 操作与调试 (22)4.2.1 软件调试 (22)4.2.2 万年历实物 (23)总结与展望 (26)致谢 (27)参考文献 (28)附录一:系统硬件原理图 (29)附录二:元器件清单 (30)附录三:设计程序 (31)第1章绪论1.1 课题的背景随着社会的发展和科技水平的提高,人类获得和计算时间的方法,历经观天阳、摆钟到现在电子钟,经过不断发展和创新,计时的精度越来越准确。

毕业设计---基于单片机的多功能电子万年历的设计

毕业设计---基于单片机的多功能电子万年历的设计

基于单片机的多功能电子万年历的设计摘要随着科技的快速发展,自从观太阳、摆钟到现在电子钟,人类不断研究,不断创新纪录。

本文主要介绍了基于单片机的智能电子万年历的研制,该万年历能够实时显示公历年、月、日、时、分、秒,以及对应的农历日期、24节气、天干地支、闹铃功能,同时还能够实时测取环境温度。

本系统的硬件部分主要由A VR单片机、时钟芯片、温度传感器等部件组成,文中给出了详细的硬件设计实现及相关电路图;软件部分主要包含公历转农历的算法设计模块、显示模块、时间的读取、温度的检测模块,按键的扫描输入模块等,文中给出了系统的软件程序流程图及各功能模块的软件程序清单,最后介绍了整体系统的设计实现、仿真及调试过程,给出了下一步的改进方案等。

关键词:单片机;液晶技术;万年历;时钟芯片Design of Multifunctional digital Perpetual Calendar Based on MCUAbstractWith the development of technology,Since the concept of the sun, Baizhong, andnow the electronic bell,human beings continue to study and constant innovation record。

This paper-based Microcontroller Development of Intelligent electronic calendar, The calendar can display real-time in the calendar year, month, day, hours, minutes and seconds,a nd the correspond ing date of the Lunar New Year, 24 Solar Terms,at the same time also to real-time measurement from the ambient temperature,In addition to the user through the keyboard input years of history,for the correspond ing period of the Lunar.The system hardware from some of the major A VR microcontroller, a number of digital control, decoder, the clock chip,temperature sensors and other components,the paper gives a detailed design and implementation of hardware and related circuit;Software contains some of the major Lunar calendar to the algorithm design module,dynamic digital display modules,time to read,temperature detection module,Press enter the scanning module.In this paper, the system software modules and flow chart of the list of software programs,Finally, the realization of the overall system design, simulation and debugging process, the next step is the improvement programmes.Keywords:MCU;crystal technology;Calendar;Clock chip目录引言 (1)第1章绪论 (2)1.1课题的背景与意义 (2)1.2 数字万年历的现状与发展 (2)1.3 论文的主要工作及章节安排 (3)1.4 本章小结 (3)第2章方案论证比较.............................................................................. (4)2.1 多功能数字万年历系统概述 (4)2.2计时方案 (4)2.3温度检测方案 (5)2.4显示方案 (5)2.5本章小结 (5)第3章系统硬件设计 (6)3.1 主控制器ATmega16 单片机介绍 (6)3.2 时钟电路DS1302 (6)3.3 温度检测DS18B20 (7)3.4 动态显示 (8)3.5 键盘接口 (8)3.6 语音闹铃模块 (8)3.7 电源设计 (9)3.8本章小结 (11)第4章系统软件设计 (12)4.1 公历计算显示程序设计 (13)4.1.1 DS1302 内部寄存器 (13)4.1.2 时间读取程序设计 (15)4.2 农历转换程序设计 (16)4.2.1 公历转农历算法研究 (16)4.2.2 干支纪年简介 (18)4.2.3 公历转农历程序 (18)4.3 温度测量程序设计 (20)4.3.1 DS18B20 的测温原理 (20)4.3.2 温度程序 (21)4.4 二十四节气算法研究 (23)4.5系统仿真 (24)4.6本章小结 (25)结论与展望 (26)致谢 (27)参考文献 (28)附录 A 电子万年历原理图 (29)附录 B 外文文献与译文 (30)英文原文: (30)中文译文: (33)附录 C 参考文献题录及摘要 (35)附录 D 电子万年历源程序 (37)插图清单图2-1 数字万年历系统框图 (4)图3-1 DS1302与ATmega16连接图 (7)图3-2 DS18B20与AtMEGA16连接图 (8)图3-3 报时电路 (9)图3-4 稳压电源原理图 (10)图3-5 电源电路 (10)图4-1 系统程序流程图 (13)图4-2 公历程序流程图 (14)图4-3 DS18B20测温原理 (21)表格清单表3-1 LCD12864显示内容 (8)表4-1 DS1302的寄存器及其控制字 (14)表4-2 RS位配置 (15)引言人类的日常生活离不开时间,任何具有周期性变化的自然现象都可以用来测量时间。

基于DS12C887时钟芯片的电子万年历设计

基于DS12C887时钟芯片的电子万年历设计

基于DS12C887时钟芯片的电子万年历设计作者:徐锦铜康晴茜来源:《丝路视野》2018年第31期【摘要】本文阐述了一种基于DS12C887时钟芯片的电子万年历软硬件设计方法,使用proteus软件设计和绘制了电子万年历的电路连接图,并通过1602液晶屏显示时钟信息,验证了电子万年历电路及其程序设计的正确性,并给出了部分C程序代码。

【关键词】DS12C887;时钟芯片;单片机在需要时间信息的电路设计中,设计人员通常采用时钟芯片获取时间信息。

目前,市场中的时钟芯片种类多样,比如DS12C887、PCF8485、SB2068、DS1302等。

其中DS12C887具有价格低、功耗小、易操作等优点,本文选用DS12C887作为设计电子万年历的时钟芯片。

一、电路连接电路原理图如图1所示,主要包括AT89C52单片机、DS12C887、1602液晶屏和3个独立按键等元器件,通过仿真,从图1中可以看到日历信息是2018年9月12日,星期三,17点16分3秒,说明本文设计的电子万年历软硬件设计正确,功能正常。

(一)DS12C887介绍及其与单片机的接口电路DS12C887是DALLAS公司推出的涓流充电时钟芯片,可计时到2100年前的年、月、日、时、分、秒、星期七种日历时间信息并自带闰年补偿功能;自带晶体振荡器并内置锂电池,在没有外部电源的情况下可工作长达10年之久;有12小时制和24小时制两种计时模式。

其中在12小时制模式中,用A.M.和RM.区分上午和下午;可选用夏令时模式;时间表示方法有两种:一种用二进制数表示,一种用BCD码表示;内部带有128字节RAM,其中11字节用来存储时间信息,4字节RAM用来存储DS12C887的控制信息,113字节RAM供用户使用;数据/地址总线复用,具有MOTOROLA和INTEL两种总线时序,本文在设计时采用的是INTEL总线。

下面阐述DS12C887的电路连接问题:DS12C887一共有24个管脚,其中6个管脚为NC (悬空管脚,不连接),有效管脚为18个。

基于51单片机和DS12C887时钟芯片的c语言程序

基于51单片机和DS12C887时钟芯片的c语言程序

基于51单片机和DS12C887时钟芯片的c语言程序代码1:#include<reg52.h>#include<define.h>void delay(uint z)//延时函数{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void di() //蜂鸣器报警声音{beep=0;delay(100);beep=1;}void write_com(uchar com){//写液晶命令函数rs=0;lcden=0;P0=com;delay(3);lcden=1;delay(3);lcden=0;}void write_date(uchar date){//写液晶数据函数rs=1;lcden=0;P0=date;delay(3);lcden=1;delay(3);lcden=0;}void init(){//初始化函数uchar num;EA=1;//打开总中断EX1=1;//开外部中断1IT1=1;//设置负跳变沿触发中断flag1=0;//变量初始化t0_num=0;s1num=0;week=1;dula=0;//关闭数码管显示wela=0;lcden=0;rd=0;/*以下几行在首次设置DS12C887时使用,以后不必再写入write_ds(0x0A,0x20);//打开振荡器write_ds(0x0B,0x26);//设置24小时模式,数据二进制格式//开启闹铃中断set_time();//设置上电默认时间-----------------------------------------------------*/write_com(0x38);//1602液晶初始化write_com(0x0c);write_com(0x06);write_com(0x01);write_com(0x80);for(num=0;num<15;num++)//写入液晶固定部分显示{write_date(table[num]);delay(1);}for(num=0;num<11;num++){write_date(table1[num]);delay(1);}}void write_sfm(uchar add,char date){//1602液晶刷新时分秒函数4为时,7为分,10为秒char shi,ge;shi=date/10;ge=date%10;write_com(0x80+0x40+add);write_date(0x30+shi);write_date(0x30+ge);}void write_nyr(uchar add,char date){//1602液晶刷新年月日函数3为年,6为分,9为秒char shi,ge;shi=date/10;ge=date%10;write_com(0x80+add);write_date(0x30+ge);}void write_week(char we){//写液晶星期显示函数write_com(0x80+12);switch(we){case 1: write_date('M');delay(5);write_date('O');delay(5);write_date('N');break;case 2: write_date('T');delay(5);write_date('U');delay(5);write_date('E');break;case 3: write_date('W');delay(5);write_date('E');delay(5);write_date('D');break;case 4: write_date('T');delay(5);write_date('H');delay(5);write_date('U');break;case 5: write_date('F');delay(5);write_date('R');delay(5);write_date('I');break;case 6: write_date('S');delay(5);write_date('A');delay(5);write_date('T');break;case 7: write_date('S');delay(5);write_date('U');delay(5);write_date('N');break;}}void keyscan(){if(flag_ri==1){//这里用来取消闹钟报警,任一键取消报警if((s1==0)||(s2==0)||(s3==0)||(s4==0)){delay(5);if((s1==0)||(s2==0)||(s3==0)||(s4==0)){while(!(s1&&s2&&s3&&s4));di();flag_ri=0;//清除报警标志}}}if(s1==0)//检测S1{delay(5);if(s1==0){s1num++;//记录按下次数if(flag1==1)if(s1num==4)s1num=1;flag=1;while(!s1);di();switch(s1num){//光标闪烁点定位case 1: write_com(0x80+0x40+10);write_com(0x0f);break;case 2: write_com(0x80+0x40+7);break;case 3: write_com(0x80+0x40+4);break;case 4: write_com(0x80+12);break;case 5: write_com(0x80+9);break;case 6: write_com(0x80+6);break;case 7: write_com(0x80+3);break;case 8: s1num=0;write_com(0x0c);flag=0;write_ds(0,miao);write_ds(2,fen);write_ds(4,shi);write_ds(6,week);write_ds(7,day);write_ds(8,month);write_ds(9,year);break;}}}if(s1num!=0)//只有当S1按下后,才检测S2和S3 {if(s2==0){delay(1);if(s2==0){while(!s2);di();switch(s1num){//根据功能键次数调节相应数值case 1: miao++;if(miao==60)miao=0;write_sfm(10,miao);write_com(0x80+0x40+10);break;case 2: fen++;if(fen==60)fen=0;write_sfm(7,fen);write_com(0x80+0x40+7);break;case 3: shi++;if(shi==24)shi=0;write_sfm(4,shi);write_com(0x80+0x40+4);break;case 4: week++;if(week==8)week=1;write_week(week);write_com(0x80+12);break;case 5: day++;if(day==32)day=1;write_nyr(9,day);write_com(0x80+9);break;case 6: month++;if(month==13)month=1;write_nyr(6,month);write_com(0x80+6);break;case 7: year++;if(year==100)year=0;write_nyr(3,year);write_com(0x80+3);break;}}}if(s3==0){delay(1);if(s3==0){while(!s3);di();switch(s1num){//根据功能键次数调节相应数值case 1: miao--;if(miao==-1)miao=59;write_sfm(10,miao);write_com(0x80+0x40+10);break;case 2: fen--;if(fen==-1)fen=59;write_sfm(7,fen);write_com(0x80+0x40+7);break;case 3: shi--;if(shi==-1)shi=23;write_sfm(4,shi);write_com(0x80+0x40+4);break;case 4: week--;if(week==0)week=7;write_week(week);write_com(0x80+12);break;case 5: day--;if(day==0)day=31;write_nyr(9,day);write_com(0x80+9);break;case 6: month--;if(month==0)month=12;write_nyr(6,month);write_com(0x80+6);break;case 7: year--;if(year==-1)year=99;write_nyr(3,year);write_com(0x80+3);break;}}}}if(s4==0)//检测S4{delay(5);if(s4==0){flag1=~flag1;while(!s4);di();if(flag1==0){//退出闹钟设置时保存数值flag=0;write_com(0x80+0x40);write_date(' ');write_date(' ');write_com(0x0c);write_ds(1,miao);write_ds(3,fen);write_ds(5,shi);}else{//进入闹钟设置read_alarm();//读取原始数据miao=amiao;//重新赋值用以按键调节fen=afen;shi=ashi;write_com(0x80+0x40);write_date('R');//显示标志write_date('i');write_com(0x80+0x40+3);write_sfm(4,ashi);//送液晶显示闹钟时间write_sfm(7,afen);write_sfm(10,amiao);}}}}void write_ds(uchar add,uchar date){//写12C887函数dsas=1;dsds=1;dsrw=1;P0=add;//先写地址dsas=0;dsrw=0;P0=date;//再写数据dsrw=1;dsas=1;dscs=1;}uchar read_ds(uchar add) {//读12C887函数uchar ds_date;dsas=1;dsds=1;dsrw=1;dscs=0;P0=add;//先写地址dsas=0;P0=0xff;ds_date=P0;//再读数据dsds=1;dsas=1;dscs=1;return ds_date;}/*---首次操作12C887时给予寄存器初始化--- void set_time(){//首次上电初始化时间函数write_ds(0,0);write_ds(1,0);write_ds(2,0);write_ds(3,0);write_ds(4,0);write_ds(5,0);write_ds(6,0);write_ds(7,0);write_ds(8,0);write_ds(9,0);}----------------------------------------*/void read_alarm(){//读取12C887闹钟值amiao=read_ds(1);afen=read_ds(3);ashi=read_ds(5);}void main()//主函数{init();//调用初始化函数while(1){keyscan();//按键扫描if(flag_ri==1)//当闹钟中断时进入这里{di();delay(100);di();delay(500);}if(flag==0&&flag1==0)//正常工作时进入这里{keyscan();//按键扫描year=read_ds(9);//读取12C887数据month=read_ds(8);day=read_ds(7);week=read_ds(6);shi=read_ds(4);fen=read_ds(2);miao=read_ds(0);write_sfm(10,miao);//送液晶显示write_sfm(7,fen);write_sfm(4,shi);write_week(week);write_nyr(3,year);write_nyr(6,month);write_nyr(9,day);}}}void exter() interrupt 2//外部中断1服务程序{ uchar c; //进入中断表示闹钟时间到,flag_ri=1; //设置标志位,用以大程序中报警提示c=read_ds(0x0c);//读取12C887的C寄存器表示响应了中断}代码2:#include<reg52.h>#include"shijian.h"/**********************模式选择*******************/ void keyscan1(){if(s4==0);{delay(5);if(s4==0){s4num++;while(!s4);switch(s4num){case 1:flag1=~flag1;if(flag1==1) //打铃时间间隔设置标志位(防止在设置时显示时间){ //把闹铃的寄存器作为打铃的寄存器使用read_alarm(); //先读取闹铃时间miao=amiao; //在把闹铃值赋给时间值用以调节fen=afen;shi=ashi;write_com(0x80+0x40);write_date('R'); //显示标志write_date('i');write_com(0x80+0x40+3);display(0x40+4,ashi); //显示间隔时间display(0x40+7,afen);display(0x40+10,amiao);}break;/************************************/case 2:flag1=~flag1;if(flag1==0) //清除标志位{flag=0;write_com(0x80+0x40);write_date(' '); //清除打铃时间间隔标志位write_date(' ');write_com(0xc0);write_ds(1,miao); //储存间隔时间write_ds(3,fen);write_ds(5,shi);}/***********************/flag_paobiao=~flag_paobiao;miao_pb=0; //先把跑表值都赋为0 fen_pb=0;tt=0;while(!s2);if(flag_paobiao==1){init_paobiao();}/************************************/break;case 3:flag_paobiao=~flag_paobiao;if(flag_paobiao==0){write_com(0x80+0x40);write_date(' ');write_date(' ');}/************************************/flag2=~flag2;if(flag2==1){miao=miaonz1; //把闹铃值赋给时间值用来调整闹铃fen=fennz1;shi=shinz1;write_com(0x80+0x40);write_date('N');write_date('Z');write_date('1');write_com(0x80+0x40+3);display(0x40+4,shinz1);display(0x40+7,fennz1);display(0x40+10,miaonz1);}break;/************************************/case 4:flag2=~flag2;if(flag2==0){miaonz1=miao; //把调整好的时间值赋回给闹铃值(保存闹铃值)fennz1=fen;shinz1=shi;flag=0;write_com(0x80+0x40);write_date(' ');write_date(' ');write_date(' ');}/***********************************/ flag21=~flag21;if(flag21==1){miao=miaonz2;fen=fennz2;shi=shinz2;write_com(0x80+0x40);write_date('N');write_date('Z');write_date('2');write_com(0x80+0x40+3);display(0x40+4,shinz2);display(0x40+7,fennz2);display(0x40+10,miaonz2);delay(5);}break;/************************************/ case 5:flag21=~flag21;if(flag21==0){miaonz2=miao;fennz2=fen;shinz2=shi;flag=0;write_com(0x80+0x40);write_date(' ');write_date(' ');write_date(' ');}/***********温湿度*************/flag22=~flag22;if(flag22==1){write_com(0x80);write_date('W');write_date(':');write_date(' ');write_date(' ');write_date('.');write_date(' ');write_date(' ');write_date(' ');write_date('S');write_date(':');write_date(' ');write_date(' ');write_date('.');tempval=measure_T();humival=measure_H();if(error==0){delayms(500);dis_tempval=c_T(tempval);disply_T(dis_tempval);dis_humival=c_H(dis_tempval,humival);disply_H(dis_humival);}}break;/******************************************/ case 6:flag22=~flag22;if(flag22==0){write_com(0x80);write_date(' ');write_date('2');write_date('0');write_date(' ');write_date(' ');write_date('-');write_date(' ');write_date(' ');write_date('-');write_date(' ');write_date(' ');write_date(' ');write_date(' ');write_date(' ');write_date(' ');}flag23=~flag23;if(flag23==1){write_com(0x80);write_date('U');write_date(':');write_date(' ');write_date('.');write_date(' ');write_date(' ');write_date('V');write_date(' ');write_date('I');write_date(':');write_date(' ');write_date('.');write_date(' ');write_date('A');write_date(' ');adval=ReadADC() ; //读取AD值disply_Y(adval); //电压值显示delay(30); //AD_val=255-adval; //disply_L(AD_val); //电压值显示delay(30);}break;case 7:flag23=~flag23;if(flag23==0){write_com(0x80);write_date(' ');write_date('2');write_date('0');write_date(' ');write_date(' ');write_date('-');write_date(' ');write_date(' ');write_date('-');write_date(' ');write_date(' ');write_date(' ');write_date(' ');write_date(' ');write_date(' ');write_date(' ');}break;case 8:s4num=0;break;}}}/************************************/if(flag_paobiao==1){if(s2==0){delay(5);if(s2==0)while(!s2);{TR0=~TR0;}}display_paobiao();}}void shijian(){uchar miaoy;year=read_ds(9);month=read_ds(8);day=read_ds(7);week=read_ds(6);shi=read_ds(4);fen=read_ds(2);miaoy=miao; //把当前秒赋给miaoy用以判断秒是否变化miao=read_ds(0);if(flag3==0){a=read_ds(1);b=read_ds(3);c=read_ds(5);flag3=1;}if(a!=0||b!=0||c!=0){if(miaoy!=miao) //判断秒是否进位如果进位把时间间隔{a--;if(a<=0){b--;a=60;if(b<=0){c--;if(c<=0)flag_naozhong=1;flag3=0;}}}}if(shi==shinz1&&fen==fennz1&&miao==miaonz1) {flag_nz1=1;}if(shi==shinz2&&fen==fennz2&&miao==miaonz2) {flag_nz2=1;}display(0x40+10,miao);display(0x40+7,fen);display(0x40+4,shi);displayweek(week);display(3,year);display(6,month);display(9,day);}void main(){init();while(1){keyscan();keyscan1();if(flag_naozhong==1){di_1();flag_naozhong=0;}if(flag_nz1==1){ls=0;}if(flag_nz2==1){beep=0;}if(key==0){ls=1;beep=1;flag_nz1=0;flag_nz2=0;}read_alarm();if(ashi!=0||afen!=0||amiao!=0) {write_com(0x80+0x40+15);write_date('#');}else{write_com(0x80+0x40+15);write_date(' ');}if(shinz1!=0||fennz1!=0||miaonz1!=0||miaonz2!=0||fennz2!=0||s hinz2!=0){write_com(0x80+0x40+14);write_date('*');}else{write_com(0x80+0x40+14);write_date(' ');}if(flag==0&&flag1==0&&flag_paobiao==0&&flag2==0&&flag21==0&&flag22==0&&flag23==0) {shijian();baoshi();}}}。

011 基于DS12C887的万年历

011   基于DS12C887的万年历

制作名称:基于DS12C887的万年历1、制作编号:0012、难度等级:★★★★★(适合第5、7学期制作)3、设计要求1)用AT89C51作主控制器,时钟芯片DS12887,温度传感器DS18B20设计一个电子万年历。

2)用16个数码管分别表示十年、年、十月、月、十日、日、星期、十时、时、十分、分、十秒、秒、百度、十度和度。

3)显示采用串行口输出段码,用十六片74LS164来驱动十六个数码管。

4)系统采用集成稳压块7805供电。

4、电路原理图终万年历原理及PCB图(5月12日).Ddb 5、方案论证按照系统设计功能的要求,初步设计系统由主控模块,时钟模块,显示模块,温度传感模块,键盘接口模块等五个模块组成。

主控芯片使用51系列AT89C51单片机时钟芯片使用了美国DALLAS公司推出的与MC146818兼容,寄存器存取速度快,在主机掉电时可用来保存重要数据的实时时钟DS12887,采用DS12887作为主要计时芯片,可作到计时准确。

显示模块采用普通的共阳LED数码管,键输入采用查询法实现调整功能。

6、硬件介绍6.1 系统硬件电路的设计系统由主控制器AT89C51,时钟芯片DS12887,温度传感器DS18B20,串口显示电路以及键扫描电路组成。

6.2 DS12C1887性能介绍1)器件特性DS12C887实时时钟芯片功能丰富,可以用来直接代替IBM PC上的时钟日历芯片DS12887,同时,它的管脚也和MC146818B、DS12887相兼容。

由于DS12C887能够自动产生世纪、年、月、日、时、分、秒等时间信息,其内部又增加了世纪寄存器,从而利用硬件电路解决子“千年”问题; DS12C887中自带有锂电池,外部掉电时,其内部时间信息还能够保持10年之久;对于一天内的时间记录,有12小时制和24小时制两种模式。

在12小时制模式中,用AM和PM区分上午和下午;时间的表示方法也有两种,一种用二进制数表示,一种是用BCD码表示;DS12C887中带有128字节 RAM,其中有11字节RAM用来存储时间信息,4字节RAM用来存储DS12C887的控制信息,称为控制寄存器,113字节通用RAM使用户使用;此外用户还可对DS12C887进行编程以实现多种方波输出,并可对其内部的三路中断通过软件进行屏蔽。

DS12887 DS12C887 的编程方法

DS12887 DS12C887 的编程方法

DS12887/ DS12C887 的编程方法1 DS12887/ DS12C887 初始化方法DS12887/ DS12C887 采取连续工作制,一般无须每次都初始化,即使是系统复位时也如此。

但初始化时,首先应禁止芯片内部的更新周期操作,所以先将DS12887/ DS12C887 状态寄存器 B 中的SET位置“1”,然后初始化00H~09H时标参数寄存器和状态寄存器A,此后再通过读状态寄存器 C ,清除寄存器C 中的周期中断标志位PF、报警中断标志位AF、更新周期结束中断标志位UF。

通过读寄存器口D中的VRT位,读状态寄存器口后VRT 位将自动置“1”,最后将状态寄存器B 中的SET 位置“0”,芯片开始计时工作。

2 闹钟单元的使用方法DS12887/DS12C887 共有 3 个闹钟单元,分别为时、分、秒闹钟单元。

在其中写入闹钟时间值并且在时钟中断允许的情况下每天到该时刻就会产生中断申请信号。

但这种方式每天只提供一次中断信号。

另一种方式是在闹钟单元中写入“不关心码”,在时闹钟单元写入C0H~FFH之间的数据,可每小时产生一次中断;在时、分闹钟单元写入C0H~FFH之间的数据,可每分钟产生一次中断;而时、分、秒闹钟单元全部写入FFH ,则每秒钟产生一次中断。

但这种方式也只能在整点、整分或每秒产生一次中断。

但控制系统要求的定时间隔不是整数时,则应该通过软件来调整实现。

3 DS12887/ DS12C887 的编程图所示的是A T89C51 单片机与DS12887/DS12C887 的接口电路,片选地址CS = # 0DDXXH。

DS12887/ DS12C887 状态寄存器的参数设置如下:状态寄存器A置为20H ,它表示采用的时钟频率为32. 678kHz ,禁止脚SQW输出。

状态寄存器B 置为22H ,它表示允许报警中断,禁止其他中断,置24 小时模式,时标寄存器内容用BCD 码表示,禁止方波输出和夏令时服务。

基于DS12C887时钟芯片的电子万年历设计

基于DS12C887时钟芯片的电子万年历设计

基于DS12C887时钟芯片的电子万年历设计本文阐述了一种基于DS12C887时钟芯片的电子万年历软硬件设计方法,使用proteus软件设计和绘制了电子万年历的电路连接图,并通过1602液晶屏显示时钟信息,验证了电子万年历电路及其程序设计的正确性,并给出了部分C程序代码。

标签:DS12C887;时钟芯片;单片机在需要时间信息的电路设计中,设计人员通常采用时钟芯片获取时间信息。

目前,市场中的时钟芯片种类多样,比如DS12C887、PCF8485、SB2068、DS1302等。

其中DS12C887具有价格低、功耗小、易操作等优点,本文选用DS12C887作为设计电子万年历的时钟芯片。

一、电路连接电路原理图如图1所示,主要包括AT89C52单片机、DS12C887、1602液晶屏和3个独立按键等元器件,通过仿真,从图1中可以看到日历信息是2018年9月12日,星期三,17点16分3秒,说明本文设计的电子万年历软硬件设计正确,功能正常。

(一)DS12C887介绍及其与单片机的接口电路DS12C887是DALLAS公司推出的涓流充电时钟芯片,可计时到2100年前的年、月、日、时、分、秒、星期七种日历时间信息并自带闰年补偿功能;自带晶体振荡器并内置锂电池,在没有外部电源的情况下可工作长达10年之久;有12小时制和24小时制两种计时模式。

其中在12小时制模式中,用A.M.和RM.区分上午和下午;可选用夏令时模式;时间表示方法有兩种:一种用二进制数表示,一种用BCD码表示;内部带有128字节RAM,其中11字节用来存储时间信息,4字节RAM用来存储DS12C887的控制信息,113字节RAM供用户使用;数据/地址总线复用,具有MOTOROLA和INTEL两种总线时序,本文在设计时采用的是INTEL总线。

下面阐述DS12C887的电路连接问题:DS12C887一共有24个管脚,其中6个管脚为NC(悬空管脚,不连接),有效管脚为18个。

时钟芯片ds12c887的程序

时钟芯片ds12c887的程序

日历时钟DS12887或146818的C语言源程序#include <reg52.h>#include <stdio.h>#include <absacc.h>#include <math.h>#include <string.h>#include <ctype.h>#include <stdlib.h>#define uchar unsigned char#define uint unsigned int#define P128870 XBYTE[0xa000]#define P128871 XBYTE[0xa001]#define P128872 XBYTE[0xa002]#define P128873 XBYTE[0xa003]#define P128874 XBYTE[0xa004]#define P128875 XBYTE[0xa005]#define P128876 XBYTE[0xa006]#define P128877 XBYTE[0xa007]#define P128878 XBYTE[0xa008]#define P128879 XBYTE[0xa009]#define P12887a XBYTE[0xa00a]#define P12887b XBYTE[0xa00b]#define P12887c XBYTE[0xa00c]#define P12887d XBYTE[0xa00d]#define P12887e XBYTE[0xa00e]#define P12887f XBYTE[0xa00f]void setup12887(uchar *p);void read12887(uchar *p);void start12887(void);void setup12887(uchar *p) //设置系统时间{uchar i;i=P12887d;P12887a=0x70; P12887b=0xa2; P128870=*p++; P128871=0xff; P128872=*p++; P128873=0xff; P128874=*p++; P128875=0xff; P128876=*p++; P128877=*p++; P128878=*p++; P128879=*p++; P12887b=0x22; P12887a=0x20;i=P12887c;}void read12887(uchar *p) //读取系统时间{uchar a;do{ a=P12887a; } while((a&0x80)==0x80);*p++=P128870; *p++=P128872; *p++=P128874; *p++=P128876;*p++=P128877; *p++=P128878; *p++=P128879;}void start12887(void) //启动时钟{uchar i;i=P12887d;P12887a=0x70; P12887b=0xa2; P128871=0xff; P128873=0xff; P128875=0xff; P12887b=0x22; P12887a=0x20;i=P12887c;}/*************************************************************文件名称:ds12c887.c适用范围:时钟芯片ds12c887的驱动程序*************************************************************/#include <absacc.h>/* 命令常量定义 */#define CMD_START_DS12C887 0x20 /* 开启时钟芯片*/#define CMD_START_OSCILLATOR 0x70 /* 开启振荡器,处于抑制状态 */#define CMD_CLOSE_DS12C887 0x30 /* 关掉时钟芯片*//* 所有的置位使用或操作,清除使用与操作 */#define MASK_SETB_SET 0x80 /* 禁止刷新 */#define MASK_CLR_SET 0x7f /* 使能刷新 */#define MASK_SETB_DM 0x04 /* 使用HEX格式*/#define MASK_CLR_DM 0xfb /* 使用BCD码格式 */#define MASK_SETB_2412 0x02 /* 使用24小时模式 */#define MASK_CLR_2412 0xfd /* 使用12小时模式 */#define MASK_SETB_DSE 0x01 /* 使用夏令时 */#define MASK_CLR_DSE 0xfe /* 不使用夏令时*//* 寄存器地址通道定义 */xdata char chSecondsChannel _at_ 0xdf00;xdata char chMinutesChannel _at_ 0xdf02;xdata char chHoursChannel _at_ 0xdf04;xdata char chDofWChannel _at_ 0xdf06;xdata char chDateChannel _at_ 0xdf07;xdata char chMonthChannel _at_ 0xdf08;xdata char chYearChannel _at_ 0xdf09;xdata char chCenturyChannel _at_ 0xdf32;xdata char chRegA _at_ 0xdf0a;xdata char chRegB _at_ 0xdf0b;xdata char chRegC _at_ 0xdf0c;xdata char chRegD _at_ 0xdf0d;/* 函数声明部分 */void StartDs12c887(void);void CloseDs12c887(void);void InitDs12c887(void);unsigned char GetSeconds(void);unsigned char GetMinutes(void);unsigned char GetHours(void);unsigned char GetDate(void);unsigned char GetMonth(void);unsigned char GetYear(void);unsigned char GetCentury(void);void SetTime(unsigned char chSeconds,unsigned char chMinutes,unsigned char chHours);void SetDate(unsigned char chDate,unsigned char chMonth,unsigned char chYear);/*************************************************************函数功能:该函数用来启动时钟芯片工作应用范围:仅在时钟芯片首次使用时用到一次入口参数:出口参数:*************************************************************/void StartDs12c887(void){chRegA = CMD_START_DS12C887;}/*************************************************************函数功能:该函数用来关闭时钟芯片应用范围:一般用不到入口参数:出口参数:*************************************************************/void CloseDs12c887(void){chRegA = CMD_CLOSE_DS12C887;}void InitDs12c887(){StartDs12c887();chRegB = chRegB | MASK_SETB_SET; /* 禁止刷新 */chRegB = chRegB & MASK_CLR_DM | MASK_SETB_2412 \& MASK_CLR_DSE;/* 使用BCD码格式、24小时模式、不使用夏令时 */chCenturyChannel = 0x21; /* 设置为21世纪 */chRegB = chRegB & MASK_CLR_SET; /* 使能刷新 */}/************************************************************* 函数功能:该函数用来从时钟芯片读取秒字节应用范围:入口参数:出口参数:*************************************************************/ unsigned char GetSeconds(void){return(chSecondsChannel);}/************************************************************* 函数功能:该函数用来从时钟芯片读取分字节应用范围:入口参数:出口参数:*************************************************************/ unsigned char GetMinutes(void){return(chMinutesChannel);}/************************************************************* 函数功能:该函数用来从时钟芯片读取小时字节应用范围:出口参数:*************************************************************/ unsigned char GetHours(void){return(chHoursChannel);}/************************************************************* 函数功能:该函数用来从时钟芯片读取日字节应用范围:入口参数:出口参数:*************************************************************/ unsigned char GetDate(void){return(chDateChannel);}/************************************************************* 函数功能:该函数用来从时钟芯片读取月字节应用范围:入口参数:出口参数:*************************************************************/ unsigned char GetMonth(void){return(chMonthChannel);}/************************************************************* 函数功能:该函数用来从时钟芯片读取年字节应用范围:入口参数:出口参数:*************************************************************/ unsigned char GetYear(void){return(chYearChannel);}/************************************************************* 函数功能:该函数用来从时钟芯片读取世纪字节应用范围:入口参数:*************************************************************/unsigned char GetCentury(void){return(chCenturyChannel);}/*************************************************************函数功能:该函数用来设置时钟芯片的时间应用范围:入口参数:chSeconds、chMinutes、chHours是设定时间的压缩BCD码出口参数:*************************************************************/void SetTime(unsigned char chSeconds,unsigned char chMinutes,unsigned char chHours){chRegB = chRegB | MASK_SETB_SET; /* 禁止刷新 */chSecondsChannel = chSeconds;chMinutesChannel = chMinutes;chHoursChannel = chHours;chRegB = chRegB & MASK_CLR_SET; /* 使能刷新 */}/*************************************************************函数功能:该函数用来设置时钟芯片的日期应用范围:入口参数:chDate、chMonth、chYear是设定日期的压缩BCD码出口参数:*************************************************************/void SetDate(unsigned char chDate,unsigned char chMonth,unsigned char chYear) {chRegB = chRegB | MASK_SETB_SET; /* 禁止刷新 */chDateChannel = chDate;chMonthChannel = chMonth;chYearChannel = chYear;chRegB = chRegB & MASK_CLR_SET; /* 使能刷新 */}。

基于DS12C887的高精度语音闹钟万年历

基于DS12C887的高精度语音闹钟万年历

1 设计方案与论证随着电子技术的发展,计算机在现代科学技术的发展中起着重要的作用。

多媒体技术、网络技术、智能信息处理技术、自适用控制技术、数据挖掘与处理技术等都离不开计算机。

本课程设计是基单片机原理与接口技术的简单应用。

运用所学的单片机原理和接口技术知识完成数字电子表的设计。

电子表已成为人们日常生活中必不可少的必需品,广泛用于个人家庭以及办公室等公共场所,给人们的生活、学习、工作、娱乐带来极大的方便。

由于数字集成电路技术的发展和采用了先进的石英技术,使电子表具有走时准确、性能稳定、携带方便等优点,它还用于计时、自动报时及自动控制等各个领域。

尽管目前市场上已有现成的电子表集成电路芯片出售,价格便宜、使用也方便,但鉴于电子表电路的基本组成包含了数字电路的主要组成部分,因此进行电子表的设计是必要的,用汇编设计电子表显示程序,要求根据输入程序显示电子表画面。

研究电子表及扩大其应用,有着非常现实的意义。

方案一:主控芯片用MSP430,时钟芯片用DS1302,显示器用12864,语音芯片用ISD4001。

方案二:主控芯片用STC89C52,时钟芯片用DS12C887,显示器用1602,语音芯片用1420。

STC89C52单片机,这款单片机成本低廉,操作方便,而且足以满足控制要求。

实时时钟芯片有12C887和DS1302可供选择,DS1302是串口操作,用外部晶振,功能比较单一,而且精确程度有外部晶振影响。

12C887有内置晶振元和锂电池,并口操作,功能很多。

综上,我们选择12C887作为实时时钟芯片。

语音芯片种类很多,考虑到只用于那种功能,我们选择了1420语音芯片,录音简单,时长20秒,很符合系统要求。

显示模块有1602,1332,12864,数码管等可供选用,因为是万年历,而且只显示数字或英文字母,最终我们选用了1602作为显示器。

综上,我们选择方案二。

最后完全可以实现四个按钮可以设置时间和闹钟时间、有录放音功能、每次上电都能显示当时的时间、用液晶显示器显示实时时间以及闹钟时间这些功能。

课程设计_电子万年历DS12C887+温度18B20+LCD12864显示+闹钟

课程设计_电子万年历DS12C887+温度18B20+LCD12864显示+闹钟

西南科技大学电子专业综合设计报告设计名称:基于单片机的多功能电子万年历系统设计姓名:学号:班级:指导教师:起止日期:西南科技大学信息工程学院制综合设计任务书学生班级:学生姓名:学号:设计名称:基于单片机的多功能电子万年历系统设计起止日期:指导教师:设计要求:基本要求:1.查阅有关资料,掌握单总线的基本通信协议及C语言的编程方法;2.用STC89C52微控制器控制DS12CR887和DS18B20的工作方式,完成多功能电子万年历系统的设计,显示部分采用LCD12864。

要求日期可显示农历,并能提示农历节日和阳历节日;要求电子万年历具有闹钟功能并能实时显示当前环境温度;3.对系统的工作的可靠性进和稳定性行分析,得出结论;4.撰写设计报告。

综合设计学生日志时间设计内容2013.11.23 熟悉题目,对研究题目做分析,具体划分为几个模块2013.11.24 LCD12864显示屏的显示模块的实现2013.11.25 DS18B20温度传感器模块的研究2013.11.26 对DS18B20和LCD12864联合设计温度显示系统2013.11.27 阅读DS12CR887的数据手册,了解芯片的功能实现2013.11.28 根据DS12CR887数据手册完成基本的驱动程序2013.11.30 在C52单片机最小系统的的基础上搭建电子万年历硬件系统,完成芯片焊接及连线2013.12.1 上网查阅阳历转换阴历的相关算法2013.12.2 完成阳历转换阴历相关算法在单片机的程序设计以及节日的显示程序2013.12.3 设计程序实现在LCD12864上显示时间,日期,农历,节日,温度等功能2013.12.4 完成闹钟程序设计2013.12.5 调试硬件系统和软件系统解决系统BUG2013.12.6 完成课程设计报告1基于单片机的多功能电子万年历系统设计摘要:电子万年历是一种通过STC52C89RC单片机编程来对不同电子芯片件进行控制、执行、数据读取、和读取的数据结果的显示的电子产品。

单片机DS12C887时钟设计

单片机DS12C887时钟设计

目录摘要 (2)1 系统总体设计 (2)1.1 系统设计的主要内容和具体要求 (2)1.1.1主要内容: (2)1.1.2 具体技术要求: (2)1.2 方案论证 (2)2 系统硬件电路设计 (3)2.1单片机控制系统包括STC89C52单片机以及它的外围电路(晶振电路和复位电路)。

(3)2.1.1晶振电路 (4)2.1.2 复位电路 (4)2.2 DS12C887时钟电路 (5)2.2.1 器件介绍 (5)2.2.2 DS12C887与单片机的连接 (6)2.3 1602液晶显示屏 (6)2.4 USB供电电路 (7)2.5 键盘电路 (8)2.6闹铃电路 (9)3 系统软件程序设计 (9)3.1 主程序运行说明及流程图 (9)3.2 DS12C887使用说明及流程图 (11)3.3 1602操作说明及流程图 (11)3.4 键盘控制说明及流程图 (12)4 系统调试 (13)5 结论 (14)6 谢辞 (14)7 参考文献 (15)8 附录A:实时日历电子钟设计电路原理图 (15)9 附录B:实时日历电子钟设计程序代码 (15)摘要在日新月异的21世纪里,家用电子产品得到了迅速发展。

许多家电设备都趋于人性化、智能化,这些电器设备大部分都含有CPU控制器或者是单片机。

单片机以其高可靠性、高性价比、低电压、低功耗等一系列优点,近几年得到迅猛发展和大范围推广,广泛应用于工业控制系统、通讯设备、日常消费类产品和玩具等。

本文设计的电子万年历属于小型智能家用电子产品。

利用单片机进行控制,实时时钟芯片DS12C887时钟芯片进行记时及掉电存储,外加键盘电路和显示电路,可实现时间的调整和显示。

电子万年历既可广泛应用于家庭,也可应用于银行、邮电、宾馆、医院、学校、企业、商店等相关行业的大厅,以及单位会议室、门卫等场所。

因而,此设计具有相当重要的现实意义和实用价值。

关键词:单片机;DS12C887;智能1 系统总体设计1.1 系统设计的主要内容和具体要求1.1.1主要内容:本次设计的题目是基于ds12c887的高精度时钟的设计,可以正常的显示年、月、日、星期、时、分、秒。

基于单片机的DS12C887的日历时钟显示系统设计论文

基于单片机的DS12C887的日历时钟显示系统设计论文

摘要在51单片机应用系统中,常常需要记录实时的时间信息并长期保存。

比如,在数据采集时,对某些重要的信息不仅需要记录其内容,还需要记录下该事件发生的准确时间;在银行营业大厅中使用的利率或汇率显示屏,上面除了需要显示利率或汇率等数据以外,还需要显示实时的时间信息,如年、月、日、星期、时间等。

本文用51单片机以及DS12C887日历时钟芯片实现日历时钟的设计。

论文研究了DS12C887日历时钟芯片的相关功能,两片MAX7219分别与单片机连接实现13位数码管显示以及整个实时日历时钟显示系统的硬件,软件设计。

设计结果表明本文设计的基于DS12C887的实时日历时钟显示系统完全能够满足设计要求。

关键词:DS12C887;51单片机;MAX7219;数码管显示Abstract51 SCM application systems, often need to record real-time information and long-term preservation. For example, when data collection for some important information not only need to record the content, but also record the exact time of the incident; the banking hall in the use of interest rate or exchange rate display, shown above in addition to the interest rate or exchange rate such data, it also needs to show real-time information, such as year, month, date, day and time. In this paper, 51 MCU and the calendar clock chip DS12C887 calendar clock design.Thesis of the calendar clock chip DS12C887-related functions, MAX7219 connected respectively to achieve 13-bit single chip digital display and the real time calendar clock display system hardware and software design.Design results show that the DS12C887-based design of real-time calendar clock display system can completely meet the design requirements.Key Words:DS12C887;51 Microcontroller;MAX7219;Digital display1 绪论本次设计的功能是在51单片机系统中设置、获取、记录实时的日历时钟信息并通过数码管显示,要求能够进行长时间的记录,并且存储的时间信息在掉电情况下至少保存10年以上。

实时时钟DS12C887_C实例程序

实时时钟DS12C887_C实例程序

DS12C887实例程序#include<intrins.h>#define uchar unsigned char#define uint unsigned intuchar nian,yue,ri,day,shi,fen,miao,ashi,afen,sshi,sfen;uchar s1num,flag,flag1,flag2,flag3,flag4,settime,setalarm;/********************************************************************引脚配置定义 GND VCC VL RS R/W E D0 D1 D2 D3 D4 D5 D6 D7 BLA BLK*********************************************************************/#define LCDIO P1sbit LCD1602_RS=P3^5;sbit LCD1602_RW=P3^4;sbit LCD1602_EN=P3^3;sbit s1=P2^1;sbit s2=P2^2;sbit s3=P2^0;sbit s4=P2^3;/********************************************************************/ void LCD_delay(void);void delay_ms(unsigned int n);uchar change_bcd(uchar a);void LCD_en_command(unsigned char command);void LCD_en_dat(unsigned char temp);void LCD_set_xy( unsigned char x, unsigned char y );void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s); void LCD_init(void);void write_sfm(uchar,uchar);void setup_time();void setup_alarm();/******************** LCD PART *************************************/void LCD_delay(void){_nop_();_nop_();_nop_();}void delay_ms(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}/********************************* *********************************/ uchar change_bcd(uchar a) //D0~D7转换程序{char temp,i;for(i=0;i<8;i++){temp<<=1;temp|=(a&0x01);a>>=1;}return(temp);}/********************************* *********************************/ void LCD_en_command(unsigned char command){command=change_bcd(command);command=_crol_(command,4);LCD1602_RS=0;LCD1602_EN=0;LCDIO&=0X0f;LCDIO|=(command & 0xf0);LCD1602_EN=1;LCD_delay();LCD1602_EN=0;LCDIO&=0X0f;LCDIO|=(command << 4) & 0xf0;LCD1602_EN=1;LCD_delay();LCD1602_EN=0;delay_ms(1);}void LCD_en_dat(unsigned char dat){dat=change_bcd(dat);dat=_crol_(dat,4);LCD1602_RS=1;LCD1602_EN=0;LCDIO&=0X0f;LCDIO|=(dat & 0xf0);LCD1602_EN=1;LCD_delay();LCD1602_EN=0;LCDIO&=0X0f;LCDIO|=(dat << 4) & 0xf0;LCD1602_EN=1;LCD_delay();LCD1602_EN=0;delay_ms(1);}/********************************************************************/ void LCD_set_xy( unsigned char x, unsigned char y ){unsigned char address;if (y ==0)address = 0x80 + x;elseaddress = 0xC0 + x;LCD_en_command(address);}/********************************************************************/ void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s) {LCD_set_xy( X, Y ); //set addresswhile (*s) // write character{LCD_en_dat(*s);s ++;}}/********************************************************************/ void LCD_init(void){LCD1602_RW=0;LCD_en_command(0x01);delay_ms(5);LCD_en_command(0x01);delay_ms(5);LCD_en_command(0x28);delay_ms(5);LCD_en_command(0x28);delay_ms(5);LCD_en_command(0x28);delay_ms(5);LCD_en_command(0x0C);delay_ms(5);LCD_en_command(0x80);delay_ms(5);LCD_en_command(0x01);delay_ms(5);}/********************************************************************/void write_sfm(uchar add,uchar date){uchar shi,ge;shi=date/10;ge=date%10;LCD_en_command(add);LCD_en_dat(shi+'0');LCD_en_dat(ge+'0');}/*****************************SET DAY & TIME***************************************/ void setup_time(){if(s1==0){delay_ms(5);if(s1==0){s1num++;TR0=0; //关定时器flag=1;flag1=1;flag3=1;flag4=1; //停止扫描DS12C887_read_time,setup_alarmwhile(!s1);if(s1num==1){LCD_en_command(0x82);LCD_en_command(0x0f);}}if(s1num==2){LCD_en_command(0x85);}if(s1num==3){LCD_en_command(0x88);}if(s1num==4){LCD_en_command(0x8b);}if(s1num==5){LCD_en_command(0xc0);}if(s1num==6){LCD_en_command(0xc3);}if(s1num==7){LCD_en_command(0xc6);}if(s1num==8){s1num=0;TR0=1; //开定时器flag1=0;flag3=0;flag4=0; //执行扫描setup_alarmsettime=1; //执行settimeLCD_en_command(0x0c);}}if(s1num!=0){/********************************************************************/ if(s2==0){delay_ms(2);if(s2==0){while(!s2);if(s1num==1){nian++;if(nian==100)miao=0;write_sfm(0x82,nian);LCD_en_command(0x82);}if(s1num==2){yue++;if(yue==13)yue=0;write_sfm(0x85,yue);LCD_en_command(0x85);}if(s1num==3){ri++;if(ri==32)ri=0;write_sfm(0x88,ri);LCD_en_command(0x88);}if(s1num==4){day++;if(day==8)day=1;write_sfm(0x8b,day);LCD_en_command(0x8b);}if(s1num==5){shi++;if(shi==24)shi=0;write_sfm(0xc0,shi);LCD_en_command(0xc0);}if(s1num==6){fen++;if(fen==60)fen=0;write_sfm(0xc3,fen);LCD_en_command(0xc3);}if(s1num==7){miao++;if(miao==60)miao=0;write_sfm(0xc6,miao);LCD_en_command(0xc6);}}}/********************************************************************/ if(s3==0){delay_ms(2);if(s3==0){while(!s3);if(s1num==1){nian--;if(nian==-1)nian=99;write_sfm(0x82,nian);LCD_en_command(0x82);}if(s1num==2){yue--;if(yue==0)yue=12;write_sfm(0x85,yue);LCD_en_command(0x85);}if(s1num==3){ri--;if(ri==0)ri=31;write_sfm(0x88,ri);LCD_en_command(0x88);}if(s1num==4){day--;if(day==0)day=7;write_sfm(0x8b,day);LCD_en_command(0x8b);}if(s1num==5){shi--;if(shi==-1)shi=23;write_sfm(0xc0,shi);LCD_en_command(0xc0);}if(s1num==6){fen--;if(fen==-1)fen=59;write_sfm(0xc3,fen);LCD_en_command(0xc3);}if(s1num==7){miao--;if(miao==-1)miao=59;write_sfm(0xc6,miao);LCD_en_command(0xc6);}}}/********************************************************************/ }}/********************************************************************//********************************************************************/void setup_alarm(){if(s4==0){delay_ms(5);if(s4==0){s1num++;TR0=0; //关定时器flag=1;flag2=1;flag3=1;flag4=1; //停止扫描DS12C887_read_time,setup_timewhile(!s4);if(s1num==1){LCD_en_command(0x01);LCD_write_string(0,0,"Start alarm at");write_sfm(0xcb,ashi);write_sfm(0xce,afen);LCD_write_string(0x0d,1,":");LCD_en_command(0xcb);LCD_en_command(0x0f);}}if(s1num==2){LCD_en_command(0xce);}if(s1num==3){LCD_en_command(0x01);LCD_write_string(0,0,"Stop alarm at");write_sfm(0xcb,sshi);write_sfm(0xce,sfen);LCD_write_string(0x0d,1,":");LCD_en_command(0xcb);LCD_en_command(0x0f);}if(s1num==4){LCD_en_command(0xce);}if(s1num==5){s1num=0;TR0=1; //开定时器flag2=0;flag3=0;flag4=0; //执行扫描setup_timesetalarm=1; //执行setalarmLCD_en_command(0x01); //清LCD屏幕LCD_write_string(0,0,"20 - -");LCD_write_string(2,1,": :");LCD_en_command(0x0c);}}if(s1num!=0){/********************************************************************/ if(s2==0){delay_ms(5);if(s2==0){while(!s2);if(s1num==1){ashi++;if(ashi==24)ashi=0;write_sfm(0xcb,ashi);LCD_en_command(0xcb);}if(s1num==2){afen++;if(afen==60)afen=0;write_sfm(0xce,afen);LCD_en_command(0xce);}if(s1num==3){sshi++;if(sshi==24)sshi=0;write_sfm(0xcb,sshi);LCD_en_command(0xcb);}if(s1num==4){sfen++;if(sfen==60)sfen=0;write_sfm(0xce,sfen);LCD_en_command(0xce);}}}/********************************************************************/ if(s3==0){delay_ms(5);if(s3==0){while(!s3);if(s1num==1){ashi--;if(ashi==-1)ashi=23;write_sfm(0xcb,ashi);LCD_en_command(0xcb);}if(s1num==2){afen--;if(afen==-1)afen=59;write_sfm(0xce,afen);LCD_en_command(0xce);}if(s1num==3){sshi--;if(sshi==-1)sshi=23;write_sfm(0xcb,sshi);LCD_en_command(0xcb);}if(s1num==4){sfen--;if(sfen==-1)sfen=59;write_sfm(0xce,sfen);LCD_en_command(0xce);}}}/********************************************************************/ }}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include <REG51.H>#include "1602.h"#include"ds12cr887.h"#define uchar unsigned char#define uint unsigned intsbit lcdrs=P3^7 ;sbit lcdrw=P3^6 ;sbit lcden=P3^5 ;sbit dscs=P1^4;sbit dsas=P1^5;sbit dsrw=P1^6;sbit dsds=P1^7;sbit dsirq=P3^3;/**************键盘引脚定义******************/sbit key_1 = P1^0; //设置格式sbit key_2 = P1^1; //+sbit key_3 = P1^2; //-sbit key_4 = P1^3; //定时设置sbit buzzer= P3^1; //蜂鸣器sbit DQ = P3^0; //定义DS18B20/******************小点闪烁********************/bit at=0;/******************全局变量********************/uchar t0=0,second=0, min=0, hour=0,day=0,month=0,year=0,weekday=0,flag=0,temp=0,flag1=0; /******************初始化时间******************/uchar code table1[]=" 2009-05-12 MON ";uchar code table2[]="00:00:00 0000";/*******************字符表*********************/uchar code word[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x20,0x2d}; uchar code week[][3]={"SUN","MON","TUE","WED","THU","FRI","SAT"};/************数据缓冲与键盘计数变量************/uchar databuffer[14],TempBuffer[4],count,t_value;uint num=0;/******************函数声明********************/void init();void lcd_write_com(uchar command); //1602液晶写命令void lcd_write_data(uchar date); //1602液晶写数据void delay(uint a);void newbuf(); //数据转换void keyboard(); //键盘子程序void disp(); //显示程序void write_ds(uchar add,uchar date);uchar read_ds(uchar add);void Init_DS18B20( );void delay_18B20(unsigned int i);uchar ReadOneChar(void );void WriteOneChar(uchar dat);void ReadTemp(void);void temp_to_str();/***********************主函数**********************/void main(){init(); //初始化Init_DS18B20( ); //DS18B20初始化lcd_write_com(0x80+0x00); //设置指针地址为首行for(num=0;num<15;num++) //将table字符串写入{lcd_write_data(table1[num]);delay(20);}lcd_write_com(0x80+0x40); //设置指针地址为第二行for(num=0;num<13;num++) //将table1字符串写入{lcd_write_data(table2[num]);delay(20);}while(1){uchar b;keyboard(); //调整时间ReadTemp(); //开启温度采集程序temp_to_str(); //温度数据转换成液晶字符lcd_write_com(0x80+0x40+9);delay(20);for(b=0;b<4;b++){lcd_write_data(TempBuffer[b]);delay(20);}if(flag==0){second=read_ds(0x00);min=read_ds(0x02);hour=read_ds(0x04);weekday=read_ds(0x06);day=read_ds(0x07);month=read_ds(0x08);year=read_ds(0x09);}if(hour==0){ flag1=1;if(flag1==1){buzzer=0;}}newbuf();disp();if(!at) //闪烁{databuffer[2]=10;databuffer[5]=10;}else{databuffer[2]=11;databuffer[5]=11;}disp();at=~at;}}/*************************初始化*************************/void init(){lcd_write_com(0x38); //设置显示模式lcd_write_com(0x0c); //光标闪烁lcd_write_com(0x06);lcd_write_com(0x01); //清屏write_ds(0x0a,0x20);write_ds(0x0b,0x26);read_ds(0x0c);buzzer=1;EA=1;EX1=1;;IT0=1;}/***********************LCD1602写命令************************/ void lcd_write_com(uchar command){ //液晶1602写命令lcdrs=0;lcdrw=0;P2=command;delay(5);lcden=1;delay(5);lcden=0;}/*************************LCD1602写数据************************/ void lcd_write_data(uchar date){lcdrs=1; //液晶1602写数据lcdrw=0;P2=date;delay(5);lcden=1;delay(5);lcden=0;}/***************************延时函数****************************/ void delay(uint a){uint x,y;for(x=a;x>0;x--)for(y=110;y>0;y--);}/******************************缓冲数据处理*************************/ void newbuf() //更新缓冲区子程序{databuffer[0]=second%10;databuffer[1]=second/10;databuffer[3]=min%10;databuffer[4]=min/10;databuffer[6]=hour%10;databuffer[7]=hour/10;databuffer[8]=day%10;databuffer[9]=day/10;databuffer[10]=month%10;databuffer[11]=month/10;databuffer[12]=year%10;databuffer[13]=year/10;}/**************************液晶数据显示**************************/ void disp() //显示程序{uchar j=0;lcd_write_com(0x80+0x40); //设置指针地址为第二行lcd_write_data(word[databuffer[7]]); //小时十位lcd_write_data(word[databuffer[6]]); //小时个位lcd_write_data(word[databuffer[5]]);lcd_write_data(word[databuffer[4]]); //分十位lcd_write_data(word[databuffer[3]]); //分个位lcd_write_data(word[databuffer[2]]);lcd_write_data(word[databuffer[1]]); //秒十位lcd_write_data(word[databuffer[0]]); //秒个位lcd_write_com(0x80+0x03); //设置指针地址为第一行lcd_write_data(word[databuffer[13]]); //年十位lcd_write_data(word[databuffer[12]]); //年个位lcd_write_data(word[12]);lcd_write_data(word[databuffer[11]]); //月十位lcd_write_data(word[databuffer[10]]); //月个位lcd_write_data(word[12]);lcd_write_data(word[databuffer[9]]); //日十位lcd_write_data(word[databuffer[8]]); //日个位lcd_write_com(0x80+0x0c);for(j=0;j<3;j++){lcd_write_data( week[weekday-1][j]);}}/******************************键盘扫描*****************************/ void keyboard(){if(key_1==0){delay(50);if(key_1==0){ count++; //按键计数,设置模式while(!key_1);flag=1;if(count==1) //key_1键摁一次{lcd_write_com(0x80+0x40+7); //设置光标为秒位置lcd_write_com(0x0f);}if(count==2) //key_1键摁两次{lcd_write_com(0x80+0x40+4); //设置光标为分位置}if(count==3) //key_1键摁三次{lcd_write_com(0x80+0x40+1); //设置光标为时位置}if(count==4) //key_1键摁四次{lcd_write_com(0x80+0x09); //设置光标为日位置}if(count==5) //key_1键摁五次{lcd_write_com(0x80+0x06); //设置光标为月位置}if(count==6) //key_1键摁六次{lcd_write_com(0x80+0x03); //设置光标为年位置}if(count==7) //key_1键摁七次{lcd_write_com(0x80+0x0c); //设置光标为年位置}if(count==8) //key_1键摁八次{count=0; //摁键次数清零lcd_write_com(0x0c); //光标不显示write_ds(0x00,second);write_ds(0x02,min);write_ds(0x04,hour);write_ds(0x06,weekday);write_ds(0x07,day);write_ds(0x08,month);write_ds(0x09,year);flag=0;}}}if(count!=0) //key_1键摁后处理{if(key_2==0) //key_2键摁下处理{delay(50);if(key_2==0){while(!key_2);if(count==1) //key_1键摁一次{second++; //秒加一if(second==60)second=0;newbuf();disp();lcd_write_com(0x80+0x40+7);}if(count==2) //key_1键摁两次{min++; //分加一if(min==60)min=0;newbuf();disp();lcd_write_com(0x80+0x40+4);}if(count==3) //key_1键摁三次{hour++; //时加一if(hour==24)hour=0;newbuf();disp();lcd_write_com(0x80+0x40+1);}if(count==4) //key_1键摁四次{day++; //日加一if(day==32)day=1;newbuf();disp();lcd_write_com(0x80+0x09);}if(count==5) //key_1键摁五次{month++; //月加一if(month==13)month=1;newbuf();disp();lcd_write_com(0x80+0x06);}if(count==6) //key_1键摁六次{year++; //年加一if(year==100)year=0;newbuf();disp();lcd_write_com(0x80+0x03);}if(count==7) //key_1键摁六次{weekday++; //年加一if(weekday==8)weekday=1;disp();lcd_write_com(0x80+0x0c);}}}if(key_3==0) //key_3键摁下处理{delay(50);if(key_3==0){while(!key_3);if(count==1) //key_1键摁一次{second--; //秒减一if(second==-1)second=59;newbuf();disp();lcd_write_com(0x80+0x40+7);}if(count==2) //key_1键摁两次{min--; //分减一if(min==-1)min=59;newbuf();disp();lcd_write_com(0x80+0x40+4); }if(count==3) //key_1键摁三次{hour--; //时减一if(hour==-1)hour=23;newbuf();disp();lcd_write_com(0x80+0x40+1); }if(count==4) //key_1键摁四次{day--; //日减一if(day==-1)day=31;newbuf();disp();lcd_write_com(0x80+0x09);}if(count==5) //key_1键摁五次{month--; //月减一if(month==-1)month=12;newbuf();disp();lcd_write_com(0x80+0x06);}if(count==6) //key_1键摁六次{year--; //年减一if(year==-1)year=99;newbuf();disp();lcd_write_com(0x80+0x03);}if(count==7) //key_1键摁六次{weekday--; //年减一if(weekday==0)weekday=7;disp();lcd_write_com(0x80+0x0c);}}}}if(key_4==0){delay(50);if(key_4==0){ count++; //按键计数,设置模式while(!key_4);flag=1;if(count==1) //key_1键摁一次{lcd_write_com(0x80+0x40+7); //设置光标为秒位置lcd_write_com(0x0f);}if(count==2) //key_1键摁两次{lcd_write_com(0x80+0x40+4); //设置光标为分位置}if(count==3) //key_1键摁三次{lcd_write_com(0x80+0x40+1); //设置光标为时位置}if(count==4) //key_1键摁四次{count=0; //摁键次数清零lcd_write_com(0x0c); //光标不显示write_ds(0x01,second);write_ds(0x03,min);write_ds(0x05,hour);flag=0;}}}}/**********************DS12887写数据*****************/void write_ds(uchar add,uchar date) //ds12887写数据{dscs=0;dsas=1;dsds=1;dsrw=1;delay(5);P0=add;dsas=0;dsrw=0;delay(5);P0=date;dsrw=1;dsas=1;dscs=1;}/*************************DS12887读数据********************/ uchar read_ds(uchar add) //ds12887读数据{uchar ds_date;dsas=1;dsds=1;dsrw=1;dscs=0;delay(5);P0=add;dsas=0;dsds=0;delay(5);P0=0xff;ds_date=P0;//问题之处dsds=1;dsas=1;dscs=1;return ds_date;}void timealarm() interrupt 2{uchar c;buzzer=0;c=read_ds(0x0c);}/***********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); //精确延时大于480usDQ = 1; //拉高总线delay_18B20(14);x=DQ; //稍做延时后如果x=0则初始化成功x=1则初始化失败delay_18B20(20);}/***********ds18b20读一个字节**************/uchar ReadOneChar(void){uchar y=0;uchar dat = 0;for (y=8;y>0;y--){DQ = 0; // 给脉冲信号dat>>=1;DQ = 1; // 给脉冲信号if(DQ)dat|=0x80;delay_18B20(4);}return(dat);}/*************ds18b20写一个字节****************/void WriteOneChar(uchar dat){unsigned char z=0;for (z=8; z>0; z--){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 importantInit_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器)前两个就是温度delay_18B20(100);a=ReadOneChar(); //读取温度值低位b=ReadOneChar(); //读取温度值高位t_value=b<<4;t_value+=(a&0xf0)>>4;}void temp_to_str() //温度数据转换成液晶字符显示{TempBuffer[0]=t_value/10+'0'; //十位TempBuffer[1]=t_value%10+'0'; //个位TempBuffer[2]=0xdf; //温度符号TempBuffer[3]='C';}。

相关文档
最新文档