基于51单片机的数码管万年历
基于stc51单片机的LCD1602显示时间的电子万年历(显示
1 课设所需软件简介1.1 Keil uVision4的简要介绍2009年2月发布Keil μVision4,Keil μVision4引入灵活的窗口管理系统,使开发人员能够使用多台监视器,并提供了视觉上的表面对窗口位置的完全控制的任何地方。
新的用户界面可以更好地利用屏幕空间和更有效地组织多个窗口,提供一个整洁,高效的环境来开发应用程序。
新版本支持更多最新的ARM芯片,还添加了一些其他新功能。
2011年3月ARM公司发布最新集成开发环境RealView MDK开发工具中集成了最新版本的Keil uVision4,其编译器、调试工具实现与ARM器件的最完美匹配。
Keil C51开发系统基本知识Keil C51开发系统基本知识1. 系统概述Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。
另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。
在开发大型软件时更能体现高级语言的优势。
下面详细介绍Keil C51开发系统各部分功能和使用。
2. Keil C51单片机软件开发系统的整体结构C51工具包的整体结构,uVision与Ishell分别是C51 for Windows和for Dos 的集成开发环境(IDE),可以完成编辑、编译、连接、调试、仿真等整个开发流程。
开发人员可用IDE本身或其它编辑器编辑C或汇编源文件。
然后分别由C51及C51编译器编译生成目标文件(.OBJ)。
目标文件可由LIB51创建生成库文件,也可以与库文件一起经L51连接定位生成绝对目标文件(.ABS)。
ABS文件由OH51转换成标准的Hex文件,以供调试器dScope51或tScope51使用进行源代码级调试,也可由仿真器使用直接对目标板进行调试,也可以直接写入程序存贮器如EPROM中。
使用独立的Keil仿真器时,注意事项:* 仿真器标配11.0592MHz的晶振,但用户可以在仿真器上的晶振插孔中换插其他频率的晶振。
基于51单片机的12864万年历
#include <reg51.h> // 该程序具有显示日期、月份、日期和时间功能#include<stdio.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int#define sint signed int#define disp_off 0x3e //显示关#define disp_on 0x3f //显示开#define disp_x 0xb8 //页地址为0页#define disp_z 0xc0 //行地址为0行#define disp_y 0x40 //列地址为0列#define comm 0 //命令标志位#define dat1 1 //数据标志位#define data_ora P0 //液晶12864的数据端与单片机的P0相连sbit di =P2^0; //Data or Instrument Select,H:写数据,L:写指令sbit rw =P2^1; //Write or Read,H:read,L:writesbit e =P2^4; //读写使能sbit cs1=P2^2; //cs1=H,选择左半屏sbit cs2=P2^3; //cs2=H,选择右半屏sbit clk=P1^0; //8563 clksbit dat=P1^1; //8563 datauchar fen=0x42,miao=0x38,shi=0x17,riqi=0x02,//设置时间用yuefen=0x09,xingqi=0x00,nian=0x07,zhongduan;//设置时间用uchar code tabma[10][16]=//阴码点阵格式、取模方式为列行式、逆向取模(低位在前),//十六进制输出,中文16*16,英文8*16 宋体{//0(0) 1(1) 2(2) 3(3) 4(4) 5(5) 6(6) 7(7) 8(8) 9(9){0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00}, /*"0",0*/{0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00}, /*"1",1*/{0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00}, /*"2",2*/{0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00}, /*"3",3*/{0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00}, /*"4",4*/{0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00}, /*"5",5*/{0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00}, /*"6",6*/{0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00}, /*"7",7*/{0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00}, /*"8",8*/{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00}, /*"9",9*/ };uchar code tab2ma[7][32]=// 日(0) 一(1) 二(2) 三(3) 四(4) 五(5) 六(6){{0x00,0x00,0x00,0xFE,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x3F,0x00,0x00,0x00,0x00}, /*"日",0*/{0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, /*"一",1*/{0x00,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x06,0x04,0x00,0x00,0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x18,0x10,0x00}, /*"二",2*/{0x00,0x04,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x04,0x00,0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00}, /*"三",3*/{0x00,0xFE,0x02,0x02,0x02,0xFE,0x02,0x02,0xFE,0x02,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x7F,0x28,0x24,0x23,0x20,0x20,0x20,0x21,0x22,0x22,0x22,0x22,0x7F,0x00,0x00}, /*"四",4*/{0x00,0x02,0x82,0x82,0x82,0x82,0xFE,0x82,0x82,0x82,0xC2,0x82,0x02,0x00,0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x30,0x20,0x00}, /*"五",5*/{0x10,0x10,0x10,0x10,0x10,0x91,0x12,0x1E,0x94,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x40,0x20,0x10,0x0C,0x03,0x01,0x00,0x00,0x01,0x02,0x0C,0x78,0x30,0x00,0x00}, /*"六",6*/ };uchar code nianma[]=//年(0) 月(1) 日(2) 星(3) 期(4){0x40,0x20,0x10,0x0C,0xE3,0x22,0x22,0x22,0xFE,0x22,0x22,0x22,0x22,0x02,0x00,0x00,0x04,0x04,0x04,0x04,0x07,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x04,0x04,0x00}; /*"年",0*/ uchar code yuema[]={0x00,0x00,0x00,0x00,0x00,0xFF,0x11,0x11,0x11,0x11,0x11,0xFF,0x00,0x00,0x00,0x00,0x00,0x40,0x20,0x10,0x0C,0x03,0x01,0x01,0x01,0x21,0x41,0x3F,0x00,0x00,0x00,0x00}; /*"月",1*/ uchar code rima[]={0x00,0x00,0x00,0xFE,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x3F,0x00,0x00,0x00,0x00}; /*"日",2*/ uchar code xingqima[]={0x00,0x00,0x00,0xBE,0x2A,0x2A,0x2A,0xEA,0x2A,0x2A,0x2A,0x2A,0x3E,0x00,0x00,0x00,0x00,0x48,0x46,0x41,0x49,0x49,0x49,0x7F,0x49,0x49,0x49,0x49,0x49,0x41,0x40,0x00, /*"星",3*/0x00,0x04,0xFF,0x54,0x54,0x54,0xFF,0x04,0x00,0xFE,0x22,0x22,0x22,0xFE,0x00,0x00,0x42,0x22,0x1B,0x02,0x02,0x0A,0x33,0x62,0x18,0x07,0x02,0x22,0x42,0x3F,0x00,0x00}; /*"期",4*///时(0) 分(1) 秒(2)uchar code shima[]={0x00,0xFC,0x44,0x44,0x44,0xFC,0x10,0x90,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x00,0x00,0x07,0x04,0x04,0x04,0x07,0x00,0x00,0x03,0x40,0x80,0x7F,0x00,0x00,0x00,0x00}; /*"时",0*/uchar code fenma[]={0x80,0x40,0x20,0x98,0x87,0x82,0x80,0x80,0x83,0x84,0x98,0x30,0x60,0xC0,0x40,0x00,0x00,0x80,0x40,0x20,0x10,0x0F,0x00,0x00,0x20,0x40,0x3F,0x00,0x00,0x00,0x00,0x00}; /*"分",1*/uchar code miaoma[]={0x12,0x12,0xD2,0xFE,0x91,0x11,0xC0,0x38,0x10,0x00,0xFF,0x00,0x08,0x10,0x60,0x00,0x04,0x03,0x00,0xFF,0x00,0x83,0x80,0x40,0x40,0x20,0x23,0x10,0x08,0x04,0x03,0x00}; /*"秒",2*/void delay(sint n); //延时程序void xie_start(); //开始条件void xie_stop(); //停止条件bit xie1(uchar shu); //向8563中写入1个字uchar du1(); //从8563中读出1个字uchar du(); //从8563中读出时间和日期uchar xie(); //向8563中设置时间和日期//uchar xie_dingshi(); //8563定时器设置//uchar xie_fangbo_dingshi(); //8563的方波设置void delay1 (uint ms); //延时void wr_lcd (uchar dat_comm,uchar content); //向12864中写命令//uchar rd_lcd (); //读12864数据void chk_busy (); //忙闲检测void lat_disp (uchar data1,uchar data2); //写点钟//void img_disp (uchar code *img) ; //显示图像void chn_disp (uchar x,uchar y,uchar xl,uchar yl,uchar row_xl,uchar row_yl,uchar code *chn);//显示汉字void init_lcd (); //12864初始化void disp(); //128显示程序//-------------主函数--------------------void main(){uchar ml=0;init_lcd (); //LCD初始化lat_disp(0x00,0x00);xie(); //预设时间用,设置好时间后可以屏蔽for(;;){du(); //读8563的时间lat_disp(0x00,0x00);disp(); //显示时间delay1(100);}}//-------------------延时---------------------------//void delay(sint n){for(n;n>0;n--);}/////////////////////以下是PCF8563读写/////////////////////以下是PCF8563读写/* I2C的起始条件,在时钟端SCK为高电平时,数据端SDA发生由高到低的变化,为起始条件,启动I2C总线。
单片机课程设计--基于51单片机的万年历
单片机课程设计报告万年历的设计基于51单片机的万年历摘要:电子万年历是一种非常广泛日常计时工具,对现代社会越来越流行。
它可以对年、月、日、周日、时、分、秒进行计时,使用寿命长,误差小。
对于数字电子万年历采用直观的数字显示,可以同时显示年、月、日、周日、时、分、秒和温度等信息,还具有时间校准等功能。
该电路采用AT89S52单片机作为核心,功耗小,能在3V的低压工作,电压可选用3~5V电压供电。
本设计是基于51系列的单片机进行的电子万年历设计,可以显示年月日时分秒及周信息,具有可调整日期和时间功能。
在设计的同时对单片机的理论基础和外围扩展知识进行了比较全面准备。
万年历的设计过程在硬件与软件方面进行同步设计。
硬件部分主要由AT89C52单片机,LCD显示电路,以及调时按键电路等组成。
在单片机的选择上本人使用了AT89C52单片机,该单片机适合于许多较为复杂控制应用场合。
显示器使用了1602液晶显示,并且使用蜂鸣器实现了整点报警的功能,温度测试的功能实现使用了DS18B20,并实现了温度过高或过低时的温度报警。
软件方面主要包括日历程序、时间调整程序,显示程序等。
程序采用C语言编写。
所有程序编写完成后,在KeilC51软件中进行调试,确定没有问题后,在Proteus软件中嵌入单片机内进行仿真,并最终实现基本要求。
综上所述此万年历具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点,符合电子仪器仪表的发展趋势,具有广阔的市场前景。
一、设计要求基本要求:1,8 个数码管上显示,显示时间的格式为(假如当前时间是19:32:20)“19-32-20”;2,具有日历功能;③时间可以通过按键调整。
发挥部分:④具有闹钟功能(可以设定多个)。
二:总体设计电路设计框图系统硬件概述本电路是由AT89S52单片机为控制核心,具有在线编程功能,低功耗,能在3V超低压工作;时钟电路由单片机定时功能提供;温度的采集由DS18B20构成,它具有独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯,使用时不需要额外的外围电路。
基于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段共阳数码管显示。
基于51单片机的万年历
基于51单片机的万年历摘要本篇论文主要介绍了运用单片机实现电子万年历的设计,其中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. 引言................................................ 错误!未定义书签。
基于51单片机的万年历设计
基于51单片机的万年历设计一、系统设计方案本万年历系统主要由 51 单片机、时钟芯片、液晶显示屏、按键等部分组成。
51 单片机作为核心控制器,负责整个系统的运行和数据处理。
时钟芯片用于提供精确的时间信息,液晶显示屏用于显示万年历的相关内容,按键则用于设置时间和功能切换。
二、硬件设计1、单片机选型选用常见的 51 单片机,如 STC89C52 单片机,它具有性能稳定、价格低廉、易于编程等优点。
2、时钟芯片选择 DS1302 时钟芯片,该芯片能够提供高精度的实时时钟,具有闰年补偿功能,并且可以通过串行接口与单片机进行通信。
3、液晶显示屏采用 1602 液晶显示屏,能够清晰地显示字符和数字,满足万年历的显示需求。
4、按键电路设计四个按键,分别用于时间设置、功能切换、加和减操作。
三、软件设计1、主程序流程系统上电后,首先进行初始化操作,包括单片机端口初始化、时钟芯片初始化、液晶显示屏初始化等。
然后读取时钟芯片中的时间数据,并在液晶显示屏上显示出来。
接着进入循环,不断检测按键状态,根据按键操作执行相应的功能,如时间设置、功能切换等。
2、时钟芯片驱动程序通过单片机的串行接口向 DS1302 发送命令和数据,实现对时钟芯片的读写操作,获取准确的时间信息。
3、液晶显示屏驱动程序编写相应的函数,实现对1602 液晶显示屏的字符和数字显示控制。
4、按键处理程序采用扫描方式检测按键状态,当检测到按键按下时,执行相应的按键处理函数,实现时间设置和功能切换等操作。
四、时间设置功能通过按键操作进入时间设置模式,可以分别设置年、月、日、时、分、秒等信息。
在设置过程中,液晶显示屏会显示当前设置的项目和数值,并通过加、减按键进行调整。
设置完成后,将新的时间数据保存到时钟芯片中。
五、显示功能万年历的显示内容包括年、月、日、星期、时、分、秒等信息。
通过合理的排版和显示控制,使这些信息在液晶显示屏上清晰、直观地呈现给用户。
六、系统调试在完成硬件和软件设计后,需要对系统进行调试。
基于51单片机的液晶显示万年历设计
基于51单片机的液晶显示万年历设计摘要随着社会的进步和发展,电子万年历作为日常计时工具被广泛地应用。
此电子万年历在硬件方面主要采用STC89C51单片机作为主控核心,由DS1302时钟芯片提供时钟及1602LCD液晶显示屏显示。
STC89C51单片机是由宏晶公司公司生产的,功耗小,电压可选用3.4v~5.5v电压供电;DS1302时钟芯片是美国DALLAS公司推出的低功耗实时时钟芯片,它可以对年、月、日、星期、时、分、秒进行计时,而且DS1302的使用寿命长,误差小;对于数字电子万年历采用直观的数字显示,数字显示是采用的1602LCD液晶显示屏来显示,可以同时显示年、月、日、星期、时、分、秒、温度等信息。
此外,该电子万年历在软件方面主要包括日历程序、时间调整程序,显示程序等。
所有程序编写完成后,在Kei l软件中进行调试,确定没有问题后,烧写到单片机上进行测试。
本次课程设计主要由时钟芯片DS1302和温度传感器DS18B20采集数据到单片机进行处理再通过LCD1602显示出来,本设计主要研究了液晶显示器LCD及时钟芯片DS1302,温度传感器DS18B20与单片机之间的硬件互联及通信,对数种硬件连接方案进行了详尽的比较。
关键词:单片机;DS1302;DS18B20;LCD1602--ABSTRACTWith the social progress and development, Electronic calendar is widely used as a dailytiming tool. The electr oniccalendarinhardware using STC89C51microcon troller as themain controlcenter, provided by the DS1302 clock chipand 1602LCD LCD display.STC89C51mic rocontroller is produced by themacrocrystal company, small power consumption,the voltagecan bechoosen among 3.4V ~5.5V for power supply;DS1302clock chip is alowpower real-time clockchip produced by DALLAS, it canbe atimeofyears,months,days,weeks,hours,minute s,seconds, andDS1302 hasa longservicelife.The error issmall;forthe digital electronic calendarusi ngvisual digitaldisplay,1602LCDdigital display is used todisplay LCD screenthat candisplay years,mo nths, days, weeks, hours,minutes and seconds, temperat ureandother information. In addition,the electronic calendar mainly includescalendarprogram,time to adjus tprocedures,displayprogram etc insofeware. After the completionof all the procedures,in theKeil softwa redebugging, determine no problem after,and burning to themicrocontrollertest.--The curriculum design mainly bytheclock chip DS1302andtemperaturesensor DS18B20 collectingdata to the microcontrollerfor processing andthen through the LCD1602 display, thisdesign mainly studies the liquid crystal display LCD and theclockchip DS1302, thehardware connection and communication betweenthete mperature sensorDS18B20 and the MCU, a number of hardwareconnection scheme foradetailed comparison.Key words:SCM,DS1302,DS18B20,LCD1602--目录1-第一章绪论ﻩ-1.1 单片机的概述ﻩ-1-1.1.1 单片机的概念ﻩ-1-1.1.2单片机的特点 --------------------------------------------------------------------------------- -1-1.2 课题背景 ---------------------------------------------------------------------------------------------------- -1-1.3 课题内容 ----------------------------------------------------------------------------------------------- -2- 第二章设计要求和方案 ----------------------------------------------------------------------- 错误!未定义书签。
基于51单片机GPS自动校时的万年历设计方案
3 硬件设计
HARDWARE DESIGN
3.1 系统概述
本系统由51单片机、DS1302时钟芯片、1062液晶显示器、DS18B20温度测量、键盘、蜂鸣器 系统等部分构成。软件部分在keil环境下用C51语言编写,包括时间设置、时间显示、定时设置、 定时闹钟、温度显示。原理框图如下:
3.2 系统框图
蜂鸣器设置:蜂鸣器报警时,设置响100毫秒,停100毫秒,循环响应,产生滴滴的声音。
液晶显示的设置:写入指令码write_com(0x38),设置功能16*2显示,5*7点阵,8位数据接口显 示/开关及光标设置8)写入指令码write_com(0x0c),设置开显示,不显示光标,光标不闪烁。 16)写入指令码write_com(0x06),设置当读或写一个字符后地址指针加一,且光标加一。当写 一个字符,整屏显示不移动。显示清屏,写入指令码write_com(0x01)。
写入指令码函数write_com()写指令过程 :输入:rs=0,D0-D7=指令码,E=高脉冲写入数据 函数 write_date() 写指令过程: 输入:rs=1,D0-D7=数据,E=高脉冲写入指令和数据时rw 端已经接地。数据指针设置 指令码80H+地址码(0-27H)显示第一行的字符指令码80H+地址码 (40H-67H)显示的第二行字符
本时钟还具有环保、走时无噪音、低功耗等非实时时钟不具有的功能。该实时时钟不但可以作 为家用,而且更可以在公共场合使用,如车站、码头、商场等场所。
2 总体方案
GENERAL PLANNING
本方案所研究的电子万年历是单片机控制技术的一个具体应用,主要研究内容
包括以下几个方面: (1)选用电子万年历芯片时,应重点考虑功能实在、使用方便、单片存储、低功 耗、抗断电的器件。 (2)根据选用的电子万年历芯片设计外围电路和单片机的接口电路。
基于51单片机的电子万年历
#include<reg52.h> typedef unsigned char u8; typedef unsigned int u16; sbit A=P2^0;sbit BA=P2^1;sbit C=P2^2;sbit led = P3^0;sbit s7=P3^7;/*k1设置时间,k2定时。
k1,k2使用不自动弹起按键。
k3时分秒选择,k4加数字,k5减数字。
*/sbit k1=P1^0;sbit k2=P1^1;sbit k3=P1^2;sbit k4=P1^3;sbit k5=P1^4;u8 count=0,sec,min=44,hour=8,mon=9,day=28,ss=0;s=60,m=60,h=24,month=12,d=31; u16 year=2015,y=9999;#define DATA P0u16 code table[]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//共阴数码管0-F编码void delay(u16 z){u16 x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}/*通过count获得hour,min,sec变量值*/ void timecontrol(){sec++;if(sec==60){sec=0;min++;if(min==60){min=0;hour++;if(hour>=24)//1d{hour=0;day++;switch(mon) {case 1:case 3:case 5:case 7:case 8:case 10:case 12:if(day==32){//一个月day=0;mon++;}break;case 4:case 6:case 9:case 11:if(day==31){//一个月day=0;mon++;}break;default: //2月if((year%4==0 && year%100!=0 ) || (year%100==0 && year%400==0))//闰年{if(day==30){day=0;mon++;}}else{if(day==29){day=0;mon++;}}break;}}if(mon>=12) //1年{mon=0;year++;if(year>=9999)year=0;}}}}void display(u16 year1,u8 mon1,u8 day1,u8 zs,u8 zm, u8 zh) {led=1;DATA=0x00;A=0;BA=0;C=0;DATA=table[zh/10];delay(3);DATA=0x00;A=1;BA=0;C=0;led=1;DATA=table[zh%10]|0x80;delay(3);DATA=0x00;A=0;BA=1;C=0;led=1;DATA=table[zm/10];delay(3);DATA=0x00;A=1;BA=1;C=0;led=1;DATA=table[zm%10]|0x80;delay(3);DATA=0x00;A=0;BA=0;C=1;led=1;DATA=table[zs/10];delay(3);DATA=0x00;A=1;BA=0;C=1;led=1;DATA=table[zs%10]|0x80;delay(3);DATA=0x00;led=0;A=0;BA=0;C=0;DATA=table[year1/1000]; delay(3);DATA=0x00;A=1;BA=0;C=0;led=0;DATA=table[year1%1000/100]; delay(3);DATA=0x00;A=0;BA=1;C=0;led=0;DATA=table[year1%1000%100/10]; delay(3);DATA=0x00;A=1;BA=1;C=0;led=0;DATA=table[year1%10];delay(3);DATA=0x00;A=0;BA=0;C=1;led=0;DATA=table[mon1/10]; delay(3);DATA=0x00;A=1;BA=0;C=1;led=0;DATA=table[mon1%10]; delay(3);DATA=0x00;A=0;BA=1;C=1;led=0;DATA=table[day1/10]; delay(3);DATA=0x00;A=1;BA=1;C=1;led=0;DATA=table[day1%10]; delay(3);void keyscan_settime() //时间设置模块{u16 ye;u8 mo,da, st,mt,ht;if(k1==0){delay(10);if(k1==0){st=sec,mt=min,ht=hour,ye=year,mo=mon,da=day;TR0=0; //关闭定时器while(k1==0) //等待用户按键{display(ye,mo,da,st,mt,ht);if(k3==0){delay(10);if(k3==0){while(!k3);ss++;if(ss==6) ss=0;}}/*通过ss选择时分秒设置*/if(k4==0) //加数{delay(10);if(k4==0){while(!k4);switch(ss){case 0:st++;if(st==60)st=0;break;case 1:mt++;if(mt==60)mt=0;break;case 2:ht++;if(ht==24)ht=0;break;case 3:ye++;if(ye==9999) ye=0;break;case 4:mo++;if(mo==13) mo=0;break;case 5:da++;if(da==32) da=0;break;default :;}}}if(k5==0) //减数{delay(10);if(k5==0){while(!k5);switch(ss){case 0:if(st>0)st--;else st=0;break;case 1:if(mt>0)mt--;else mt=0;break;case 2:if(ht>0)ht--;else ht=0;break;case 3:if(ye>0) ye--;else ye=0;break;case 4:if(mo>0) mo--;elsemo=0;break;case 5:if(da>0) da--;elseda=0;break;default : ;}}}}TR0=1;sec=st,min=mt,hour=ht,day=da,mon=mo,year=ye;}}display(year,mon,day,sec,min,hour);}void keyscan_time() //用户定时模块{if(k2==0){delay(10);if(k2==0){s=sec;m=min;h=hour,y=year,month=mon,d=day;while(k2==0) //开始定时设置{display(y,month,d,s,m,h);if(k3==0){delay(10);if(k3==0){while(!k3);ss++;if(ss==6) ss=0;}}/*通过ss选择时分秒设置*/if(k4==0) //加数{delay(10);if(k4==0){while(!k4);switch(ss){case 0:s++;if(s==60)s=0;break;case 1:m++;if(m==60)m=0;break;case 2:h++;if(h==24)h=0;break;case 3:y++;if(y==9999) y=0;break;case 4:month++;if(month==13) month=0;break;case 5:d++;if(d==32) d=0;break;default :;}}}if(k5==0) //减数{delay(10);if(k5==0){while(!k5);switch(ss){case 0:if(s>0)s--;else s=0;break;case 1:if(m>0)m--;else m=0;break;case 2:if(h>0)h--;else h=0;break;case 3:if(y>0) y--;else y=0;break;case 4:if(month>0) month--;elsemonth=0;break;case 5:if(d>0) d--;else d=0;break;default : ;}}}}}}}void buz(){if((year==y)&&(mon==month)&&(day==d)&&(hour==h)&&(min==m)&&(sec==s)) {s7=0;delay(1000);s7=1;}}void time0_init(){TMOD=0x01;TH0=0x4b;TL0=0xfe;EA=1;ET0=1;TR0=1;}void main(void){time0_init();while(1){keyscan_settime();. . .. . .keyscan_time();buz();}}void Time0() interrupt 1{TH0=0x4b;TL0=0xfe;count++;if(count==20){count=0;timecontrol();}}. 专业.专注.。
基于51单片机的万年历设计流程
基于51单片机的万年历设计流程
基于51单片机的万年历设计流程可以分为以下几个步骤:
1. 确定需求:首先,你需要明确你的万年历需要有哪些功能。
例如,是否需要显示日期、时间、星期,是否需要闹钟功能,是否需要手动或自动校准等。
2. 选择硬件:选择合适的单片机作为主控制器。
常用的单片机有8051系列,如AT89C51、AT89S52等。
此外,还需要选择适当的显示模块、按键模块、实时时钟模块等。
3. 设计硬件电路:根据选择的硬件设备,设计电路原理图和PCB图。
需要
考虑单片机的引脚连接、电源供给、时钟源、外部扩展等问题。
4. 编写软件程序:根据硬件电路和需求,编写相应的软件程序。
这包括初始化程序、主程序、中断服务程序等。
5. 调试和测试:将编写好的程序下载到单片机中,进行实际测试。
根据测试结果,对程序进行调试和修改,直到满足设计要求。
6. 生产:完成调试后,就可以进行批量生产了。
在生产过程中,还需要对产品进行质量检测,确保每个产品都能正常工作。
7. 后期维护:在产品上市后,可能需要对产品进行维护或升级。
例如,如果用户在使用过程中发现了问题,或者有新的需求,就需要对产品进行改进或升级。
以上是基于51单片机的万年历设计的基本流程,但具体的步骤可能会根据具体的需求和硬件设备有所不同。
单片机课程设计--基于51单片机的万年历
单片机课程设计--基于51单片机的万年历单片机课程设计基于 51 单片机的万年历一、引言在现代生活中,时间的准确记录和显示对于我们的日常生活和工作具有重要意义。
万年历作为一种能够同时显示年、月、日、星期、时、分、秒等信息的设备,给人们带来了极大的便利。
本次课程设计旨在利用 51 单片机实现一个简单实用的万年历系统。
二、系统设计方案(一)硬件设计1、单片机选型选择经典的 51 单片机,如 STC89C52 单片机,其具有性能稳定、价格低廉、资源丰富等优点,能够满足本设计的需求。
2、显示模块采用液晶显示屏(LCD1602)作为显示设备,能够清晰地显示数字和字符信息。
3、时钟芯片选用DS1302 时钟芯片,它可以提供精确的实时时钟数据,包括年、月、日、星期、时、分、秒等。
4、按键模块设置三个按键,分别用于调整时间、选择调整项(年、月、日、时、分、秒等)以及切换显示模式(正常显示和设置模式)。
(二)软件设计1、主程序流程系统初始化后,首先读取 DS1302 中的时间数据,并将其显示在LCD1602 上。
然后进入循环,不断检测按键状态,根据按键操作进行相应的时间调整和显示模式切换。
2、时间读取与显示程序通过与 DS1302 进行通信,读取实时时间数据,并将其转换为适合LCD1602 显示的格式进行显示。
3、按键处理程序检测按键的按下状态,根据不同的按键执行相应的操作,如调整时间、切换显示模式等。
三、硬件电路设计(一)单片机最小系统单片机最小系统包括单片机芯片、晶振电路和复位电路。
晶振电路为单片机提供时钟信号,复位电路用于系统初始化时将单片机的状态恢复到初始值。
(二)显示电路LCD1602 显示屏通过数据总线和控制总线与单片机相连。
数据总线用于传输要显示的数据,控制总线用于控制显示屏的读写操作和显示模式。
(三)时钟电路DS1302 时钟芯片通过串行通信接口与单片机进行通信。
单片机通过发送特定的指令和数据,对 DS1302 进行读写操作,获取或设置时间信息。
基于51单片机的电子万年历系统的设计
参考内容
一、引言
单片机是现代电子设备中的重要组成部分,广泛应用于各种嵌入式系统设计。 51单片机作为一种经典的微控制器,因其结构简单、易于编程、可靠性高等优点, 被广泛用于各种领域,如智能家居、工业控制、物联网等。万年历作为一种日常 生活中常见的计时工具,具有显示日期、时间、星期、月份等功能,对于人们的 日常生活和工作有着重要的作用。本次演示将介绍一种基于51单片机的万年历设 计。
二、系统设计
1、硬件设计
基于51单片机的万年历设计需要硬件和软件的配合实现。硬件部分主要包括 51单片机、显示模块、按键输入模块和时钟芯片等。其中,51单片机作为主控制 器,负责处理各种数据和控制信号;显示模块用于显示日期、时间等信息;按键 输入模块用于用户输入操作;时钟芯片则为系统提供实时时间。
基于51单片机的电子万年历系 统的设计
目录
01 一、概述
03 三、软件设计
02 二、硬件设计 04 四、系统调试与优化
目录
05 五、应用场景及前景
07 参考内容
06 六、结论
随着科技的不断发展,单片机已经成为现代于51单片机的电子万年历系统设计具有广泛的实际应用价值。 本次演示将详细介绍这种系统的设计过程和实现方法。
感谢观看
首先需要进行硬件搭建,包括选择合适的单片机、显示模块、按键输入模块 和时钟芯片等,并将其连接起来。需要注意的是,在搭建硬件时需要考虑各个模 块之间的接口和连接方式,以确保系统能够正常工作。
2、软件编程
在硬件搭建完成后,需要进行软件编程。首先需要进行系统初始化,包括对 单片机进行初始化和对显示进行清屏处理。然后需要进行按键处理和时钟数据处 理,以实现用户输入和实时时间的读取。最后需要进行显示处理,将处理后的数 据显示到显示模块上。
基于51单片机的万年历设计
一、引言万年历是一种日历工具,能够显示任何一个公历日期的星期、年、月和日,并且能够自动判断闰年。
在本设计中,我们将使用51单片机设计一个基于LCD显示屏的万年历。
它将能够显示当前的日期和星期,并且具备一些附加功能,如闹钟、计时器等。
二、设计目标本设计的主要目标是通过51单片机实现以下功能:1.显示当前日期和星期:使用LCD显示屏显示当前的年、月、日和星期。
2.闰年判断:根据公历算法判断是否为闰年,并在显示屏上进行标识。
3.闹钟功能:设置一个闹钟时间,并在指定时间到达时发出提醒。
4.计时器功能:实现一个简单的计时器,能够显示经过的时间。
三、系统框图```+------------------+51单片+---+----------+---++--v--++--v--+LCD ,, Keypa+-----++-------+```四、系统设计1.时钟模块:使用定时器模块实现系统的主时钟,根据预设的频率进行中断,更新时间和日期。
2.LCD模块:使用51单片机的IO口控制LCD显示屏,实现对日期、星期和其他功能的显示。
3.按键模块:通过按键模块实现对系统功能的操作,包括设置闹钟、切换功能等。
4.闹钟模块:根据预设的时间进行判断,判断是否到达闹钟时间并触发相应的操作。
5.计时器模块:通过计时器模块实现计时功能,显示经过的时间。
五、代码实现以下是基于51单片机的万年历的主要代码实现的伪代码:1.时钟模块:```初始化定时器;定时器中断中获取当前的日期和时间;```2.LCD模块:```定义LCD引脚;初始化LCD显示;定时刷新LCD内容;```3.按键模块:```定义按键引脚;初始化按键;判断按键事件并执行相应的操作;```4.闹钟模块:```设置闹钟时间;判断当前时间是否与闹钟时间相等;触发相应操作;```5.计时器模块:```设置起始时间;计算当前时间与起始时间的差值;显示计时时间;```六、实验结果通过上述的代码实现和电路连接,我们可以成功地实现了基于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 万年历的背景万年历是我国古代传说中最古老的一部太阳历。
为纪念历法编撰者万年功绩,便将这部历法命名为“万年历”。
相传,在很久以前,有个名叫万年的青年,看到当时节令很乱,想把节令定准。
一天,他上山砍柴,坐在树阴下休息,树影的移动启发了他,他设计了一个测日影计天时的晷仪。
可是,天阴雨雾,影响测量。
后来,山崖上的滴泉引起了他的兴趣,他又动手做了一个五层漏壶。
基于51单片机的万年历毕业设计
中文摘要本设计万年历以AT89C51为控制中心,与温度传感器DS18B20,时钟芯片DS1302综合应用为一体,不仅能够准确显示时间、日期,闹钟设置,环境温度测量及温度高低温报警等功能。
单片机是一种集CPU、RAM、ROM、I/O接口和中断系统等于一体的器件,只需要外加电源和晶振就可实现对数字信息的处理和控制。
单片机与数字万年历相结合,用于时间显示,温度测试等不仅具有控制方便、组态简单和灵活性大等优点,而且可以大幅度提高被检测数值的技术指标,从而能够大大提高产品的质量和数量。
关键词:单片机,温度传感器,C语言,液晶显示ABSTRACTThis design USES AT89C51 as calendar control center, and the temperature sensor DS18B20, the clock DS1302 chip integrated application as a whole, and not only be able to accurately display the time, date, alarm, the environment temperature measurement and high temperature, low temperature alarm functions. SCM is a collection of CPU, RAM, ROM, I/O interface and interrupt system is one of the devices, only require additional power can be used for vibration and grain is the process of digital information and control. Single-chip microcomputer and digital calendar, combining for time to show, temperature testing has not only control convenient, simple and flexible configuration advantages, and which could increase the technical index of the tested value, which can greatly improve the quality of the products and quantity.Key words:Single-chip microcomputer, Temperature Sensor,C language,Liquid crystal displ目录第一章前言 (4)1.1系统开发背景及现状 (4)1.2 系统开发的目的 (4)第二章总体设计 (5)2.1 本设计实现的功能和要求 (5)2.2 设计的选择方案和论证 (5)2.2.1单片机芯片的选择方案和论证 (5)2.2.2显示模块选择方案和论证 (5)2.2.3 时钟芯片的选择方案和论证 (6)2.3.4 温度传感器的选择方案与论证 (6)2.3总体设计框图 (6)第三章硬件设计 (7)3.1 主要元器件介绍 (7)3.1.1 单片机简介 (7)3.1.2 传感器DS18B20介绍 (8)3.1.3 LCD1602液晶显示介绍 (9)3.2 各模块设计 (10)3.2.1 主控制电路 (10)3.2.2 LCD1602显示模块设计 (11)3.2.3 DS18B20温度传感器模块 (11)3.2.4 键盘输入模块设计 (12)3.2.5 蜂鸣器模块设计 (12)3.2.6 DS1302时钟电路模块 (13)第四章软件设计 (14)第五章安装与调试 (16)5.1 安装制作 (16)5.2 硬件调试 (16)5.2.1布线的原则与焊接 (16)5.2.2 硬件调试与测试 (17)5.3 软件调试 (17)5.3.1 软件测试仪器 (17)5.3.2 软件调试与测试 (17)5.4 联调 (18)5.5测试结果分析与结论 (19)第六章总结 (20)参考文献 (21)附录A (22)附录B (24)致谢 (26)第一章前言1.1系统开发背景及现状当今世界,知识更新的速度越来越快。
基于-51单片机的万年历设计
单片机课程设计题目基于51单片机的万年历设计学生专业班级学号院(系)指导教师完成时间目录1课程设计的目的12课程设计的任务与要求1 2.1设计任务12.2设计要求13单片机发展概况14设计原理与功能说明44.1设计思想44.2总体电路图54.3时钟模块64.4液晶显示模块64.5按键模块75系统测试75.1硬件测试75.2软件测试86总结8参考文献10附录一:总体电路原理图11附录二:主程序12附录三:元器件清单27 附录四:实物图281课程设计的目的1.通过制作万年历,可以对单片机这门课程更好的认识。
2.理论与实践结合,提高自己的动手能力。
3.学会与合作者更好的交流学习,共同进步和提高。
4.能够增长查阅资料的能力,视野更加开阔。
5.拓展其他学科的联系,全面发展。
6.培养自我发现问题,解决问题的能力。
2课程设计的任务与要求2.1设计任务1.可以去学校图书馆或者网上,搜集整理相关的资料,做好前期理论准备,为以后设计电路,看懂电路图做理论支持。
2.构想万年历电路图,并且具有可行性,画出电路图。
3.列举电路所需的电子元件,仔细对比所需的元件的参数,通过去电子元件经销商或者网购购买。
2.2设计要求1.显示年、月、日、时、分、秒。
2.可通过键盘自动调整时间。
3.计时精度:月误差小于20秒。
3单片机发展概况单片机诞生于20世纪70年代末,它的发展史大致可分为三个阶段:第一阶段(1976-1978):初级单片机微处理阶段。
该时期的单片机具有 8 位CPU,并行 I/O 端口、8 位时序同步计数器,寻址围 4KB,但是没有串行口。
第二阶段(1978-1982):高性能单片机微机处理阶段,该时期的单片机具有I/O 串行端口,有多级中断处理系统,15 位时序同步技术器,RAM、ROM 容量加大,寻址围可达 64KB。
第三阶段(1982-至今)位单片机微处理改良型及 16 位单片机微处理阶段民用电子产品、计算机系统中的部件控制器、智能仪器仪表、工业测控、网络与通信的职能接口、军工领域、办公自动化、集散控制系统、并行多机处理系统和局域网络系统。
基于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单片机的电子万年历设计
课程设计报告书目录设计报告书目录一、设计目的 (1)二、设计思路 (1)三、设计过程 (1)3.1、系统方案论证 (1)3.2、电子万年历流程图设计 (2)四、系统调试与结果 (6)五、主要元器件与设备 (6)六、课程设计体会与建议 (7)6.1、设计体会 (7)6.2、设计建议 (7)七、参考文献 (8)八、源程序清单与注释 (10)一、设计目的1、熟悉单片机各部件的组成及其功能。
2、掌握时钟芯片显示时间和调试的方法。
3、掌握温度传感器的工作原理及其调试方法。
4、掌握数码管的显示方法。
二、设计思路1、利用单片机的时钟芯片来实现时间信息显示。
2、利用四个按键实现时间的调整功能。
3、利用温度传感器来实现温度显示。
4、利用单片机对各个数据进行处理并保证各模块正常工作。
5、单片机处理后的数据送入显示模块显示。
三、设计过程3.1系统方案论证数字万年历的总体方框图如图1所示:图1 数字万年历总体方框图其工作原理为:时间模块利用时钟芯片可以读取到高精度的年、月、日、时、分、秒信息。
按键部分采用四个按键实现时间的调整功能,即设置、加1、减1、切换四个按键。
温度采集模块利用温度传感器采集温度信息。
单片机使用AT89C52单片机,将读取的时间信息、按键信息和温度信息送入单片机机进行数据处理,同时单片机控制保证着各模块芯片的正常工作,单片机将经过处理后的时间温度信息送显示模块显示。
显示模块使用17个LED显示管,可以显示年、月、日、星期、时、分、秒和温度。
3.2、电子万年历流程图设计3.2.1、电子万年历系统的主程序流程图如图2所示:图2 电子万年历系统的主程序流程图电子万年历系统总的电路连接如附图1所示。
3.2.2、时间程序设计因为使用时钟芯片为DS12C887,阳历程序只需从DS12C887各寄存器中读出年,月,日,时,分,秒等数据,再处理即可。
在首次对DS12887进行操作之前必须对它进行初始化,然后DS12C887中读出数据,再经处理后送给显示缓冲单元。
基于51单片机的电子万年历的设计
设计说明书基于51单片机的电子万年历的设计系部电子信息与控制工程系专业名称电子信息工程技术班级电子姓名学号指导教师2014 年 06 月 23 日基于51单片机的电子万年历的设计摘要电子万年历是单片机系统的一个应用,由硬件和软件相配合使用。
硬件由主控器、时钟电路、温度检测电路、显示电路、键盘接口5个模块组成。
主控模块用AT89C52、时钟电路用时钟芯片DS1302、显示模块用LED数码管、温度检测采用DS18B20温度传感器、键盘接口电路用普通按键接上拉电阻完成;软件利用C语言编程实现单片机程序控制。
单片机通过时钟芯片DS1302获取时间数据,DS18B20采集温度信号送该给单片机处理,单片机再把时间数据和温度数据送给74LS154译码,然后通过三极管C9015放大驱动LED数码管显示阳历年、月、日、时、秒、闹钟、星期、温度。
关键词:电子万年历;单片机;温度传感器;时钟;数码显示。
目录1 引言 (4)2 功能要求 (5)3 方案论证与设计 (6)3.1控制部分的方案选择 (6)3.2测温部分的方案选择 (6)3.3显示部分的方案选择 (7)4 系统硬件电路设计 (8)4.1主控器AT89S52 (8)4.2时钟电路DS1302 (8)4.2.1. DS1302的性能特性 (8)4.2.2 DS1302数据操作原理 (9)4.3测温电路的设计 (11)4.3.1 温度传感器工作原理 (11)4.3.2 DS18B20与单片机的接口电路 (15)4.4键盘接口的设计 (15)5 系统程序的设计 (16)5.1阳历程序设计 (16)5.2时间调整程序设计 (16)5.3温度程序设计 (16)5.3.1 主程序 (17)5.3.2 读出温度子程序 (17)5.3.3 温度转换命令子程序 (17)5.3.4 计算温度子程序 (18)5.3.5显示数据刷新子程序 (18)6调试及性能分析 (19)6.1调试步骤 (19)6.2性能分析 (19)7总结 (20)致谢 (21)参考文献 (22)附1 实物图 (23)1 引言随着微电子技术和超大规模集成电路技术的不断发展,家用电子产品不但种类日益丰富,而且变得更加经济实用,单片微型计算机体积小、性价比高、功能强、可靠性高等独有的特点,在各个领域得到了广泛的应用。
基于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;}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
宜宾学院物理与电子工程学院课题论文单片机(期末)课程设计题目:基于51单片机的数码管万年历院(系):物理与电子工程学院专业年级: 2012级硕勋励志班指导老师:文良华姓名:陈志凤学号: 1203030252014年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 万年历的背景万年历是我国古代传说中最古老的一部太阳历。
为纪念历法编撰者万年功绩,便将这部历法命名为“万年历”。
相传,在很久以前,有个名叫万年的青年,看到当时节令很乱,想把节令定准。
一天,他上山砍柴,坐在树阴下休息,树影的移动启发了他,他设计了一个测日影计天时的晷仪。
可是,天阴雨雾,影响测量。
后来,山崖上的滴泉引起了他的兴趣,他又动手做了一个五层漏壶。
天长日久,他发现每隔三百六十多天,天时的长短就会重复一遍。
当时的国君叫祖乙,天气风云的不测,使他很苦恼。
一个名叫阿衡的大臣,为讨好皇上,奏称要设天台敬祭天神。
祖乙认为有理,便带领百官去祭天,却无济于事。
万年知道后,忍不住就带着日晷和漏壶去见皇上,对祖乙讲清了日月运行的道理。
祖乙听后龙颜大悦,感到有道理。
于是把万年留下,在天坛前修建日月阁,筑起日晷台和漏壶亭。
并派了十二个童子服侍万年。
祖乙对万年说:"希望你能测准日月规律,推算出准确的晨夕时间,创建历法,为天下的黎民百姓造福。
"有一次,祖乙传旨要阿衡去了解万年测试历法的进展情况。
当他登上日月坛时,看见天坛边的石壁上刻着:日出日落三百六,周而复始从头来。
草木枯荣分四时,一岁月有十二圆。
阿衡见此,知道万年的历法已研究成功,心中忐忑不安。
他万分惧怕万年因创建历法而得宠,国君会怪罪自己提出祭祀天神的主意。
于是,他阴谋策划,派了一个刺客去除掉万年。
刺客攀上日月阁,见万年正在阁上观察星斗,便张弓搭箭,准备射死他。
谁知,刺客被卫士发现,被当场缉拿。
祖乙知后,惩处了阿衡,亲自登上日月阁看望万年。
万年指着天象,对祖乙说:“现在正是十二个月满,旧岁已完,新春复始,祈请国君定个节吧。
”祖乙说:“春为岁首,就叫春节吧。
”冬去春来,年复一年。
后来,万年经过长期观察,精心推算,制定出了准确的太阳历。
当他把太阳历呈奉给继任的国君时,已是满面银须。
国君深为感动,为纪念万年的功绩,便将太阳历命名为“万年历”,封万年为日月寿星。
而现在所使用的万年历,即:包括若干年或适用于若干年的历书。
万年只是一种象征,表示时间跨度大。
我在本次课程设计中制作的“基于51单片机的数字万年历”便是以电子产品为载体的基于AT89C51单片机在数码管上显示(公历)年月日、时分秒功能的简易万年历。
1、2 万年历的应用随着人们时间观念的增强,万年历被广泛应用于生活中的各种场合。
比如黄历的出版、挂历、电子表、手机万年历软件、电脑万年历软件等等。
随着科技的发展,现代的万年历能同时显示公历、农历和干支历等多套历法,更能包含黄历相关吉凶宜忌、节假日、提醒等多种功能信息;而其载体更包括历书出版物、电子产品、电脑软件和手机应用等非常丰富,极为方便人们查询使用。
阳历,可能是我们的祖先最早使用的历法,它根据太阳运行规律制定。
古人以为太阳绕地球运行,转动一周为一年——今日我们知道是地球绕太阳公转的周期,但古人的认识却相反。
据学者考证,战国时还有太阳历,一年十个月,以天干为名,每月三十六日,分三旬,旬以地支为名,如此十个月三百六十日,加上五至六天不入干支的“废日”,一年就是三百六十五日或三百六十六日。
在那种情况下,节气的安排首先有“夏至”、“冬至”,继而又有“春分”、“秋分”,季节上的回归年先分春秋二季,后来再分出春夏秋冬四季,以至二十四节气。
古代文献《管子》中有这种历法的痕迹,彝族和西南少数民族的火把节与之有关。
岭南民间至今还流传“冬至大过年”的说法,就是民间对这种历法的记忆残留。
古人确实曾经以“一阳更始”的冬至作为元旦。
阴历是按月亮的盈亏变化来制定的。
一个朔望月的周期是二十九或三十天,年的长短只是月的整倍数,与回归年无关。
月也与四季寒暑无关。
希腊历和回历都属于这种历法。
它的一年中,也不可能出现“双春”、“盲年”。
第二章设计原理一年365天,分成12个月,这12个月里有7个月是31天,4个月是30天,1个月是28天或29天。
将这样的算法用软件编程语言描述出来,再用硬件电路实现功能并显示,便设计出了一个简单的电子万年历。
本次设计的原理非常简单,即利用AT89C51单片机内部定时/计数器T0的模式2(8位自动重装初值)产生一个时间为250us的信号,再计数4000次产生1S 的时间后发出中断,再由单片机进行数据处理后,送人数码管(共阴极数码管)显示(动态显示)。
并增加时间调整功能(调整位选择、根据具体要求加或者减调整)其原理就是向单片机P口送人一个识别信号,由单片机软件对信号进行处理,并实现功能。
本次设计采用的是14位共阴极数码管,由P0口作段选(P0.0-A,P0.1-B,...,P0.7-DP)、P1口和P2口部分位作位选的动态显示。
显示的时候只需向数码管送入相应段码,并选通相应的位,利用余辉效应和视觉停留效应便可实现显示。
第三章 实现过程3、1 方案选择● 方案一:采用日历时钟芯片DS1302来产生时间,数据经单片开机处理后送到数码管显示。
● 方案二:采用纯单片机制作,利用AT89C51单片机内部的定时/计数器和中断产生时间,经单片机处理后送数码管显示。
方案一虽然定时准确,软件部分设计简单,但电路复杂成本高不适合初学者。
所以本次设计采用方案二。
3、2 系统框图如图3-1所示:图3-1 系统框图3、3 说明系统由51系列单片机AT89C51、按键、数码显示三个模块构成。
单片机包括时钟电路、复位电路;按键部分能实现对时间的调整,三个独立按键的功能分别是:调整选位、加、减。
显示部分采用的是14位共阴极数码管,由P0口作段选、P1口和P2口部分位作位选的动态显示。
按键单片 机 (定时/计数、中断、数据处理)显示3、4 电路模块说明3、4、1 复位、时钟电路(如图3-4-1所示)图3-4-1 复位、时钟电路如图3-4-1,本次设计的晶振采用12MHZ的晶振(机器周期为1us),复位电路为按键复位。
3、4、2 显示电路(如图3-4-2所示)图3-4-2 显示电路如图3-4-2所示,本次设计的显示模块采用的是用14位共阴极数码管动态显示。
其中,P0口作段选(P0.0-A,P0.1-B,...,P0.7-DP)、P1口和P2口部分位作位选(P1.2-秒低位,P1.3-秒高位,P1.4-分低位,P1.5-分高位,P1.6-时低位,P1.7-时高位,P2.0-日低位,P2.1-日高位,P2.2-月低位,P2.3-月高位,P2.4、P2.5-年低位P2.6、P2.7-年高位)。
3、4、3 按键调整电路(如图3-4-3所示)图3-4-3按键调整电路如图3-4-3,系统外接三个独立按键,分别接入P3.0、P3.1、P3.2作用分别是调整选位、加、减(均为低电平有效)。
3、4、4 完整的硬件电路图(如图3-4-4所示)图3-4-4 完整的硬件电路图3、5 软件设计模块3、5、1 万年历的算法万年历的算法主要包括时间处理和日期处理,其软件大概框图如图3-5-1所示:图3-5-1 软件算法流程图 图3-5-2 时间处理流程图3、5、2 时间处理 本次设计的时间处理十分简单,总结起来就一句话:定时计数满往前加一清零。
流程图见图3-5-2所示,具体程序如下所示:3、5、3 日期处理图3-5-3(a)闰年算法图3-5-3(b)闰年及大小月算法流程图日期处理主要包括大小月处理,及闰年(二月)处理,处理方法见图3-5-3(a\b),具体程序如下:第四章最终结果本次设计采用在Proteus中仿真来验证结果,具体仿真电路图及结果见图4-1、4-2、4-3、4-4所示:图4-1 仿真电路图图4-2 仿真初始化显示图4-3 重设初值仿真图4-4 调整选位仿真第五章收获与体会5、1 设计过程中遇到的问题及解决方法设计过程中遇到很多问题,具体问题及解决方法如下:问题一:程序编译的时候170多个错误。
解决办法:检查问题时发现,很多问题都是出在有P口出现的地方,经过多次修改后发现原来在Keil编译环境下不区分大小写,但是编译C程序时定义端口时P必须要大写。
问题二:仿真的时候根本没有结果。
解决办法:通过对程序的进一步分析以及对电路图的核对发现自己犯了一个非常低级的错误。
那就是使用P0口作的通用I/O口但却没有接上拉电阻,导致作段选驱动的P0不能正常驱动数码管。
所以根本没有结果。
于是便加上了上拉电阻。
问题三:终于有结果,但是乱码了。
解决办法:加了上拉电阻以后,终于有了结果,但是显示不正确。
通过分析以后得出可能是选择的数码管不是共阴极的,然后在Proteus元件库中找出了多个二极管并将引脚随意接高低电平后进行仿真判断。
最终选出了共阴极的数码管,并接入电路后得出了仿真结果。
问题四:这个完全是经验问题。
解决办法:当所有仿真和PPT都做好以后,我就打包存档到了U盘,同时将电脑上的数据清空了。
结果U盘坏了,唯一的解决办法就是重做。
还好,源程序还在!5、2 收获与体会在整个过程中,我犯了很多低级错误,这些错误其实我都知道是怎么回事。
也许把它们出成试卷或者作业题的形式我一个都不会错,但就是在实际应用中就会把这些平时看书时看过、记过甚至背过的注意事项变成一个个错误,导致设计不能成功。