数码管模块化显示电子万年历

合集下载

数码管显示万年历时钟

数码管显示万年历时钟

数码管显示万年历时钟数码管显示万年历时钟功能介绍一、功能说明:1.整体功能达到了市售电子日历效果,显示内容包括年、月、日、星期、时、分、秒、室温;2.实时时钟芯片采用了两种:DS12C887+和DS1302。

可供学习和使用过程中进行选择;3.数码管控制采用了MAX7219专用扫描驱动芯片,可通过PS/2键盘对数码管的显示亮度进行15级调节;4.电路板上留有PS/2键盘接口,用于调节当前时间、数码管显示亮度、闹铃时间。

这一点和变通电子日历用明显区别,以达到一个有点专业的电子钟的要求;5.电路板上安装有继电器,可作为简单的时间控制(定时控制)或温度控制装置;二、待改进之处:1.可在板上合适的位置增加几个独立按键,日常使用调节更方便些;2.显示内容可增加农历和湿度;3.可以用光敏电阻配合串行A/D转换芯片实现显示亮度的自动调节,以适应环境光线的变化,这样子就更加具有专业性了。

三、PS/2键盘调整说明:1.使用PS2键盘F1进入运行时间设定、F2进入数码管显示亮度设定、F3进入闹铃时间设定、F4启动闹铃、F5关闭闹铃2.按下F1然后依次设定年、月、日、星期、时、分、秒时间信息,中途可以按小键盘区的ENTER键,退出设定状态3.按下F2然后选择小键盘区0-9和字符A-F可设定16级显示亮度,按下选择参数自动恢复走时状态4.按下F3然后依次设定时、分、秒三个闹铃时间参数,设定好任一参数可按小键盘区的ENTER键退出设定状态5.按下F4开启闹铃,继电器吸合其下方工作指示LED点亮,按下F5关闭闹铃,继电器释放同时LED熄灭,如蜂鸣器已经开始闹铃,可按F6或复位键6.按下F1或F2或F3但不想设定任何参数,都可按ESC退出相应的设定状态。

带温度显示的万年历_数码管显示(附电路图和源代码)

带温度显示的万年历_数码管显示(附电路图和源代码)

设计报告设计任务:设计一个智能化万年历时钟电路,LED数码管作为电路的显示部分,按钮开关作为调时部分,通过与单片机连接数码管动态显示年、月、日、时、分、秒、星期、温度。

并能准确计算闰年闰月的显示。

设计要求:通过与单片机连接数码管动态显示年、月、日、时、分、秒、星期等功能,并能准确计算闰年闰月的显示,三个个按钮连接P3.0、P3.1、P3.2可以精确调整每一个时间数值,通过对所设计的万年历时钟电路进行实验测试,达到了动态显示时间,随时调整时间等技术所连线路和单片机接口仿真图如图3所示:图3 仿真按键4)温度采集部分:DS18B20温度传感器,测温范围-55℃~+125℃,固有测温分辨率0.5℃。

独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。

