单片机原理课程设计 基于AT89C52的电子时钟设计.doc
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机原理课程设计 基于AT89C52的电子时钟设计 单片机 原理 课程设计 基于 AT89C52 电子 时钟 设计
- 资源描述:
-
单片机原理课程设计 题 目: 基于AT89C52得电子时钟设计 姓 名: 学 院: 专 业: 班 级: 学 号: 指导教师: 年月日 南京农业大学教务处制 aortiu 目 录 摘要 ……………………………………………………………………………2 关键词 ……………………………………………………………………………2 引言 ……………………………………………………………………………2 1设计要求与方案论证 …………………………………………………………2 1、1设计要求 ………………………………………………………………2 1、2系统方案选择方案与论证 ……………………………………………2 1.2.1单片机芯片得选择方案与论证……………………………………2 1.2.2 显示模块选择方案与论证 …………………………………………3 1.2.3 时钟芯片得选择方案与论证 ………………………………………3 2、系统得硬件设计与实现…………………………………………………3 2、1电路设计框图 …………………………………………………………3 2、2系统硬件概述 …………………………………………………………3 2、3 主要单元电路得设计 ……………………………………………………4 2。3。1 单片机主控制模块得设计 ……………………………………………4 2.3。2时钟电路模块得设计 ………………………………………………4 2.3。3 键盘模块设计 …………………………………………………………5 2。3。4蜂鸣器模块得设计 …………………………………………………5 2.3。5显示模块得设计 ……………………………………………………5 3. 系统得软件设计 ………………………………………………………6 3、1程序流程框图 ……………………………………………………………6 3、2程序得设计 ………………………………………………………………7 4、系统调试 ……………………………………………………………………7 4、1软件调试 …………………………………………………………………7 4、2硬件调试 …………………………………………………………………8 4、3 实验箱调试结果 ……………………………………………………………………8 5、总结心得体会 ……………………………………………………………………9 附录一:系统程序 ……………………………………………………………9 基于AT89C52得电子时钟设计 指导教师:吕成绪 胡飞 摘要:单片机在电子产品中得应用越来越广泛,特别就是51系列得单片机,由于其使用方便、价格低廉等优势,在市场上占有很大得份额。AT89C52就就是51系列中得一个比较成熟得型号.本设计就是一个多功能得实时时钟,带秒表、整点报时、闹铃、调整时间等功能.可按键直接设置闹铃时间.由AT89C51单片机、DS1302、LCD1602等模块组成。现代社会,时间就就是金钱,时钟就是每个人得必备品。本设计实现了所需功能,给大家带来方便,整体性好、人性化强、可靠性高,实现了时钟得多功能应用。 关键词:电子时钟;DS1302;LCD1602; 引言: 随着科技得快速发展,时间得流逝,从观太阳、摆钟到现在电子钟,人类不断研究,不断创新纪录。美国DALLAS公司推出得具有涓细电流充电能得低功耗实时时钟电路DS1302。它可以对年、月、日、周、时、分、秒进行计时,还具有闰年补偿等多种功能,而且DS1302得使用寿命长,误差小。对于数字电子时钟采用直观得数字显示,可以同时显示年、月、日、周日、时、分、秒与温度等信息,还具有时间校准等功能。该设计以AT89C51单片机作为核心,功耗小,能在3V得低压工作,电压可选用3~5V电压供电。 综上所述,此电子时钟具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点,符合电子仪器仪表得发展趋势,具有广阔得市场前景。 1、设计要求与方案 1、1 设计要求: (1)启动时显示制作得年、月、日、制作者得学号等信息。 (2)24小时计时功能(精确到秒) (3)整点报时功能。 (4)秒表功能 (5)省电功能模式(未设计) 1、2 系统基本方案选择 1.2。1单片机芯片得选择方案与论证 方案一: 采用89C51芯片作为硬件核心,采用Flash ROM,内部具有4KB ROM 存储空间,能于3V得超低压工作,而且与MCS-51系列单片机完全兼容,但就是运用于电路设计中时由于不具备ISP在线编程技术, 当在对电路进行调试时,由于程序得错误修改或对程序得新增功能需要烧入程序时,对芯片得多次拔插会对芯片造成一定得损坏。 方案二: 采用AT89S52,片内ROM全都采用Flash ROM;能以3V得超底压工作;同时也与MCS-51系列单片机完全该芯片内部存储器为8KB ROM 存储空间,同样具有89C51得功能,且具有在线编程可擦除技术,当在对电路进行调试时,由于程序得错误修改或对程序得新增功能需要烧入程序时,不需要对芯片多次拔插,所以不会对芯片造成损坏。 相比之下,我们在实验箱实际仿真时选择采用AT89S52作为主控制系统,由于proteus库中没有AT89S52,在原理图仿真时采用了AT89C51、 1.2。2 显示模块选择方案与论证 方案一:采用点阵式数码管显示,点阵式数码管就是由八行八列得发光二极管组成,对于显示文字比较适合,如采用在显示数字显得太浪费,且价格也相对较高,所以也不用此种作为显示、 方案二:采用LCD液晶显示屏,液晶显示屏得显示功能强大,显示多样,清晰可见、 本设计采用LCD1602、 1.2.3时钟芯片得选择方案与论证 方案一: 直接采用单片机定时计数器提供秒信号,使用程序实现年、月、日、时、分、秒计数.采用此种方案虽然减少芯片得使用,节约成本,但就是,实现得时间误差较大。所以不采用此方案。 方案二: 采用DS1302时钟芯片实现时钟,DS1302芯片就是一种高性能得时钟芯片,可自动对秒、分、时、日、周、月、年以及闰年补偿得年进行计数,而且精度高,位得RAM做为数据暂存区,工作电压2、5V~5、5V范围内,2、5V时耗电小于300nA、 综上各方案所述,对此次作品得方案选定: 采用AT89C52作为主控制系统, DS1302提供时钟计时,LCD1602屏幕显示、 2、系统得硬件设计与实现 2、1 电路设计框图 AT89C51 单片机 模 块 LCD1602 显示模块 DS1302 时钟模块 键盘模块 2、2 系统硬件概述 本电路就是由AT89C51单片机为控制核心,具有在线编程功能,低功耗,能在3V超低压工作;时钟电路由DS1302提供,它就是一种高性能、低功耗、带RAM得实时时钟电路,它可以对年、月、日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2、5V~5、5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节得时钟信号或RAM数据。DS1302内部有一个31*8得用于临时性存放数据得RAM寄存器。可产生年、月、日、周日、时、分、秒,具有使用寿命长,精度高与低功耗等特点,同时具有掉电自动保存功能;显示部份由LCD1602构成、 2、3 主要单元电路得设计 2。3。1单片机主控制模块得设计 图—1 主控制系统 AT89C51单片机为40引脚双列直插芯片,有四个I/O口P0,P1,P2,P3。 单片机得最小系统如上图所示,18引脚与19引脚接时钟电路,XTAL1接外部晶振与微调电容得一端,在片内它就是振荡器倒相放大器得输入,XTAL2接外部晶振与微调电容得另一端,在片内它就是振荡器倒相放大器得输出、第9引脚为复位输入端,接上电容,电阻及开关后够上电复位电路、如图-1 所示、 2.3。2时钟电路模块得设计 图-2 DS1302得引脚图 图-2示出DS1302得引脚排列,其中Vcc1为后备电源,Vcc2为主电源。在主电源关闭得情况下,也能保持时钟得连续运行。DS1302由Vcc1或Vcc2两者中得较大者供电.当Vcc2大于Vcc1+0、2V时,Vcc2给DS1302供电。当Vcc2小于Vcc1时,DS1302由Vcc1供电。X1与X2就是振荡源,外接32、768KHz晶振。RST就是复位/片选线,通过把RST输入驱动置高电平来启动所有得数据传送。RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据得传送手段.当RST为高电平时,所有得数据传送被初始化,允许对DS1302进行操作。如果在传送过程中RSTS置为低电平,则会终止此次数据传送,I/O引脚变为高阻态.上电动行时,在Vcc大于等于2、5V之前,RST必须保持低电平。中有在SCLK 为低电平时,才能将RST置为高电平,I/O为串行数据输入端(双向)。SCLK始终就是输入端。 2.3。3 键盘模块设计 图-3 键盘模块 如图—3,K1、K2、K3、K4均为多功能键。K1为秒表设置键,按K4键时为时钟确定键;K2在K4按下时为时钟下调键,在K3按下时为闹钟确定键,在K1按下时为秒表开始键;K3为闹钟设置键,在K4按下时为时钟上调键,在K1按下时为秒表暂停键;K4为时钟设置键,在K3按下时为闹钟移位键,在K1按下时为秒表退出键。 2。3.4蜂鸣器模块得设计 图-4 声音输出模块 闹铃时间到与整点时,P3_7给低电平,蜂鸣器响。 2。3.5显示模块得设计 图-5 LCD显示输出模块 如图—5,1脚VSS与3脚VEE为电源接地,第2管脚VDD接电源,第4管脚RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器;RW为读写信号线,高电平1时进行读操作,低电平0时进行写操作;E(或EN)端为使能(enable)端; 第7~14脚D0~D7为8位双向数据端。控制与数据端都接了上拉电阻用来驱动。 3、系统得软件设计 3、1程序流程框图 图-A 主程序流程图 图—B 时间调整程序流程图 3、2 程序得设计 见附录 4、系统调试 4、1软件调试结果 时钟主界面 用户 设置闹铃界面 秒表界面 时钟仿真图 4、2 硬件调试结果 起初蜂鸣器有点问题不响,后来发现就是定义错端口引起得。其她功能正常。 4、3 实验箱调试结果 实现功能得具体方法: 时钟主界面时按下K1键进入秒表功能,按K2秒表开始,再按K3秒表停,按键K4返回时间显示;按K4开始调试(移位“年→秒”),接着按K2、K3调节时间增减;按K2开启闹钟,K3调节时间,K4(移位“时分”);按“年→秒”得顺序移位,按键K2进行减运算,按键K3进行加运算,按键K1返回到主界面并显示设置值。 按下K3键,实现闹钟定时调整,按键K4进行“分-秒”移位,按键K3进行上调,按键K2返回到主界面. 主界面K2实现开启/关闭闹钟得功能。 按下K1键进入秒表,按键K2开始计时,K3暂停计时,K4返回到主界面。 5、总结心得体会: 这次实习我们组选择得就是电子时钟设计。实习任务包括理论设计、调试与仿真、撰写设计报告等。其中理论设计又包括选择总体方案,硬件系统设计、软件系统设计;硬件设计包括单元电路,选择元器件及计算参数等;软件设计包括模块化层次结构图,程序流程图。程序设计就是课程设计得关键环节,开始以为时钟会很简单,就算遇到问题应该也很好解决,但当自己真正去做得时候,发现了好多困难。于就是查资料,问同学。经过与同学得探讨,通过调试进一步完善程序设计,最后虽然省电模式没实现但其她基本达到课题所要求得指标。完成了实习任务。这次实习我更加了解了单片机得应用,更加牢牢得掌握了书本知识与现实得结合,总之这就是实习收获很大,以后还需多动手实践,多练习编程,才能熟练掌握单片机。 窗体顶端 附录一: 程序: #include<reg52、h> #include〈INTRINS、H> #include<lcd1602、h>ﻩ #include〈ds18b20、h〉 #define uchar unsigned char #define uint unsigned int #define TIME (0X10000—50000) #define FLAG 0xf4ﻩ //闹钟标志 sbit rst=P1^2; ﻩ //DS sbit clk=P1^0; sbit dat=P1^1; sbit rs=P2^0; ﻩ//LCD sbit rw=P2^1; sbit e=P2^2; sbit beep=P1^3; sbit mbkey=P1^4; uchar k; uchar flag; uchar i=20,j,time1[16]; uchar alarm[2],time2[15],time[3];time5[3]; uchar code Day[]={31,28,31,30,31,30,31,31,30,31,30,31}; //12个月得最大日期(非闰年) uchar key2num,ms=0,mbmiao=0,mbfen=0,mbkeynum,num; //ms秒表进数, mbmiao、mbfen秒表得秒、分,key2num就是key5得计数ﻩ uchar code table[]=" 32210324 GYY”; uchar code table1[]=” 32210326 GLQ"; uchar code table4[]=” 00:00:00 MB "; void delay(uint z) { uint x,y; for(x=z;x〉0;x--) for(y=110;y〉0;y--); } delay1ms(uchar time) //延时1ms { uchar i,j; ﻩfor(i=0;i<time;i++) { for(j=0;j<250;j++);} } ﻩ //LCD驱动部分 enable() { rs=0; ﻩrw=0; ﻩe=0; delay1ms(3); ﻩe=1; } write2(uchar i) { P0=i; rs=1; rw=0; ﻩe=0; ﻩdelay1ms(2); ﻩe=1; } write1(uchar data *address,m) { uchar i,j; ﻩfor(i=0;i<m;i++,address++) { j=*address; write2(j); } } //LCD显示 lcdshow() { P0=0XC; ﻩﻩﻩ//显示器开、光标关 ﻩenable(); ﻩP0=0x80;ﻩﻩﻩ//第一行0~15 ﻩenable(); ﻩwrite1(time1,16); P0=0xc1; ﻩ//第二行1~14 ﻩenable(); write1(time2,15); } //DS1302读写子程序 write(uchar address) { uchar i; clk=0; _nop_(); ﻩrst=1; ﻩ_nop_(); for(i=0;i<8;i++) ﻩ{ dat=address&1; _nop_(); ﻩclk=1; ﻩ address>>=1; ﻩﻩclk=0; ﻩ} } uchar read() { uchar i,j=0; ﻩfor(i=0;i<8;i++) ﻩ{ j>>=1; ﻩﻩ_nop_(); ﻩﻩclk=0; _nop_(); ﻩ if(dat) ﻩﻩ j|=0x80; ﻩ _nop_(); ﻩclk=1; ﻩ} ﻩreturn(j); } //部分显示数据初始化 timestart() {ﻩ time1[6]=time1[9]=’-'; time1[2]='2’,time1[3]='0'; time2[2]=time2[5]=':'; write(0xc1); alarm[0]=read(); ﻩrst=0; write(0xc3); alarm[1]=read();ﻩﻩ ﻩ rst=0; write(0xc5); ﻩtime1[0]=read(); ﻩrst=0; } //读取时间 readtime() { uchar i,m,n; write(0x8d); //读取年份 ﻩm=read(); ﻩrst=0; ﻩtime1[4]=m/16+0x30; time1[5]=m%16+0x30; time1[15]=m+0x30; for(i=7,n=0x89;i〈11;i+=3,n-=2)ﻩ//读取月份与日期 ﻩ{ write(n); ﻩm=read(); ﻩrst=0; time1[i]=m/16+0x30; ﻩﻩtime1[i+1]=m%16+0x30; } ﻩfor(m=0,i=0,n=0x85;i〈7;i+=3,n—=2,m++)ﻩ//读取时,分,秒 ﻩ{ write(n); ﻩ time[m]=read(); ﻩ //将实时得时分秒给time[] ﻩrst=0; time2[i]=time[m]/16+0x30; time2[i+1]=time[m]%16+0x30; ﻩ} } baoshi()ﻩ //整点报时 { beep=1; if(time[1]==0) if(time[2]==0) {beep=0;delay(10);beep=1;} ﻩ ﻩ ﻩ ﻩﻩﻩ } //闹钟部分 showalarm() { uchar i; for(i=1;i<10;i++) ﻩ{beep=0;delay(1000);beep=1;} } //根据日期得变动自动调整星期 //设置时间 settime() { uchar i=0x85,year,month,day,n; time2[6]=time2[7]=0x30,time1[14]=time1[15]=0x20; lcdshow(); while(1) { ﻩ ﻩ P0=0x0e;ﻩﻩ //显示器开显示、开光标 enable(); ﻩ P0=i;ﻩﻩ //定光标 ﻩﻩenable(); ﻩP1=0xf0; ﻩ if(P1!=0Xf0)ﻩ ﻩﻩ //有按钮按下 { ﻩﻩ delay1ms(100);ﻩﻩ //延时0、1s去抖动 ﻩ if(P1!=0Xf0) ﻩﻩﻩ{ ﻩﻩ j=7; ﻩﻩﻩ if(P1==0X70) ﻩ ﻩ //K1,设置时钟 ﻩ ﻩﻩ{ ﻩ ﻩi+=3; ﻩﻩﻩﻩ if(i==0x8e) ﻩﻩﻩ i=0xc2; ﻩﻩﻩ ﻩelse if(i〉0xc5) ﻩﻩ i=0x85; ﻩﻩ} ﻩ else if(P1==0xb0) //K2,上调 { ﻩ year=(time1[4]&0xf)*10+(time1[5]&0xf); month=(time1[7]&0xf)*10+(time1[8]&0xf); ﻩﻩ day=(time1[10]&0xf)*10+(time1[11]&0xf); ﻩﻩ if(i==0x85) ﻩ { ﻩﻩ ﻩﻩﻩyear++; ﻩ ﻩif(year>99) ﻩﻩﻩ year=0; ﻩ ﻩﻩﻩﻩif((year%4)!=0) ﻩ ﻩ ﻩﻩif(month==2&&day==29) ﻩﻩ ﻩ ﻩﻩday=28; ﻩﻩ } ﻩ else if(i==0x88) ﻩ ﻩﻩ{ ﻩ ﻩﻩmonth++; ﻩﻩﻩﻩ if(month>12) ﻩ ﻩ ﻩmonth=1; ﻩﻩ ﻩif(day>Day[month—1]) ﻩ { ﻩ ﻩﻩﻩday=Day[month-1]; ﻩ ﻩ if(month==2&&(year%4)==0) ﻩﻩday=29; ﻩﻩﻩﻩﻩﻩ} ﻩ ﻩ ﻩ ﻩ ﻩ } ﻩﻩelse if(i==0x8b) ﻩ ﻩ{ ﻩﻩﻩ ﻩday++; ﻩ ﻩ if(day>Day[month-1]) ﻩﻩ { ﻩ ﻩﻩ if(month==2&&(year%4)==0) ﻩﻩﻩﻩ { ﻩﻩﻩﻩﻩﻩﻩif(day〉29) ﻩ ﻩﻩﻩﻩday=1; ﻩﻩ ﻩﻩﻩ} ﻩﻩ ﻩ if(month!=2) ﻩ day=1; ﻩﻩ } ﻩ ﻩ } ﻩﻩﻩ ﻩelse if(i==0xc2) ﻩﻩ ﻩ{ ﻩ ﻩ n=(time2[0]&0xf)*10+(time2[1]&0xf); ﻩn++; ﻩ if(n>23) ﻩ ﻩ ﻩn=0; ﻩ ﻩ ﻩ time2[0]=n/10+0x30; ﻩﻩ time2[1]=n%10+0x30; ﻩ ﻩﻩ} ﻩﻩ else ﻩﻩ ﻩﻩ{ ﻩﻩ ﻩﻩn=(time2[3]&0xf)*10+(time2[4]&0xf); ﻩ n++; ﻩﻩ ﻩﻩ if(n>59) ﻩﻩﻩ ﻩ n=0; ﻩ time2[3]=n/10+0x30; ﻩ ﻩ time2[4]=n%10+0x30; ﻩ ﻩ} ﻩtime1[4]=year/10+0x30; ﻩ ﻩ time1[5]=year%10+0x30; ﻩﻩﻩﻩtime1[7]=month/10+0x30; ﻩtime1[8]=month%10+0x30; ﻩ ﻩ time1[10]=day/10+0x30; ﻩﻩ ﻩ time1[11]=day%10+0x30; ﻩﻩ lcdshow(); ﻩ } ﻩﻩelse if(P1==0xd0)ﻩﻩﻩﻩﻩ //K3,下调 ﻩﻩﻩ{ year=(time1[4]&0xf)*10+(time1[5]&0xf); ﻩmonth=(time1[7]&0xf)*10+(time1[8]&0xf); ﻩﻩ ﻩ day=(time1[10]&0xf)*10+(time1[11]&0xf); ﻩ ﻩﻩif(i==0x85) ﻩﻩ ﻩ{ ﻩ ﻩ year--; ﻩ ﻩ if(year〈1) ﻩ ﻩﻩ year=99; if((year%4)!=0) ﻩﻩ ﻩ ﻩif(month==2&&day==29) ﻩ ﻩﻩﻩday=28; ﻩﻩ} ﻩﻩﻩﻩﻩelse if(i==0x88) ﻩ ﻩ{ ﻩﻩ month--; ﻩ ﻩ if(month<1) ﻩ ﻩﻩﻩ ﻩmonth=12; ﻩ ﻩﻩ if(day>Day[month-1]) ﻩ { ﻩﻩﻩday=Day[month—1]; ﻩ ﻩﻩ if(month==2&&(year%4)==0)ﻩ ﻩ ﻩ ﻩ day=29; ﻩ }ﻩﻩ ﻩ ﻩ } ﻩﻩﻩ ﻩelse if(i==0x8b) ﻩﻩﻩﻩ{ ﻩ ﻩﻩﻩﻩday——; ﻩﻩﻩ if(day〈1) ﻩ ﻩ ﻩ { ﻩ ﻩﻩif(month==2&&(year%4)==0) ﻩﻩﻩ ﻩ{ ﻩﻩﻩﻩ ﻩﻩﻩday=29; ﻩ ﻩ ﻩ} ﻩ if(month!=2) ﻩﻩ ﻩday=Day[month-1]; ﻩ ﻩ ﻩ} ﻩ ﻩ } ﻩelse if(i==0xc2) ﻩﻩﻩﻩﻩ{ ﻩﻩ ﻩﻩn=(time2[0]&0xf)*10+(time2[1]&0xf); ﻩn--; ﻩ ﻩﻩ ﻩif(n〈0) n=23; ﻩ time2[0]=n/10+0x30; ﻩ ﻩﻩﻩﻩtime2[1]=n%10+0x30; ﻩﻩﻩ } ﻩelse ﻩﻩﻩ { ﻩ ﻩﻩ n=(time2[3]&0xf)*10+(time2[4]&0xf); ﻩﻩﻩﻩn--; ﻩﻩ ﻩ if(n<0) ﻩ ﻩn=59; ﻩ ﻩ ﻩﻩtime2[3]=n/10+0x30; ﻩ ﻩﻩ time2[4]=n%10+0x30; ﻩﻩ } ﻩﻩtime1[4]=year/10+0x30; ﻩﻩ time1[5]=year%10+0x30; ﻩﻩﻩ time1[7]=month/10+0x30; ﻩﻩ time1[8]=month%10+0x30; ﻩ ﻩﻩ time1[10]=day/10+0x30; ﻩﻩﻩﻩtime1[11]=day%10+0x30; ﻩﻩ ﻩﻩlcdshow(); ﻩ } ﻩﻩ else if(P1==0xe0) ﻩ ﻩﻩ //K4,确定设置 ﻩ { delay1ms(1000);ﻩ ﻩﻩﻩwrite(0x8c); ﻩﻩwrite((time1[4]&0xf)*16+(time1[5]&0xf)); ﻩ ﻩﻩrst=0; ﻩ ﻩ write(0x8a); ﻩﻩﻩrst=0; ﻩﻩ for(i=7,n=0x88;i<11;i+=3,n-=2) ﻩ ﻩﻩ{ﻩ ﻩﻩﻩﻩ ﻩwrite(n); ﻩﻩ ﻩﻩ write((time1[i]&0xf)*16+(time1[i+1]&0xf)); ﻩﻩ ﻩrst=0; ﻩﻩﻩ} ﻩ ﻩ ﻩfor(i=0;i〈7;i+=3,n-=2) ﻩ { ﻩﻩ write(n); ﻩﻩﻩﻩ write((time2[i]&0xf)*16+(time2[i+1]&0xf)); ﻩ rst=0; } ﻩﻩTR0=0; ﻩ ﻩ return; ﻩﻩ} ﻩﻩ else ﻩﻩ{ ﻩ ﻩﻩ TR0=0; ﻩ ﻩﻩ return; ﻩﻩ} } ﻩﻩ} ﻩif(j==0) { ﻩﻩTR0=0; ﻩﻩ return; } } } //设置闹钟 setalarm() { uchar i,n; ﻩfor(i=1;i<16;i++) ﻩ{ time1[i]=0x20; ﻩ} time2[0]=alarm[0]/16+0x30; time2[1]=(alarm[0]&0x0f)+0x30; time2[3]=alarm[1]/16+0x30; ﻩtime2[4]=(alarm[1]&0x0f)+0x30; ﻩtime2[6]=time2[7]=0x30; lcdshow(); ﻩi=0xc2; while(1) ﻩ{ P0=0xe;ﻩ ﻩ//显示器开、光标开 ﻩﻩenable(); ﻩ P0=i;ﻩ //定光标 ﻩﻩenable(); ﻩP1=0xf0; ﻩ if(P1!=0Xf0) ﻩ ﻩ//有按钮按下 ﻩ { ﻩdelay1ms(100); ﻩ ﻩ//延时0、1s去抖动 ﻩ ﻩif(P1!=0Xf0) ﻩ { ﻩ ﻩ j=7; ﻩﻩﻩﻩif(P1==0X70)ﻩ ﻩ ﻩﻩ{ ﻩ ﻩﻩﻩi+=3; ﻩ ﻩif(i>0xc5) ﻩﻩﻩﻩ ﻩi=0xc2; ﻩﻩ} ﻩ ﻩﻩelse if(P1==0xb0) ﻩ //按K2,设闹钟 ﻩ { ﻩﻩif(i==0xc2) ﻩ ﻩ{ ﻩﻩﻩﻩ n=(time2[0]&0xf)*10+(time2[1]&0xf); ﻩ ﻩﻩﻩﻩn++; ﻩ if(n>23) ﻩﻩ n=0; ﻩ ﻩ time2[0]=n/10+0x30; ﻩ ﻩtime2[1]=n%10+0x30; ﻩ } ﻩ ﻩ ﻩelse { ﻩ ﻩﻩﻩn=(time2[3]&0xf)*10+(time2[4]&0xf); ﻩ ﻩ n++; ﻩ if(n>59) ﻩ ﻩ ﻩ ﻩn=0; ﻩﻩﻩ ﻩﻩtime2[3]=n/10+0x30; ﻩﻩﻩﻩ time2[4]=n%10+0x30; ﻩﻩﻩ } ﻩﻩﻩ lcdshow(); ﻩﻩ} ﻩ ﻩ else if(P1==0xd0)ﻩﻩ ﻩﻩ ﻩ //确定闹钟设置 ﻩﻩ ﻩ{ ﻩﻩ write(0xc0);ﻩ ﻩ ﻩ ﻩwrite((time2[0]&0x0f)*16+(time2[1]&0x0f)); ﻩ ﻩﻩrst=0; ﻩﻩ write(0xc2); ﻩﻩwrite((time2[3]&0xf)*16+(time2[4]&0xf)); ﻩﻩﻩ rst=0; ﻩ ﻩtime1[0]=FLAG; ﻩﻩﻩﻩwrite(0xc4); ﻩﻩ ﻩ write(time1[0]); ﻩ ﻩ rst=0; ﻩ ﻩﻩTR0=0; ﻩ ﻩtimestart(); ﻩ ﻩﻩreturn; ﻩﻩ ﻩ} ﻩ ﻩelse ﻩﻩﻩ { ﻩ ﻩ TR0=0; ﻩﻩﻩﻩﻩtimestart(); ﻩ return; ﻩ} ﻩ ﻩ} ﻩ} if(j==0) { ﻩTR0=0; ﻩ timestart(); ﻩ ﻩreturn; ﻩ} ﻩ} } //lcdwrite() LCD写指令 void lcdwrite(uchar write) { rs=0; ﻩP0=write; delay(1); e=1; delay(1); e=0; }ﻩ //lcdshuju() LCD写数据 void lcdshuju(uchar shuju) { rs=1; P0=shuju; ﻩdelay(1); e=1; delay(1); e=0; }ﻩ //秒表部分 void write_sfm(uchar add ,uchar date)ﻩ //秒显示函数 { uchar shi,ge; shi=date/10; ge=date%10; ﻩlcdwrite(0x80+0x40+add); lcdshuju(0x30+shi); ﻩlcdshuju(0x30+ge); } void mbiao( )ﻩ ﻩﻩ ﻩ//秒表函数 { lcdwrite(0x80+0x40); for(num=0;num〈16;num++) ﻩ lcdshuju(table4[num]); start: while(1) { if(P1!=0Xf0) { delay1ms(100);ﻩ ﻩﻩ//延时0、1s去抖动 if(P1!=0Xf0) ﻩ if(P1==0xd0) ﻩ //秒表开始计数 ﻩ {TR1=1; ﻩﻩ ET1=1; ﻩ } else if(P1==0xb0)ﻩ //秒表暂停计数 { TR1=0; } ﻩ else if(P1==0x70)ﻩ //退出 ﻩﻩﻩ {return; ﻩ ﻩ } ﻩﻩ goto start; } } } void init() {ﻩe=0; rw=0; ﻩlcdwrite(0x38);//显示模式 lcdwrite(0x0c);//开显示,光标不闪烁 lcdwrite(0x80); for(i=0;i<16;i++) ﻩ{ lcdshuju(table[i]); delay(200); ﻩ} ﻩlcdwrite(0x80+0x40); ﻩfor(i=0;i<16;i++) ﻩ{ lcdshuju(table1[i]); ﻩ delay(200); ﻩ} delay(500); lcdwrite(0x01); } main() {ﻩ init(); ﻩIE=0X82; TMOD=0x11; ﻩwrite(0x8E); ﻩ//关闭写保护 ﻩwrite(0); ﻩrst=0; P0=1;ﻩ ﻩ //清屏并光标复位 enable(); ﻩP0=0X38; ﻩ//设置显示模式:8位2行5x7点阵 enable(); P0=6; ﻩ //文字不动,光标自动右移 enable(); timestart(); while(1) { ﻩ readtime(); //读取时间 lcdshow(); ﻩﻩ //显示时间 baoshi(); if(ti展开阅读全文
咨信网温馨提示:1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。




单片机原理课程设计 基于AT89C52的电子时钟设计.doc



实名认证













自信AI助手
















微信客服
客服QQ
发送邮件
意见反馈



链接地址:https://www.zixin.com.cn/doc/12089450.html