版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、成绩揃肖2和垮氏HUNAN INSTITUTE OF ENGINEERING课程设计课程名称 单片机原理与应用课程设计课题名称时钟跑表设计专业自动化班级1303班学号 201301020331姓名卓彬彬指导老师林国汉、王迎旭、李晓秀等2016年6月10日电气信息学院课程设计任务书课题名称 时钟跑表设计姓 名 卓彬彬 专业自动化班级1303班学号 31指导老师林国汉课程设计时间 2016年5月30日-2016年6月10日一、任务及要求一、任务及要求设计任务:本课题要求以MCS-51系列单片机为核心,设计一个数字时钟。(1) 具有时钟和跑表功能,用LED或者液晶显示器进行显示;(2) 具有时钟调整
2、功能(3) 具有闹钟功能*能将闹钟时间在AT24C02保存(5)*其它功能设计要求:(1) 确定系统设计方案;(2) 进行系统的硬件设计;(3) 完成应用程序设计;(4) 应用系统的硬件和软件的调试。二、进度安排第一周:周一:集中布置课程设计任务和相关事宜,查资料确定系统总体方案。周二周三:完成硬件设计和电路连接周四周日:完成软件设计第二周:周一周三:程序调试周四周五:设计报告撰写。周五进行答辩和设计结果检查。三、参考资料1、王迎旭等 . 单片机原理及及应用 M. 2 版. 机械工业出版社, 20122、胡汉才. 单片机原理及其接口技术 M.3 版. 清华大学出版社, 2010.20103、戴
3、灿金.51单片机及其C语言程序设计开发实例M.清华大学出版社,目录第一章 总体方案设计 11.1 设计方案 . 11.2 设计思路及系统框架图 1第二章 硬件电路设计 22.1 单片机 AT89C51 22.2 矩阵键盘电路 42.3 蜂鸣器电路 42.4 LED 数码管显示电路 52.5 24C02 存储电路 5第三章 软件设计 63.1 系统主程序 63.2 数码管显示程序 73.3 矩阵键盘功能程序 73.4 定时功能程序 9第四章 调试 104.1 系统调试方法 104.2 调试结果 . 114.3 调试中遇到的问题及其解决方法 12第五章 总结 13附录 14附录 A 电路仿真原理图
4、 14附录 B 程序清单 14第一章 总体方案设计1.1 设计方案(1)通过单片机内部的计数 / 定时器,采用软件编程来实现时钟计数, 一般称为软时钟, 这种方法的硬件线路简单,系统的功能一般与软件设计相关,通常用在对时间精度要求不 高的场合。(2)采用时钟DS1302芯片,它的功能强大,功能部件集成在芯片内部,具有自动产生 时钟等相关功能,硬件成本相对较高;软件编程简单,通常用在对时钟精度要求较高的场 合。方案选择:最终这次我选择的是方案( 1),因为方案( 1)硬件电路简单,操作更方 便简单。1.2 设计思路及系统框架图我们采用的是AT89C51作为时钟控制芯片。本次方案主要由时钟模块、秒
5、表模块和闹 钟模块组成,其中时钟模块包含时钟显示功能、时钟调整功能和时钟暂停功能,秒表模块 包含秒表启动功能、秒表暂停功能、秒表时间存储功能和秒表回显功能,闹钟模块包含闹 钟调整功能、闹钟显示功能和闹钟存储功能。时钟通过定时器T0对时、分、秒的数值进行操作,并且秒计算到 60的时候,要自己清零并向分进 1,分计算到 60的时候,要自己 清零并向时进 1,时进到 24的时候,要清零,这样才能进行循环计时。秒表模块需要重新 显示一个秒表界面,同时也应该需要通过另外一个定时器 T1 对秒表进行操作,从而保证 在秒表界面,时钟显示模块的时间还在进行。闹钟模块则需要设计闹钟时间,当设计的闹 钟时间和时钟
6、的时间相等,蜂鸣器响起,从而达到闹钟功能,此外通过外接24c02存储芯片,将闹钟时间进行存储,且具有断电存储功能,当系统断电重新开启以后,可显示之前 设定的闹钟值。此外还要实现对时间的调整功能,AT89C51 的 P1 口外接一个矩阵键盘,当按下 K3键时,进行时钟调整,当 K3按下一次时,是对时间的分钟进行调整,按下K5键数值加一,按下K6键数值减一。当按下K12键时,进行闹钟的调整,当K3按下一次时,是对闹钟的 分钟进行调整,按下K5键数值加一,按下K6键数值减一。对于秒表模块,当按下 K7键 时,秒表启动,当按下K8键时,显示秒表当前值,但秒表继续走动。在秒表计时过程中, 每按下一次K9
7、键,则对秒表当前值进行存储,每按下 K10键,则对存储值进行一一回显 (矩阵键盘按键标号详见电路仿真图)。在单片机内部构建两个模块:控制模块、定时模块,用以实现根据要求进行自动计数功能。单片机外部构建四个电路:矩阵键盘电路、数码管显示电路、蜂鸣器电路、24C02存储电路,用以实现对单片机内部计数选择控制、闹钟响铃、闹钟存储和时间输出的正确 显示。该电子时钟是显示分、时值,秒为数码表的DP位闪烁的一种计时装置本次计时周期设置为24小时。为了确保时间正常校对,在系统中设有校对按钮,用以实现对数码管 显示的正确调整,如图1.1所示为系统框架图。51单片机矩阵键盘电路24C02存储电路控疋制时模模块块
8、数码管显示电路蜂鸣器电路图1.1系统框架图第二章硬件电路设计2.1 单片机 AT89C51AT89C51是一种带4K字节FLASH存储器的低电压、高性能 CMOS勺8位微处理器,俗 称单片机。AT89C51是一种带2K字节闪存可编程可擦除只读存储器的单片机。单片机的可 擦除只读存储器可以反复擦除1000次。该器件采用ATMEL高密度非易失存储器制造技术 制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能 8位CPU和闪烁存 储器组合在单个芯片中,ATMEL的 AT89C51是一种高效微控制器。AT89C51单片机为很多 嵌入式控制系统提供了一种灵活性高且价廉的方案,如图2.1所
9、示为AT89C51的管脚图。本次电路中用到单片机的P0 P1、P2、P3 口,所示下面对这四个端口进行详细介绍。P0 口: P0 口为一个8位漏级开路双向I/O 口,每脚可吸收8TTL门电流。当P0 口的 管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义 为数据/地址的低八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时, P0输出原码,此时P0外部必须接上拉电阻。本次课设中 P0 口接的是数码管的8个管脚, P0A0P0A7依次接数码管的ADP管脚。P1 口: P1 口是一个内部提供上拉电阻的8位双向I/O 口, P1 口缓冲器能接收输出
10、4TTL 门电流。P1 口管脚写入1后,被内部上拉为高,可用作输入,P1 口被外部下拉为低电平 时,将输出电流,这是由于内部上拉的缘故。在 FLASHS程和校验时,P1 口作为低八位地 址接收。本次P1课设口接的数码管的6个位选端口。223口-1ilz>XTAL1XTAL2RSTPSEN ALE EAP1 0/T2PI JIT2CXPI .2P1 3P1 4P1 5P1JBP1 7PO.CMADO P0.1/AD1 P0.2/AD2 PO.3/AD3 PQ.4/AE>4 PO.5JAD5P0.7/AD7P2 0/A6P2-1 /A9P2.2JA1OP283tfAl 1P2.4/A1
11、2P2.5/A13P2.&M4P2.7/A15P3 CURXDP3j/TXDP3.2jlNT0P3.3d«7FrP3.4JT0P3 5/T1P3 BJWR"P37/图2.1 89C51引脚图P2 口: P2 口为一个内部上拉电阻的8位双向I/O 口,P2 口缓冲器可接收,输出4个 TTL门电流,当P2 口被写“ T时,其管脚被内部上拉电阻拉高,且作为输入。并因此作 为输入时,P2 口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2 口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2 口输出地址的高八位。在 给出地址“ 1 ”时,它利用内部上拉
12、优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2 口在FLASHS程和校验时接收高八位地址信号和控制信号。本次课设中P2 口的P2MP2A7分别接的是数码管的位选 WL W4P3 口 :本次课设中P3 口的P3A3和P3A4分别接的是24C02的SCL和SDA,P3A7接的是 蜂鸣器的一端。2.2 矩阵键盘电路在本次设计中,矩阵键盘的 S1S4列分别接P1A7P1A4引脚,H1H4行分别接的是 P1A3P1A0引脚。先从P1 口的高四位输出高电平,低四位输出低电平,从 P1 口的高四位 读取键盘状态。再从P1 口的高四位输出低电平,低四位输出高电平,从P1 口
13、的低四位读取键盘状态。将两次读取结果组合起来就可以得到当前按键的特征编码。使用上述方法我 们得到16个键的特征编码。举例说明如何得到按键的特征编码:假设“K1”键被按下,找其按键的特征编码。从P1 口的低四位输出低电平,即PM0 P1A3为输出口。高四位输出高电平,即P1A4P1A7为输入口。读P1 口的高四位状态为“ 0111”,其值为“ 70H'。再从P1 口的低四位输出高电平,即 P1A0P1A3为输入口。 高四位输出低电平,即PM4P1A7为输出口,读P1 口的低四位状态为“1110”,其值为“0Erfo将两次读出的P0 口状态值进行逻辑或运算就得到其按键的特征编码为“7Erf
14、 0用同样的方法可以得到其它15个按键的特征编码,如图2.2所示为矩阵键盘接线图。图2.2矩阵键盘接线图2.3 蜂鸣器电路因本次课设包含闹钟功能,故在 P3 口的P3A7接了一蜂鸣器。当时钟显示的时间与闹 钟存储的时间相同时,P3A7引脚输出低电平,使蜂鸣器接通,发出滴滴的响声,响声持续 时间为20秒,20秒后P3A7引脚输出高电平,蜂鸣器关断,如图2.3所示为蜂鸣器接线图。图2.3蜂鸣器接线图2.4 LED数码管显示电路在本次的设计中,采用的4位的数码管显示器。数码管如果按照段数分可为七段数码 管和八段数码管,八段数码管比七段数码管多一个发光二极管单元,也就是多了一个小数 点的显示;如果按照
15、发光二极管单元的连接方式又可以分为共阳极数码管和共阴极数码管。 共阳极的数码管是将所有发光二极管的阳极接到一起后就形成公共阳极(COM的数码管,共阳极数码管在应用时要将公共极(COM接到+5V,当某一字段发光二极管的阴极为低电 平时,相应字段就点亮,当某一字段的阴极为高电平时,相应字段就不亮。共阴极数码管 是将所有发光二极管的阴极接到一起形成公共阴极(COM的数码管,共阴极数码管在应用时应将公共极(COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相 应字段就点亮,当某一字段的阳极为低电平时,相应字段就不亮。本次课设的数码管选用 共阳极八段数码管,如图2.4所示为LED数码管接线图
16、。图2.4 LED数码管接线图2.5 24C02存储电路根据本次课设要求,在闹钟时间调整以后要能够存储起来,当系统断电以后,能够将闹钟进行,等待系统再次接通电源后,启动时钟程序后,当时钟时间与存储的闹钟时间一致时,蜂鸣器发出响声。故选用AT24C02芯片,进行闹钟时间的存储。AT24C02芯片为2562X 8的EEPRQM采用8引脚DIP,其中Vcc、GNE为电源引脚,SCL SDA为I C总线引脚,AOA2为地址引脚,TEST为测试端,系统中可接地处理,如图 2.5所示为AT24C02的引 脚图。AO1V78VccA127WPA236SCLVss45SDA图2.5 AT24C02引脚图本次课
17、设中AT24CO的SCL和 SDA分别接P3A4和P3A5, AO、A1、A2端接地,电路接线图,如图2.6所示KJ .UJRAUP3.1HXD3.2晰而P3.3/1MTP3.4/T0P3.5fT1P3.mRP3.7/RD图2.6 AT24C02接线图第三章软件设计3.1 系统主程序先对显示单元和定时器/计数器初始化,然后重复调用数码管显示模块和按键处理模块,检测矩阵按键值,贝U转入相应的功能程序。主程序流程图如图3.1所示。图 3.1 主程序流程图图3.2数码管显示流程图3.2 数码管显示程序本设计有4个数码管,从右到左为时、分、秒。在本系统中数码管显示采用动态显示。 在系统中从P1端口控制
18、数码管的段选,输入数码管数组对数码管进行显示。同时用 P2端 口的P2A4P2A7对4位数码管实现位选。由于本次课设要求时钟和秒表的功能,因为我 分别写了两个数码管显示函数,两个功能显示的格式进行了更改。数码管显示程序流程图 如图3.2所示。3.3 矩阵键盘功能程序本次设计的16个矩阵按键共用到了 12个按键,每个按键都有相应的功能。K1键为时 钟启动键,按下K1键后数码管显示时钟。此时按下 K3键以后进行时钟调整,按一下进行 分钟调整,按两下进行小时调整。接着按 K5键数值加一,按K6键数值减一。每次调整分 钟或小时之后都要按K1键进行确定之后才能重新按K3键进行调整。按下K7键启动秒表,
19、接着按下K8键,秒表暂停,但此时秒表还在走动,只是显示按键时秒表的当前值。在秒 表走动过程中,按下K9键则存储当前按下值,每按一下,存储一个值,按下K10键后则回显秒表之前存储的值,每按一下,回显一个时间,循环显示。K11键为闹钟显示功能按键,K12为闹钟调整按键,按一下进行分钟调整,按两下进行小时调整。接着按 K5键数值加一,按K6键数值减一。每次调整分钟或小时之后都要按 K11键进行确定之后才能重新 按K12键进行调整。此外K2键为时钟暂停键,K4键为系统清零键。时钟模块、秒表模块 和闹钟模块对应的矩阵键盘功能程序流程图分别如图 3.3、图3.4、图3.5所示。N是否有按键按下YNYN3键
20、是否按下?Y按几下?一下两下时钟显示分钟调整小时调整N是否有按键按YNKTt?Y9键是否按下?YYNY10键是否下?秒表回显存储按下时秒表时 间秒表启动图3.3时钟模块矩阵键盘功能流程图图3.4秒表模块矩阵键盘功能流程图图3.5闹钟模块矩阵键盘功能流程图3.4 定时功能程序TO用于时钟定时,定时时间设为50ms定时时间到则中断,在中断服务程序中用一个计数器对50ms计数,计20次则对秒单元加一。秒单元加到 60则对分单元加一,同时秒 单元清0;分单元加到60则对时单元加一,同时分单元清 0;时单元加到24则对时单元 清0,标志一天时间计满。T1用于秒表定时,定时时间设为20ms定时时间到则中断
21、,在 中断服务程序中用一个计数器对 20ms计数,计5次则对秒表的100毫秒单元加一。100毫 秒单元加到10则对秒单元加一,同时100毫秒单元清0;秒单元加到1000则自动清0。时钟的秒显示为数码管第四位管子的 DP值闪烁,每次秒加一 DP就会闪烁一次。定时器T0 功能流程图如图3.4所示,定时器T1功能流程图如图3.5所示。图3.4定时器TO功能流程图图3.5定时器T1功能流程图第四章调试4.1 系统调试方法本次实验是采用的是硬件调试,由于有做好的电路板和硬件,所以调试起来比较方便。本次课题,通过在Keil软件里编写程序,通过对各个模块程序的单步或跟踪调试,使程 序逐渐趋于正确,最后统调程
22、序,并生成相应的*.hex文件,然后通过使用stc-isp-15xx-V6.80软件下载到单片机中,进行程序的运行和调试,观察显示结果,根据显示的结果和 课题的要求再修改程序,再运行查找错误,直到满足要求。4.2 调试结果时钟显示、秒表显示和闹钟显示的调试结果分别如图4.1、4.2、4.3所示图4.1时钟显示调试图图4.2秒表显示调试图图4.3闹钟显示调试图4.3 调试中遇到的问题及其解决方法在调试的过程我遇到了一些问题,当我在编写秒表瞬时存储和回显程序的时候,我定 义了两个数组,分别把瞬时秒表值存到数组里面然后再把它们一一读出来。在实际调试过 程中,当按下回显按键时并没有显示出一些存储值,经
23、过和同学的探讨才发现是用来读取 数组值的变量定义成了局部变量,将其改正成全局变量以后就可以显示出一部分的值,但 也没有全部的显示。在检查程序过程中发现了用于秒表回显的一些判断条件以及一些变量 的赋值有的错误,经过老师的提醒和同学的帮助最终把存储的秒表值都能够会显出来了。第五章 总结通过本次课程设计, 将许多在之前在课本上学习过或者了解过的知识真正的运用到实 践中。本次课题为时钟跑表,因为之前自己在课余的时候学习过一些关于时钟的程序并且 自己也在开发板上做过一些时钟的程序, 所以关于时钟和秒表的计时相应程序的编写就轻 松许多。所以本次课设主要就是在时钟和闹钟调整以及秒表的回显和用24C02存储闹
24、钟时间花了大量的时间来编写相应的程序。通过看书和查阅有关资料慢慢就有了一些思路,然 后就根据自己的设想以及对矩阵键盘的各个按键定义的功能一点点编程。 每次编写完相应 的程序,都会先下载到开发板中进行调试。每个模块程序的编写都不是一帆风顺,在调试 过程中都会遇到这样或者那样的问题。发现问题就要学会解决,所以本次课设也充分锻炼 了我的独立思考的能力以及解决问题的能力。遇到问题主要就是检查程序,一步步的运行 和调试,通过问同学和请教老师使得问题在多次试验后都能够轻松的解决。本次实验还让 我更加熟练的掌握和学会了 Proteus 的使用技巧和方法知道了怎样将 Proteus 与 Keil 连 接进行单
25、步调试。通过对新加的功能(闹钟时间的存储)让我懂得了AT24C02的原理和使用方法,了解了一些单片机I/O模拟I2C总线扩展AT24C02连接电路和原理,通过和同学 讨论和请教老师最后成功的完成了相应程序的编写,以及调试出理想的功能效果。在这里 感谢林国汉老师对本次课设的悉心指导,使我的课设能够成功的完成。附录附录A电路仿真原理图0cc-rrcGi CliW 1 I K<i=l* rJ T r 7KTU4K0=-*i -jOTlfK5«=-*I 111 .!.1 2UMIJe芝懈 zr PWUR;j.1-RMdffjSEL 旳 A押FU3C 口rnv-p 応曲 mPL3MJPC
26、Lmji町肿MXrr-Tcmr氐述w&irnL'i.iPpujIF1 sirt-.-Eq附录B程序清单#include"reg52.h" #include"intrins.h" #ifndef _I2C_H_ #define _I2C_H_ #define uint unsigned int #define uchar unsigned char uint xdata resultm100; uint xdata resultf100; uchar code duanxuan= 0xc0,0xf9,0xa4,0xb0,0x99 ,0x92
27、,0x82,0xf8,0x80,0x90,0x7f,0x83,0 xc6,0xa1,0x86,0x8e ,0xff;/ 共阳极 0f 数码管编码 uchar code duanxuan1= 0xc0-0x80,0xf9-0x80,0xa 4-0x80,0xb0-0x80,0x99-0x80,0x92-0x80, 0x82-0x80,0xf8-0x80,0x80-0x80,0x90-0x 80,0x7f-0x80,0x83-0x80,0xc6-0x80,0xa1 -0x80,0x86-0x80,0x8e-0x80 ,0xff-0x80Juchar code weixuan=0xe0,0xd0,0
28、xb0,0x70;uchar flag3; uchar temp,timer0_shi,timer0_fen,timer0_mia o;uchar timer1_fm,nao1,nao2,nao3,nao4; uint timer1_zm;uchar timer1_bw, timer1_sw, timer1_gw; uchar c,z,k;sbit beep =P3A7 ; sbit scl=P3A4; sbit sda=P3A5; uint t0=0,t1=0;/- 定义使用的 IO 口-/sbit I2C_SCL = P3A4; sbit I2C_SDA = P3A5; void I2C_
29、Delay10us(); void I2C_Start(); void I2C_Stop();uchar I2C_SendByte(uchar dat, ucharack);uchar I2C_ReadByte();void At24c02Write(unsigned char addr,unsigned char dat); unsigned char At24c02Read(unsignedchar addr);#endif void init(void)TMOD=0x11;TCON=0x01;TH0=0x3c; / 定时 50msTL0=0x0b0;TH1=0xb1;/ 定时 20msT
30、L1=0xe0;EA=1;EX0=1;ET0=1;ET1=1;void delay(uint x) /12Mhz 延时 xmsuint i,j;for(i=x;i>0;i-)for(j=20;j>0;j-); void smg_display(uchar dx,uchar wx)/ 数码管位选P0=duanxuandx;P2=weixuanwx-1;delay(1);void smg_display1(uchar dx,uchar wx)/ 数码管位选P0=duanxuan1dx;P2=weixuanwx-1;delay(1);uchar keyscan()uchar temp_k
31、eyvalue,temp1_keyvalue;P1=0xf0;delay(1);temp_keyvalue=P1;if(temp_keyvalue!=0xf0) delay(2);temp_keyvalue=P1; if(temp_keyvalue!=0xf0)temp1_keyvalue=temp_keyvalue&0xf0;P1=0x0f;delay(2);temp_keyvalue=P1;temp1_keyvalue=temp1_keyvalue|temp _keyvalue;while(temp_keyvalue!=0x0f)P1=0x0f;temp_keyvalue=P1;r
32、eturn temp1_keyvalue;void naozhong(uchar s,uchar f) if(s=timer0_shi&&f=timer0_fen)if(timer0_miao<=20)beep=0;if(timer0_miao>20)beep=1;void disposal(void) uchar hour,second,timer1_ffm;ucharzt_bw,zt_sw,zt_gw,zt_fm;uchar nao_fen,nao_shi; uchar nao_gsw,nao_ggw,nao_dsw,nao_dgw;uchar key_prog
33、ress,timer0_gsw,timer0_ggw,fl ag1,flag2;uchartimer0_dsw,timer0_dgw,s1,s2,f1,f2; key_progress=keyscan();switch(key_progress) case 0xbe:/ 时钟暂停TR0=0;timer0_gsw=timer0_shi/10;timer0_ggw=timer0_shi%10;timer0_dsw=timer0_fen/10;timer0_dgw=timer0_fen%10;smg_display(timer0_gsw,1);smg_display1(timer0_ggw,2);s
34、mg_display(timer0_dsw,3);smg_display(timer0_dgw,4); break;case 0xee: / 清零 TR0=0;TR1=0;timer1_zm=0;timer1_fm=0;timer0_shi=0;timer0_fen=0;timer0_dgw=timer0_fen%10;timer0_gsw=timer0_shi/10;timer0_ggw=timer0_shi%10;timer0_dsw=timer0_fen/10;timer0_dgw=timer0_fen%10;smg_display(timer0_gsw,1);smg_display1(
35、timer0_ggw,2);smg_display(timer0_dsw,3);smg_display(timer0_dgw,4); break;case 0x7e:/ 时钟启动 keyscan();temp=P1;nao1=At24c02Read(1);nao1=At24c02Read(1);nao2=At24c02Read(2);nao2=At24c02Read(2);while(temp =0xf0) TR0=1;flag3=1;timer0_gsw=timer0_shi/10;timer0_ggw=timer0_shi%10;timer0_dsw=timer0_fen/10;timer
36、0_dgw=timer0_fen%10;smg_display(timer0_gsw,1);delay(30);smg_display1(timer0_ggw,2);delay(30);smg_display(timer0_dsw,3);delay(30);smg_display(timer0_dgw,4);delay(30);if(nao1|nao2)!=0)naozhong(nao2,nao1);temp=P1;break;case 0xde: / 时钟调整 keyscan();flag3=0;temp=P1;flag2=0;flag1+;if(flag1>2)flag1=2;whi
37、le(temp =0xf0)s1=timer0_gsw; s2=timer0_ggw; f1=timer0_dsw; f2=timer0_dgw;hour=s2+s1*10; second=f2+f1*10; smg_display(s1,1);delay(50);smg_display1(s2,2);delay(50); smg_display(f1,3);delay(50); smg_display(f2,4);delay(50);temp=P1;break;case 0x7d: / 加时钟 flag3=0;if(flag1=1|flag2=1)second+;if(flag1=2|fla
38、g2=2) hour+;if(hour>=24)hour=0;if(second>=60)second=0;keyscan();temp=P1;while(temp =0xf0) s1=hour/10;s2=hour%10;f1=second/10;f2=second%10;smg_display(s1,1);delay(50); smg_display(s2,2);delay(50); smg_display(f1,3); delay(50); smg_display(f2,4);delay(50); nao1=f2+f1*10;nao2=s2+s1*10; temp=P1;if
39、(keyscan()=0x7e) timer0_fen=f2+f1*10; timer0_shi=s2+s1*10; flag1=0;flag2=0; if(keyscan()=0xdb)nao_fen=f2+f1*10; nao_shi=s2+s1*10;nao4=nao_dgw+nao_dsw*10; smg_display(nao_gsw,1); delay(50);smg_display1(nao_ggw,2);delay(50);smg_display(nao_dsw,3);delay(50);smg_display(nao_dgw,4);delay(50);temp=P1;brea
40、k;flag1=0;flag2=0;break;case 0xbd: / 减时钟 flag3=0;if(flag1=2|flag2=2)if(hour<=0)hour=24;hour-; if(flag1=1|flag2=1)if(second<=0)second=60;second-;keyscan();temp=P1;while(temp =0xf0) s1=hour/10;s2=hour%10;f1=second/10;f2=second%10; smg_display(s1,1); delay(50); smg_display(s2,2);delay(50);smg_dis
41、play(f1,3);delay(50);smg_display(f2,4);delay(50);temp=P1;nao1=f2+f1*10;nao2=s2+s1*10; if(keyscan()=0x7e) timer0_fen=f2+f1*10;timer0_shi=s2+s1*10;flag1=0;flag2=0;if(keyscan()=0xdb)nao_fen=f2+f1*10; nao_shi=s2+s1*10; flag1=0;flag2=0;break;case 0xeb:/ 闹钟调整 keyscan(); flag3=0;temp=P1;flag2+; flag1=0; if
42、(flag2>2) flag2=2;while(temp =0xf0)nao_gsw=nao2/10; nao_ggw=nao2%10;if(flag2=1)nao_dsw=nao1/10; nao_dgw=nao1%10;case 0xdb:/ 闹钟确定 flag3=0;keyscan();temp=P1;while(temp =0xf0)nao_ggw=nao2%10; nao_dsw=nao1/10; nao_dgw=nao1%10; nao3=nao_ggw+nao_gsw*1 nao4=nao_dgw+nao_dsw*10;smg_display(nao_gsw,1); del
43、ay(20);smg_display1(nao_ggw,2);delay(20);smg_display(nao_dsw,3);delay(20);smg_display(nao_dgw,4);delay(20);temp=P1;At24c02Write(1,nao1);At24c02Write(1,nao1);At24c02Write(2,nao2);At24c02Write(2,nao2);break;case 0xdd:/ 跑表启动 keyscan();flag3=0;temp=P1;while(temp =0xf0)TR1=1;timer1_bw=timer1_zm/100;timer
44、1_sw=(timer1_zm/10)%10;timer1_gw=timer1_zm%100%10; timer1_ffm=timer1_fm; smg_display(timer1_bw,1); delay(10);smg_display(timer1_sw,2); delay(10);smg_display1(timer1_gw,3);delay(10);smg_display(timer1_fm,4);delay(10);temp=P1;keyscan();if(keyscan()=0xed)zt_bw=timer1_bw;zt_sw=timer1_sw;zt_gw=timer1_gw;
45、zt_fm=timer1_fm;break;case 0xed:/ 跑表暂停flag3=0;smg_display(zt_bw,1); delay(20);smg_display(zt_sw,2);delay(20);smg_display1(zt_gw,3);delay(20);smg_display(zt_fm,4);delay(20);break;case 0x7b:/ 跑表计次数 k+;c=k;z=k; flag3=0; keyscan();temp=P1;resultfk-1=timer1_fm;resultmk-1=timer1_bw*100+timer1_sw*10+timer1
46、_gw;while(temp =0xf0)TR1=1;timer1_bw=timer1_zm/100;timer1_sw=(timer1_zm/10)%10;timer1_gw=timer1_zm%100%10;timer1_ffm=timer1_fm;smg_display(timer1_bw,1);delay(5);smg_display(timer1_sw,2); delay(5);smg_display1(timer1_gw,3);delay(5); smg_display(timer1_fm,4); delay(5);temp=P1;keyscan();if(keyscan()=0x
47、ed)zt_bw=timer1_bw; zt_sw=timer1_sw; zt_gw=timer1_gw; zt_fm=timer1_fm;keyscan();if(keyscan()=0xbb)k=0;break;case 0xbb:/ 跑表回显 flag3=0;k=0;c-;timer1_ffm=resultfc;timer1_bw=resultmc/100;timer1_sw=(resultmc/10)%10;timer1_gw=resultmc%100%10;keyscan();temp=P1;while(temp =0xf0)if(c=0)c=z;smg_display(timer1
48、_bw,1); delay(30);smg_display(timer1_sw,2); delay(30);smg_display1(timer1_gw,3);delay(30);smg_display(timer1_ffm,4);delay(30); temp=P1; break;void main()init();while(1) keyscan();disposal();void timer0() interrupt 1TH0=0x3c;TL0=0x0b0;t0+;if(t0=20)t0=0; timer0_miao+; if(flag3=1) smg_display(10,4);del
49、ay(25); if(timer0_miao=60) timer0_miao=0; timer0_fen+; if(timer0_fen=60) timer0_fen=0; timer0_shi+; if(timer0_shi=24)timer0_shi=0;void timer1() interrupt 3TH1=0xb1;/ 定时 20msTL1=0xe0;t1+;if(t1=5)t1=0;timer1_fm+;if(timer1_fm=10) timer1_fm=0; timer1_zm+;if(timer1_zm>=1000) timer1_zm=0;void I2C_Delay10us()uchar a, b;for(b=1; b>0; b-)for(a=2; a>0; a-);void I2C_Start()I2C_S
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2026学年统编版三年级语文上册期末复习《课文内容与积累运用》专项突破卷
- 莆田二中历史考试题目及答案
- 光伏内部培训课件内容
- 值周学生安全培训美篇课件
- 侵权索赔培训课件
- 企鹅课件介绍大全
- 腹泻病题库及答案
- 深度解析(2026)《GBT 34068-2017物联网总体技术 智能传感器接口规范》
- 2026年本溪市教育系统冬季“名校优生”引进急需紧缺人才备考题库及参考答案详解1套
- 深度解析(2026)《GBT 33968-2017改善焊接性能热轧型钢》(2026年)深度解析
- 施工方案与安全保障措施
- 工程维保及售后服务方案
- 医院科室主任的工作总结
- 附表:医疗美容主诊医师申请表
- GB/Z 20833.5-2023旋转电机绕组绝缘第5部分:重复冲击电压下局部放电起始电压的离线测量
- 毕节市织金县化起镇污水处理工程环评报告
- 黑布林英语阅读初一年级16《柳林风声》译文和答案
- 河流动力学-同济大学中国大学mooc课后章节答案期末考试题库2023年
- 一年级上册美术测试题
- 常用兽药配伍禁忌一览表
- 2023年一级建造师机电工程管理与实务考试笔记
评论
0/150
提交评论