DS18B20的采集数据通过DQ传入单片机,单片机读取数据后将数据输出!如图所示:程序如下:ReadOneChar(void){unsigned char i=0;// 定义i用于循环unsigned char dat = 0;// 读取的8位数据for (i=8;i>0;i--)//8次循环{DQ = 0;// 拉低DQ总线开始读时序dat>>=1;// dat左移一位DQ = 1; //释放DQ总线if(DQ)// 如果DQ=1,执dat|=0x80;(0x80即第7位为1,如果DQ为1,即读取的数据为1,将dat的第7为置1,然后dat>>=1,循环8次结束,dat 即为读取的数据)//DQ=0,就跳过dat|=0x80;Tdelay(4);// 延时以完成此次读时序,之后再读下一数据}return(dat); 返回读取的dat}//写一个字节WriteOneChar(unsigned char dat){unsigned char i=0;//for (i=8; i>0; i--)//{DQ = 0;//DQ = dat&0x01;//Tdelay(5);//延时以完成此次读时序,之后再读下一数据DQ = 1;//dat>>=1;//}}//读取温度ReadTemperature(void){unsigned char a=0;unsigned char b=0;unsigned int t=0;float tt=0;//Init_DS18B20();WriteOneChar(0xCC);// 写指令,跳过ROM,WriteOneChar(0x44);// 启动温度转换Init_DS18B20();WriteOneChar(0xCC);// 写指令,跳过ROM,WriteOneChar(0xBE);// 写指令,读暂存存储器a=ReadOneChar();//读低8位b=ReadOneChar();//读高8位t=b;//t<<=8;//t=t|a;//tt=t*0.0625;//t= tt*10+0.5;//return(t); //获得0.01°C 的精度并返回}LED数码管的选择LED数码管分为共阴和共阳两种,以利用STC89C51的P0口作为LED显示的数据部分,以P2口的七个口作为显示部分的位选,通过三八译码器和4-16译码器扩展为17位的位选分别接在一个四位数码管和13个数码管的位选部分。

电子万年历

电子万年历

电子万年历设计摘要随着现代生活节奏的不断加快,时间对于我们每个人来说也越来越重要,我们都需要有工具来度量时间。

电子万年历作为一种应用广泛的日常计时工具,由于它具有读取方便、显示直观、价格低廉等诸多优点,在当代社会中的应用也越来越广泛,大大方便了人们的生活和工作。

本设计是基于单片机技术原理,采用AT89S52单片机芯片作为主控制器,并采用时钟芯片DS1302来实现时钟,通过硬件电路的制作及软件程序的编制,利用单片机的控制作用通过共阳极数码管显示时间,实现显示阳历的年、月、日、星期、时、分、秒以及阴历的月、日的功能,还具有掉电继续计时的功能。

本设计主要由按键模块、显示模块、DS1302时钟模块、AT89S52主控制系统组成,其中按键电路采用3个按键构成独立连接式键盘,显示电路采用19个共阳极数码管构成,并利用74LS164译码器将二进制代码转化为对应的高低电平信号,并利用74LS138芯片来实现数码管的动态选择。

时钟模块采用DS1302芯片,它的使用寿命长、误差小,满足电子万年历需要精确计时的要求。

关键词:AT89S52,DS1302,数码管,译码器THE DESIGN OF ELECTRONIC CALENDARABSTRACTAs the pace of modern life continues to increase,time is becoming more and more important for us. We all need the tools to measure time. As a widely used timing tool, Electronic calendar has many advantages, such as easy to read, direct display and low cost. In modern society, it is becoming more and more extensive and makes our life and work easier.This design is based on principles of single-chip computer, using chip AT89S52 as the core controller and clock chip DS1302 as the clock. By combining the hardware circuits and software programs preparation, using common anode LED to display time under the control of single-chip computer. It can display the date of solar calendar and lunar calendar. It can continue to measure time after power lost.This design consists of four main parts, including key module, display module, DS1302 clock module and AT89S52 master control system. Buttons circuit uses three buttons to make up the independent keyboard. Display circuit consists of 19 common anodes LED. It uses 74LS164 to translate binary code into the corresponding high level signal and uses 74ls138 to choose the corresponding digital tube. The clock module uses clock chip DS1302, DS1302 meets the requirement of accurate timekeeping because of its long service life and small error.KEY WORDS:AT89S52,DS1302,Digital tube,Decoder目录前言 (1)第1章系统设计方案的选择 (3)§1.1电子万年历的设计意义 (3)§1.2 国内外同类设计的发展概况 (3)§1.3 设计要求 (4)§1.4 设计方案的选择与论证 (5)§1.4.1 单片机芯片的选择 (5)§1.4.2 时钟芯片的选择 (5)§1.4.3 显示模块的选择 (6)§1.4.4 键盘模块的选择 (6)§1.5 本设计的最终方案 (6)第2章系统的硬件设计与实现 (7)§2.1 电路设计总框图 (7)§2.2 系统的硬件概述 (7)§2.3 主要单元电路的设计 (8)§2.3.1 AT89S52主控制系统设计 (8)§2.3.2 键盘模块设计 (13)§2.3.3 时钟模块设计 (14)§2.3.4 显示模块的设计 (18)第3章系统的软件设计 (23)§3.1 主程序流程图 (23)§3.2 阳历程序设计 (24)§3.2.1 DS1302初始化 (24)§3.2.2 BCD码转化为十进制子程序 (27)§3.3 时间调整程序的设计 (27)§3.4 阴历程序的设计 (29)§3.4.1 计算阳历天数的程序设计 (29)§3.4.2 阳历转阴历程序 (32)结论 (33)参考文献 (34)致谢 (36)附录 (37)前言在当代繁忙的工作与生活中,时间与我们每个人都有非常密切的关系,每个人都受到时间的影响。

电子万年历毕业设计

电子万年历毕业设计

目录摘要 ........................................................... 错误!未定义书签。

一.设计要求与方案论证............................................ 错误!未定义书签。

1.1设计要求................................................... 错误!未定义书签。

1.1.1基本要求................................................ 错误!未定义书签。

1.1.2创新要求................................................ 错误!未定义书签。

1.2系统基本方案选择和论证...................................... 错误!未定义书签。

1.2.1单片机芯片.............................................. 错误!未定义书签。

1.2.2 显示模块 ............................................... 错误!未定义书签。

1.2.3时钟芯片................................................ 错误!未定义书签。

1.2.4温度传感器.............................................. 错误!未定义书签。

1.3电路设计最终方案决定........................................ 错误!未定义书签。

二.电子万年历硬件设计与实现...................................... 错误!未定义书签。

2.1电子万年历系统设计.......................................... 错误!未定义书签。

基于51单片机的电子万年历

基于51单片机的电子万年历

基于51单片机的电子万年历制作【摘要】本次设计就是设计一款万年历,以AT89S52单片机为核心,配备数码管显示模块、按键等功能模块。

分别采用A/D转换器TLC1549和温度传感器LM35来实现的。

万年历采用24小时制方式显示时间,在数码管上显示年、月、日、小时、分钟、秒等功能。

设计的核心主要包括硬件设计和软件编程两个方面。

硬件电路设计主要包括中央处理单元电路、时钟电路、执行电路等几部分。

软件用汇编语言来实现,主要包括主程序、键盘扫描子程序、时间设置子程序等软件模块。

【绪论】万年历,就是记录一定时间范围内(比如100年或更多)的具体阳历与阴历的日期的年历,方便有需要的人查询使用。

万年只是一种象征,表示时间跨度大。

这次设计通过对万年历系统的设计,详细介绍了51 单片机应用中的按键处理、数码管显示原理、动态和静态显示原理、定时中断、A/D转换等原理。

该系统能够显示年、月、日、小时、分钟、秒、星期、农历、温度,通过按键可以修改时间和设定闹钟等功能。

此系统结构简单、功能齐全,具有一定的推广价值。

1.系统说明1.1方案选择●方案一:采用日历时钟芯片DS12887来产生时间,数据经单片机处理后送到数码管显示。

DS12887内部有晶体振荡器、振荡电路、充电电路和可充电锂电池。

此外,片内有114B的RAM。

●方案二:采用纯单片机制作。

方案一中因为有了日历时钟芯片,这就使得单片机的软件部分简单很多。

但是考虑到芯片成本高,因此采用方案二。

1.2 系统方框图:如图1-1所示:图1-1 系统方框图1.3 说明系统由51系列单片机AT89S52、按键、温度采集、数码管显示、闹钟报时,电源等部分构成。

单片机部分包括时钟电路、复位电路;按键部分能够实现对时间的调整和定时时间的设定。

四个按键的功能分别为:退出、闹钟、设置、修改。

温度采集部分包括温度传感器、A/D转换。

传感器采样进来的信号经A/D转换后送给单片机,经软件处理后送至7段共阳数码管显示。

单片机课程设计报告电子万年历

单片机课程设计报告电子万年历

单片机课程设计报告电子万年历单片机课程设计报告:电子万年历一、设计简介在本次单片机课程设计中,我们选择了电子万年历作为设计主题。

电子万年历是一种结合了数字电路、单片机技术和实时时钟(RTC)技术的电子产品,它具有显示年份、月份、星期、日、时、分、秒的功能,还可以根据用户的需求进行定时、闹钟、报时等功能。

二、硬件设计我们采用了基于8051内核的单片机作为主控芯片。

该单片机具有丰富的I/O 端口,适于实现各种复杂的输入输出操作。

此外,它还内置了定时器和中断控制器,可以很方便地实现实时时钟功能。

1.显示模块:为了方便用户查看时间信息,我们选用了LCD显示屏作为显示设备。

LCD屏具有功耗低、体积小、显示内容丰富等优点。

2.实时时钟(RTC)模块:我们采用了常用的DS1302芯片作为实时时钟模块。

该芯片可以提供秒、分、时、日、星期、月、年的信息,而且还有可编程的报警功能。

3.按键模块:为了实现人机交互,我们设计了一组按键。

用户可以通过按键来调整时间、设置闹钟等。

4.电源模块:为了保证系统的稳定工作,我们采用了稳定的5V直流电源。

三、软件设计我们采用了C语言编写程序。

程序主要由以下几个部分组成:1.主程序:主程序主要负责读取RTC模块的时间信息,并控制LCD显示屏显示时间。

同时,主程序还要检测按键输入,根据用户的需求进行相应的操作。

2.RTC驱动程序:为了正确地读取和设置DS1302芯片的时间信息,我们编写了相应的驱动程序。

驱动程序包括初始化和读写寄存器两部分。

3.按键处理程序:按键处理程序用于检测按键输入,并根据按键值执行相应的操作。

比如,用户可以通过按键来增加或减少时间,设置闹钟等。

4.LCD显示程序:LCD显示程序用于控制LCD显示屏的显示内容。

在本设计中,我们使用了点阵字符库,将时间信息以字符的形式显示在LCD屏上。

四、测试与验证为了确保我们的电子万年历设计正确无误,我们进行了以下的测试和验证:1.硬件测试:首先,我们对硬件电路进行了测试,确保每个模块都能正常工作。

(汇编)实现数码管显示年,月,日,时,分,秒,星期,温度,按键可调万年历

(汇编)实现数码管显示年,月,日,时,分,秒,星期,温度,按键可调万年历

;///////////////////////////////////////////;本程序源代码由湖南工程职业技术学院提供.;专业单片机培训,让你学习单片机更容易.;程序员:蒋庆桥;QQ:xxxxxxxxx;本程序用汇编实现数码管显示年,月,日,时,分,秒,星期,温度,按键可调万年历,H_ADJ BIT P3.0 ;时/年调整M_ADJ BIT P3.1 ;分/月调整S_ADJ BIT P1.4 ;秒/日调整DT_SET BIT P1.6 ;时间/日期选择STR BIT P1.5;启动走时T_RST BIT P1.0 ;实时时钟复位线引脚T_CLK BIT P1.1 ;实时时钟时钟线引脚T_IO BIT P1.2 ;实时时钟数据线引脚HH_BIT EQU 40H ;时高位HL_BIT EQU 41H ;时低位MH_BIT EQU 42H ;分高位ML_BIT EQU 43H ;分低位SH_BIT EQU 44H ;秒高位SL_BIT EQU 45H ;秒低位TEMPER_L EQU 46HTEMPER_H EQU 47HYH_BIT EQU 48H ;年高位YL_BIT EQU 49H ;年低位MOH_BIT EQU 4aH ;月高位MOL_BIT EQU 4bH ;月低位DH_BIT EQU 4cH ;日高位DL_BIT EQU 4dH ;日低位SEC EQU 30HMIN EQU 31HHOUR EQU 32HDAY EQU 33HMONTH EQU 34HWEEK EQU 35HYEAR EQU 36HTEMPER equ 37hFLAG1 BIT 20h.0 ;DS18B20存在标志位DQ BIT P1.3A_BIT EQU 55HB_BIT EQU 56HDS1302_ADDR EQU 5EHDS1302_DATA EQU 5FHORG 00HLJMP STARTSTART:MOV SP,#60HMOV TMOD,#11HMOV TH0,#3CHMOV TL0,#0B0HMOV R0,#10SETB EASETB ET0SETB TR0MOV R1,37HMOV YEAR,#13H ;上电预置日期、时间MOV WEEK,#03H ;周1 MONMOV MONTH,#07H ;2011 04 25 12:00:00MOV DAY,#05HMOV HOUR,#23HMOV MIN,#00HMOV SEC,#00HMOV 50H,#0/////////////////////////////////////////////////////////////////////// ////MAIN:LCALL KEY//MAIN2:CALL FENLILCALL INIT_18B20LCALL GET_TEMPERcall CHANGEcall dispcall displayAJMP MAINFENLI:MOV A,YEARMOV B,#10HDIV ABMOV YL_BIT,BMOV YH_BIT,AMOV A,MONTHMOV B,#10HDIV ABMOV MOL_BIT,BMOV MOH_BIT,AMOV A,DAYMOV B,#10HDIV ABMOV DL_BIT,BMOV DH_BIT,AMOV A,HOURMOV B,#10HDIV ABMOV HL_BIT,BMOV HH_BIT,AMOV A,MINMOV B,#10HDIV ABMOV ML_BIT,BMOV MH_BIT,AMOV A,SECMOV B,#10HDIV ABMOV SL_BIT,BMOV SH_BIT,ARETKEY: ;按键子程序JB F0,MAIN10 ;F0=1,开始走时。

数码管万年历

数码管万年历
硬件设计与仿真
d0 d1 d2 d3 d4 d5 d6 d7 w0 w1 w2 w3 w4 w5
U4
19 XTAL1 18 XTAL2
9 RST
29 30 31
PSEN ALE EA
1 2 3 4 5 6 7 8
P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7
AT89C51
❖ alarm();
❖ led_display1();

❖}
❖}
D0 D1 D2 D3 D4 D5 D6 D7
Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7
11 1
LE OE
74HC573
19 d0 18 d1 17 d2 16 d3 15 d4 14 d5 13 d6 12 d7
0a 1a 2a 3a 4a 5a 6a
U3
00 2 01 3 02 4 03 5 04 6 05 7 06 8 07 9
P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD
10 11 12 13 14 15 16 17
P0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7
39 38 37 36 35 34 33 32
P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A15
C程序
❖ #include<reg52.h> ❖ #include"dingshiqi.h" ❖ #include"led_display.h" ❖ #include"tiaoshi.h" ❖ #include"key.h" ❖ #include"jishi.h"

