基于某51单片机地键盘盘可调万年历
51单片机实现万年历程序

51单片机实现万年历程序51单片机实现万年历利用AT89S52单片机的P0口来和另外几个口来控制1602液晶的显示和P1口还有其它口来控制ds12887时钟芯片。
设置四个按键,1个定义为时间设置功能键,一个定义为闹钟设置功能键,另外两个用来调节时间的增减。
原理图:pcb图:源程序:#include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit beep=P2^0;//蜂鸣器控制口sbit timeadd=P2^1;//调节时间加sbit timesub=P2^2;//调节时间减sbit timeclk=P2^3;//闹钟设定键sbit timefun=P2^4;//时间设定键sbit lcdrs=P2^5;//液晶的命令和数据控制口sbit ledrw=P2^6;//液晶的写数据口sbit lcden=P2^7;//液晶显示模块的使能端sbit timeds=P3^3;//时钟芯片地址闸sbit timerw=P3^4;//时钟芯片读写sbit timeas=P3^5;//时钟芯片地址闸sbit timeen=P3^6;//时钟芯片片选uchar code table[]="20 - - week ";uchar code table1[]=" : : ";//要显示的字符串char num,shi,fen,miao,nian=2000,yue,ri,week,numfun,anumfun,flag,flag1; uchar leap;write_com(0x80+add);write_date(0x30+shi);write_date(0x30+ge);}void write_zhou(uchar add,uchar date) {write_com(0x80+add);write_date(0x30+date);}void write_ds(uchar add,uchar date){ timeen=0;timeas=1;timeds=1;timerw=1;P1=add;timeas=0;timerw=0;P1=date;timerw=1;timeas=1;timeen=1;}uchar read_ds(uchar add){uchar ds_date;timeas=1;timeds=1;timerw=1;timeen=0;P1=add;timeas=0;timeds=0;P1=0xff;ds_date=P1;timeds=1;timeas=1;timeen=1;return ds_date;}void keyscan(){if(flag1==1)//用来关闭闹钟铃声{if(timeadd==0){delay(5);if(timeadd==0){while(!timeadd==0);flag1=0;}}if(timesub==0){delay(5);if(timesub==0){while(!timesub==0);flag1=0;}}}if(timefun==0){delay(5);if(timefun==0){while(!timefun);flag=1;numfun++;if(numfun==1){write_com(0x80+0x40+0x0a);write_com(0x0f);}if(numfun==2){write_com(0x80+0x40+0x07);write_com(0x0f);}if(numfun==3){write_com(0x80+0x40+0x04);write_com(0x0f);}if(numfun==4){write_com(0x80+0x0f);write_com(0x0f);}if(numfun==5){write_com(0x80+0x09);write_com(0x0f);}if(numfun==6){write_com(0x80+0x06);write_com(0x0f);}if(numfun==7){write_com(0x80+0x03);write_com(0x0f);}if(numfun==8){numfun=0;flag=0;}}}if(numfun!=0){if(timeadd==0){delay(5);while(!timeadd);if(numfun==1){miao++;if(miao==60)miao=0;write_sfm(9,miao);write_com(0x80+0x40+9);write_ds(0,miao);}if(numfun==2){fen++;if(fen==60)fen=0;write_sfm(6,fen);write_com(0x80+0x40+6);write_ds(2,fen);}if(numfun==3){shi++;if(shi==24)shi=0;write_sfm(3,shi);write_com(0x80+0x40+3);write_ds(4,shi);}if(numfun==4){week++;if(week==8)week=1;write_zhou(0x0f,week);write_com(0x80+0x0f);write_ds(6,week);}if(numfun==5){if(nian==0){switch(yue){case 1:ri++;if(ri==32) ri=1;break;case 2:ri++;if(ri==30) ri=1;break;case 3:ri++;if(ri==32) ri=1;break;case 4:ri++;if(ri==31) ri=1;break;case 5:ri++;if(ri==32) ri=1;break;case 6:ri++;if(ri==31) ri=1;break;case 7:ri++;if(ri==32) ri=1;break;case 8:ri++;if(ri==32) ri=1;break;case 9:ri++;if(ri==31)ri=1;break;case 10:ri++;if(ri==32)ri=1;break;case 11:ri++;if(ri==31)ri=1;break;case 12:ri++;if(ri==32)ri=1;break;}}else if(leap&&yue==2){ri++;if(ri==30)ri=1;}else if(yue==2&&leap==0){ri++;if(ri==29)ri=1;}elseswitch(yue){case 1:ri++;if(ri==32) ri=1;break;case 3:ri++;if(ri==32) ri=1;break;case 4:ri++;if(ri==31) ri=1;break;case 5:ri++;if(ri==32) ri=1;break;case 6:ri++;if(ri==31) ri=1;break;case 7:ri++;if(ri==32) ri=1;break;case 8:ri++;if(ri==32) ri=1;break;case 9:ri++;if(ri==31) ri=1;break;case 10:ri++;if(ri==32) ri=1;break;case 11:ri++;if(ri==31) ri=1;break;case 12:ri++;if(ri==32) ri=1;break;}write_nyr(8,ri);write_com(0x80+0x08);write_ds(7,ri);}if(numfun==6){yue++;if(yue==13)yue=0;write_nyr(5,yue);write_com(0x80+0x05);write_ds(8,yue);}if(numfun==7){nian++;if(nian==100)nian=0;leap=nian%4==0&&nian%100!=0;write_nyr(2,nian);write_com(0x80+2);write_ds(9,nian);}}if(timesub==0){delay(5);while(!timesub);if(numfun==1){miao--;if(miao==-1)miao=59;write_sfm(9,miao);write_com(0x80+0x40+9);write_ds(0,miao);}if(numfun==2){fen--;if(fen==-1)fen=59;write_sfm(6,fen);write_com(0x80+0x40+6);write_ds(2,fen);}if(numfun==3){shi--;if(shi==-1)shi=23;write_sfm(3,shi);write_com(0x80+0x40+3);write_ds(4,shi);}if(numfun==4){week--;if(week==0)week=7;write_zhou(0x0f,week);write_com(0x80+0x0f);write_ds(6,week);}if(numfun==5){if(nian==0){switch(yue){case 1:ri--;if(ri==0) ri=31;break;case 2:ri--;if(ri==0) ri=29;break;case 3:ri--;if(ri==0) ri=31;break;case 4:ri--;if(ri==0) ri=30;break;case 5:ri--;if(ri==0) ri=31;break;case 6:ri--;if(ri==0) ri=30;break;case 7:ri--;if(ri==0) ri=31;break;case 8:ri--;if(ri==0) ri=31;break;case 9:ri--;if(ri==0) ri=30;break;case 10:ri--;if(ri==0) ri=31;break;case 11:ri--;if(ri==0) ri=30;break;case 12:ri--;if(ri==0) ri=31;break;}}else if(leap&&yue==2){ri--;if(ri==0)ri=29;}else if(yue==2&&leap==0){ri--;if(ri==0)ri=28;}elseswitch(yue){case 1:ri--;if(ri==0) ri=31;break;case 3:ri--;if(ri==0) ri=31;break;case 4:ri--;if(ri==0) ri=30;break;case 5:ri--;if(ri==0) ri=31;break;case 6:ri--;if(ri==0) ri=30;break;case 7:ri--;if(ri==0) ri=31;break;case 8:ri--;if(ri==0) ri=31;break;case 9:ri--;if(ri==0) ri=30;break;case 10:ri--;if(ri==0) ri=31;break;case 11:ri--;if(ri==0) ri=30;break;case 12:ri--;if(ri==0) ri=31;break;}write_nyr(8,ri);write_com(0x80+0x08);write_ds(7,ri);}if(numfun==6){yue--;if(yue==-1)yue=12;write_nyr(5,yue);write_com(0x80+0x05);write_ds(8,yue);}if(numfun==7){nian--;if(nian==-1)nian=99;leap=nian%4==0&&nian%100!=0;write_nyr(2,nian);write_com(0x80+2);write_ds(9,nian);}}}}void set_alarm(){uchar ashi,afen,amiao;if(timeclk==0)//判断是否按下闹钟设定键{delay(5);//延时消抖if(timeclk==0){while(!timeclk);anumfun++;//按键次数加1if(anumfun==1){flag=1;write_com(0x80+0x40+0x0a);write_com(0x0f);}if(anumfun==2){flag=1;write_com(0x80+0x40+0x07);write_com(0x0f);}if(anumfun==3){flag=1;write_com(0x80+0x40+0x04);write_com(0x0f);}if(anumfun==4){flag=0;anumfun=0;}}}if(anumfun!=0){if(timeadd==0)//如果加功能键按下{delay(5);while(!timeadd);if(anumfun==1) //设定秒{amiao++;if(amiao==60)amiao=0;write_sfm(9,amiao);write_com(0x80+0x40+9);write_ds(1,amiao);}if(anumfun==2){afen++;if(afen==60)afen=0;write_sfm(6,afen);write_com(0x80+0x40+6);write_ds(3,afen);}if(anumfun==3){ashi++;if(ashi==24)ashi=0;write_sfm(3,ashi);write_com(0x80+0x40+3);write_ds(5,ashi);}}}if(anumfun!=0){if(timesub==0){delay(5);while(!timesub);if(anumfun==1){amiao--;if(amiao==-1)amiao=59;write_sfm(9,amiao);write_com(0x80+0x40+9);write_ds(1,amiao);}if(anumfun==2){afen--;if(afen==-1)afen=59;write_sfm(6,afen);write_com(0x80+0x40+6);write_ds(3,afen);}if(anumfun==3){ashi--;if(ashi==-1)ashi=23;write_sfm(3,ashi);write_com(0x80+0x40+3);write_ds(5,ashi);}}}}void init(){EA=1;//开总中断EX0=1;//开外部中断0IT0=1;//设定触发方式为负跳变沿有效lcden=0;//选通液晶显示屏ledrw=0;//设定液晶显示屏的读写方式为读write_com(0x38);//设置液晶显示模式为16*2显示,5*7点阵,8位数据接口 write_com(0x0c);//打开显示,并使光标不显示也不闪烁write_com(0x06);//光标指针每次自动加1write_com(1);//清屏write_com(0x80);//送地址指针for(num=0;num<16;num++){write_date(table[num]);delay(5);}write_com(0x80+0x40);//写到第二行for(num=0;num<11;num++){write_date(table1[num]);delay(5);}write_ds(0x0a,0x20);//开启时钟芯片振荡器write_ds(0x0b,0x26);//开启闹钟read_ds(0x0c);//读取时钟芯片c寄存器}void main(){init();while(1){keyscan();set_alarm();if(flag1==1)didi();if(flag==0){//读取时间miao=read_ds(0x00);fen=read_ds(0x02);shi=read_ds(0x04);yue=read_ds(0x08);ri=read_ds(0x07);nian=read_ds(0x09);week=read_ds(0x06);//写入液晶显示屏write_sfm(9,miao);write_sfm(6,fen);write_sfm(3,shi);write_nyr(2,nian);write_nyr(5,yue);write_nyr(8,ri);write_zhou(0x0f,week);}}}void exter() interrupt 0{flag1=1;read_ds(0x0c);//读时钟芯片c寄存器。
51单片机万年历实验DS1302可按键设置时钟

