电子系统课程设计.doc_第1页
电子系统课程设计.doc_第2页
电子系统课程设计.doc_第3页
电子系统课程设计.doc_第4页
电子系统课程设计.doc_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

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

文档简介

物理机物理机电电学院学院课课程程设计报设计报告告 课程名称:电子系统课程设计 专业班级: 电子信息工程 2 班 学生姓名: 学 号: 指导教师: 王清辉、何文丰 完成时间: 2013 年 6 月 25 日 报告成绩: 评阅意见: 评阅教师 日期 电子系统设计 第第 1 1 章章 设计任务设计任务与与要求要求 1 1.1 软件任务1 1.2 硬件任务.1 第第 2 2 章章 方案的设计方案的设计与与论证论证 2 2.1 单片机型号的选择 .2 2.2 按键的选择 .2 2.3 显示器的选择 .2 2.4 计时部分的选择 .3 2.5 发音部分的设计 .3 2.6 显示器驱动电路 .3 2.7 电源的选择.3 2.8 函数信号发生器3 第第 3 3 章章 硬件电路设计硬件电路设计 5 3.1 设计原理 .5 3.2 AT89C51 单片机简介6 3.3 键盘电路的设计 .7 3.4 段码驱动电路 .7 3.5 蜂鸣器驱动电路 .7 3.6 函数信号发生器数模转换器8 3.7 函数信号发生器键盘接口电路8 3.8 电子系统电路总原理图 .9 3.9 电子系统 PCB 图 10 第第 4 4 章章 软件设计软件设计 11 4.1 主程序部分的设计 .11 4.2 系统初始化显示功能 12 4.3 密码显示界面与密码输入 12 4.4 功能选择界面 12 4.5 键盘扫描函数 12 4.6 时间和闹钟的设置 12 4.7 秒表设置 13 4.8 函数信号发生器流程图 15 第第 5 5 章章 仿真过程与仿真仿真过程与仿真结结果果 16 第第 6 6 章章 安装与调试安装与调试 20 结论与心得结论与心得 22 参考文献参考文献 23 附附 录录 24 1 一、设计任务与要求 1.1 软件任务 设计任务 1: 增加系统初始化显示功能 LED 显示部分每 1 秒钟点亮 1 段 LED,依次 8 秒后全亮 LCD 显示部分控制 10 秒倒计时 设计任务 2: 增加密码功能,要求正确输入密码才能进入系统 设计任务 3: 进入系统后有相应的功能模块选择:F1,F2,F2 等进入 设计任务 4: 具有串行通讯功能,能够通过串口与 PC 机通讯,每 1 秒钟可以将本选定功能相关的 数据上传。 1.2 硬件任务 函数信号发生器 目标:掌握如何设计函数信号发生器 要求:设计的函数信号发生器最起码能够产生三角波和正弦波且频率可调,幅值小于 5V。通过按键可以选择产生三角波还是正弦波。 2 二、方案设计与论证 本设计应解决的主要问题有两大方面,即硬件电路设计和软件设计两大方面。其中 硬件电路部分又可分为四个模块:键盘模块、显示模块、计时模块和发声模块。硬件电 路部分致力于低成本、低功耗和易实现性。软件部分则应做到代码的精简、准确、易读 懂。 2.1 单片机型号的选择 通过对多种单片机性能的分析,最终认为 AT89C51 是最理想的电子时钟开发芯片。 AT89C51 是一种带 4K 字节闪烁可编程可擦除只读存储器的低电压,高性能 CMOS8 位微处 理器,器件采用 ATMEL 高密度非易失存储器制造技术制造,与工业标准的 MCS-51 指令集 和输出管脚相兼容。由于将多功能 8 位 CPU 和闪烁存储器组合在单个芯片中,ATMEL 的 AT89C51 是一种高效微控制器,而且它与 MCS-51 兼容,且具有 4K 字节可编程序存储器和 1000 次擦写循环,数据保留时间为 10 年,是最好的选择。 2.2 按键的选择 方案一:44 矩阵式键盘。如果选择此方案,那么在修改时钟或设置闹铃时间时就 可以直接从键盘输入,方便、快捷,但程序较为复杂。 方案二:独立式按键。如果设置过多按键,将会占用较多 I/O 口,而且会给布线带 来不便,因此,此方案适用于按键较少的情况。如果选择此方案,由于按键较少,在修 改时间或设置闹铃时间时就不能直接输入,只能通过加或减完成,稍为麻烦一些,但其 程序简单。 由于并不需要经常修改时间和设置闹铃时间,而且方案二的程序简单,按键少、成 本低,因此,选择方案二。 2.3 显示器的选择 方案一:液晶显示器。如果选择此方案,将会降低系统的功耗,这样就可以用电池 供电,便于携带。但液晶显示器的驱动电路复杂,使用起来有一定的难度。 方案二:用数码管作为显示器。数码管的驱动电路简单,使用方便,如果选择了此方 案,那么在夜间看时间的时候就不需要有光源,非常方便。其缺点是功耗较大。 3 由于数码管使用起来较为方便,在夜间看时间也很方便,因此我选择了方案二。 2.4 计时部分的选择 如果使用时钟芯片,系统就不怕掉电且时间精确。但这种芯片比较贵,况且,设计 本系统主要是为了学习单片机程序的编写和调试以及设计硬件电路的一些方法,因此采 用软件的方法来计时而没有采用价格较高的时钟芯片。 2.5 发音部分的设计 通过三极管放大后驱动蜂鸣器工作,再通过软件这时产生等时时间方波驱动蜂鸣器 发出间断嘀声,这样就可以省去硬件振荡电路,降低成本。 2.6 显示器驱动电路 由于通过数码管公共及的电流较大且避免过多地使用分立元件,采用了一片 74HC573 来驱动段码,用 P3 口作位码驱动。 2.7 电源的选择 如果是用电池供电,就比较方便携带,但是本系统,采用了数码管作为显示器,功 耗较大,需要经常更换电池。况且,本系统的体积较大,即使使用电池供电也不能随身 携带,因此,用电池供电不大合适,所以用 5V 外部稳压电源来供电。 2.8 函数信号发生器 方案一:采用模拟分立元件或单片函数发生器就可以产生正弦波、方波、三角波, 方法简单。通过调整外部元件也可以实现输出频率的改变,但采用模拟元器件造成元件 分散性太大,从而产生的频率稳定性较差、抗干扰能力低、灵活性较差、而且精度低, 不能实现任意波形转换和波形运算输出等方面自主控制功能。 方案二:采用专业的锁相式频率合成方案,这种锁相式频率合成是一种高稳定度和 高精确度的大量离散技术,他能够准确的产生波形,可以很好的解决频率稳定精确的情 况下又要求频率在较大的范围内可调的问题。但是频率受 VCO 可变频率范围上的影响, 高低频率比无法做到很高,还有其只能产生正弦波或方波,不能满足产生三角波的要求。 方案三:采用 AT89C51 单片机和数模转换器 DAC0832 实现波形的产生。波形的产生 4 方法是用 AT89C51 单片机执行波形程序,向 DAC0832 转换器的输入端输入相应的数据, 从而在 DA 转换电路输出端再通过运放电路转换得到相应的电压波形。在 AT89C51 的 P1 口接按键控制波形的种类和波形的频率,每种波形对应一种按键方式。此方案原理简单, 同时适合操作,实现起来也相对较容易。 经比较,方案三的设计能够更好的实现和完成题目的要求,产生的三种波形和频率 可由按键控制,并通过按键改变来转换不同的波形,也能够在示波器上显示出所要求的 波形。波形的频率步进也可以实现调节,具有线路简单、可行性高、符合设计要求等优 点。在本设计的基础上,加上 LCD 显示,从而能够在 LCD 上显示出频率值、幅度值信息。 输出的波形也较稳定,精度较高,通过滤波电路使得系统的抗干扰性增强,电路简单, 性价比高。综上所述,我们选择了第三种 5 三、硬件电路设计 3.1 设计原理 系统原理图: 函数信号发生器: 图 3-1 系统原理图 键盘 输入 时钟 复位 单片机 89C51 LCD 显 示 DA 转换 放大 电路 波形 显示 6 1 2 3 4 P1 Header 4 1K R1 Res2 1K R2 Res2 1K R3 Res2 1K R4 Res2 VCC K1 AN K2 AN K3 AN K4 AN 3.2AT89C51 单片机简介 AT89C51 是一款单片封装的微控制器,适合于许多要求高集成度、低成本 的场合。可以满足多方面的性能要求。AT89C51 采用了高性能的处理器结构, 指令执行时间只需 2 到 4 个时钟周期。6 倍于标准 51 单片机器件。AT89C51 集 成了许多系统级的功能,这样可大大减少元件的数目和电路板面积并降低系统 的成本。AT89C51 单片机内部主要有以下部件:8031CPU、振荡电路、总线控制 部件、中断控制部件、片内 Flash 存储器、并行 I/O 接口、定时器和串行 I/O 接口。 图 3-2 AT89C51 单片机 3.3 键盘电路的设计 键盘采用 4 个独立按键配以 4 个上拉电阻实现对时钟和闹钟的设定及修改。 7 LS1 Speaker VCC 1 2 P4 Header 2 Q1 2N3906 图 3-3 键盘输入电路 3.4 段码驱动电路 由于通过数码管公共及的电流较大且避免过多地使用分立元件,采用了一 片 74HC573 来驱动段码,用 P0 口作位码驱动。 图 3-4 段码驱动器 74HC573 3.5 蜂鸣器驱动电路 发音部分是通过三极管放大驱动蜂鸣器工作,再通过软件这时产生等时时 间方波驱动蜂鸣器发出间断嘀声,这样就可以省去硬件振荡电路,降低成本。 图 3-5 蜂鸣器驱动电路 8 3.6 函数信号发生器数模转换器 由于单片机输出的是数字信号,因为要得到模拟信号的波形就必须对其进 行数模换。我们采用了 DAC0832 数模转换器,该芯片由 8 位输入锁存器、8 位 DAC 寄存器、8 位 D/A 转换器及转换控制电路四部分构成。由于其输出为电 流输出,因为外加运算放大器 OP07 使之装换为电压输出。最后通过示波器显 示输出的波形。 图 3-6 D/A 转换电路 3.7 函数信号发生器键盘接口电路 常用的键盘电路一般为矩阵式,但是对于此设计,为了方便程序的简单化, 我们采用了一般的键盘接口输出信号。具体实现方法:P2.1 用来作为波形选择, 其输出正弦波、三角波、方波。P2.3、P2.4 用来作为频率调节; 图 3-7 键盘接口电路 9 3.8 电子系统电路总原理图 图 3-8 电路总原理图 10 3.9 电子系统 PCB 图 图 3-7 PCB 图 11 开始 始 数码管段码检测 密码输入界面 密码判断 正确 错误 功能选择界面 按键选择 时钟功能待定秒表功能 F2F3F1 按键扫描是否返 回功能选择界面 否是 四、软件设计 4.1 主程序部分的设计 程序部分主要采用了程序结构的模块化设计,避免了一些函数的不必要的 重复书写,使程序变得单间易懂。程序在执行时,主程序要须通过调用子函数 就可完成相应的功能 。主程序流程图如下图 4-1。 12 图 4-1 主程序流程图 4.2 系统初始化显示功能 LED 显示部分每 1 秒钟点亮 1 段 LED,依次 8 秒后全亮 使用定时器延时,8 个数码管同时点亮,定时器每延时一秒点亮一段 LED, 依次 8 秒后全亮。 4.3 密码显示界面与密码输入 系统初始化显示之后就进入密码显示界面,界面显示为 P - - - -。通过按键 S1 选择当 前要输入的密码,通过按键 S2、S3 进行对值的加减,通过 S4 进行确认操作。 密码输入完成之后会显示 F,覆盖之前输入的数值,对密码进行保护。 密码输入正确显示- - -ON- - -,然后进入功能选择界面 密码输入错误显示- - - - - - - -,回到密码输入界面,继续输入密码。 4.4 功能选择界面 功能界面显示为 F1-F2-F3,可以设置三个功能,目前只设置了 F1、F2 两个功能,F3 为 待定功能。在功能界面仍然是 S1 进行选择,S4 进行确认操作。 4.5 键盘扫描函数 这些函数主要是判断是否有按键按下,并根据相应按键按下的情况调用相 关函数执行。 4.6 时间和闹钟的设置 此部分主要是通过判断 cnt 在不同值时通过调用加 1、减 1 子函数对时间 和闹钟的时、分、秒进行设置。在闹钟设置时,判断按键 S4 按下情况我,进行 闹钟的开启与关闭,相关流程图如下图 4-7。 13 图 4-2 时间/闹钟设置流程图 14 4.7 秒表的设置 本实验利用单片机的定时器/计数器定时和记数的原理,通过采用 proteus 仿真软件来模拟实现。模拟利用 AT89C51 单片机、LED 数码管以及控件来控制 秒表的计数以及计数的开启/暂停/继续与复位! 是否 是 否 定时器溢出中断 对定时器重新赋值 进行加一操作后重新计算时间 往 P0 口和 P2 口送显示时间 数码管显示 中断返回主函数 对定时器/计 数器初始化 始化 程序开始 判断 P04 口是 否有低电平信 号 开中断并 启动定时器 开始、暂停或 者继续 计数置零 判断 P10 口是否有 低电平信号 图 4-3 秒表设置流程图 15 4.8 函数信号发生器 图 4-4 函数信号发生器流程图 开始 显示 初始化系统 按键是否按下 计算相关函数 定时中断送端口显示 查询选择波型 波形输出 LCD 显示 16 五、仿真过程与仿真结果 此电子系统设计是利用 Proteus 仿真软件进行仿真,基本上实现了课程设 计要求实现的功能。 硬件部分设置了的三个按键 S1、S2、S3、S4。 图 5-1 系统初始化显示 8 段全亮 图 5-2 密码输入界面 17 输入密码时显示 P- - - -,输入完成之后显示 P F F F。 图 5-3 功能选择界面 图 5-4 电子时钟界面 当按键 S1 第一次按下时,停止计时进入闹钟 1 的秒设置,当按键 S1 第二、 第三次按下时,分别进入闹钟 1 的分设置和时设置,当按 S1 第四 、第五、第 18 六次按下时分别进入闹钟 2 的秒、分、时设置,当按 S1 第七 、第八、第九次 按下时分别进入闹钟 3 的秒、分、时设置,当按 S1 第十 、第二一、第十二次 按下时分别进入时间的秒、分、时设置,在 S1 按下的各阶段,可用按键 S2、S3 进行时间和闹铃时间的时、分、秒进行加减设置;当按键 S1 第十三次 按下时恢复到时间显示功能。当显示的时间和定时设置的时间一致时,蜂鸣器 发出等时间断蜂鸣声,闹铃时间设置为 60 秒。在各个闹钟设置阶段,如果有 S4 按下,则相应闹钟功能关闭或开启;如在闹铃时有 S4 按下则提前停止闹铃。 图 5-5 秒表界面 S1 按清零,S2 开始和暂停,可以长达 9 分钟的计时。 19 图 5-6 函数信号发生器仿真图 正弦波 三角波 产生三角波的原理:三角波产生是通过 P0 口将 00H 送入寄存器 A 中, DAC0832 输出 A 中的内容,通过 A 中数值的加 1 递升,同时延时,当 A 中的内 容为 0FF 时,A 中的内容减 1 递减,从而循环产生三角波。 方波 产生方波的原理:方波产生是通过 P0 口将 00H 输出给 DAC0808,输出对应 模拟量,然后读取 P2 口的状态,取反后作为延时常量,延时时间到,将 FFH 输 出时,同样输出对应模拟量,再延时,从而得到方波。 20 六、安装与调试 首先制作电路板:在 PROTEL DXP 软件上画出实训原理图,接着导入制作 PCB 电路板,最后经打印、热转印、腐蚀、打孔,最后做出电路板。 1、步骤如下: 第一步:利用一个能生成图像的软件生成一些图像文件,这里使用版本为 Altium2004 组织 SCH 文件,再利用网络表生成相应 PCB 图(可自动布线,也可 手工布线),接着画 PCB 图,以备打印; 第二步:将 PCB 图打印到热转印纸上; 第三步:将打印好 PCB 的转印纸平铺在覆铜板上,准备转印; 第四步:用热应机加温将转印纸上黑色油墨粉压在覆铜板上形成高精度的 抗腐; 第五步:热应机加温加压成功转印后的效果; 第六步:准备好三氯化铁溶液进行腐蚀; 第七步:腐蚀结束,清洗干净,晾干之后进行打孔。 第八步:将焊盘铣刀装到台钻上,清理出焊盘部分,剩下的部分用于阻焊; 第九步:安装所需预定原件并焊接好。 2、硬件调试 拿到电路板后,首先要检查加工质量,在确保没任何质量问题时再安装元 器件。元器件在安装前要足逐一检查,用万用表测其数值,看是否与所需相同, 完成焊接后应先空载上电(芯片座不插芯片) ,并检查各引脚的电位是否正确。 若一切正常,方可在断电的情况下将芯片插入,再次检查各引脚的电位及其逻 辑关系。将万用表的探针放到单片机接电源的引脚上检测一下,看是否符合要 21 求。 在调试时我遇到了一个问题:用 STC 下载器无法将程序下载到单片机中, 经检查,是 COM 端口和波特率选的不正确,应更改 STC 下载器的 COM 端口使之 与电脑的 COM 端口相对应,波特率改为 9600115200 即可下载成功。 时间显示界面 图 6-1 时钟运行图 闹钟设置界面 22 图 6-2 闹钟设置图 七、结论与心得 做了一周的课程设计,有很多的心得体会,有关于单片机的,也有关 于模电数电等基础科目的。 因为单片机已经很久没复习,刚拿到题目,不知道从哪入手,后来通 过对书本的回顾,加深了对单片机的记忆。有些知识会迁移和联系模电数 电。课堂教学考虑到大多数同学的需求,主要强调“基本”基本知识、 基本理论、基本方法、基本技能。而这次设计正是为我们提供了一个深入 学习、探索的机会,成为课堂教学的有益补充。我们正面临就业问题,这 次课设给了我们一个机会去试验。 单片机理论的学习是为课程的设计作准备的,但有时学习的理论也解 决不了实践中的问题。实践中获得的知识能让我对单片机的知识有更好的 认识和理解。虽然这次的课程设计我参考了一些文献资料,没有做到创新, 但在对程序的读写过程中我明白了许多。这次课程设计的最大收获是只有 把理论用到实践中我们才能真正掌握好所学知识。 23 八、参考文献 1李全利、 迟荣强,单片机原理及接口技术M,北京:高等教育出版社,2004 2凌玉华,单片机原理及应用系统设计M,长沙:中南大学出版社,2006 3张道德,单片机接口技术(C51 版)M,北京:中国水利水电出版社,2007 4 王幸之、钟爱琴、王雷、王闪,AT89 系列单片机原理与接口技术M,北京:北 京航空航天大学出版社,2004 5何立明,单片机应用系统设计M,北京:北京航空航天大学出版社,1990 6陈光东,单片机微型计算机原理与接口技术M,武汉:华中理工大学出版社, 1998 24 附 录 1 /* *头文件 * * #include #include /* *宏定义 * * #define uchar unsigned char #define uint unsigned int /* *位声明 * * sbit key1=P10; sbit key2=P11; sbit key3=P12; sbit key4=P13; sbit fmq=P21; /* 数码管显示的数值 * uchar code table=0xc0,0xf9,0xa4, 0xb0,0x99,0x92, / 0 1 2 3 4 5 0x82,0xf8,0x80,0x90,0x bf,0x0ff,0x73,0x71,0x80; / 6 7 8 9 - 灭 pf . table68=0x06,0x71,0x40,0 x5b,0x71,0x40, 0x4f,0x71; /1 F - 2 F - 3 F uchar table75=0x40,0x40,0x40,0 x40,0x73; / - - - P uchar table88=0x40,0x40,0x40,0 x37,0x3f,0x40,0x40,0x40; uchar code table10=0x01,0x03,0x07,0 x0f,0x1f,0x3f,0x7f; /* *函数声明 * * void jia(); void jian(); void jia1(); void jian1(); void shijian1(); void display5(); void displayxz(); void display6(); void key_scan1(); void shijian(); void display7(uchar,uchar,uchar); void keyscan4(); void miaobiao(); /*数组 定义,数组内含有 8 个数值 * uchar table18,table28,table3 8,table48; uchar password=1,2,1,2; uchar save8; uchar table58; /* *时间显示初始值 * uchar shi=12,fen=0,miao=0; /* *定义全局变量 * * uchar shi1,fen1,miao1,shi2,fen2,m iao2,shi3,fen3,miao3; uchar shi4,fen4,miao4; uchar flag, flag1, wss, cnt, cnt1, alm1, alm2, alm3; / 1 秒 等时 位闪 次数 校时 闹 1 闹 2 闹 3 uint flag2; / 蜂鸣 uchar conflag; uchar cnt2,s1,s2,s3,s4,cnt3; uchar n; uchar minute,second,second0_1,num 2; uchar t=0; uchar num=0; /*延时 函数,用于动态扫描数码管 * void delay(uchar i) uchar x,y; for(x=i;x0;x-) for(y=120;y0;y-); /* *初始化函数 * void init() TMOD|=0x01; /工 作方式 1 TH0=0x3c; /定 时时间为:50ms(65536- 50000)/256 TL0=0x0b0; /(65536-50000)%256 ET0=1; /打 开定时器 EA=1; /开 总中断 TR0=1; /启 动定时器 void UART_init(void) SCON = 0x50; TMOD|= 0x20; TH1 = 0xF3; TL1 = 0xF3; TR1 = 1; ES = 1; EA = 1; /*显示 子函数,用于显示时间数值 * void display() uchar i,j; if(cnt!=10|wss=0) table10=miao%10; /分离秒的个位与十位 table11=miao/10; else table10=table11=11; 25 if(cnt!=11|wss=0) table13=fen%10; /分离分的个位与十位 table14=fen/10; else table13=table14=11; if(cnt!=12|wss=0) table16=shi%10; /分离时的个位与十位 table17=shi/10; else table16=table17=11; table12=table15=10; j=0x7f; for(i=0;i=20) /判断是否到一秒 wss=wss; flag=0; /到了,则标 志位清零 if(cnt1!=0) miao4+; /秒加 1 if( miao459) /判断秒是否到 60s miao4=0; /到了,则清零 fen4+; /分加 1 if(fen459) /以下含义同上 fen4=0; shi4+; if(shi423) shi4=0; else miao+; /秒加 1 if( miao59) / 判断秒是否到 60s miao=0; /到了,则清零 fen+; /分加 1 if(fen59) / 以下含义同上 fen=0; shi+; if(shi23) shi=0; 26 /* *键盘扫描子函数 */ void key_scan() if(key1=0) while(!key1) /防止掉显 if(cnt=1|cnt=2|cnt=3) display1(); if(cnt=4|cnt=5|cnt=6) display2(); if(cnt=7|cnt=8|cnt=9) display3(); if(cnt=0|cnt=10|cnt=11 |cnt=12|cnt=13) display(); cnt+; /记下按 键 key1 按下的次数 if(cnt=10 fen4=fen; shi4=shi; cnt1+; if(cnt=13) cnt=0; if(cnt1=1) miao=miao4; fen=fen4; shi=shi4; cnt1=0; if(key2=0) /判断 key2 是否按下 while(!key2) /防止掉显 if(cnt=1|cnt=2|cnt=3) display1(); if(cnt=4|cnt=5|cnt=6) display2(); if(cnt=7|cnt=8|cnt=9) display3(); if(cnt=0|cnt=10|cnt=11 |cnt=12|cnt=13) display(); jia(); if(key3=0) /判断 key3 是否按下 while(!key3) /防止掉显 if(cnt=1|cnt=2|cnt=3) display1(); if(cnt=4|cnt=5|cnt=6) display2(); if(cnt=7|cnt=8|cnt=9) display3(); if(cnt=0|cnt=10|cnt=11 |cnt=12|cnt=13) display(); jian(); /调用减 1 子函数 if(key4=0) /判断 key4 是否按下 while(!key4) /防止掉 if(cnt=1|cnt=2|cnt=3) alm1=alm1; display1(); if(cnt=4|cnt=5|cnt=6) alm2=alm2; display2(); if(cnt=7|cnt=8|cnt=9) alm3=alm3; display3(); if(cnt=0|cnt=10|cn t=11|cnt=12|cnt=13) display(); while(key4) /跳回选择菜单 if(cnt3=1|cnt3=2|cnt3= 3) display6(); if(cnt3=0) displayxz(); shijian1(); key_scan1(); /* *加 1 子函数 * void jia() if(cnt=1) / 判断 key1 按下的次数是否为 1 miao1+; / 是,则秒加 1 if(miao159) / 判断秒是否大于 60,是,则秒 清零 miao1=0; if(cnt=2) / 以下含意同上 fen1+; if(fen159) fen1=0; if(cnt=3) shi1+; if(shi123) shi1=0; if(cnt=4) miao2+; if(miao259) miao2=0; if(cnt=5) fen2+; if(fen259) fen2=0; if(cnt=6) shi2+; if(shi223) shi2=0; if(cnt=7) miao3+; if(miao359) miao3=0; if(cnt=8) fen3+; if(fen359) fen3=0; if(cnt=9) shi3+; if(shi323) shi3=0; if(cnt=10) miao+; if(miao59) miao=0; cnt1+; if(cnt=11) fen+; if(fen59) fen=0; cnt1+; if(cnt=12) shi+; if(shi23) shi=0; cnt1+; /* *减 1 子函数 */ / void jian() if(cnt=1)/判 断 key1 按下的次数是否为 1, 是则秒减 1 miao1-; if(miao1=255) /判 27 断秒是否减到 255,是,则秒置 59 miao1=59; if(cnt=2)/以 下含意同上 fen1-; if(fen1=255) fen1=59; if(cnt=3) shi1-; if(shi1=255) shi1=23; if(cnt=4) miao2-; if(miao2=255) miao2=59; if(cnt=5) fen2-; if(fen2=255) fen2=59; if(cnt=6) shi2-; if(shi2=255) shi2=23; if(cnt=7) miao3-; if(miao3=255) miao3=59; if(cnt=8) fen3-; if(fen3=255) fen3=59; if(cnt=9) shi3-; if(shi3=255) shi3=23; if(cnt=10) miao-; if(miao=255) miao=59; cnt1+; if(cnt=11) fen-; if(fen=255) fen=59; cnt1+; if(cnt=12) shi-; if(shi=255) shi=23; cnt1+; /* *闹铃子函数 * / void clock() /判断秒的数值是否相等 if(miao=miao1 /是,则标志位,flag2 清零 while(!(flag2=1200) if(flag11) /等时 方波驱动蜂鸣器 fmq=fmq; flag1=0; shijian(); /调用时 间子函数 display(); /调用显 示子函数 fmq=1; /关闭蜂鸣器 /* *时钟函数 * */ void shizhong() init(); /调用初始化子函数 while(1) clock(); /闹钟子函数 if(cnt=1|cnt=2|cnt=3) /显示子函数 display1(); if(cnt=4|cnt=5|cnt =6) display2(); if(cnt=7|cnt=8|cnt =9) display3(); if(cnt=0|cnt=10|cn t=11|cnt=12|cnt=13) display(); shijian(); /调用时间子函数 key_scan(); /调用键盘扫描子函数 /* *功能 * void confirm() uchar i; save0=s1; save1=s2; save2=s3; save3=s4; for(i=0;i9) /判断 秒是否大于 60,是,则秒清零 s1=0; if(cnt2=2) / 以下含意同上 s2+; if(s29) s2=0; if(cnt2=3) s3+; if(s39) s3=0; if(cnt2=4) s4+; if(s49) s4=0; /* *减 1 子函数 */ / void jian1() if(cnt2=1) /判断 key1 按下的次数 是否为 1,是则秒减 1 s1-; if(s1=255)/判 断秒是否减到 255,是,则秒置 59 s1=9; if(cnt2=2) /以下含意同上 s2-; if(s2=255) s2=9; if(cnt2=3) s3-; if(s3=255) s3=9; if(cnt2=4) s4-; if(s4=255) s4=9; /* 时间子函数 * */ void shijian1() if(flag=20) /判断是否到一秒 wss=wss; flag=0; /到了,则标 志位清零 /* *秒表 * void display7(uchar minute,uchar second, uchar second0_1) P2=0x7f; /送位选数 据 P0=tablesecond0_1; / 送段选数据 delay(5); /延时 P2=0xbf; /送位选数据 P0=tablesecond%10; /送 段选数据 delay(5); P2=0xbf; /送位选数据 P0=table14; /送段选数 据 delay(5); P2=0xdf; /送位选数据 P0=tablesecond/10; /送 段选数据 delay(5); P2=0xef; P0=table10; /送段选数据 delay(5); /延时 P2=0xf7; /送位选数据 P0=tableminute; /送段 选数据 delay(5); P2=0xfb; /送位选数 据 P0=table0; /送段选数据 delay(5); /* * * void keyscan4() if(key1=0) /清零 delay(10); /延时去抖 if(key1=0) while(!key1) /等待按下 TR0=0; /定时 器 TR0 关闭 minute=0; second=0; second0_1=0; if(key2=0) /暂停和开始 delay(10); if(key2=0) while(!key2); TR0=TR0; /每次 按下,TR1 的状态时相反的 if(key4=0) while(!key4) while(key4) /进入选择 TR0=1; if(cnt3=1|cnt3=2|cnt3= 3) display6(); if(cnt3=0) displayxz(); shijian1(); key_scan1(); /*秒表 函数* void miaobiao() minute=0;second=0;second0_1 =0; TMOD=0x01; /设置 TO 定时器 TH0=(65536- 50000)/256; /装初值 11.05992M 晶振 50ms 数为 45872 TL0=(65536-45872)%256; EA=1; /开总中断 ET0=1; /开启定时器 T0 中断 30 while(1) /程序停在这里等待中断的发 生,这个大循环也是实现数据 显示的主体 keyscan4(); /直接把第二只数码管的小数 点烧出来 display7(minute,second,seco nd0_1); /* *秒表 * /* * void main() init(); leddisp(); init(); UART_init(); while(1) if(cnt2=1|cnt2=2|cnt2= 3|cnt2=4|cnt2=5) /密码输入 display5(); if(cnt2=0) display4(); shijian1(); key_scan2(); if(conflag!=0) /判断密码 if(conflag=1)/正 确 flag2=0; while(!(flag2=20) succeed(); while(1) /功能界面 if(cnt3=1|cnt3=2|cnt3= 3) display6(); if(cnt3=0) displayxz(); shijian1(); key_scan1(); if(conflag=2) /错 误 flag2=0; while(!(flag2=20) fail(); conflag=0; /* *定时中断 * */ void time0() interrupt 1 TH0=0x3c; /初 值 50ms (65536-50000)/256 TL0=0x0b0; / (65536-50000)%256 flag+; /标 志位 flag1+; flag2+; t+; if(t20) t=0; num2+; /秒表 if(num2=2) /如果到了 2 次,说明 0.1 秒的时间到 num2=0; / 然后把 num2 清零重新再计 2 次 second0_1+; if(second0_1=10) second0_1=0; second+; if(second=60) second=0; minute+; if(minute=9) minute=0; void interrupt_uart() interrupt 4 uchar dat1,dat2,dat3; dat1=shi; dat2=fen; dat3=miao; if(t=20) if(RI) RI = 0; /SBUF=num; switch(num) case 0:SBUF=0x0a;break; case 1:SBUF=dat1;break; case 2:SBUF=0x0b;break; case 3:SBUF=dat2;break; case 4:SBUF=0x0c;break; case 5:SBUF=dat3;break; default:SBUF=0; num+; if(num5)num=0; REN = 0; if(TI) TI = 0; /SBUF = num; switch(num) case 0:SBUF=0x0a;break; case 1:SBUF=dat1;break; case 2:SBUF=0x0b;break; case 3:SBUF=dat2;break

温馨提示

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

评论

0/150

提交评论