单片机课程设计—万年历[1]

单片机课程设计—万年历[1]

郑州轻工业学院软件学院单片机与接口技术课程设计总结报告设计题目:电子万年历学生:系别:专业:班级:学号:指导教师:2021年12月16日设计题目:电子万年历设计任务与要求:1、显示年月日时分秒及星期信息2、具有可调整日期和时间功能3、增加闰年计算功能方案比拟:方案一:系统分为主控制器模块、显示模块、按键开关模块,主控制模块采用AT89C52单片机为控制中心,显示模块采用普通的共阴LED数码管,键输入采用中断实现功能调整,计时使用AT89C52单片机自带的定时器功能,实现对时间、日期的操作,通过按键盘开关实现对时间、日期的调整。

方案二:系统分为主控模块、时钟电路模块、按键扫描模块,LCD显示模块,电源电路、复位电路、晶振电路等模块。

主控模块采用AT89C52单片机,按键模块用四个按键,用于调整时间,显示模块采用LCD1602,时钟电路模块采用DS1302时钟芯片实现对时间、日期的操作。

两个方案工作原理大致相同,只有显示模块和时钟电路不同。

LED数码管价格适中,对于数字显示效果较好,而且使用单片机的端口也较少; LCD1602液晶显示屏,显示功能强大,可以显示大量文字、图形,显示多样性,清晰可见,价格相对LED数码管来说要昂贵些,但是基于本设计显示的东西较多,假设采用LED数码管的话,所需数码管较多,而且不利于控制,因此选择LCD1602作为显示模块。

DS1302是一款高性能的实时时钟芯片,以计时准确、接口简单、使用方便、工作电压范围宽和低功耗等优点,得到广泛的应用,实时时钟有秒、分、时、星期、日、月和年,月小于31天时可以自动调整,并具有闰年补偿功能,而且在掉电时能够在外部纽扣电池的供电下继续工作。

单片机有定时器的功能,但时间误差较大,且需要编写时钟程序,因此采用DS1302作为时钟电路。

比照以上方案,结合设计技术指标与要求我们选择了方案二进行设计。

逻辑总框图:该电子万年历的总体设计框图如图(1)所示。

基于STCC单片机的多功能电子万年历

基于STCC单片机的多功能电子万年历

基于STCC单片机的多功能电子万年历————————————————————————————————作者:————————————————————————————————日期:摘要本文介绍了基于STC89C52单片机的多功能电子万年历的硬件结构和软硬件设计方法。

本设计由数据显示模块、温度采集模块、时间处理模块和调整设置模块四个模块组成。

系统以STC89C52单片机为控制器,以串行时钟日历芯片DS1302记录日历和时间,它可以对年、月、日、时、分、秒进行计时,还具有闰年补偿等多种功能。

温度采集选用DS18B20芯片,万年历采用直观的数字显示,数据显示采用1602A液晶显示模块,可以在LCD上同时显示年、月、日、周日、时、分、秒,还具有时间校准等功能。

此万年历具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点,具有广阔的市场前景。

关键字:万年历温度计液晶显示ABSTRACTThis paper introduces the based on STC89C52 multi-function electronic calendar of the hardware structure and software and hardware design method. This design by data display module, temperature acquisition module, time processing module and set module four modules. With STC89C52 single-chip microcomputer system for the controller to serial clock calendar chip DS1302 record calendar and time, it can be to date and time, minutes and seconds for the time, also has a leap year compensation and other functions. Temperature gathering choose DS18B20 chip, calendar by using object digital display, data showed that the 1602 A liquid crystal display module, can be in the LCD shows at the same time year, month, day, Sunday, when, minutes and seconds, still have time calibration etc. Function. This calendar has read the convenient, direct display, functional diversity, simple circuit, low cost, and many other advantages, has a broad market prospect.Key words:Perpetual Calendar thermometer LCD display目录摘要 (III)ABSTRACT (IV)前言 (VI)1 绪论 01.1 课题研究的背景 01.2课题的研究目的与意义 01.3课题解决的主要内容 02 系统的方案设计与论证 (1)2.1单片机芯片设计与论证 (2)2.2按键控制模块设计与论证 (2)2.3时钟模块设计与论证 (2)2.4温度采集模块设计与论证 (3)2.5显示模块模块设计与论证 (3)3 系统硬件的设计 (4)3.1 STC89C52单片机 (4)3.2时钟芯片DS1302接口设计与性能分析 (7)3.3温度芯片DS18B20接口设计与性能分析 (11)3.4 LCD显示模块 (16)3.5按键模块设计 (17)3.6复位电路的设计 (18)4 系统的软件设计 (20)4.1主程序流程图的设计 (20)4.2 程序设计 (21)5 系统的机体设计 (27)5.1系统的模块组成 (27)5.2 功能实现 (27)结论 (29)参考文献 (30)致谢 (31)附录 (32)前言随着科技的快速发展,时间的流逝,从观太阳、摆钟到现在电子钟,人类不断研究,不断创新纪录。

