单片机万年历设计附带八个独立按键的PCB和仿真图

万年历,最全面的万年历文章 - 电子工程世界网
在电子工程世界为您找到如下关于“万年历”的新闻
万年历资料下载
51做万年历(原理图,程序)
51做万年历(原理图,程序)
51做万年历(原理图,程序)
51做万年历(原理图,程序)
51做万年历(原理图,程序)...
万年历源码万年历源码万年历源码...
LED 数字万年历 LED 数字万年历-HT45R02
此款LED 数码万年历采用Holtek 公司开发的HT45R02 和HT38A5 微控制器设计,具有年、月、日、时、分、秒、星期、温度、农历、气温、24 节气显示以及整点报时,定闹功能。HT45R02 具有2K?14 位ROM,80?8 位RAM 和40 个双向输入/输出口。拥有省电,宽广的工作电压范围等特点。HT38A5 提供高质量...
万年历源码万年历源码...
万年历源码万年历源码...
万年历源码万年历源码...
单片机万年历电路图+仿真+代码单片机万年历电路图+仿真+代码单片机万年历电路图+仿真+代码...
12864阴历万年历,带有温度...
万年历的设计图,仿真图...
亲们制作万年历的可以看下。元件清单都很详细。希望对你们有帮助。...
万年历相关帖子
/details_6880_1.html38:STM32桌面万年历(立创社区ID:HolyAngel)作品链接:/article/details_7040_1.html39:雕刻机主轴恒功伺服节能调速器(立创社区ID:文信武安)作品链接:/article/details_7311_1.html40:基于stm8s的...
:电路中共用到3.3 V.5 V电压值,由于是便携式产品,可用5 V 锂电池供电.进入系统后,5 V 电压通过LM V 得到3.3 V 电压给MSP430单片机供电.  时钟模块:实时时钟采用低功耗芯片DS1302,可自动对秒.分.时.日.周.月.念年及闰年补偿进行计数,扩展万年历功能显示,功耗低,2.5 V 供电时,功耗小于300 nA,且精度较高,满足系统需求.  E2PROM...
;十万个为什么,让您一站到底;美食查询,满足唯爱与美食不可辜负的您;万年历,温馨提醒您家人朋友的生日,不忘祝福。 紫光物联智能云音箱——科幻的情节,不再遥远!尽在咫尺!美好的事情就要分享智慧科技让生活更美好咨询热线: 紫光物联深圳运营中心:(广东、海南、福建、江西等区域)关注微信公众号:紫光物联深圳运营中心
紫光物联智能家居黑科技新品——智能云音箱魅力来袭...
。  2017年的第二届立创商城电子制作节赛程已经入第二阶段,目前已收到了355份优秀参赛作品,参赛选手包括北京大学、北京理工大学、北京邮电大学、中国科学院、中国地质大学、上海交通大学、电子科技大学、哈尔滨工业大学、厦门大学等众多知名院校的在校大学生,也不乏西门子等知名企业的电子工程师。  在三百多份参赛作品中,小到桌面万年历、自动浇花系统,大到解三阶魔方机器人、掌上无人机等智能硬件,五花八门、无奇不有...
& && && && & 主要以EX8900CE时钟芯片,与stm32l071相连成测试电路,求问如何着手通I2C输出时钟芯片里的万年历,工具IAR
如何输出万年历? 求助还要拿1芯币才能看{:1_101:}...
一个.c源程序
128X64液晶显示器的基本应用
12864常用使用手册
12864源程序&&原理图 PCB
12864资料和程序
12864万年历+温度计+闹钟+温度检测
12864液晶显示相关资料...
。记录和存储电压、电流、有功功率、无功功率、视在功率、频率、相位等电力参数。11、 电力设备调整及运行过程动态监视,帮助用户解决电力设备调整及投运过程中出现的问题。12、 测试分析电力系统中无功补偿及滤波装置动态参数并对其功能和技术指标作出定量评价13、具备万年历、时钟功能,实时显示日期及时间。可在现场校验的同时保存测试数据和结果,并通过串口上传至计算机,通过后台管理软件(选配件)实现数据微机化管理...
基于DSP的时钟显示;LCD12864的使用,动态刷新当前年、月、日、时、分、秒。
DSP课程设计报告——万年历...
求助用液晶屏显示时间的程序&&而且要求利用中断概念
液晶屏显示时间 这个估计没人会给你。不如买个带样例程序的开发板。 我有资料,联系QQ邮箱[email][/email] 你这问题太大了,我不知道你想要什么 什么液晶屏啊?什么单片机啊?显示时间是指万年历吗?
这个,真该!好好学习,自己做吧! 连构思一个大致框架的思维都没有...
倒计时,实现可暂停可复位,添加代码即可使用。
njiggih,如果您要查看本帖隐藏内容请回复
7.闹钟工程代码分享
明德扬设计的闹钟工程案例,有24小时时钟计数器,可设定闹钟时间,可修改时钟时间,当到达闹钟设定时间时则蜂鸣器响。
njiggih,如果您要查看本帖隐藏内容请回复
8.基于至简设计法实现的万年历功能
明德扬至简设计法实现的万年历案例,具有年月日计数器,时间设定功能,自主判断...
万年历视频
你可能感兴趣的标签
热门资源推荐拒绝访问 |
| 百度云加速
请打开cookies.
此网站 () 的管理员禁止了您的访问。原因是您的访问包含了非浏览器特征(39af5-ua98).
重新安装浏览器,或使用别的浏览器当前位置: >>
专科毕业设计(论文) 专科毕业设计(论文) ( 2010 届 )多功能万年历设计Design of Multi-function Calendar学生姓名:郭骏 Student: Guo Jun 指导老师:周强 Adviser: Zhou Qiang 台州学院 物理与电子工程学院Sch
ool of Physics & Electronics Engineering Taizhou University Taizhou, Zhejiang, China2010 年 3 月March 2010摘要本篇论文主要介绍了运用单片机实现电子万年历的设计, 其中51 单片机作为对系统的主要控制器, 由DS1302完成对时钟电路的显示和 DS18B20对温度的检测。设计主要由时钟电路模块、稳压电路模块、 液晶显示模块、温度测试模块组成。实现了年、月、日、星期、温度 显示,及闹钟报警的功能。这个设计具有体积小,简单方便,功能齐 全,精度高等特点。 关键词51 单片机;时钟芯片;温度显示;闹钟设置AbstractThis paper mainly introduces the realization of electronic calendar application of the design of SCM,51 MCU as the main controller of the system, DS1302 completed by the clock circuit display and temperature test DS18B20。Designed for use mainly by the clock circuit module, voltage regulator circuit module, liquid crystal display module, temperature measurement modules。Achieved a year, month, day, week, temperature display, and alarm clock function。This design is small, simple and convenient, complete functions and high accuracy。 Key words51 MCU;Clock chip;Temperature display;Alarm clock settings目录1. 引言................................................错误!未定义书签。 错误!未定义书签。 1.1 选题背景.......................................错误!未定义书签。 错误!未定义书签。 1.2 单片机的发展历程................................................ 1 2. 设计方案思路......................................................... 2 3.万年历的硬件设计原理................................................. 2 3.1 硬件系统设计框架................................................ 2 3.2 单片机主控制模块................................................ 3 3.3 时钟电路模块.................................................... 3 3.4 稳压源电路模块.................................................. 4 3.5 液晶显示模块.................................................... 4 3.6 温度测试模块.................................................... 5 4、软件设计............................................................. 5 4.1 程序设计流程图.................................................. 5 4.2 时间设定模块设计................................................ 6 4.3 温度设定模块设计................................................ 7 4.4 闹钟设定模块设计................................................ 8 5、 万年历的制作和调试.................................................. 9 5.1 布线的原则...................................................... 9 5.2 焊接调试........................................................ 9 5.3 万年历硬件调试 ................................................. 10 5.4 系统软件的调试................................................. 10 6、 结论............................................................... 12 参考文献............................................................... 13 谢 辞................................................................. 141.引言单片机经过几十年的发展,已经广泛应用于生活中的各个领域。例如导弹的导航装置、飞机上各种仪表的控制、计算机的网络通讯与数据传输、工业自动化 过程的实时控制和数据处理等各个方面。 电子万年历就是运用了单片机实现时钟的功能, 在日常生活中主要有方便人 们生活和装饰等作用。万年历原本就具有良好的开放性和发挥性,可以根据不同 的需求设计多种多样功能的万年历,以去满足人们日常生活。万年历基本设计要 求简单轻巧,功能齐全等。 现在对于电子万年历的设计大多运用 51 单片机。主要是因为 51 单片机种 类齐全、结构体系完整、指令系统功能完善、性能优越、具有较高可靠性和高性 价比等特点。1.1 选题背景随着人们的生活水平提高,生活节奏的加快,对时间的要求越来越高,为了 方便人们能随时知道时间,万年历的需求也日益增长。至二十一世纪的今天,万 年历经过第三次革命:第一次是摆和摆轮游丝的发明,相对稳定的机械振荡频率 源使钟表的走时差从分级缩小到秒级, 代表性的产品就是带有摆或摆轮游丝的机 械钟或表。第二次革命是石英晶体振荡器的应用,发明了走时精度更高的石英电 子钟表,使钟表的走时月差从分级缩小到秒级。第三次革命就是单片机数码计时 技术的应用(电子万年历)。 1.2 单片机的发展历程单片机是单片微型计算机的简称,也就是把微处理器(CPU) 、一定容量的程 序存储器(ROM)和数据存储器(RAM) 、输入/输出接口(I/O) 、时钟及其他一些 计算机外围电路, 通过总线连接在一起并集成在一个芯片上构成的微型计算机系 统。 单片机经过几十年的发展,在功能、体积、功耗、价格等个个股方面已经达 到非常优异的水平。在未来的发展中,单片机将趋向实现高性能化、存储器大容 量化、接口多样化、集成化、低功耗化等特点。2.设计方案思路方案一:万年历的单片机芯片选用 AT89S52 作主控制芯片,显示模块采用LCD1602,温度检测模块采用 DS18B20 温度传感器,时钟芯片选用 DS1302 芯片,稳压源电路主要采用三端集成电路 7805,经过稳压电路,可以提供单片 机正常工作电压 5V。 方案二: 万年历的单片机芯片选用 89C51 作主控制芯片, 显示模块采用 LED 数码管, 温度检测模块采用 DS18B20 温度传感器, 时钟芯片选用 DS1302 芯片, 稳压源电路主要采用三端集成电路 7805,经过稳压电路,可以提供单片机正常 工作电压 5V。 本次设计选择方案一, 主要是因为 AT89S52 具有 89C51 的功能, 片内 ROM 全都采用 Flash ROM, 能以超低电压工作, 具有在线编程可擦除技术。 DS18B20 温度传感器, 它具有耐磨耐碰、 体积小、 使用方便、 封装形式多样的优点。 DS1302 芯片具有高性能、低功耗、可以对年、月、日、周日、时、分、秒进行计时,具 有闰年补偿功能,工作电压为 2.5V~5.5V,满足设计所需。3.万年历的硬件设计原理3.1 硬件系统设计框架 DS1302 时钟芯片 DS18B20 温度检测 稳压电路 复位键LCD 显示AT89S52 单片机闹钟按键图 3-1硬件系统设计框架3.2 单片机主控制模块AT89S52 单片机为 40 引脚双列直插芯片,有 4 个 I/0 口 P0、P1、P2、P3,每条 I/0 口能独立的做输出和输入。AT89S52 具有以下标准功能: 8k 字节 Flash, 256 字节 RAM, 32 位 I/O 口线, 看门狗定时器, 个数据指针, 2 三个 16 位 定 时器/计数器, 一个 6 向量 2 级中断结构, 全双工串行口, 片内晶振及时钟电路。图 3-2 AT89S52 引脚示意图3.3 时钟电路模块DS1302 是美国 DALLAS 公司推出的一种高性能、低功耗、带 RAM 的实 时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿 功能,工作电压为 2.5V~5.5V。采用三线接口与 CPU 进行同步通信,并可采用 突发方式一次传送多个字节的时钟信号或 RAM 数据。 DS1302 内部有一个 31×8 的用于临时性存放数据的 RAM 寄存器。 图 3-3DS1302 引脚示意图3.4稳压电路模块三端稳压集成电路 7805 是一个输出正 5V 直流电压的稳压电源电路。稳压电路采用 7805,输入端和输出端分别接滤波电容,在输入端接一个二极管,可 防止正负极电源接反。图 3-4 7805 引脚示意图3.5液晶显示模块LCD1602 液晶显示屏有 16 个引脚, 通过 D0~D7 的 8 位数据端传输数据和指令。图 3-5 LCD1602 引脚示意图表 3-5LCD1602 引脚功能管脚 1 管脚 2 管脚 3V ss V dd V0一般接地 接电源(+5V) 液晶显示器对比度调整端,接正电源时对比度最弱,接 地电源时对比度最高 管脚 4 管脚 5 管脚 管脚 管脚 管脚 管脚 管脚 管脚 管脚 管脚 管脚 管脚 6 7 8 9 10 11 12 13 14 15 16RS R/W E DB 0 DB 1 DB 2 DB 3 DB 4 DB 5 DB 6 DB 7 BLA BLKRS 为寄存器选择,高电平 1 时选择数据寄存器、低电 平 0 时选择指令寄存器 R/W 为读写信号线,高电平(1)时进行读操作,低电平 (0)时进行写操作。 E(或 EN)端为使能(enable)端,下降沿使能。 底 4 位三态、 双向数据总线 0 位 底 4 位三态、 双向数据总线 1 位 底 4 位三态、 双向数据总线 2 位 底 4 位三态、 双向数据总线 3 位 高 4 位三态、 双向数据总线 4 位 高 4 位三态、 双向数据总线 5 位 高 4 位三态、 双向数据总线 6 位 高 4 位三态、 双向数据总线 7 位 背光电源正极 背光 电源负极3.6 温度测试模块DS18B20 温度传感器具有耐磨耐碰,体积小,使用方便,封装形式多样, 适用于各种狭小空间设备数字测温和控制领域。测温范围 -55℃~+125℃, 固有测温分辨率 0.5℃,工作电源为 3~5V。图 3-6 DS18B20 引脚示意图4. 4.1软件设计 程序设计流程图万年历的程序主要包括:延时程序、键盘输入程序(加减时按键程序、闹钟加减按键程序)、温度显示模块程序、时钟显示模程序、液晶数据显示程序等。 开始初始化 LCD、允许 LCD 显 示?YES NOLCD 关闭 读取温度、时间LCD 显示 扫描按键时间设定图 4-1 程序流程设计图闹钟设定4.2时间设定模块设计 DS1302可以对年、月、日、星期、时、分、秒进行计时,且具有闰年补偿功能。设计时不需要加电容,只需加一个32.768HZ晶振就可以了。 开始 DS1302 初始化 从 DS1302 中读出数据,放入 RAM 调用显示子程序 LCD 显示时间 扫描按键 时间设置 数据写回 DS1302 保存图4-2 时间设定程序流程图返回主显单4.3 温度设定模块设计DS18B20 的初始化: (1) 先将数据线置高电平“1”。 (2) 延时(该时间要求的不是很严格,但是尽可能的短一点) (3) 数据线拉到低电平“0”。 (4) 延时 750 微秒(该时间的时间范围可以从 480 到 960 微秒)。 (5) 数据线拉到高电平“1”。 (6) 延时等待(如果初始化成功则在 15 到 60 毫秒时间之内产生一个由 DS18B20 所返回的低电平“0”。据该状态可以来确定它的存在,但是应注意不能 无限的进行等待,不然会使程序进入死循环,所以要进行超时控制)。 (7) 若 CPU 读到了数据线上的低电平“0”后,还要做延时,其延时的时间从发 出的高电平算起最少要 480 微秒。 (8) 将数据线再次拉高到高电平“1”后结束。 开始 DS18B20 初始化 从 DS18B20 中读出数据,放入 RAM LCD 模块显示温度返回图4-3 温度测量程序流程4.4闹钟设定模块设计开始 初始化 扫描按键 闹钟设定 数据保存 返回图 4-4 闹钟设定程序流程图5.万年历的制作和调试5.1 布线的原则画硬件原理图时应注意些原则: (1) 按统一的要求选择图纸幅面、图框格式、电路图中的图形符号、文字符号。 (2) 应根据万年历的的工作原理,将各元器件自左到右,自上而下地排成一列或 数列。(3) 图面安排时,电源部分一般安排在左下方,输入端在左侧,输出端在 右侧。(4) 图中可动元件的工作状态,原则上应处于开断、不加电的工作位置。 (5) 将所有芯片的电源和地引脚全部利用,不要悬空。 在实际画的过程中应考虑自己的制作水平, 为了防止制作出的 PCB 板有断线 等情况发生,在画线时都用 30mil,而为了区分电源线和接地线,则电源线和接 地线用 50mil。在画 PCB 中应值得注意的是先看元器件的实物,然后看软件中是 否有相对应的库元器件,如果没有就需要根据实物自己画出相对应的元件,以免 做好板后才发现元器件无法插入对应的孔中。 在制作 PCB 板的时候应注意必须把墨全部转印到覆铜板上, 以免对板腐蚀的 时候出现断线等情况,如果转印并不十分好,则可以用黑色水墨笔在断线处画上 一笔,也可以起到防腐蚀的效果。5.2焊接调试万年历的制作过程中焊接最容易出现问题,在焊接前,必须先对照元器件的PCB 图和原理图,以免防止元器件的正负极接反或者把元器件搞错。在焊接的时 候要注意虚焊,根据焊接的经验,在焊点锡是尖角的,一般都是焊实了;如果焊 点处出现圆颗状,则容易出现虚焊,元器件的管脚可能没有焊实,出现接触不良 的情况。检查是否虚焊可以在完成焊接后,接上电源,看电路是否能正常工作, 如果不行,则可以用数字万用表进行检测。用数字万用表检测的时候,可以很方 便的检测出电路的通断, 判断在做板的时候是否有断路, 也很容易检测是否虚焊。5.3万年历硬件调试在制作出实物后,硬件并非按照理论上的情况成功进行。经过检测发现单片机的工作电压不能达到 5V,导致 LCD 不能正常显示,经过检查发现稳压电路供 电有问题,主要是 7805 端的电压不稳定,经过对焊接的修正和电容的更换,使 单片机能获得 5V 的正常工作电压。LCD 正常工作状态:图 5-3 1602 正常显示状态 对于进行检测时发现实际温度与检测温度有偏差,且偏差较大的问题,只需对程 序进行修正,可以减小误差。 修正前: a=tmpreadbyte(); //先读取低八位b=tmpreadbyte(); //再读取高八位 temp=b; temp=temp&&8; temp=temp|a; mm=temp*0. 625; temp=mm*10; return(temp); 修正后: a=tmpreadbyte(); //先读取低八位 b=tmpreadbyte(); //再读取高八位 temp=b; temp=temp&&8; temp=temp|a; mm=temp*0.0625; temp=mm*10+0.5; return(temp);5.4系统软件的调试根据原理图,在已有的程序上进行修改就可以运用于设计。在编写过程中可以根据自己所想的理想界面,对程序进行修改,在修改完成后没有错误就可以运 用在硬件上。一般在程序编写好后,可以先进行软件仿真,这个可以检查程序是 否适用于硬件,如果没有成功则说明,程序还存在一些问题;如果成功,则说明 程序没有问题。但是在软件仿真成功后,实际运用在硬件上,未必能成功,那是 因为软件仿真和实际的硬件始终存在一定的差别, 软件仿真只是提高程序的成功 率。在运用在实际的硬件上时,还需要根据硬件的实际情况进行修正,一般都可 以成功,问题不大。 在软件调试时由于实际硬件问题,原本的程序不适合,在对程序进行修改, 使结果能正常显示在 LCD 上。对程序数值的修改如下: 数值不正确导致无法显示:void init_ds18b20() //DS18B20 初始化; { x=1; while(x) { DQ=0; delay_us(100); //需延时 480us―960us DQ=1; //delay_us(2);//需延时 15―60us for 2――28.21us 可以 ?????? delay_1us(4);// while 2――21.70us if(DQ==0) //等待 DS18B20 拉低; x=0; } delay_us(20); //需要延时 60―240us DQ=1; //释放总线 // delay_us(500); } 修改后的数值:将// while 2――21.70us 改为 while 3――28.21us 就可以了6.结论本次设计主要是介绍了单片机的发展历程和万年历在日常生活中给人们带来的方便。第二章主要介绍了设计万年历的总体思路、万年历组成的几个模块以 及模块之间的连接。第三章主要介绍了各个模块的具体组成的,每个模块选用的 具体器件和器件的优点,其中主要运用到的器件是单片机 AT89S52、DS1302 时钟芯片、DS18B20 温度传感器、7805 三端集成稳压电路、LCD1602 液晶显 示屏。第四章主要介绍了软件设计,写出了其中几个主要模块的程序流程图,看 起来清晰明了,便于程序的编写。第五章主要介绍了在制作万年历的过程中的注 意事项、硬件软件的最终调试和解决在制作过程中出现的问题。 在此次万年历的设计过程中,更加熟习地掌握单片机及其他元器件的运用, 明白了它们的工作原理和使用方法。在制作过程中,很好的锻炼了自己的动手能 力,从一片空白,到慢慢运用自己所学,把几年的学习知识一起运用在一个作品 中,这个万年历的成功制作,自己付出许多时间、精力。更主要的是利用这个设 计,把以前的分散知识结合在一起,并且用自己的方式表达出来,这是对自己几 年的辛苦的肯定。 在此过程中同样感到了自己的许多不足,和一些知识的欠缺,明白对于电子 这一类的学习中还有许许多多自己所不知道的知识和问题。但是也明白了,只有 在一次次的实践过程中,才能成长的更快,才能完善自己,才能挑战未来。 希望在以后还能像这样不断扩展和锻炼自己。 参考文献[1] 孙育才. MCS-51 系列单片机微型计算机及应用[M]. 东南大学出版社, 1997, 23-34. [2] 何立民. 单片机应用系统设计[M].北京航空航天大学出版社,. [3] 张天凡. 51 单片机 C 语言开发详解[M].电子工业出版社, [4] 于 永 . 51 单 片 机 C 语 言 常 用 模 块 与 综 合 系 统 设 计 [M]. 电 子 工 业 出 版 社 ,
[5] 胡辉. 单片机原理与应用[M].中国水利水电出版社, [6] 谭浩强. C 语言设计[M].清华大学出版社. [7] 高鹏. Protel 99 入门与提高[M].人民邮电出版社. [8] 王怀平. 单片机微机万年历设计[N].职大学报.] 胡汉才. 单片机原理及接口技术[M].清华大学出版社. [10] 张有德. 单片微型机原理应用与实践[M].复旦大学出版社. [11] 何希庆. MCS-51 单片机原理实例实践[M].山东大学出版社.[12] 范立南. 单片微机接口与控制技术[M].辽宁大学出版社. [13] 李 华 . MCS-51 系 列 单 片 机 实 用 接 口 技 术 [M]. 北 京 航 空 航 天 大 学 出 版 社. [14] 张毅刚. MCS-51 单片机应用设计[M].哈尔滨工业大学出版社. [15] 晁阳. 单片机 CS-51 原理及应用开发教程.清华大学出版.谢 辞此次万年历的设计在指导老师和同学的帮助下,自己一步一步完成的。很感 谢指导老师对我的关心和督促,感谢同学对我在遇到问题时的帮助。在学校的良 好环境中,安心学习,顺利完成毕业设计。在这次的设计中学到了许多知识,很 好地锻炼自己,通过自己努力完成了作品。 感谢学校创造这么好的学习环境;感谢指导老师的细心栽培;感谢同学的热 心帮助! 附件附件一:原理图附件二:PCB 图 附件三:元器件清单 1 2 3 4 5 6 7 8 9 元器件名称 普通电容 C1、C2 普通电容 C5、C6 电解电容 C7 点解电容 C3、C4 普通电阻 R4、R9 普通电阻 R5、R6、R7、R8、R10 普通电阻 R2 普通电阻 R100 元器件型号 22pf 0.1uf 10uf 100uf 1k 10k 4.7k 10 10k 4.7k 数量 2 2 1 2 2 5 1 1 1 110 可变电阻 R3 11 上拉电阻 R1 12 单片机 U1 13 时钟芯片 U2 14 三端集成稳压电路 U4 15 晶振 Y3 16 晶振 Y2 17 LCD 液晶显示屏 Y1 18 温度传感器 J1 19 插针 J2 20 开关 S1、S2、S3、S4、S5 21 蜂鸣器 LS1 22 二极管 D1 23 PNP Q1AT89S52 DSM 32.768HZ 1602 DS18B20 CON21 1 1 1 1 1 1 1 5 1IN1 1附件四:实物图 附件五:程序清单#include&reg52.h& #include &intrins.h& #define uint unsigned int #define uchar unsigned char /*****************变量定义*************************/ uint l_ sbit dssclk=P1^0; sbit dsio=P1^1; sbit dsrst=P1^2; sbit lcdrs=P3^0; sbit lcdrw=P3^1; sbit lcden=P3^2; uchar miao,shi,fen,nian,yue,ri, sbit sbit sbit sbit sbit BUZZER=P3^3; //蜂鸣器接口 s0=P2^0; //时间设置 s1=P2^1; //闹钟设置 s2=P2^2; //加一 s3=P2^3; //减一uint ntable[4]; sbit DQ=P1^4; //定义 DS18B20 接口; uchar aa,bb,cc,dd,ee, uchar jinzhi(uchar x); uchar nza,nzb,nzc,//闹钟设置的各参数 uchar flag,flag1,flag2,s0num,s1 //flag1 为闹钟标志位 ,flag 显示标志位,flag2 为按键锁定标志位 /*******************函数声明部分***********************/ void help(void); void keyscan(); //键盘输入 void delay_us(uchar us); //for us 延时 void delay_1us(uchar us); //while us 延时 void delay_1ms(uchar z); //键盘延时消抖 void init_ds18b20(); //DS18B20 初始化 bit tmpreadbit(); //读一位程序 uchar tmpreadbyte(); //读一个字节程序 void writebyte(dat); //写字节程序 void write_ds_byte(uchar temp); //ds1302 写一位 void write_ds(uchar,uchar); //ds1302 写一个字节 uchar read_ds(uchar); //ds1302 读一个字节 //void read_rtc(void); //void set_rtc(void); void write_sfm(uchar,uchar); //lcd 写 时 分 秒 月 日 void write_year(uchar,uchar); //lcd 写 年 void write_xinqi(uchar,uchar); //lcd 写 星期 uint tmp(); //读取温度 void display(uchar aa,uchar bb,uchar cc,uchar dd,uchar ee,uchar ff); 显示部分 void init(); //lcd 初始化 void write_date(uchar date); //lcd 写数据 void write_com(uchar com); //lcd 写指令 void tmpchange(); //温度转化命令 uchar jinzhi(uchar x); //进制转化 void init_naozhongdisplay(void); //闹钟显示界面初始化 /********************延时部分**************************/ void delay_us(uchar us) //for us 延时 { // i= for(i=i&0;i--); } void delay_1us(uchar us) //while us 延时 { i= while(i) { i--; } } void delay_1ms(uchar z) //键盘延时消抖 { uchar x,y; for(x=z;x&0;x--) for(y=110;y&0;y--); } void delay(uchar z) { uchar x,y; for(x=z;x&0;x--) for(y=110;y&0;y--); } /***************************************************/ void init_naozhongdisplay(void) //闹钟显示界面初始化 { write_com(0x80+0); //设置数据指针 write_date(0x4f); //0 write_date(0x46); //F write_date(0x46); //F// 温 度 write_com(0x80+0x40+0); write_date(0x30); write_date(0x30); write_date(0x3a); write_date(0x30); write_date(0x30); write_date(0x3a); write_date(0x30); write_date(0x30);//0 //0 //: //0 //0 //: //0 //0} /******************lcd 液晶程序部分**************************/ void write_com(uchar com) //lcd 写指令 { lcdrs=0; lcdrw=0; lcden=0; P0= lcden=1; delay(5); lcden=0; } void write_date(uchar date) //lcd 写数据 { lcdrs=1; lcdrw=0; lcden=0; P0= lcden=1; delay(5); lcden=0; } void init() //lcd 初始化 { lcden=0; write_com(0x38); //lcd 液晶 显示模式设置 write_com(0x0c); //lcd 液晶 开显示 关光标 关闪烁 write_com(0x06); //读一个字节 光标指针加一 不整屏移动 write_com(0x01); //清屏 write_com(0x80); //设置数据指针 } void display(uchar aa,uchar bb,uchar cc,uchar dd,uchar ee,uchar ff) // 温 度 显 示 部分 { write_com(0x80+10); //温度显示部分 write_date(aa); write_date(0x30+bb); write_date(0x30+cc); write_date(dd); write_date(0x30+ee); write_date(ff); } /********************键盘输入部分*********************/ void keyscan() { uchar mm,ff,ss,rr,yy, if(s0==0) { delay_1ms(5); if(s0==0) { flag=1; //当 flag=0 时才更新始终数据显示 否则禁止更新显示 s0num++; //计算时间设置按键的次数 当为 8 时则退出设置状态 进入正常显 示 flag1=0; while(!s0); if(s0num==1) { write_com(0x80+0x40+11); write_com(0x0f); } } if(s0num==2) { write_com(0x80+0x40+7); } if(s0num==3) { write_com(0x80+0x40+4); } if(s0num==4) { write_com(0x80+0x40+1); } if(s0num==5) { write_com(0x80+9); } if(s0num==6) { write_com(0x80+6); } if(s0num==7) { write_com(0x80+3); } if(s0num==8) { s0num=0; write_com(0x0c); flag=0; write_ds(0x8e,0x00); write_ds(0x80,miao); //写秒 write_ds(0x82,fen); //写分 write_ds(0x84,shi); //写时 write_ds(0x86,ri); //写日 write_ds(0x88,yue); //写月 write_ds(0x8a,xinqi); //写星期 write_ds(0x8c,nian); //写年 write_ds(0x8e,0x80); } } if(s0num!=0) { /********************加时钟按键程序*********************/ if(s2==0) { delay_1ms(5); if(s2==0) { while(!s2); if(s0num==1) { xinqi++; if(xinqi==8) xinqi=0; write_xinqi(11,xinqi); write_com(0x80+0x40+11); } if(s0num==2) { mm=miao/16; miao=miao%16; miao=miao+mm*10; miao++; if(miao==60) miao=0; mm=miao/10; mm=mm*16; miao=miao%10; miao=mm+ write_sfm(0x40+6,miao); write_com(0x80+0x40+7); } if(s0num==3) { ff=fen/16; fen=fen%16; fen=fen+ff*10; fen++; if(fen==60) fen=0; ff=fen/10; ff=ff*16; fen=fen%10; fen=ff+ write_sfm(0x40+3,fen); write_com(0x80+0x40+4); } if(s0num==4) { ss=shi/16; shi=shi%16; shi=shi+ss*10; shi++; if(shi==24) shi=0; ss=shi/10; ss=ss*16; shi=shi%10; shi=ss+ write_sfm(0x40+0,shi); write_com(0x80+0x40+1); } if(s0num==5) { rr=ri/16; ri=ri%16; ri=ri+rr*10; ri++; if(ri==32) ri=0; rr=ri/10; rr=rr*16; ri=ri%10; ri=rr+ write_sfm(8,ri); write_com(0x80+9); } if(s0num==6) { yy=yue/16; yue=yue%16; yue=yue+yy*10; yue++; if(yue==13) yue=0; yy=yue/10; yy=yy*16; yue=yue%10; yue=yy+ write_sfm(5,yue); write_com(0x80+6); } if(s0num==7) { nn=nian/16; nian=nian%16; nian=nian+nn*10; nian++; if(nian==99) nian=0; nn=nian/10; nn=nn*16; nian=nian%10; nian=nn+ write_year(0,nian); write_com(0x80+3); }} } /********************减时钟按键程序*********************/ if(s3==0) { delay_1ms(5); if(s3==0) { while(!s3); if(s0num==1) { xinqi--; if(xinqi==0) xinqi=7; write_xinqi(11,xinqi); write_com(0x80+0x40+11); } if(s0num==2) { mm=miao/16; miao=miao%16; miao=miao+mm*10; miao--; if(miao==0) miao=59; mm=miao/10; mm=mm*16; miao=miao%10; miao=mm+ write_sfm(0x40+6,miao); write_com(0x80+0x40+7); } if(s0num==3) { ff=fen/16; fen=fen%16; fen=fen+ff*10; fen--; if(fen==0) fen=59; ff=fen/10; ff=ff*16; fen=fen%10; fen=ff+ write_sfm(0x40+3,fen); write_com(0x80+0x40+4); } if(s0num==4) { ss=shi/16; shi=shi%16; shi=shi+ss*10; shi--; if(shi==0) shi=23; ss=shi/10; ss=ss*16; shi=shi%10; shi=ss+ write_sfm(0x40+0,shi); write_com(0x80+0x40+1); } if(s0num==5) { rr=ri/16; ri=ri%16; ri=ri+rr*10; ri--; if(ri==0) ri=31; rr=ri/10; rr=rr*16; ri=ri%10; ri=rr+ write_sfm(8,ri); write_com(0x80+9); } if(s0num==6) { yy=yue/16; yue=yue%16; yue=yue+yy*10; yue--; if(yue==0) yue=12; yy=yue/10; yy=yy*16; yue=yue%10; yue=yy+ write_sfm(5,yue); write_com(0x80+6); } if(s0num==7) { nn=nian/16; nian=nian%16; nian=nian+nn*10; nian--; if(nian==0) nian=99; nn=nian/10; nn=nn*16; nian=nian%10; nian=nn+ write_year(0,nian); write_com(0x80+3); } } } }/*************闹钟设置按键********************/ if(s1==0) { delay_1ms(5); if(s1==0) { flag2=1; //防止在闹钟设置界面下 s0 起作用 flag=1; //当 flag=0 时才更新始终数据显示 否则禁止更新显示 //flag1=1; //开启闹钟设置界面 s1num++; while(!s1); if(s1num==1) { write_com(0x01); // init_naozhongdisplay(); write_com(0x80+2); //设置闹钟开关 write_com(0x0f); } } if(s1num==2) { write_com(0x80+0x40+1); //设置闹钟的小时 } if(s1num==3) { write_com(0x80+0x40+4); //设置闹钟的分钟 } if(s1num==4) { write_com(0x80+0x40+7); //设置闹钟的秒 } if(s1num==5) { s1num=0; write_com(0x0c); //关闭光标显示 flag1=0; //关闭闹钟设置界面 flag=0; //当 flag=0 时才更新始终数据显示 否则禁止更新显示 write_com(0x01); //清屏 flag2=0; //是 S0 按键起作用 ntable[0]= ntable[1]= ntable[2]= ntable[3]= } } if(s1num!=0) { if(s2==0) /***闹钟加时钟按键程序*****/ { delay_1ms(5); if(s2==0) { while(!s2); if(s1num==1) { nza++; if(nza==2) { nza=0; } //闹钟开关设置(加) if(nza==1) { write_com(0x80+0); write_date(0x4f); write_date(0x4e); write_date(0x20); write_com(0x80+1); } if(nza==0) { write_com(0x80+0); write_date(0x4f); write_date(0x46); write_date(0x46); write_com(0x80+2); } } if(s1num==2) { if(nzb==23) { nzb=0; }//设置数据指针 //0 //N ////设置数据指针 //0 //F //F nzb++; write_com(0x80+0x40+0); write_date(0x30+nzb/10); write_date(0x30+nzb%10); write_com(0x80+0x40+1); } if(s1num==3) { if(nzc==59) { nzc=0; } nzc++; write_com(0x80+0x40+3); write_date(0x30+nzc/10); write_date(0x30+nzc%10); write_com(0x80+0x40+4); } if(s1num==4) { if(nzd==59) { nzd=0; } nzd++; write_com(0x80+0x40+6); write_date(0x30+nzd/10); write_date(0x30+nzd%10); write_com(0x80+0x40+7); } }//设置闹钟的小时//设置闹钟的分钟//设置闹钟的秒} /********************闹钟减时钟按键程序*********************/ if(s3==0) { delay_1ms(5); if(s3==0) { while(!s3); if(s1num==1) { if(nza==0) { nza=2; } nza--; //闹钟开关设置(减) if(nza==1) { write_com(0x80+0); //设置数据指针 write_date(0x4f); //0 write_date(0x4e); //N write_date(0x20); // write_com(0x80+1); } if(nza==0) { write_com(0x80+0); //设置数据指针 write_date(0x4f); //0 write_date(0x46); //F write_date(0x46); //F write_com(0x80+2); } } if(s1num==2) { if(nzb==0) { nzb=24; } nzb--; write_com(0x80+0x40+0); write_date(0x30+nzb/10); write_date(0x30+nzb%10); write_com(0x80+0x40+1); } if(s1num==3) { if(nzc==0) { nzc=60; } nzc--; write_com(0x80+0x40+3); write_date(0x30+nzc/10); write_date(0x30+nzc%10); write_com(0x80+0x40+4); } if(s1num==4) {//设置闹钟的小时//设置闹钟的分钟 if(nzd==0) { nzd=60; } nzd--; write_com(0x80+0x40+6); write_date(0x30+nzd/10); write_date(0x30+nzd%10); write_com(0x80+0x40+7); } } } }//设置闹钟的秒} /**********************ds18b20 温度部分**************************/ void init_ds18b20() //DS18B20 初始化; { x=1; while(x) { DQ=0; delay_us(100); //需延时 480us―960us DQ=1; // delay_us(2); // 需 延 时 15 ― 60us for 2 ― ― 28.21us 可 以 ?????? delay_1us(4); //while 3――28.21us 可以 while 2――21.70us 不 行 if(DQ==0) //等待 DS18B20 拉低; x=0; } delay_us(20); //需要延时 60―240us DQ=1; //释放总线 // delay_us(500); } bit tmpreadbit() //读一位程序 { DQ=0; delay_us(1); // &=15us ?19.53 for 0 1 2 不行 DQ=1; dat=DQ; delay_us(8); // &45us return(dat); } uchar tmpreadbyte()//读一个字节程序 { uchar i, datt=0; for(i=0;i&8;i++) { datt=datt&&1; j=tmpreadbit(); if(j) { datt=datt|0x80; } delay_us(3); // &1us } DQ=1; // delay_us(15); return(datt); } void writebyte(dat) //写字节程序 { for(i=0;i&8;i++) { wei=dat&0x01; dat=dat&&1; if(wei) { DQ=0; delay_us(0);//15us 之内 DQ=1; delay_us(0); //50――60us } else { DQ=0; delay_us(9); //至少 60us DQ=1; // delay_us(1); //可无 } delay_us(2); //15――60us } DQ=1; delay_us(1); } void tmpchange() //温度转化命令 {? 80.30for 8可无 init_ds18b20(); // delay_us(100); writebyte(0xcc); writebyte(0x44); }// 可无uint tmp() //读取温度 { uchar a,b; init_ds18b20(); // delay_us(100); //可无 writebyte(0xcc); writebyte(0xbe); // delay_us(2); //可无 a=tmpreadbyte(); //先读取低八位 b=tmpreadbyte(); //再读取高八位 temp=b; temp=temp&&8; temp=temp|a; mm=temp*0.0625; temp=mm*10+0.5; return(temp); } /***********************ds1302 时钟程序部分***************************/ void write_ds_byte(uchar temp) { for(i=0;i&8;i++) { dssclk=0; dsio=temp&0x01; temp=temp&&1; dssclk=1; } } void write_ds(uchar add,uchar dat) { dsrst=0; _nop_(); dssclk=0; _nop_(); dsrst=1; _nop_(); write_ds_byte(add); write_ds_byte(dat); dsrst=0; } uchar read_ds(uchar add) { uchar i,temp=0x00; dsrst=0; _nop_(); dssclk=0; _nop_(); dsrst=1; _nop_(); write_ds_byte(add); for(i=0;i&8;i++) { if(dsio) temp=temp|0x80; dssclk=0; temp=temp&&1; dssclk=1; } dsrst=0; _nop_(); //以下为 DS1302 复位的稳定时间 dsrst=0; dssclk=0; _nop_(); dssclk=1; _nop_(); dsio=0; _nop_(); dsio=1; _nop_(); return (temp); //返回 } /*****************写入液晶数据显示*****************/ void write_sfm(uchar add,uchar datt) { uchar aa, aa=datt/16; bb=datt&0x0f; write_com(0x80+add); write_date(0x30+aa); write_date(0x30+bb); } void write_year(uchar add,uchar dat) { uchar aa,bb,cc, aa=2; bb=0; cc=dat/16; dd=dat&0x0f; if(cc==10) { bb++; cc=0; if(bb==10) { aa++; bb=0; } } write_com(0x80+add); write_date(0x30+aa); write_date(0x30+bb); write_date(0x30+cc); write_date(0x30+dd); } void write_xinqi(uchar add,uchar datt) { write_com(0x80+0x40+add); if(datt==1) { write_date(0x4d); write_date(0x4f); //mon write_date(0x4e); } if(datt==2) { write_date(0x54); write_date(0x55); //tue write_date(0x45); } if(datt==3) { write_date(0x57); //wed write_date(0x45); write_date(0x44); } if(datt==4) { write_date(0x54); write_date(0x48); //thu write_date(0x55); } if(datt==5) { write_date(0x46); write_date(0x52); write_date(0x49); } if(datt==6) { write_date(0x53); write_date(0x41); write_date(0x54); } if(datt==7) { write_date(0x53); write_date(0x55); write_date(0x4e); } } void help(void) { write_ds(0x8e,0x00); write_ds(0x80,0x00); write_ds(0x82,0x00); write_ds(0x84,0x00); write_ds(0x86,0x01); write_ds(0x88,0x01); write_ds(0x8a,0x01); write_ds(0x8c,0x00); write_ds(0x8e,0x80); } //sun //sat //fri//写秒 //写分 //写时 //写日 //写月 //写星期 //写年/******************************主函数部分****************************/ void main() { init(); BUZZER=1; flag=0; help(); //帮助一开始的时候时钟开始走时 while(1) { keyscan(); if(flag==0) { write_com(0x80+4); write_date(0x2d); write_com(0x80+7); write_date(0x2d); write_com(0x80+0x42); write_date(0x3a); write_com(0x80+0x45); write_date(0x3a); miao=read_ds(0x81); fen=read_ds(0x83); shi=read_ds(0x85); ri=read_ds(0x87); yue=read_ds(0x89); nian=read_ds(0x8d); xinqi=read_ds(0x8b);//设置数据指针 ////设置数据指针 ////设置数据指针 //: //:if(ntable[0]==1) { if(shi==ntable[1]&fen==ntable[2]&miao==ntable[3]) { for(x=0;x&500;x++) { BUZZER=1; delay_1ms(1); BUZZER=0; delay_1ms(1); BUZZER=1; delay_1ms(1); BUZZER=0; delay_1ms(1); BUZZER=1; delay_1ms(1); } } } write_sfm(0x40+6,miao); write_sfm(0x40+3,fen); write_sfm(0x40+0,shi); write_sfm(8,ri); write_sfm(5,yue); write_year(0,nian); write_xinqi(11,xinqi); /********************温度显示程序********************/ tmpchange(); //调用转换温度子程序 l_tmp=tmp(); //获取温度值 if(l_tmp&0) { aa=0x2d; //负号 } else { aa=l_tmp/1000; if(aa==0) aa=0x20; // 不显示 } l_tmp=l_tmp%1000; bb=l_tmp/100; l_tmp=l_tmp%100; cc=l_tmp/10; dd= 0x2e; //小数点 ee=l_tmp%10; ff=0 // 度 display(aa,bb,cc,dd,ee,ff); } } }
2017年万年历(每月一张 可记录 免费下载)_社会民生_生活休闲 暂无评价|0人阅读|0次下载|举报文档2017年万年历(每月一张 可记录 免费下载)_社会民生_生活休闲。...第万年历(TC 2.0 实现) 自学视频、源程序:配套资源\mr\1\ 章 在计算机普及的今天,万年历成为了人们日常生活和工作中经常用到的桌 面实用工具,它方便人们查看...33 8.总结???34 2 《C++课程设计――简单万年历制作》 简单万年历程序 1.1 设计题目描述本程序是一个简单的实现时间系统功能的万年历程序,此程序是为了遵循 ...基于51单片机的万年历_电子/电路_工程科技_专业资料。基于51单片机的万年历的设计基于51 单片机的万年历摘 要 本篇论文主要介绍了运用单片机实现电子万年历的设计, ...第 4 页共 17 页 - 5 -华东交通大学理工学院 C 语言课程设计 2..万年历程序设计思路图解 1.万年历总程序大体图解 在本次的程序中,我们由浅及深,我们将...数码万年历的使用说明_电子/电路_工程科技_专业资料。数码万年历的使用说明 数码万年历的使用操作说明 按键说明:设置键、上调键、下调/定闹键、流水键。 1、时间...(一)实习名称:单片机万年历 此次实习使用单片机 AT89S51、LCD1602 和外围元件制作一 个可以显示时间(时-分-秒) 、日期(年-月-日) 、星期的时钟。其中 年份...单片机课程设计报告 题目 院系 组长 ::: 带温度显示的万年历 电气信息工程系 专业 : 学号 : 学号 : 学号 : 学号 : 学号 : 通信工程 组员 1 : 组员 2 ...(& 欢迎进入万年历查询系统 \n&); printf(& * * \n\n&); printf(& ***\n\n \n&); printf(& 1 年历 2 月历 3 日历 4 退出\n&); printf(&...电子万年历的设计与实现_电子/电路_工程科技_专业资料。毕业设计(论文)任务书 题目: 电子万年历的设计与实现 任务与要求:设计一以单片机为核心控制的万年历,具有多...
All rights reserved Powered by
copyright &copyright 。文档资料库内容来自网络,如有侵犯请联系客服。

我要回帖

更多关于 单片机万年历程序 的文章

 

随机推荐