*选择设置加 1。
* 注意
:
*******************************************************************************
/
#include<reg51.h> #include"lcd.h" #include"ds1302.h"
sbit K1=P3^1; sbit K2=P3^0; sbit K3=P3^2; sbit K4=P3^3;
LcdInit();
Ds1302Init();
while(1)
{
if(SetState==0)
{
Ds1302ReadTime();
}
else
{ if(K1==0)
//检测按键 K1 是否按下
{ Delay10ms(); //消除抖动
if(K1==0)
{
SetPlace++;
if(SetPlace>=7)
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////以下是 主文件 main.c 的内容
void Int0Configuration();
void LcdDisplay();
unsigned char SetState,SetPlace; void Delay10ms(void); //误差 0us
/******************************************************************************
单片机课程设计--基于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单片机的万年历设计

洛阳理工学院课程设计报告课程名称单片机原理与应用设计题目基于STC89C51万年历得设计与实现专业物联网工程班级学号姓名完成日期大约在冬季目录摘要 (1)一、设计目标与内容 (2)1、1设计目标 (2)1、2 设计内容 (2)1、3设计要求 (2)1、4 本章小结 (2)二、系统设计 (3)2、1 电路设计框图 (3)2、2 系统硬件概述 (3)2、3 主要单元电路得设计 (4)2、3、1 时钟电路模块得设计 (4)2、3、2温度传感器电路设计 (5)2、3、3显示模块得设计 (7)2、4本章小结 (7)三、系统得软件设计 (7)3、1程序流程图 (7)3、1、1 系统总流程图 (7)3、1、2 温度程序流程图 (8)3、1、3 DS1302时钟程序流程图 (8)3、1、4 LCD显示程序流程图 (9)3、2程序得设计 (10)3、2、1 DS18B20测温程序 (10)3、2、2 DS1302读写程序 (11)3、2、3液晶显示程序 (13)3、3本章小结 (13)四、仿真与调试 (14)4、1 Keil软件调试流程 (14)4、2 Proteus软件运行流程 (16)4、3本章小结 (16)总结 (16)基于STC89C51万年历得设计与实现摘要古人依靠日冕、漏刻记录时间,而随着科技得发展,电子万年历已经成为日渐流行得日常计时工具。
本文研究得万年历系统拟用STC89C52单片机控制,以DS1302时钟芯片计时、DS18B20采集温度、1602液晶屏显示。
系统主要由温度传感器电路,单片机控制电路,显示电路以及校正电路四个模块组成。
本文阐述了系统得硬件工作原理,所应用得各个接口模块得功能以及其工作过程,论证了设计方案理论得可行性。
系统程序采用C语言编写,经Keil软件进行调试后在Proteus软件中进行仿真,可以显示年、月、日、星期、时、分、秒与温度并具有校准功能与与即时时间同步得功能。
实验结果表明此万年历实现后具有读取方便、显示直观、功能多样、电路简洁等诸多优点,符合电子仪器仪表得发展趋势,具有广阔得市场前景。
基于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、按键处理程序采用扫描方式检测按键状态,当检测到按键按下时,执行相应的按键处理函数,实现时间设置和功能切换等操作。
四、时间设置功能通过按键操作进入时间设置模式,可以分别设置年、月、日、时、分、秒等信息。
在设置过程中,液晶显示屏会显示当前设置的项目和数值,并通过加、减按键进行调整。
设置完成后,将新的时间数据保存到时钟芯片中。
五、显示功能万年历的显示内容包括年、月、日、星期、时、分、秒等信息。
通过合理的排版和显示控制,使这些信息在液晶显示屏上清晰、直观地呈现给用户。
六、系统调试在完成硬件和软件设计后,需要对系统进行调试。
毕业设计(论文)-基于MCS-51的万年历设计

毕业设计(论文)-基于MCS-51的万年历设计1 引言1.1 万年历的背景与意义万年历作为一种常见的时间计数工具,被广泛应用于日常生活和工业生产中。
随着电子技术的飞速发展,电子万年历以其准确、方便、易操作等特点逐渐取代了传统的机械万年历。
基于MCS-51单片机的万年历设计,不仅满足了人们对时间精确计量的需求,同时也为单片机技术在时间测量领域的应用提供了新的思路。
1.2 MCS-51单片机的介绍MCS-51单片机是美国Intel公司推出的一种高性能的8位单片机,具有较高的性价比、丰富的指令集和灵活的I/O端口。
由于其结构简单、易于编程和扩展,MCS-51单片机被广泛应用于工业控制、家用电器、智能仪表等领域。
1.3 论文结构及内容安排本文主要分为七个章节,首先介绍万年历的背景与意义以及MCS-51单片机的基本情况;其次,阐述万年历的原理与设计要求,并提出基于MCS-51单片机的万年历设计方案;接着,详细介绍MCS-51单片机的硬件设计和软件设计;然后,进行系统调试与性能测试;在此基础上,探讨万年历的实际应用与拓展;最后,总结全文并指出创新与不足之处,展望未来的研究方向。
2. 万年历的原理与设计2.1 万年历的基本原理万年历是一种可以显示公历日期、时间,并且可以自动调整闰年和平年的日历。
它的核心是通过算法处理时间的流逝,计算出当前的日期。
基本原理涉及以下几个核心概念:•时间单位:秒、分、时、日、月、年•时间算法:通过累计秒数,进行时、日、月、年的进位处理•闰年规则:四年一闰,百年不闰,四百年再闰2.2 万年历的设计要求在设计万年历时,需要遵循以下要求:•准确性:确保时间显示准确无误•可靠性:系统稳定运行,适应不同的环境条件•易用性:用户界面友好,操作简便•经济性:在满足功能要求的前提下,尽可能降低成本2.3 基于MCS-51单片机的万年历设计方案基于MCS-51单片机的万年历设计主要包括以下几个部分:2.3.1 时间计算模块利用单片机内部的定时器,以秒为单位递增计数,通过编写中断服务程序来处理时间进位,实现时、分、秒的计算。
基于51单片机的电子万年历毕业设计论文

引脚号
引脚名称
功能
1
Vcc2
主电源
2,3
X1,X2
振荡源,外界32.768kHz晶振
4
GND
地线
5
RST
复位/片选线
6
I/O
串行数据输入/输出端(双向)
7
SCLK
串行数据输入端
8
Vcc1
后备电池
76 5 4 3210
1
RAM
A4
A3
A2
A1
A0
RAM
图4.2 DS1302的控制字
实时时钟,可对秒、分、时、日、周、月以及带闰年补偿的年进行计数;
用于高速数据暂存的31×8位RAM;
最少引脚的串行I/O;
2.5~5.5V电压工作范围;
2.5V时耗电小于300nA;
用于时钟或RAM数据读/写的单字节或多字节(脉冲方式)数据传送方式;
简单的3线接口;
可选的慢速充电(至Vcc1)的能力。
2.用凌阳16位单片机设计。凌阳16位单片机有丰富的中断源和时基,方便本实验的设计。它的准确度相当高,并且C语言和汇编兼容的编程环境也很方便来实现一些递归调用。I/O口功能也比较强大,方便使用。用凌阳16位单片机做控制器最有特色的就是它的可编程音频处理,可完成语音的录制播放和识别。这些都方便对设计进行扩展,使设计更加完善。成本也相对低一些。但是,在控制与显示的结合上有些复杂,显示模组资源相对有限,而且单片机的稳定性不是很高。
Keywords:Electronicperpetual calendar;single-chip processor;temperature sensor;clock;digital display
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
开放性实验报告题目: 基于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章绪论 (1)1.1实时万年历的简介 (1)1.2系统所实现的功能 (3)第2章开发工具软件简介 (4)2.1K EIL U V ISION4软件简介 (4)2.2P ROTEUS软件简介 (4)2.3K EIL U V ISION4与P ROTEUS软件联合仿真 (5)第3章LCD1602显示控制技术 (6)3.11602字符型LCD简介 (6)3.2LCD1602功能 (7)3.3 LCD1602的指令说明及时序 (8)3.4LCD1602的RAM地址映射及标准字库表 (7)3.5 LCD1602的一般初始化(复位)过程 (8)第4章系统硬件概况 (13)4.1系统概况 (13)4.2 MCS-51单片机最小系统模块 (14)4.3 DS1302时钟芯片控制与键盘设置时间模块 (15)4.4 LCD1602显示模块 (16)第5章软件控制系统概况 (18)5.1程序流程概况 (18)5.2 流程图 (18)5.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主要技术参数:显示容量:16×2个字符芯片工作电压:4.5—5.5V工作电流:2.0mA(5.0V)模块最佳工作电压:5.0V字符尺寸:2.95×4.35(W×H)mm3.2 1602引脚功能编号符号引脚说明编号符号引脚说明1 VSS 电源地9 D2 数据2 VDD 电源正极10 D3 数据3 VL 液晶显示偏压11 D4 数据4 RS 数据/命令选择12 D5 数据5 R/W 读/写选择13 D6 数据6 E 使能信号14 D7 数据7 D0 数据15 BLA 背光源正极8 D1 数据16 BLK 背光源负极第1脚:VSS为地电源。
第2脚:VDD接5V正电源。
第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位第4脚:RS为寄存器选择,高电平时选数据寄存器、低电平时选择指令寄存器。
第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。
当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W 为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。
第7~14脚:D0~D7为8位双向数据线。
第15脚:背光源正极。
第16脚:背光源负极。
3.3 1602LCD的指令说明及时序芯片时序表如下:读状态输入RS=L,R/W=H,E=H 输出D0—D7=状态字输出无写指令输入RS=L,R/W=L,D0—D7=指令码,E=高脉冲读数据输入RS=H,R/W=H,E=H 输出D0—D7=数据写数据输入RS=H,R/W=L,D0—D7=数据,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”。