电子万年历(数码管显示)

电子万年历(数码管显示)

程序#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int#define jump_ROM 0xCC#define start 0x44#define readdata 0xBEsbit dq=P1^7;sbit w1=P0^6;sbit w2=P0^5;sbit w3=P0^4;sbit w4=P0^7;sbit wela=P0^3;sbit A=P0^0;sbit b=P0^1;sbit C=P0^2;sbit SCLK=P1^0; //DS1302通讯线定义sbit DIO=P1^1;sbit RST=P1^2;sbit k1=P1^6;sbit k2=P1^5;sbit add=P1^4;sbit sub=P1^3;uchar code smgw[]={0,1,2,3,4,5,6,7};uchar code smgd[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};//uchar code tab[]={0x077,0x12,0x0c7,0x0d3,0x0b2,0x0f1,0x0f4,0x13,0x0f7,0x0b3,0x00}; uchar temperature[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};uchar code xingqi[] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x7f};uchar tab1[9];uchar tab2[9];uchar nian,yue,ri,zhou,shi,fen,miao,a,shan,tt,shan;uchar knum;uchar q,j,tempp;void display();void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=55;y>0;y--);}void delay1(int useconds){int s;for(s=0;s<useconds;s++);}uchar resetds(void){uchar presencesignal;dq=0;delay1(30);dq=1;delay1(3);presencesignal=dq;delay1(30);return presencesignal;}void writebit(char val){ dq=0;if(val==1)dq=1;elsedq=0;delay1(5);dq=1;}void writebyte(char val) {uchar i;uchar temp;for(i=0;i<8;i++){temp=val>>i;temp&=0x01;writebit(temp);}delay1(5);}uchar readbit(void) {uchar i;dq=0;dq=1;for(i=0;i<3;i++)return dq;}uchar readbyte(void) {uchar i;uchar value=0;for(i=0;i<8;i++) {if(readbit())value|=0x01<<i;delay1(7);}return (value);}void temper(){uchar get[9];uchar k,lsb,msb,n;int m;float t;m=0;resetds();writebyte(jump_ROM);writebyte(start);delay1(5);resetds();writebyte(jump_ROM);writebyte(readdata);display();for(k=0;k<9;k++){get[k]=readbyte();}msb=get[1];lsb=get[0];if((msb&0x80)!=0) // /取补码/ {m=1;msb=~msb;lsb=( ~lsb)+1;if(lsb==0){msb++;}}display();n=lsb;msb=msb<<4;lsb=lsb>>4;tempp=msb|lsb;n=n&0x0f;t=(float )(n);t=t*0.0625;j=(int)(t*100);P2=temperature[j%10];w4=1;w1=0;delay(2);P2= temperature[j/10];w1=1;w2=0;delay(2);P2=temperature[tempp%10]+0x80;w2=1;w3=0;delay(2);P2= temperature[tempp/10];w3=1;w4=0;delay(2);w4=1;}void write(uchar date) //写入DS1302一个字节{uchar temp,i;RST=1;SCLK=0;temp=date;for(i=0;i<8;i++){SCLK=0;if(temp&0x01)DIO=1;elseDIO=0;SCLK=1;temp>>=1;}}uchar read() //读出DS1302一个字节{uchar a,temp;RST=1;for(a=8;a>0;a--){temp>>=1;SCLK=1;_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();SCLK=0;if(DIO){temp=temp|0x80;}else{temp=temp|0x00;}}return (temp);}void write_1302(uchar add,uchar dat) //写DS1302数据{RST=0;SCLK=0;RST=1;write(add);write(dat);SCLK=1;RST=0;}uchar read_1302(uchar add) //读DS1302数据{uchar dat1,dat2;RST=0;SCLK=0;RST=1;write(add);dat1=read();SCLK=1;RST=0;dat2=dat1/16; //数据进制转换dat1=dat1%16;dat1=dat1+dat2*10; //十六进制转十进制return(dat1);}void ds1302_init() //1302初始化{RST=0;SCLK=0;write_1302(0x8e,0x00); //允许写入write_1302(0x80,0x00);//设置初始值SECwrite_1302(0x82,0x59);//设置初始值MINwrite_1302(0x84,0x23);//设置初始值HRwrite_1302(0x86,0x20);//设置初始值DA TEwrite_1302(0x88,0x4);//设置初始值MONTH write_1302(0x8A,0x03);//设置初始值DAYwrite_1302(0x8C,0x12);//设置初始值YEARwrite_1302(0x8e,0x80);}void display(){ P2=temperature[j%10];w4=1;w1=0;delay(2);P2= temperature[j/10];w1=1;w2=0;delay(2);P2=temperature[tempp%10]+0x80;w2=1;w3=0;delay(2);P2= temperature[tempp/10];w3=1;w4=0;delay(2);w4=1;miao=read_1302(0x81); //读秒fen=read_1302(0x83); //读分shi=read_1302(0x85);//&0x3f; //读时ri=read_1302(0x87); //读日yue=read_1302(0x89); //读月nian=read_1302(0x8d); //读年zhou=read_1302(0x8B); //读星期if(knum==7){wela=0; //年A=0;b=1;C=1;P2=0x5b&shan;delay(2);A=1;b=1;C=1;P2=0x3f&shan;delay(2);wela=1;A=0;b=0;C=0;P2=smgd[nian/10]&shan;delay(2);A=1;b=0;C=0;P2=smgd[nian%10]&shan;delay(2);}else{wela=0; //年A=0;b=1;C=1;P2=0x5b;delay(2);A=1;b=1;C=1;P2=0x3f;delay(2);wela=1;A=0;b=0;C=0;P2=smgd[nian/10];delay(2);A=1;b=0;C=0;P2=smgd[nian%10];delay(2);}if(knum==6){ wela=1;A=0;b=1;C=0; // 月P2= smgd [yue/10]&shan;delay(2);A=1;b=1;C=0;P2= smgd [yue%10]&shan;delay(2);}else{ wela=1;A=0;b=1;C=0; // 月P2=smgd [yue/10];delay(2);A=1;b=1;C=0;P2= smgd [yue%10];delay(2);}if(knum==4){ wela=1;A=0;b=1;C=1; // 星期P2=xingqi[zhou%10]&shan;delay(2);}else{A=0;b=1;C=1; // 星期P2=xingqi[zhou%10];delay(2);}if(knum==5){wela=1;A=0;b=0;C=1; // 日P2= smgd [ri/10]&shan;delay(2);A=1;b=0;C=1;P2= smgd [ri%10]&shan;delay(2);}else{ wela=1;A=0;b=0;C=1; // 日P2= smgd [ri/10];delay(2);A=1;b=0;C=1;P2= smgd [ri%10];delay(2);}if(knum==3){ wela=0;A=0;b=0;C=0; // 时P2= smgd [shi/10]&shan;delay(2);A=1;b=0;C=0;P2= smgd [shi%10]&shan;delay(2);}else{ wela=0;A=0;b=0;C=0; // 时P2= smgd [shi/10];delay(2);A=1;b=0;C=0;P2= smgd [shi%10];delay(2);}if(knum==2){ wela=0;A=0;b=1;C=0; // 分P2= smgd [fen/10]&shan;delay(2);A=1;b=1;C=0;P2= smgd [fen%10]&shan;delay(2);}else{ wela=0;A=0;b=1;C=0; // 分P2= smgd [fen/10];delay(2);A=1;b=1;C=0;P2= smgd [fen%10];delay(2);}if(knum==1){ wela=0;A=0;b=0;C=1; // 秒P2= smgd [miao/10]&shan;delay(2);A=1;b=0;C=1;P2= smgd [miao%10]&shan;delay(2);wela=1;A=1;b=1;C=1;}else{ wela=0;A=0;b=0;C=1; //秒P2= smgd [miao/10];delay(2);A=1;b=0;C=1;P2= smgd [miao%10];delay(2);wela=1;A=1;b=1;C=1;}}void key(){uchar temp;display();if(k1==0){delay1(20);if(k1==0){while(!k1);knum++;if(knum==8){knum=1;}}}if(k2==0){delay1(20);if(k2==0){while(!k2);knum--;if(knum==0){knum=7;}}}if(knum!=0){if(add==0){delay1(20);if(add==0){while(!add);switch(knum){case 1: miao++;if(miao==60){miao=0;}temp=(miao)/10*16+(miao)%10;//十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00); //允许写,禁止写保护write_1302(0x80,temp);write_1302(0x8e,0x80); //打开写保护break;case 2:fen++;if(fen==60)fen=0;temp=(fen)/10*16+(fen)%10;//十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00); //允许写,禁止写保护write_1302(0x82,temp);write_1302(0x8e,0x80); //打开写保护}break;case 3: shi++;if(shi==24){shi=0;}temp=(shi)/10*16+(shi)%10;//十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00); //允许写,禁止写保护write_1302(0x84,temp);write_1302(0x8e,0x80); //打开写保护break;case 5:ri++;switch(yue){case 1:case 3:case 5:case 7:case 8:case 10:case 12:if(ri==32)ri=1;break;case 4:case 6:case 9:case 11:if(ri==31)ri=1;break;case 2:if(nian%4==0||nian%400==0){if(ri==30)ri=1;}elseif(ri==29)ri=1;}break;}temp=(ri)/10*16+(ri)%10;//十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00); //允许写,禁止写保护write_1302(0x86,temp);write_1302(0x8e,0x80); //打开写保护break;case 4:zhou++;if(zhou==8)zhou=1;temp=(zhou)/10*16+(zhou)%10;//十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00); //允许写,禁止写保护write_1302(0x8a,temp); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码write_1302(0x8e,0x80); //打开写保护break;case 6: yue++;if(yue==13)yue=1;temp=(yue)/10*16+(yue)%10;//十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00); //允许写,禁止写保护write_1302(0x88,temp);write_1302(0x8e,0x80); //打开写保护break;case 7:nian=(((nian>>4)&0x0f)*10+(nian&0x0f))+1;if(nian==99)nian=0;//temp=(nian)/10*16+(nian)%10;//十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00); //允许写,禁止写保护write_1302(0x8c,((nian/10)<<4)+((nian%10)&0x0f)); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码write_1302(0x8e,0x80); //打开写保护break;}}if(sub==0){delay1(20);if(sub==0){while(!sub);switch(knum){case 1: miao--;if(miao==-1)miao=59;temp=(miao)/10*16+(miao)%10;//十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00); //允许写,禁止写保护write_1302(0x80,temp);//write_1302(0x80,((miao/10)<<4)+((miao%10)&0x0f)); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码write_1302(0x8e,0x80); //打开写保护break;case 2:fen--;if(fen==-1)fen=59;temp=(fen)/10*16+(fen)%10;//十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00); //允许写,禁止写保护write_1302(0x82,temp);//write_1302(0x82,((fen/10)<<4)+((fen%10)&0x0f)); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码write_1302(0x8e,0x80); //打开写保护}break;case 3:shi--;if(shi==-1)shi=23;temp=(shi)/10*16+(shi)%10;//十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00); //允许写,禁止写保护write_1302(0x84,temp);//write_1302(0x84,((shi/10)<<4)+((fen%10)&0x0f)); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码write_1302(0x8e,0x80); //打开写保护break;case 5:ri--;switch(yue){case 1:case 3:case 5:case 7:case 8:case 10:case 12:if(ri==0)ri=31;break;case 4:case 6:case 9:case 11:if(ri==0)ri=30;break;case 2:if(nian%4==0||nian%400==0){if(ri==0)ri=29;}else{if(ri==0)ri=28;}break;}temp=(ri)/10*16+(ri)%10;//十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00); //允许写,禁止写保护write_1302(0x86,temp);//write_1302(0x86,((ri/10)<<4)+((ri%10)&0x0f)); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码write_1302(0x8e,0x80); //打开写保护break;case 4:zhou--;if(zhou==0)zhou=7;temp=(zhou)/10*16+(zhou)%10;//十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00); //允许写,禁止写保护write_1302(0x8a,temp); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码write_1302(0x8e,0x80); //打开写保护break;case 6: yue--;//yue=(((yue>>4)&0x01)*10+(yue&0x0f))-1;if(yue==0)yue=12;temp=(yue)/10*16+(yue)%10;//十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00); //允许写,禁止写保护write_1302(0x88,temp); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码write_1302(0x8e,0x80); //打开写保护break;case 7:nian=(((nian>>4)&0x0f)*10+(nian&0x0f))-1;if(nian==-1)nian=99;//temp=(nian)/10*16+(nian)%10;//十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00); //允许写,禁止写保护write_1302(0x8c,((nian/10)<<4)+((nian%10)&0x0f)); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码write_1302(0x8e,0x80); //打开写保护break;}}}}}void main(){ds1302_init();IT0=1;EX0=1;TMOD=1;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;shan=0x00;temper();while(1){temper();for(q=0;q<230;q++)key();display();}}void int0() interrupt 0{TR0=~TR0;knum=0;shan=0x0ff;}void time0() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;tt++;if(tt==9){tt=0;shan=~shan;}}。

