基于51单片机的键盘盘可调万年历.docx_第1页
基于51单片机的键盘盘可调万年历.docx_第2页
基于51单片机的键盘盘可调万年历.docx_第3页
基于51单片机的键盘盘可调万年历.docx_第4页
基于51单片机的键盘盘可调万年历.docx_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

开放性实验报告题 目: 基于80c51的万年历设计_ 院 系: 专业班级: 学 号: 姓 名: 指导老师:_ 时 间: 2014年9月8号 摘要电子万年历是一种非常广泛日常计时工具,对现代社会越来越流行。它可以对年、月、日、周、时、分、秒进行计时,还具有闰年补偿等多种功能。本系统选用dallas公司生产的日历时钟芯片ds1302来作为实时时数字万年历采用直观数字显示,可以同时显示年、月、日、周、时、分、秒等信息,还具有键盘时间校准等功能。该电路采用at89c52单片机作为核心,用以5v电压供电。本系统硬件部分由at89c52单片机、ds1302时钟芯片、lcd1602液晶显示环境下以c51语言编写,包括时间设置、时间显示、时间修正等功能。在仿真的时候,以proteus与keil uvision4软件为基础,编写了mcs-51单片机对lcd1602显示控制的软件,绘制其原理图,并使用proteus软件与keil uvision4软件建立联合仿真。本设计主要论述了原理图各个模块的作用,以及控制软件的各个模块的编程。关键词:时钟芯片ds1302;单片机at89c52;液晶显示1602;独立键盘等目 录第1章 绪论11.1 实时万年历的简介11.2 系统所实现的功能3第2章 开发工具软件简介42.1 keil uvision4软件简介42.2 proteus软件简介42.3 keil uvision4与proteus软件联合仿真5第3章 lcd1602显示控制技术63.1 1602字符型lcd简介63.2 lcd1602功能73.3 lcd1602的指令说明及时序83.4 lcd1602的ram地址映射及标准字库表73.5 lcd1602的一般初始化(复位)过程8第4章 系统硬件概况134.1 系统概况134.2 mcs-51单片机最小系统模块144.3 ds1302时钟芯片控制与键盘设置时间模块154.4 lcd1602显示模块16第5章 软件控制系统概况185.1 程序流程概况185.2 流程图185.3 源程序代码19参考文献25第1章 绪论1.1 实时万年历的简介随着电子技术的发展,人类在不断研究的过程中也在不停创造新的纪录。万年历目前已经不再局限于以纸张的形式出现。以电脑软件或者电子产品形式出现的万年历被称为电子万年历。与传统万年历相比,电子万年历得到了越来越得到大众的青睐,采用电子时钟作为时间显示早已成为一种时尚。目前市场上各式各样的电子时钟数不胜数,但多数是只针对时间显示,功能单一不能满足人们多样化的需求。 本文提出了一种基于at89c51单片机的万年历设计方案,本方案以at89c51单片机作为主控核心,与时钟芯片ds1302、按键、led1602显示等模块组成硬件系统。在硬件系统中设有独立按键和led显示器,能显示丰富的信息,根据使用者的需要可以随时对时间进行校准、选择时间等,综上所述此万年历具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点。1.2 系统所实现的功能现在所使用的万年历,实际上就是记录一定时间范围内(比如100年或更多)的具体阳历或阴历日期的年历,方便有需要的人查询使用,与原始历法并无直接联系。而随着微电子技术的高速发展,人们发明了更加准确更加便捷的电子万年历。因为这种万年历在日常生活中运用得越来越广泛,在现代社会也越来越流行。它可以对年、月、日、周、时、分、秒进行计时,还具有闰年补偿等多种功能,而且其使用寿命更长,误差更小,有的电子万年历还具有时间以及星期的校准功能。本文主要包括以下内容:1单片机为核心,建立以lcd1602为显示控制系统,编制各控制子程序模块,为操作人员提供灵活、准确的控制信息,实现对lcd1602液晶显示当前时间。2绘制整个控制系统原理图。 3配合控制程序软件,完成对整个硬件系统的控制。4使用keil uvision4进行c语言代码的编写。5使用proteus进行仿真。第2章 开发工具软件简介2.1 keil uvision4软件简介keil是美国keil software公司出品的51系列兼容单片机c语言软件开发系统,与汇编相比,c语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。用过汇编语言后再使用c来开发,体会更加深刻。在开发大型软件时更能体现高级语言的优势。keil 软件提供丰富的库函数和功能强大的集成开发调试工具,全windows界面。keil生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。其次,该软件不但可以进行软件仿真,而且还可以通过其内嵌模块keil-monitor-51,实现在不需要连接硬件仿真器的条件下,通过下载线连接硬件系统对项目进行实时仿真。另外,可以与proteus单片机仿真软件联合实现虚拟硬件仿真。2.2 proteus软件简介目前电子设计手段日新月异,由手工设计阶段到eda阶段,再到虚拟设计阶段,人们不断提高设计水平与效率。proteus软件是英国labcenter electronics公司出版的eda工具软件。proteus嵌入式系统仿真与开发平台是一款可以实现数字电路、模拟电路、微控制器系统仿真及pcb设计等功能的eda软件。从元件的选取到连线,直至电路的调试、分析和软件的编译,都是在计算机中完成,所有的工作先在虚拟环境下进行。基于这一设计思想开发的proteus软件,可在原理图设计阶段对所设计的电路进行评估、验证,看是否达到设计要求的技术指标,并可以通过改变元件的参数使整个电路性能达到最优化。这样就避免了传统电子电路设计中方案更换带来的多次重复购买元器件及制板,在节省设计时间与经费的同时,提高了设计效率与质量。proteus软件不仅具有其它eda工具软件的模拟电子和数字电子的仿真功能,而且还具有其他eda软件所没有的单片机系统硬件仿真功能。它可以仿真mcs-51系列单片机、avr单片机、pic单片机和arm7微处理器,可以直接在电路原理图上实现硬件的虚拟仿真,实现程序的调试,并提供进行测试与分析的虚拟示波器、逻辑分析仪等虚拟仪器及仿真图表。它是目前最好的仿真单片机及外围器件的工具。proteus软件主要由实现原理图编辑及仿真的isis模块和实现pcb板设计及自动布线的ares模块组成。proteus软件提供了三十多个元器件库,数千元器件。元件涉及电阻、电容、二极管、mos管、变压器、继电器、各种放大器、各种激励源、300多种微处理器、各种门电路和各种终端等。提供的仪表有交直流电压表、电流表、逻辑分析仪、定时/计数器和信号发生器等虚拟仪器,proteus作为可视化仿真软件,提供数码管、液晶屏、led、按钮、键盘等外设。2.3 keil uvision4与proteus软件联合仿真proteus软件与keil uvision4软件之间的联合虚拟仿真,指keil uvision4软件将proteus软件打开的单片机系统看成一个虚拟的硬件电路,使用keil uvision4软件对程序进行编译、调试时自动连接proteus软件中的虚拟单片机系统,虚拟单片机系统的状态随keil uvision4软件对程序调试实时变化。这样,可实现用proteus软件与keil uvision4软件联合虚拟硬件仿真。 第3章lcd1602液晶显示屏3.1 1602字符型lcd简介字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式lcd,本设计采用16列*2行的字符型lcd1602带背光的液晶显示屏。1602lcd主要技术参数:显示容量:162个字符芯片工作电压:4.55.5v工作电流:2.0ma(5.0v)模块最佳工作电压:5.0v字符尺寸:2.954.35(wh)mm3.2 1602引脚功能编号符号引脚说明编号符号引脚说明1vss电源地9d2数据2vdd电源正极10d3数据3vl液晶显示偏压11d4数据4rs数据/命令选择12d5数据5r/w读/写选择13d6数据6e使能信号14d7数据7d0数据15bla背光源正极8d1数据16blk背光源负极第1脚:vss为地电源。第2脚:vdd接5v正电源。第3脚:vl为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10k的电位第4脚:rs为寄存器选择,高电平时选数据寄存器、低电平时选择指令寄存器。第5脚:r/w为读写信号线,高电平时进行读操作,低电平时进行写操作。当rs和r/w共同为低电平时可以写入指令或者显示地址,当rs为低电平r/w为高电平时可以读忙信号,当rs为高电平r/w为低电平时可以写入数据。第714脚:d0d7为8位双向数据线。第15脚:背光源正极。第16脚:背光源负极。3.3 1602lcd的指令说明及时序芯片时序表如下:读状态输入rs=l,r/w=h,e=h输出d0d7=状态字写指令输入rs=l,r/w=l,d0d7=指令码,e=高脉冲输出无读数据输入rs=h,r/w=h,e=h输出d0d7=数据写数据输入rs=h,r/w=l,d0d7=数据,e=高脉冲输出无基本操作时序表读写操作时序如图2-7和2-8所示:图2-7读操作时序图2-8 写操作时序3.4 1602lcd的ram地址映射及标准字库表液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认入显示字符地址,也就是告诉模块在哪里显示字符,图2-9是1602的内部显示地址。图2-9液晶内部显示地址例如第二行第一个字符的地址是40h,那么是否直接写入40h就可以将光标定位在第二行第一个字符的位置呢?这样不行,因为写入显示地址时要求最高位d7恒定为高电平1所以实际写入的数据应该是01000000b(40h)+10000000b(80h)=11000000b(c0h)。是自动右移的,无需人工干预。每次输入指令前都要判断液晶模块是否处于忙的状态。1602液晶模块内部的字符发生存储器(cgrom)已经存储了160个不同的点阵常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“a”的代码是01000001b(41h),显示时模块把地址41h中的点阵字符图形显示出来,我们就能看到字母“a”。3.5 1602lcd的一般初始化(复位)过程延时15ms写指令38h(不检测忙信号)延时5ms写指令38h(不检测忙信号)延时5ms写指令38h(不检测忙信号)以后每次写指令、读/写数据操作均要检测忙信号写指令38h:显示模式设置写指令08h:显示关闭写指令01h:显示清屏写指令06h:显示光标移动设置写指令0ch:显示开及光标设置第4章 系统硬件概况4.1 系统概况单片机控制模块是整个设计方案的核心。at59c51芯片作为该系统的控制部件,它通过ds1302将时间实时通过硬件电路转送入单片机内部,单片机内部将时间转换成字符串然后送入lcd1602模块显示。键盘通过at59c51还控制lcd1602模块对万年历的显示与调节。其系统原理图如下:4.2 mcs-51单片机最小系统模块(1)晶振电路:在xtali与xtal2外接石英晶体和微调电容等构成时钟电路。其中,晶体的选择至少必须考虑:谐振频点,负载电容,激励功率,温度特性,长期稳定性。选择电容c1,c2:在许可范围内,c1,c2值越低越好。c值偏大虽有利于振荡器的稳定,但将会增加起振时间。应使c2值大于c1值,这样可使上电时,加快晶振起振。4.3 ds1302时钟芯片控制模块 (1) 时钟芯片ds1302的工作原理: ds1302在每次进行读、写程序前都必须初始化,先把sclk端置 “0”,接着把rst端置“1”,最后才给予sclk脉冲;读/写时序如下图所示。为ds1302的控制字,此控制字的位7必须置1,若为0则不能把对ds1302进行读写数据。对于位6,若对程序进行读/写时ram=1,对时间进行读/写时,ck=0。位1至位5指操作单元的地址。位0是读/写操作位,进行读操作时,该位为1;该位为0则表示进行的是写操作。控制字节总是从最低位开始输入/输出的。表6为ds1302的日历、时间寄存器内容:“ch”是时钟暂停标志位,当该位为1时,时钟振荡器停止,ds1302处于低功耗状态;当该位为0时,时钟开始运行。“wp”是写保护位,在任何的对时钟和ram的写操作之前,wp必须为0。当“wp”为1时,写保护位防止对任一寄存器的写操作。(2) ds1302的控制字节ds1302的控制字如表-1所示。控制字节的高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入ds1302中,位6如果0,则表示存取日历时钟数据,为1表示存取ram数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出表-1 ds1302的控制字格式 ram rd 1 a4 a3 a2 a1 a0 / ck /wr (3) 数据输入输出(i/o) 在控制指令字输入后的下一个sclk时钟的上升沿时,数据被写入ds1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个sclk脉冲的下降沿读出ds1302的数据,读出数据时从低位0位到高位7。如下图1所示 图1 ds1302读/写时序图(4) ds1302的寄存器ds1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为bcd码形式,其日历、时间寄存器及其控制字见表-2。表-2 ds1302的日历、时间寄存器 写寄存器读寄存器bit7bit6bit5bit4bit3bit2bit1bit080h81hch10秒秒82h83h10分分84h85h12/010时时/pm86h87h0010日日88h89h00010月月8ah8bh00000星期8ch8dh10 年年8eh8fhwp0000000此外,ds1302 还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与ram相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。 ds1302与ram相关的寄存器分为两类:一类是单个ram单元,共31个,每个单元组态为一个8位的字节,其命令控制字为c0hfdh,其中奇数为读操作,偶数为写操作;另一类为突发方式下的ram寄存器,此方式下可一次性读写所有的ram的31个字节,命令控制字为feh(写)、ffh(读)。 本设计总的用了三个按扭开关作为调整设置按键,三个中的其中两个是调整时间增加、减少的键,第三个是切换年、月、日及时、分、秒的显示状态并在所切换的显示状态下配合加减两个键调整时间。4.4 lcm1602显示模块单片机p0.0p0.7分别于lcd模块的d0d7数据线连接,p2.0p2.2接到lcd模块控制信号引脚rs、rw和e,lcd模块的vdd引脚接电源+5v,vss和vee引脚接地。结合lcm1602控制指令,通过at89c51单片机来控制lcm1602显示相应的时间。第5章 软件控制系统概况5.1 程序流程概况该控制系统主要包括单片机对lcm1602液晶温度显示与万年历显示控制两部分。软件控制程序主要有主控程序、电子时钟的时间控制程序和温度显示程序组成。主控程序负责对整个程序进行调用与控制,进行了初始化程序还有键盘功能程序;显示程序和时间控制程序是电子时钟中比较重要的部分,时间控制程序体现了年、月、日、时、分、秒的计算方法。软件的设计采用模块化设计与混合编程的设计思想实现,编程软件为keil uvision4软件。5.2 流程图开始初始化读日期、时间写日期、时间显示子程序 时间修改子程序日期修改子程序显示结果返回开关控制子程序时间控制程序主要是定时器0计时中断程序每隔10ms中断一次当作一个计数,每中断一次则计数加1,当计数100次时,则表示1秒到了,秒变量加1,同理再判断是否1分钟到了,再判断是否1小时到了,再判断是否1天到了,再判断是否1月到了,再判断是否1年到了,若计数到了则相关变量清除0。先给出一般年份的每月天数。如果是闰年,第二个月天数不为28天,而是29天。闰年的判断规则为,如果该年份是4或100的整数倍或者是400的整数倍,则为闰年;否则为非闰年。在我们的这个设计中由于只涉及100年范围内,所以判断是否闰年就只需要用该年份除4来判断就行了。温度的显示主要是靠ds18b20采集现在的温度数据,cpu读取数据进行显示,当各自的条件得不到满足时,对应的显示器状态就不发生改变,只是在满足条件的情况下,显示器的状态才变化。程序流程图如图所示:5.3 源程序代码#include#define uchar unsigned char#define uint unsigned intsbit sclk=p36;sbit io=p34;sbit ce=p35;sbit lcdrs=p26;sbit lcdrw=p25;sbit lcden=p27;sbit k0=p30;sbit k1=p31;sbit k2=p32;sbit k3=p33;uchar flag;uchar nyr=2014-01-01;uchar sfm=23:59:50 mon;uchar week1=mon;uchar week2=tue;uchar week3=wed;uchar week4=thur;uchar week5=fri;uchar week6=sat;uchar week7=sun;void write_week();void delay1(uchar m)uchar x,y;for(x=m;x0;x-)for(y=110;y0;y-);/以下为ds1302驱动程序uchar time_data7=0x14,0x01,0x01,0x01,0x23,0x59,0x50;/年,周,月,日,时,分,秒uchar year,week,month,day,hour,minute,second;uchar write_add7=0x8c,0x8a,0x88,0x86,0x84,0x82,0x80;/写地址uchar read_add7=0x8d,0x8b,0x89,0x87,0x85,0x83,0x81;/读地址void delay();void write_1302_byte(uchar add)uchar i;for(i=0;i1;sclk=1;void write_1302(uchar add1,uchar dat1) ce=0;delay();sclk=0;delay();delay();ce=1;write_1302_byte(add1);write_1302_byte(dat1);delay();delay();ce=0; uchar read_1302(uchar addr)uchar j,temp=0x00;ce=0;delay();sclk=0;delay();delay();ce=1;write_1302_byte(addr);for(j=0;j1;delay();sclk=1;return (temp);void set_rtc()uchar i;write_1302(0x8e,0x00);for(i=0;i7;i+)write_1302(write_addi,time_datai);write_1302(0x8e,0x80);void read_rtc()uchar i;for(i=0;i7;i+)time_datai=read_1302(read_addi);/以上为ds1302的驱动程序/以下为1602液晶显示驱动void write_1602com(uchar com)lcdrs=0;lcdrw=0;p0=com;delay1(5);lcden=1;delay1(5);lcden=0;void write_1602dat(uchar dat)lcdrs=1;lcdrw=0;p0=dat;delay1(5);lcden=1;delay1(5);lcden=0;void init_1602()uchar i;lcden=0;write_1602com(0x38);write_1602com(0x0c);write_1602com(0x06);write_1602com(0x01);write_1602com(0x80+3);for(i=0;i10;i+)write_1602dat(nyri);delay1(5);write_1602com(0x80+0x40+1);for(i=0;i13;i+)write_1602dat(sfmi);delay1(5);void write_sfm(uchar add,uchar dat)uchar shi,ge;shi=dat/16;ge=dat%16;write_1602com(0x80+0x40+add);write_1602dat(0x30+shi);write_1602dat(0x30+ge);void write_nyr(uchar add,uchar dat)uchar shi,ge;shi=dat/16;ge=dat%16;write_1602com(0x80+add);write_1602dat(0x30+shi);write_1602dat(0x30+ge);void deal()year=time_data0;write_nyr(5,year);month=time_data2;write_nyr(8,month);day=time_data3;write_nyr(0x0b,day);hour=time_data4;write_sfm(1,hour);minute=time_data5;write_sfm(4,minute);second=time_data6;write_sfm(7,second);void write_week()uchar i;week=time_data1%16;write_1602com(0x80+0x40+11);for(i=0;i9)time_data6=time_data6+6;if(time_data6=0x60)time_data6=0;write_sfm(7,time_data6);write_1602com(0x80+0x40+7);if(add=2)time_data5+;if(time_data5&0x0f)9)time_data5=time_data5+6;if(time_data5=0x60)time_data5=0;write_sfm(4,time_data5);write_1602com(0x80+0x40+4);if(add=3)time_data4+;if(time_data4&0x0f)9)time_data4=time_data4+6;if(time_data4=0x24)time_data4=0;write_sfm(1,time_data4);write_1602com(0x80+0x40+1);if(add=4) /星期time_data1+;if(time_data1=8)time_data1=1;write_sfm(0x0b,time_data1);write_week();write_1602com(0x80+0x40+0x0b);if(add=5)time_data3+;if(time_data3&0x0f)9)time_data3=time_data3+6;if(time_data3=0x32)time_data3=1;write_nyr(0x0b,time_data3);write_1602com(0x80+0x0b);if(add=6)time_data2+;if(time_data2&0x0f)9)time_data2=time_data2+6;if(time_data2=0x13)time_data2=1;write_nyr(8,time_data2);write_1602com(0x80+8);if(add=7)time_data0+;if(time_data0&0x0f)9)time_data0=time_data0+6;if(time_data0=0x99)time_data0=0;write_nyr(5,time_data0);write_1602com(0x80+5);if(k2=0)delay1(5);if(k2=0)while(!k2);if(add=1) time_data6-;if(time_data6&0x0f)9)time

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论