基于51单片机的数码管万年历

基于51单片机的数码管万年历

宜宾学院物理与电子工程学院课题论文单片机(期末)课程设计题目:基于51单片机的数码管万年历院(系):物理与电子工程学院专业年级: 2012级硕勋励志班指导老师:****名:***学号: *********2014年6月目录摘要 (2)第一章绪论 (3)1、1 万年历的背景 (3)1、2 万年历的应用 (4)第二章设计原理 (5)第三章实现过程 (6)3、1 方案选择 (6)3、2 系统框图 (6)3、3 说明 (6)3、4 电路模块说明 (7)3、5 软件设计模块 (8)3、5、1 万年历的算法 (8)3、5、2 时间处理 (9)3、5、3 日期处理 (10)第四章最终结果 (11)第五章收获与体会 (13)5、1 设计过程中遇到的问题及解决方法 (13)5、2 收获与体会 (13)致谢 (14)参考文献 (15)摘要随着人们时间观念的增强,万年历被广泛应用于生活中的各种场合。

现在所使用的万年历,即:包括若干年或适用于若干年的历书。

万年只是一种象征,表示时间跨度大。

本次课程设计中制作的“基于51单片机的数字万年历”便是以电子产品为载体的基于AT89C51单片机在数码管上显示(公历)年月日、时分秒功能的简易万年历。

利用AT89C51单片机内部定时/计数器T0的模式2(8位自动重装初值)产生一个时间为250us的信号,再计数4000次产生1S的时间后发出中断,再由单片机进行数据处理后,送人数码管(共阴极数码管)显示(动态显示)。

关键字:51单片机、万年历、数码管、动态显示、定时/计数T0第一章绪论1、1 万年历的背景万年历是我国古代传说中最古老的一部太阳历。

为纪念历法编撰者万年功绩,便将这部历法命名为“万年历”。

相传,在很久以前,有个名叫万年的青年,看到当时节令很乱,想把节令定准。

一天,他上山砍柴,坐在树阴下休息,树影的移动启发了他,他设计了一个测日影计天时的晷仪。

可是,天阴雨雾,影响测量。

后来,山崖上的滴泉引起了他的兴趣,他又动手做了一个五层漏壶。

基于FPGA的多功能电子万年历

基于FPGA的多功能电子万年历

基于FPGA的多功能电子万年历电子万年历可以显示日期、星期、时间以及其他的一些信息。

近几年,随着FPGA技术的发展,基于FPGA的电子万年历已经被广泛使用。

基于FPGA的电子万年历除了具备传统电子万年历的基本功能外,还具有诸多的优点。

采用FPGA做万年历,集成度高、抗电磁干扰性能好、可编程性强,且易于扩展。

本文将主要讲述基于FPGA的多功能电子万年历的设计原理、实现细节以及相关应用。

设计原理基于FPGA的多功能电子万年历主要由FPGA芯片、时钟模块、数码管显示模块以及按键扫描模块组成。

1.FPGA芯片:大体上分为输入、输出、内存和运算4个部分。

通过采用FPGA芯片可以实现逻辑门的优化布局和资源分配,从而实现万年历的多种功能。

2.时钟模块:利用时钟模块产生震荡脉冲,驱动万年历的各种操作。

时钟模块还可以产生各种频率的时钟信号,如秒钟、分频、时钟、日历等,从而实现多种功能。

3.显示模块:显示模块主要通过数码管来显示日期、星期、时间等信息。

具体实现方法是将数码管的数码码表和时序参数存储在内存中,通过编程控制数码管的显示方式,实现数据的输出。

4.按键扫描模块:按键扫描模块主要通过扫描键盘来接受用户的输入,并根据用户的操作控制万年历的功能。

实现细节基于FPGA的多功能电子万年历的实现细节主要包括万年历的功能实现、按键扫描和电路部署。

1.万年历的功能实现多功能电子万年历主要支持年、月、日的日期显示、星期显示、时间显示、时钟多种功能。

具体实现方法是每秒读取系统时间,并将时间转换成5V逻辑电平数据,然后通过编程控制数码管的显示方式,实现数据的输出。

2.按键扫描按键扫描模块主要通过接收按下按键后输出电平并进行数值编码,与计算机进行数值比对,然后根据用户的操作控制万年历的功能。

比如,按下设置键后,进入设置模式,按一次将秒数置零,按2次进行月日年设置,按3次进行时间设置,按4次重新返回当前时间界面。

3.电路部署电路部署主要包括FPGA芯片与其他模块、模块与模块之间的连接。

基于51单片机电子万年历设计

基于51单片机电子万年历设计

一、引言电子万年历是一种以数字形式实时显示日期、星期和时间等信息的电子设备。

在现代人日常生活中,万年历是一种常见的小型电子产品。

本文将基于51单片机设计一款简单实用的电子万年历。

二、设计原理1.时钟模块:采用DS1302实时时钟模块。

DS1302通过三线式串行接口与51单片机进行通信,可以实时获取日期、星期和时间等信息。

2.显示模块:使用数码管显示日期、星期和时间等信息。

共使用四块共阳数码管,采用数码管模块进行驱动,通过IO口进行数据传输。

3.按键模块:设计四个按键,分别为设置、上、下和确定。

通过按键来调整日期、星期和时间等信息。

4.闹钟功能:加入闹钟功能,可以设定闹钟时间,到达设定时间时,会有提示音。

5.温湿度传感器:加入温湿度传感器,可以实时监测环境温湿度,并在数码管上进行显示。

6.外部电源:由于51单片机工作电压较高,需要使用外部电源进行供电。

三、硬件设计1.电源电路:使用稳压电源芯片LM7805进行5V稳压,将稳压后的电压供给单片机和各个模块。

2.时钟模块:DS1302模块与单片机通过串行通信进行连接。

时钟模块上的时钟信号、数据信号和复位信号分别与单片机的IO口相连。

3.数码管显示模块:共有四块共阳数码管,通过595芯片进行驱动。

单片机的IO口与595芯片的串行、时钟和锁存引脚相连,595芯片的输出引脚与数码管的各段相连。

4.按键模块:通过电阻分压来实现按键功能,按下按键时,相应的IO口会被拉低。

5.闹钟功能:使用蜂鸣器来产生提示音,通过IO口与单片机相连。

6.温湿度传感器:使用DHT11温湿度传感器。

传感器的数据引脚通过IO口与单片机相连。

四、软件设计1.时钟显示:通过DS1302获取日期、星期和时间等信息,将其转化为数码管需要的编码格式,并通过595芯片进行显示。

2.按键操作:对按键进行扫描,根据按键的不同操作进行相应的处理。

例如按下设置键进行日期和时间的设置,按下上下键进行数值的变化,按下确定键进行数值的确认。

基于51数码管显示的万年历(仿真+程序【完整】)

基于51数码管显示的万年历(仿真+程序【完整】)

基于数码管显示的万年历(proteus仿真+C程序)Proteus仿真图C语言程序/****************************************************** ***TITLE: 万年历设计FUNCTION: 显示:年-月-日-星期-时-分-秒WRITER: LINLIANHUOTIME: 2014-07-24REMARK: 译码扫描时间不能过长,否则无法实现调整**********************************************************/#include<reg51.h>#define uint unsigned int#define uchar unsigned char/***********码表***************/uchar code smg_table[]={0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0xA7,0xFF,0xEF,0xC0}; uchar code months_days[]={31,28,31,30,31,30,31,31,30,31,30,31};uchar code transcode[]={0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xeb,0xec,0xed, 0xee,0xef,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd};uchar buffer[22]={0};/**********数据定义*********/uchar add_sub;uchar key_detection=0;uchar count=0;typedef struct{uchar year[2];uchar month;uchar day;uchar week;}date;typedef struct{uchar hour;uchar minute;uchar second;}moment;date today={{14,20},7,25,5};moment now={16,52,45};/**********延时子程序*************/ void delay(){uchar i,j;for(i=0;i<=8;i++)for(j=0;j<40;j++);}/**********数码管显示子程序***********/ void smg_display(){uchar i;buffer[0]=now.second%10;buffer[1]=now.second/10;buffer[2]=10;buffer[3]=now.minute%10;buffer[4]=now.minute/10;buffer[5]=10;buffer[6]=now.hour%10;buffer[7]=now.hour/10;buffer[8]=today.week%10;buffer[9]=today.week/10;buffer[10]=10;buffer[11]=today.day%10;buffer[12]=today.day/10;buffer[13]=10;buffer[14]=today.month%10;buffer[15]=today.month/10;buffer[16]=10;buffer[17]=today.year[0]%10;buffer[18]=today.year[0]/10;buffer[19]=today.year[1]%10;buffer[20]=today.year[1]/10;buffer[21]=10;for(i=0;i<22;i++){P0=smg_table[buffer[i]];P2=transcode[i];delay();P2=0xff;}}/***********初始化子程序************/void init(){TMOD=0X01;TH0=55535/256;TL0=55535%256;EA=1;ET0=1;TR0=1;P1=0XFF;}/**********按键扫描子程序********/void key_scan(){key_detection=P1&0xff;add_sub=key_detection&0x80;switch(add_sub){case 0x80:switch(key_detection){case 0xfe:{EA=1;EX0=1;IT0=1;}break;case 0xfd:{EA=1;EX0=1;IT0=1;}break;case 0xfb:{EA=1;EX0=1;IT0=1;}break;case 0xf7:{EA=1;EX0=1;IT0=1;}break;case 0xef:{EA=1;EX0=1;IT0=1;}break;case 0xdf:{EA=1;EX0=1;IT0=1;}break;case 0xbf:{EA=1;EX0=1;IT0=1;}break;default: {EA=1;EX0=0;TR0=1;}break;}break;case 0x00:switch(key_detection){case 0x7e:{EA=1;EX0=1;IT0=1;}break;case 0x7d:{EA=1;EX0=1;IT0=1;}break;case 0x7b:{EA=1;EX0=1;IT0=1;}break;case 0x77:{EA=1;EX0=1;IT0=1;}break;case 0x6f:{EA=1;EX0=1;IT0=1;}break;case 0x5f:{EA=1;EX0=1;IT0=1;}break;case 0x3f:{EA=1;EX0=1;IT0=1;}break;default: {EA=1;EX0=0;TR0=1;}break;}break;}}/***********闰年计算子程序***********/ uchar leap_year(uchar a,uchar b){uchar x,y;x=a*100+b;if((x%4==0)&&(x%100!=0)||(x%400==0)) y=1;elsey=0;return y;}/***********主程序************/void main(){init();while(1){key_scan();}}/**********T0中断服务子程序************/ void T0_int() interrupt 1 using 0{uchar l;TH0=55535/256;TL0=55535%256;count++;if(count==30){count=0;now.second++;if(now.second>=60){now.second=0;now.minute++;if(now.minute>=60){now.minute=0;now.hour++;if(now.hour>=24){now.hour=0;today.day++;today.week++;if(today.week>=8){today.week=1;}l=leap_year(today.year[1],today.year[0]);if((l==1)&&(today.month==2)){if(today.day>=30){today.day=1;today.month++;}}elseif(today.day>=months_days[today.month-1]+1){today.day=1;today.month++;if(today.month>=12){today.month=1;today.year[0]=today.year[0]+1;if(today.year[0]>=100){today.year[0]=0;today.year[1]=today.year[1]+1;if(today.year[1]==100){today.year[1]=0;}}}}}}}}smg_display();}/*************INT0中断服务子程序*****************/void int0_int() interrupt 0 using 1{uchar k;switch(add_sub){case 0x80:switch(key_detection){case 0xfe:{now.second++;if(now.second>=60) now.second=0;smg_display();}break;case 0xfd:{now.minute++;if(now.minute>=60) now.minute=0;smg_display();}break;case 0xfb:{now.hour++;if(now.hour>=24) now.hour=0;smg_display();}break;case 0xf7:{today.week++;if(today.week>=8) today.week=1;smg_display();}break;case 0xef:{today.day++;k=leap_year(today.year[1],today.year[0]);if((k==1)&&(today.month==2)){if(today.day>=30) today.day=1;}elseif(today.day>=months_days[today.month-1])today.day=1;smg_display();}break;case 0xdf:{today.month++;if(today.month>=13)today.month=1;smg_display();}break;case 0xbf:{today.year[0]=today.year[0]+1;if(today.year[0]>=100){today.year[0]=0;today.year[1]=today.year[1]+1;if(today.year[1]==100)today.year[1]=0;}smg_display();}break;default:{EA=1;EX0=0;TR0=1;}break; }break;case 0x00:switch(key_detection){case 0x7e:{//now.second++;if(now.second>0) now.second--;else now.second=59;smg_display();}break;case 0x7d:{//now.minute++;if(now.minute>0) now.minute--;else now.minute=59;smg_display();}break;case 0x7b:{//now.hour++;if(now.hour>0) now.hour--;else now.hour=23;smg_display();}break;case 0x77:{//today.week++;if(today.week>1) today.week--;else today.week=1;smg_display();}break;case 0x6f:{//today.day++;k=leap_year(today.year[1],today.year[0]);if((k==1)&&(today.month==2)){if(today.day>1) today.day--;else today.day=29;}else{if(today.day>1) today.day--;elsetoday.day=months_days[today.month-1];}smg_display();}break;case 0x5f:{//today.month++;if(today.month>1)today.month--;else today.month=12;smg_display();}break;case 0x3f:{//today.year[0]=today.year[0]+1;if(today.year[0]>0)today.year[0]=today.year[0]-1;else{today.year[0]=99;today.year[1]=today.year[1]-1;}smg_display();}break;default:{EA=1;EX0=0;TR0=1;}break;}break;}}。

带温度显示的万年历 数码管显示

带温度显示的万年历 数码管显示

设计报告万年历时钟的设计班级: 09光电<2>班专业:光电子技术姓名:阮军峰学号: 0906010234 完成日期:2011年06月11日一、设计目的:1、掌握C51程序用于实践并实现相应的功能;2、掌握时钟程序的使用方法;3、掌握时间函数的使用方法;4、掌握键盘的程序使用方法;二、设计任务:设计一个智能化万年历时钟电路,LED数码管作为电路的显示部分,按钮开关作为调时部分,通过与单片机连接数码管动态显示年、月、日、时、分、秒、星期、温度。

并能准确计算闰年闰月的显示。

三、设计要求:通过与单片机连接数码管动态显示年、月、日、时、分、秒、星期等功能,并能准确计算闰年闰月的显示,三个个按钮连接P3.0、P3.1、P3.2可以精确调整每一个时间数值,通过对所设计的万年历时钟电路进行实验测试,达到了动态显示时间,随时调整时间等技术指标。

四、系统方案设计:1、系统总体设计:1) 原理构成框图本设计用STC89C51作为核心控制部分,外接晶振电路和74HC154,74LS138作为位选扩展电路,P3.0、 P3.1 、P3.2接三个个按钮作为时间调整部分,以两个17个数码管作为显示部分,P2口作为位选,P0口作为数据输出部分。

具体框图如图1所示:图1 原理框图2) 主程序的设计系统程序采用C语言按模块化方式进行设计,然后通过KeilC51L 软件开发平台将程序转变成十六进制程序语言,得到HEX文件,接着使用Proteous进行仿真,其次,按照Proteous的仿真电路图,在Protel99SE中完成电路板的逻辑布局及布线。

3) 时间调整电路的设计采用按键设计,独立式按键直接与单片机I/O口相连构成键盘,每个按键不会相互影响,按下模式可以选择年月日时分秒星期。

按下(+)(-)进行调试,程序如下:while(1){P3_0=1;if(P3_0==0){delay(10);if(P3_0==0)//如果按键被按下{Kdelay();if(P3_0==0)//确定按键按下{while(P3_0==0); // 等待按键放开cursor++;if(cursor>=9){cursor=0;}//如果cursor大于9则cursor=0if(P1_0==0){cursor=0;}} }}P3_1=1;if(P3_1==0){delay(10);if(P3_1==0) //如果按键被按下{Kdelay();if(P3_1==0) //确定按键按下{if(cursor==1){sec++;//如果cursor=1则按键按下秒数加一if(sec==60)sec=0;//如果秒数等于60秒则回到0开始}if(cursor==2){min++;//如果cursor=2则按键按下分数加一if(min==60)min=0; 如果分数等于60分则回到0开始}if(cursor==3){hour++;//如果cursor=3则按键按下时数加一if(hour==24)hour=0; //如果时数等于24时则回到0开始}if(cursor==4){day++;//如果cursor=4则按键按下天数加一if(day==31)day=0; //如果天数等于31天则回到0开始}if(cursor==5){month++;//如果cursor=5则按键按下月数加一if(month==13)month=0; //如果月数等于13月则回到0开始}if(cursor==6){yearl++;//如果cursor=6则按键按下年数低位加一if(yearl==100)yearl=0; //如果年数等于100则回到0开始}if(cursor==7){yearh++;//如果cursor=7则按键按下年数高位加一if(yearh==30)yearh=20; //如果年数大于30则回到0开始}if(cursor==8){week++;//如果cursor=8则按键按下星期数加一if(week==8)week=1; //如果星期数等于8则回到0开始}}while(P3_1==0);}}P3_2=1; //写入时先写1if(P3_2==0){//按键按下delay(10);//延时10个毫秒if(P3_2==0)//确定按键按下{Kdelay();if(P3_2==0){if(cursor==1){sec--;//如果cursor=1则按键按下秒数减一if(sec==0)sec=59; //如果秒数小于0则回到59开始}if(cursor==2){min--;//如果cursor=2则按键按下分数减一if(min==0)min=59; //如果分数小于0则回到59开始}if(cursor==3){hour--;//如果cursor=3则按键按下时数减一if(hour==0)hour=23; //如果时数小于0则回到23开始}if(cursor==4){day--;//如果cursor=4则按键按下天数减一if(day==0)day=31; //如果天数小于0则回到31开始}if(cursor==5){month--;//如果cursor=5则按键按下月数减一if(month==0)month=12; //如果月数小于0则回到12开始}if(cursor==6){yearl--;//如果cursor=6则按键按下年的低位数减一if(yearl==0)yearl=99; //如果年数小于0则回到99开始}if(cursor==7){yearh--;//如果cursor=7则按键按下年的高位数减一if(yearh==20)yearh=30; //如果年数小于0则回到30开始}if(cursor==8){week--;//如果cursor=8则按键按下秒星期减一if(week==0)week=7; //如果星期数小于0则回到7开始}while(P3_2==0);}}}i=ReadTemperature();所连线路和单片机接口仿真图如图3所示:图3 仿真按键4)温度采集部分:DS18B20温度传感器,测温范围-55℃~+125℃,固有测温分辨率0.5℃。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
uchar Init_DS18B20()
{
uchar status;
DQ = 1; delayms(8); DQ = 0 ; delayms(90); DQ = 1; delayms(8);
status = DQ; delayms(100);
DQ = 1;
return status;
}
//-------------------------------------------------------
extern void write1(uchar addr,uchar dat);
extern void init();//7221初始化
extern void init1();
#endif
/*max7221.c*/
#include "max7221.h"
#include <intrins.h>
uchar CurrentT = 0 ; //当前读取的温度整数部分
uchar Temp_Value[] = {0x00,0x00}; //从DS18B20读取的温度值
bit ng=0;//正负数标志位,ng=0,为正数,反之为负数,正数负数的处理方法不同,
bit DS18B20_IS_OK=1;//为1时表示当前读取温度正常,否则读取失败。
//----------------------------------------------------------------
void Process_Temperature()
{
// uchar i;
//延时值与负数标识
// uchar ng = 0;
//高5位全为1(0)则为负数,为负数时取反加1,并设置负数标识
Temp_Value[1] = ReadOneByte(); //温度高8位
DS18B20_IS_OK = 1;
}
}
//----------------------------------------------------------------
//对读取的温度值进行判断,处理,负数的情况,整数情况
#define NOP() {_nop_(),_nop_(),_nop_(),_nop_()}
sbit DQ=P1^3; //DS18B20控制线,单线模式。
extern bit ng; //正负数标志位,ng=0,为正数,反之为负数,正数负数的处理方法不同,
extern bit DS18B20_IS_OK;//为1时表示当前读取温度正常,否则读取失败。
uchar Display_Digit[4]={0,0,0,0}; //读取的温度值转换后存在这个数组中
//-------------------------------------------------------
//初始化DS18B20
//-------------------------------------------------------
dat<<=1;
DIN=CY;
CLK=1;
_nop_();
_nop_();
CLK=0;
}
CSB=1;
}
void write1(uchar addr,uchar dat)
{
uchar i;
CSB1=0;
for(i=0;i<8;i++)
{
CLK1=0;
addr<<=1;
DIN1=CY;
CLK1=1;
_nop_();
void WriteOneByte(uchar dat)
{
uchar i ;
for (i = 0; i < 8; i++)
{
DQ = 0 ; DQ = dat & 0x01 ; delayms(5); DQ = 1; dat>>=1;
}
}
//----------------------------------------------------------------
SCLK=1;
RST=0;
return dat;
}
void gettime()//ds1302读取当前时间存储在datetime中
{
uchar i,add=0x81;
for(i=0;i<7;i++)
{
datetime[i]=read_data(add);
add+=2;
}
}
/*max7221.h*/
#ifndef _MAX7221_H_//注:Max7221只能用来驱动共阴数码管,对共阳的没效
数码管显示模块化显示电子万年历
数码管共阳极7407驱动共阴极max7221/7419驱动
Ds1302实时时间显示
Ds18b20温度显示芯片
/*delay.h*/
#ifndef _DELAY_H
#define _DELAY_H_
#define uint unsigned int
#define uchar unsigned char
write(0x0a,0x07); //亮度地址0x0a,0x00-0x0f,0x0f时最亮
write(0x0b,0x07); //扫描数码管个数地址0x0c,最多扫描8只数码管
write(0x0c,0x01); //工作模式地址0x0c0x00:关闭;0x01:正常
}
void init1()
{
write1(0x09,0xff);
#define uchar unsigned char
sbit IO=P1^0; //ds1302跟单片机接口
sbit SCLK=P1^1;
sbit RST=P1^2;
extern unsigned char datetime[7]; //存储获得的时间值
extern void gettime();//读取时间值函数
{
IO=X&0X01;
SCLK=1;
SCLK=0;
X>>=1;
}
}
uchar get_a_byte_from_ds1302()
{
uchar i,b=0x00;
for(i=0;i<8;i++)
{
b|=_crol_((uchar )IO,i);
SCLK=1;
SCLK=0;
}
//return b/16*10+b%16; //返回的BCD码转换为十进制
write1(0x0a,0x07);
write1(0x0b,0x07);
write1(0x0c,0x01);
}
/*ds18b20.h*/
#ifndef _DS18B20_H
#define _DS18B20_H
#include <reg51.h>
#include "delay.h"
#include <intrins.h>
else
{
WriteOneByte(0xCC); //跳过序列号
WriteOneByte(0x44); //启动温度转换
Init_DS18B20();
WriteOneByte(0xCC); //跳过序列号
WriteOneByte(0xBE); //读取温度寄存器
Temp_Value[0] =ReadOneByte(); //温度低8位
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void delayms(uint xms)//毫秒级别延时
{
while(xms--);
}
/*ds1302.h*/
#ifndef _DS1302_H_
#define_DS1302_H_
#include <reg51.h>
#define uint unsigned int
void write(uchar addr,uchar dat) //写数据,写地址函数
{
uchar i;
CSB=0;
for(i=0;i<8;i++)
{
CLK=0;
addr<<=1;
DIN=CY;
CLK=1;
_nop_();
_nop_();
CLK=0;
}
for(i=0;i<8;i++)
{
CLK=0;
//读一字节
//-------------------------------------------------------
uchar ReadOneByte()
{
uchar i, dat = 0;
DQ = 1; _nop_();
for (i = 0; i < 8; i++)
{
DQ = 0; dat >>= 1; DQ = 1; _nop_();_nop_();
extern uchar Display_Digit[4];//读取的温度值转换后存在这个数组中
externvoid Read_Temperature(); //读取当前温度值
extern void Process_Temperature();//处理当前获得的温度值,正数,负数等。
#endif
/*ds18b20.c*/
if(DQ) dat |= 0x80;
delayms(30);
DQ = 1;
}
return dat;
}
相关文档
最新文档