四路多段定时开关(一)

时间:2021-03-20 10:53:32 电子信息工程毕业论文 我要投稿

四路多段定时开关(一)

毕业设计(论文)任务书
专业(班):  02楼宇2    姓名:   罗艳华   
 课题名称、主要内容和基本要求
课题名称:四路多段定时开关
主要内容:
 实现四路定时开关控制,能在24小时内任意时间通断,每路24小时内最多可执行六次开与关,并可控制输出功率,单路控制功率不小于800W,掉电后数据不丢失。
基本要求:
 完成Protel电路设计、单片机硬件系统设计、单片机程序设计、
电路焊接与调试全过程。制作出实物并能演示运行。
课题名称:四路多段定时开关
 进度安排
周次 工作内容 执行情况
6、7 学习电子系统的设计过程,明确课题内容,整体构思,查阅资料 
8 复习单片机及相关知识、PROTEL使用 
9、10 设计、绘制电路、采购元器件、制版 
11 硬件组装 
12、13 程序设计与调试 
14、15 撰写论文 
    
摘要
 
 单片计算机即单片微型计算机。(Single-Chip Microcomputer),是集CPU,RAM,ROM,定时,计数和多种接接口于一体的微控制器。它体积小,成本低,功能强,广泛应用于智能产品和工业自动化上。而C语言已成为当前举世公认的高效简洁又贴近硬件的编程语言之一。C语言现已成为专业化的单片机上的实用高级语言。而且由于开发速度、软件质量结构化、可维护性方面的原因,使C语言渐渐有取代汇编的趋势。这次毕业设计通过对C语言对单片机进行编程的学习应用,从而达到学习、设计、开发软、硬件的能力。
前言
 本文通过用对一个能实现定时,时钟,日历显示功能的时间系统的设计学习,文章主要介绍了时钟芯片DS12C887。系统由AT89C52、七段LED数码显示器、按键、二极管、DS12C887、发光二极管等部份构成,能实现时钟日历的功能:能进行年、月、日、时、分、秒的显示、实现四路开关定时输出、时间的调整等功能。文章后附有硬件设备请单。由于本人水平水限,难免有疏落不足之处,敬请老师和同学能给与批评纠正。

 

目   录

任务书 1
摘要 4
前言 4
第一章、硬件设计 7
 1-1  硬件设计框图 7
 1-1-1键盘部分 7
 1-1-2显示及时钟芯片部分 8
 1-1-3继电器输出部分 9
 1-2  系统硬件详细设计图 9
 1-3  各芯片介绍 10
 1-3-1 AT89C52单片机应用设计 10
 1-2-2 DS12C887时钟芯片 11
 1-2-3 74C922N 17
 1-2-4 SN74LS04N 18
 1-2-5 ULN2003A 18
第二章、系统软件设计 20
 2-1  KEIL51软件的应用 20
 2-2  C语言编程单片机应用 21
 2-3  程序 22
 2-3-1 程序中地址分配 22
 2-3-2 主程序 24
 2-3-3 显示程序 25
 2-3-4 读取键盘并换算成键值 26
 2-3-5 外部中断1 27
附  录
结  论 
参考文献 

 

 


第一章、硬件部分

1-1  硬件设计框图
1-1-1键盘部分
图注:键盘部分接线示意图

 如图所示键盘与74C922芯片相连接,74C922为一键盘编码器,其中第一路(S2-S5)键盘与74C922中的X1相连接,第二路键盘(S6-S9)与74C922中的X2相连接,第三路键盘(S10-S13)与X3相连接,第四路键盘(S14-S17)与X4相连接。而74C922中的Y1则与(S2、S6、S10、S14)相连接,Y2与(S3、S7、S11、S15)相连接,Y3与(S4、S8、S12、S16)相连接,Y4与(S5、S9、S13、S17)相连接。键盘产生的中断与单片机中的P3.3脚相接,作为中断1(INT1)。
 电路板中共用到十七个键盘,其中有十个为数字键,和六个功能键,左下角中的S1则是起到个复位作用。
1-1-2显示及时钟芯片部分
图注:数码显示及DS12C887部分接线图

 这部分的主要功能就是通过单片机读取时钟芯片中的时间,再给七段数码显示器显示出来。
 首先讲一下时钟芯片与89C51的接线,单片机89C52中P3.6(WR)脚与DS12C887时钟芯片的15脚WR相接,单片机对时钟芯片进行写入数据,89C52的P3.7脚(RD)与DS12C887的17脚RD相接,单片机读取时钟芯片,DS12C887的AD0~AD7分别为89C52的P1.0~P1.7脚相连。DS12C887的IRQ脚时钟更新中断脚与P3.2相接,做为中断0(INT0);DS12887的第14脚(AS)与89C52的30脚(ALE/PROG)相连,DS12887的24、18脚接VCC正电源,1、12并上13脚接地。89C52的20脚接地。
   接着就是七段数码显示器的接线了,显示器的a、b、c、d、e、f分别接89C52的P2.0、P2.1、P2.2、P2.3、P2.4、P2.5、P2.6相接,显示器的第3、8脚接SN7404N(反相器)再分别与P1.0、P1.1、P1.2、P1.3相接,第二个显示器中的dp位接SN7404(反相器)后再与DS12887的SQW位相接,SQW位输出2HZ的频率使DP点亮。
1-1-3继电器输出部分
图注:继电器输出部分接线图

 89C52中P3.0与ULN2003A的INT1端子接,输出OUT1接继电器K4相接。由此对应P3.1接INT2,输出OUT2接K3,P3.2接INT3,输出K2,P3.3接INT3,输出OUT3接K1,再如图P2.7接INT7,输出OUT7与蜂鸣器相接。在制作电路板的过程中忘掉一个上拉电阻,位置是P2.7与正电源相接。
1-2  系统硬件详细设计图
 实际焊接出的板子跟设计中的有些不一样,最不一样的还是键盘的排列,原来设计是4X4矩阵形排列,由于焊接的种种原因,于是改成了两行八纵的排法,板子是通过我们利用Protel软件进行电路的设计,并不断的去了解硬件的功能及咨询老师,确定基本可能完全操作后,再进行焊接。
 注:焊接部份为自己焊做,但PBC板是拿出去外面制作。下图为实际硬件焊接图:

1-3  各芯片介绍
 在设计中用到了许多芯片有以前接触过的也有听都没听过的,系统由AT89C52、SN74LS04N反相器、键盘解码器74C922芯片、ULN2003A芯片、七段LED数码显示器、按键、二极管、DS12C887及发光二极管等组成。在本文中主要介绍几种芯片AT89C52、SN74LS04N、74C922及DS12C887和ULN2003A芯片。
1-3-1  AT89C52单片机应用设计
  AT89C52是一个低电压,高性能CMOS 8位单片机,片内含8k bytes的可反复擦写的Flash只读程序存储器和256 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,功能强大的AT89C52单片机可为您提供许多较复杂系统控制应用场合。   AT89C52有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2个读写口线,AT89C52可以按照常规方法进行编程,也可以在线编程。其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发成本。
 
主要功能特性:
  · 兼容MCS51指令系统 · 8k可反复擦写(>1000次)Flash ROM
  · 32个双向I/O口 · 256x8bit内部RAM
  · 3个16位可编程定时/计数器中断 · 时钟频率0-24MHz
  · 2个串行中断 · 可编程UART串行通道
  · 2个外部中断源 · 共6个中断源
  · 2个读写中断口线 · 3级加密位
  · 低功耗空闲和掉电模式 · 软件设置睡眠和唤醒功能

1-3-2  DS12C887时钟芯片
 DS12C887的特性:DS12C887实时时钟芯片功能丰富,可以用来直接代替IBM PC上的时钟日历芯片DS12C887,同时,它的管脚也和MC146818B、DS12887相兼容。
 由于DS12C887能够自动产生世纪、年、月、日、时、分、秒等时间信息,其内部又增加了世纪寄存器,从而利用硬件电路解决子“千年”问题; DS12C887中自带有锂电池,外部掉电时,其内部时间信息还能够保持10年之久;对于一天内的时间记录,有12小时制和24小时制两种模式。在12小时制模式中,用AM和PM区分上午和下午;时间的表示方法也有两种,一种用二进制数表示,一种是用BCD码表示;DS12C887中带有128字节 RAM,其中有11字节RAM用来存储时间信息,4字节RAM用来存储DS12C887的控制信息,称为控制寄存器,113字节通用RAM使用户使用;此外用户还可对DS12C887进行编程以实现多种方波输出,并可对其内部的三路中断通过软件进行屏蔽。
 DS12C887的引脚功能:DS12C887的引脚排列如图1所示,各管脚的功能说明如下:
 GND、 VCC:直流电源,其中VCC接+5V输入,GND接地,当VCC输入为+5V时,用户可以访问DS12C887内RAM中的数据,并可对其进行读、写操作;当VCC的输入小于+4.25V时,禁止用户对内部RAM进行读、写操作,此时用户不能正确获取芯片内的时间信息;当VCC的输入小于+3V时, DS12C887会自动将电源发换到内部自带的锂电池上,以保证内部的电路能够正常工作。
 MOT:模式选择脚,DA12C887有两种工作模式,即Motorola模式和Intel模式,当MOT接VCC时,选用的工作模式是Motorola模式,当MOT接GND时,选用的是Intel模式。本文主要讨论Intel模式。
 SQW:方波输出脚,当供电电压VCC大于4.25V时,SQW脚可进行方波输出,此时用户可以通过对控制寄存器编程来得到13种方波信号的输出。
 AD0~AD7:复用地址数据总线,该总线采用时分复用技术,在总线周期的前半部分,出现在AD0~AD7上的是地址信息,可用以选通DS12C887内的RAM,总线周期的后半部分出现在AD0~AD7上的数据信息。
 AS:地址选通输入脚,在进行读写操作时,AS的上升沿将AD0~AD7上出现的地址信息锁存到DS12C887上,而下一个下降沿清除AD0~AD7上的地址信息,不论是否有效,DS12C887都将执行该操作。
 DS/RD:数据选择或读输入脚,该引脚有两种工作模式,当MOT接VCC时,选用Motorola工作模式,在这种工作模式中,每个总线周期的后一部分的DS为高电平,被称为数据选通。在读操作中,DS的上升沿使DS12C887将内部数据送往总线AD0~AD7上,以供外部读取。在写操作中,DS的下降沿将使总线 AD0~AD7上的数据锁存在DS12C887中;当MOT接GND时,选用Intel工作模式,在该模式中,该引脚是读允许输入脚,即Read Enable。
 R/W:读/写输入端,该管脚也有2种工作模式,当MOT接VCC时,R/W工作在Motorola模式。此时,该引脚的作用是区分进行的是读操作还是写操作,当R/W为高电平时为读操作,R/W为低电平时为写操作;当MOT接GND时,该脚工作在Intle模式,此时该作为写允许输入,即Write Enable。
 CS:片选输入,低电平有效。
 IRQ:中断请求输入,低电平有效,该脚有效对DS12C887内的时钟、日历和RAM中的内容没有任何影响,仅对内部的控制寄存器有影响,在典型的'应用中,RESET可以直接接VCC,这样可以保证DS12C887在掉电时,其内部控制寄存器不受影响。
 DS12C887的地址分布
 附图1是DS12877的地址分布图。所有的地址包括114字节通用RAM、10字节用于记录时间、日历、闹钟和RAM以及4字节的控制、状态RAM。所有字节都可以在除以下的情况下直接读写。

时间、日历和闹钟的数据格式
地址 功能 十进制范围 范    围
   二进制数据模式  BCD数据模式
0  秒 0-59 00-3B 00-59
1  秒闹钟 0-59 00-3B 00-59
2  分钟 0-59 00-3B 00-59
3 分钟闹钟 0-59 00-3B 00-59
4 小时(12进制) 1-12 01-0CAM,81-8CPM 01-12AM,81-92PM
 小时(24进制) 0-23 00-17 00-23
5  时闹钟(12时制) 1-12 01-0CAM,81-8CPM 01-12AM,81-92PM
 时闹钟(24时制) 0-23 00-17 00-23
6 星期(星期天=1) 1-7 00-07 00-07
7 日期 1-31 01-0F 1-31
8 月份 1-12 01-0C 1-12
9 年 0-99 00-63 00-99
DS12887有四个控制寄存器,它们可以在任何时候读写。
寄存器A
最高位             最低位
BIT7 BIT6  BIT5 BIT4  BIT3  BIT2  BIT1  BIT0
UIP DV2 DV1 DV0 RS3 RS2 RS1  RS0
UIP更新(UIP)位用来标志芯片是否即将进行更新。当UIP位为1时,更新即将开始;当它为0时,表示在至少244μs内芯片不会更新,此时,时钟、日历和闹钟信息可以通过读写相应的字节获得和设置。UIP位为只读位并且不受复位信号(RESET)的影响。通过把寄存器B中的SET位设置为1可以禁止更新并将UIP位清0。
DV0,DV1,DV2
这3位是用来开关晶体振荡器和复位分频器。当[DV0 DV1 DV2]=[010]时,晶体振荡器开启并且保持时钟运行;当[DV0 DV1 DV2]=[11X]时,晶体振荡器开启,但分频保持复位状态。
RS3,RS2,RS1,RS0作用:1.设置周期中断允许位(PIE);2.设置方波输出允许位(SQWE);3.两位同时设置为有效并且设置频率;4.全部禁止。周期性中断率和方波中断频率表列出了可通过RS寄存器选择的周期中断的频率和方波的频率。这四个可读写的位不受复位信号的影响。
最高位             最低位
BIT7 BIT6 BIT5 BIT4 BIT3 BIT2 BIT1 BIT0
SET PIE AIE UIE SQWE DM 24/12 DSE
寄存器B
SET当SET=0,芯片更新正常进行;当SET=1,芯片更新被禁止。SET位可读写,并不会受复位信号的影响。
PIE当PIE=0,禁止周期中断输出到IRQ;当PIE=1,允许周期中断输出到IRQ。
AIE当AIE=0,禁止闹钟中断输出到IRQ;当AIE=1,允许闹钟中断输出到IRQ。
UIE当UIE=0,禁止更新结束中断输出到IRQ;当UIE=1,允许更新结束中断输出到IRQ。此位在复位或设置SET为高时清0.
SQWE当SQWE=0,SQW脚为低;当SQWE=1,SQW输出设定频率的方波。
DMDM=0,BCDDM=1,二进制,此位不受复位信号影响。
24/12此位为1,24时制;为0,12小时制
DSE夏令时允许标志。在四月的第一个星期日的1∶59∶59AM,时钟调到3∶00∶00AM;在十月的最后一个星期日的1∶59∶59AM,时钟调到1∶00∶00AM。
寄存器C
最高位             最低位
BIT7 BIT6 BIT5 BIT4 BIT3 BIT2 BIT1 BIT0
IRQF PF AF UF 0 0 0 0
IRQF当有以下情况中的一种或几种发生时,中断请求标志位(IRQF)置高;PF=PIE=1AF=AIE=1UF=UIE=1IRQF=PF·PIE+AF·AIE+UF·UIEIRQF-且为高IRQ脚输出低。所有标志位在读寄存器C或复位后清0。
PF 周期中断标志。AF 闹钟中断标志。UF 更新中断标志。
BIT 0 THROUGH BIT3第0位到第3位无用,不能写入,只读且读出的值恒为0。
寄存器D
最高位             最低位
BIT7 BIT6 BIT5 BIT4 BIT3 BIT2 BIT1 BIT0
VRT 0 0 0 0 0 0 0
VRT当VRT=0时表示内置电池能量耗尽,此时RAM中的数据的正确性就不能保证了。
BIT6 THROUGH BIT0第0位到第6位无用,只读,且读出的值恒为0。
2-2-3 74C922
 我们采用专用键盘管理芯片74C922。74C922为CMOS工艺技术制造,工作电压为3—15V,“二键锁定”功能,编码输出为三芯输出,可直接与微处理器数据线相连,内部振荡器完成4×4矩形键盘扫描,有 按键时,DA变高,通过非门接到AT89C51的INT1口,并且设INT0为边沿触发方式,当DA变高时,经过非门变为低电平跳变产生INT1外部中断,通知AT89C51从数据总线读键值,判断键值从而完成相应的散转程序功能。
 系统中共用了16个键盘按钮形状,当时图纸设计时以矩阵型4X4行之安排,后由于板的大小和实际等问题,便以每行八个,排做两行处理。
2-2-4 SN74LS04N
 如下图所示,SN74LS04N的引脚如下,7脚接地,14脚接VCC正电源,并且形象的体现出了SN74LS04N的作用,SN74LS04N作用就是反相器,SN74LS04N内部形成了六个非门,分别是1与2、3与4、5与6、8与9、10与11、12与13构成六个非门,起到一个反相的作用。

2-2-5 ULN2003A
 ULN2003A是内含7个达林顿管的驱动芯片,输入电压与TTL电平兼容。每个上达林顿管的集电极可吸收最大500mA的电流,耐压30V,因此可以用来驱动四相步进电机。ULN2003A电路具有以下特点:  ●电流增益高(大于1000);  ●带负载能力强(输出电流大于500mA);   ●温度范围宽(-40~85℃);  ●工作电压高(大于50V)。    ULN2003电路主要用于如下领域:  ●伺服电机; ●步进电机;  ●电磁阀;    ●可控照明灯。

 

 

 

 

 

第二章、系统软件设计

2-1  KEIL51软件的应用
 因此苏老师购见意我用C语言进行编程。还好时间尚早,我开始利用空闲时间进行C语言对单片机编程的学习。
 首先我对KEIL51软件进行了学习,软件是苏老师发给我的,在平日的时间里就自己捉摸着怎么用,在周日的时间我就回学校找苏老师问一周累积的问题。KEIL51跟MEDWIN不同的是:KEIL51需要新建项目(new project),之后选择单片机,这里难住了我好久,怎么选择单片机的型号也没选对,后来学校问老师应选择Ateml的AT89C51。这个就新建好了一个项目了。
 新建一个程序文件(File-New),建好后保存新建的程序,如果是用C语言进行编程的话扩展名应为(.c),如果是用汇编语言进行编程的话扩展名应为(.a或.asm),建好保存该文件,然后还需要将程序加到项目中,如图所示右键点击Source Group1文件夹弹出菜单,选择"Add File to Group 'Source Group 1'"就会弹出文件窗口,选择刚刚保存的文件,按ADD按钮,关闭文件窗,程序文件已加到项目中了。
 用KEIL51进得软件调试,在硬件没焊好的情况下,我都是直接用KEIL51进行仿真调试。图片由左到右分别编译单个文件、是编译当前项目及重新编译。此键为停止编译按钮,这个键只有在点击了前三个中的任一个后才会生效。这就是开启\关闭调试模式的按钮,它也存在于菜单Debug-Start\Stop Debug Session中。为运行按钮,当程序处于停止状态时才有效。为模拟芯片的复位,程序回到最开头处执行。为停止按钮,程序处于运行状态时才有效。
 后来硬件板焊好后就需要芯片烧写成HEX文件。
2-2  C语言编程单片机的学习
设计中所用到的运算符
关系和逻辑运算符 含义
> 大于
>= 大于等于
< 小于
<= 小于等于
== 等于
!= 不等于
&& 与
‖ 或
! 非
相对的优先级:最高为!运算再进行>=、<=运算,接着运行==、!=运算,后&&运算,最后执行‖运算。
运算符 作用
+ 加法
- 减法
* 乘法
/ 除法
++ 自加
-- 自减
% 模运算(取整数除法的余数)
主要就介绍一些我所用到的语句。
在程序设计中,主要利用了C语言的if、switch及for语句。其中if、switch为条件语句,for是一个循环控制语句,在程序中更常用到的语句是break语句,在switch语句中,在case子句执行完毕后,通过break语句使控制立即跳出switch语句。在循环语句中,break语句的作用是在循环体中测试到应立即结束循环时,使控制立即跳出循环结构,转而执行循环语句后的语句。
2-3  程序
2-3-1  程序中地址分配
程序设计中的地址分布,由于DS12C887中前14个字节是10字节用于记录时间、日历、闹钟和RAM以及4字节的控制、状态RAM。113字节通用RAM使用户使用,我先计算了我的地址分布,从第14个字节开始我用做存储每路的开关次数,每一路可设定每次开关的时间(小时、分钟、时长及功率),时长是以分钟为单位,最高可设置为99分钟。每一路开关每一次均要用四个字节,通过计算四路开关能在24小时内任意时间通断,每路24小时内最多可执行六次开与关,下表为我设定计算我在编程时的地址分布表。
表:DS12C887地址分配情况
路数 次数 第一次 第二次 第三次 第四次 第五次 第六次
第一路 14 15-18 19-22 23-26 27-30 31-34 35-38
第二路 39 40-43 44-47 48-51 52-55 56-59 60-63
第三路 64 65-68 69-72 73-76 77-80 81-84 85-88
第四路 89 90-93 94-97 98-101 102-105 106-109 110-113
例如程序:
 for(i=0;i<4;i++);i为判断电路设计中的第几路,
 {
  switch(i)
  {
  case(0):
  out0=0;
  break;
  ……
  }
 for(j=0;j<XBYTE[14+25*i];j++);j为每路开关的开关次数。
 {
 if(((XBYTE[15+j*4+25*i]<hour)||((XBYTE[15+j*4+25*i]==hour)&&(XBYTE[16+j*4+25*i]<=min)))
 &&(((XBYTE[15+j*4+25*i]+(XBYTE[17+j*4+25*i])/60)>hour)||(((XBYTE[15+j*4+25*i]+(XBYTE[17+j*4+25*i])/60)==hour)&&((XBYTE[16+j*4+25*i]+(XBYTE[17+j*4+25*i])%60)>min))))
{
  switch(i)
  {
  case(0):
  out0=XBYTE[18+4*j];
  break;
 ……
  }
 举例在程序中设计第一路开关开关一次,即i=0,设定的开关次数(一次)存放在外部RAM(DS12C887)第14个字节中,XBYTE[14]=1,j=0时循环一次,,如果读取到第15个字节(小时)中数值小于或等于系统时间小时(hour)&&(与运算符)第16个字节(分钟)中数值小于或等于系统时间分钟(min)&&第15个字节数值+第17个字节(时长)数值/60大于等于系统时间小时(hour)&&第16个字节数值+第17个字节数值%60大于系统时间分钟(min),判断条件如果为真的情况下,输出第18个字节中设定的功率。
 由于每路六次开关共用25个字节,因此循环语句用判断每路for (j=0;     j< XBYTE[14+25*i];j++),每一路从14字节开始,后循环语句即用14+25*路数。
2-3-2主程序(main)
 主程序中主要设置了CPU的工作模式及中断,T0为延时16ms;T1为显示时间设置为0.512ms;T2设置为延时100ms;设置芯片的工作模式:给外部RAM中A寄存器中写入0x20内容(XBYTE[0x0a]=0x20),即是将A寄存器中DV1位置1”,查看上述所讲DS12C887内容,[DV0 DV1 DV2]=[010]时,晶体振荡器开启并且保持时钟运行;
将外部RAM中B寄存器中写入0x1E内容,即是将B寄存器中UIE、SQWE、DM、24/12位置“1”,即是使得时钟芯片允许更新结束中断输出的IRQ;SQW输出设定频率的方波,采用二进制,并且为24小时制。
 主程序中还实现了通电时显示SZPT,一段时间延时后,显示0605(因为制做日期在五月份所以编程写入了0605),一段时间延时后,就读取时间显示小时和分钟。之后就是一个while循环语句。
2-3-3显示程序(display)
   dis0=decode(d0); 此程序为解码程序
 dis1=decode(d1);
 dis2=decode(d2);
 dis3=decode(d3);
 key0=d3;数码显示器4
 key1=d2;数码显示器3
 key2=d1;数码显示器2
 key3=d0;数码显示器1
switch(d)
 {
 case(0):
 return 0x40;
 break;………… 
    }
 
 程序用的是switch选择语句,如果系统要显示零的话,返回数值为0x40。在设计中采用的是共阳极的七段数码显示器,当该位置“1”显示,在电路设计中,数码显示器又与SN74LS04芯片的一个非门相连,即该位为“0”时,数码管显示,其返回值计算如下表:
 
     段号
显示数值 a
p2.0 b
p2.1 c
p2.2 d
p2.3 e
p2.4 f
p2.5 g
p2.6 十六进制
p2值
0 0 0 0 0 0 0 1 40
1 1 0 0 1 1 1 1 79
2 0 0 1 0 0 1 0 24
3 0 0 0 0 1 1 0 30
4 1 0 0 1 1 0 0 19
5 0 1 0 0 1 0 0 12
6 0 1 0 0 0 0 0 02
7 0 0 0 1 1 1 1 78
8 0 0 0 0 0 0 0 00
9 0 0 0 0 1 0 0 10
P 0 0 1 1 0 0 0 0C
T 0 1 1 1 0 0 1 4E
A 0 0 0 1 0 0 0 08
E 0 1 1 0 0 0 0 06
D 1 0 0 0 0 1 0 21
U 1 0 0 0 0 0 1 41
off 1 1 1 1 1 1 1 7F

2-3-4读取键盘并换算成键值(keytranslate)
这段程序的主要功能就是将杂乱无序的键盘使得有顺序可循。由于电路板上键盘不是按顺序排好的,因此通过编程当原来无序的键盘变得比较好操作。
  case(0x0):
  keyr=0;
  break;
 其具体程序对应的键盘值可看下表:
板上的顺序 0 4 8 12 1 5 9 13
编程后顺序 0 1 2 3 4 a b c
板上的顺序 2 6 10 14 3 7 11 15
编程后顺序 5 6 7 8 9 d e f
 这段程序主要采用的是switch选择语句。
2-3-5外部中断1(key)
 外部中断1为键盘中断,键进行读取。左图为:键盘中断一服务子程序图
 keya,其功能在于,按第一下显示case(1):  display (hour/10, hour%10, min/10,min%10);程序相同,按第二下显示年份,第三下显示为日期,第四下显示为星期几和秒。
 Keyb,其功能在于,按下如果在SET为1并且0x0e不为0的情况下,如果条件key3<7为真的话,那么第14个字节即为第四段数码管的值,如果为假的情况下,蜂鸣器发声,并且显示“EAA0”;keyb==1 为真的情况下,显示为“1,off,off,XBYTE[0x0e]”,当0x0e不为“0”的情况下,keyb=2的情况下,显示为XBYTE[0x0f]及XBYTE[0x10]中的数值,若输入数值又将显示内容写入外部RAM中,语句如:XBYTE[4*l+0x0f]=key0*10+key1;XBYTE[4*l+0x10]=key2 *10 +key3;
 Keyd,其功能在于,进入设置和退出设置,当按下keyd键,显示为PASD,如果如果条件“(key0==1)&&key1==2)&&(key2==3)&&(key3==4)”为真的情况下,SET置“1”,并显示为“PASS”,即可以对系统进行设置修改,如果为假蜂鸣器发声,并显示“EAA0”。当系统修改好后,再按下keyd键,显示“0UEA”。
附录
附表1设备清单:
序号 设备名称 型号 数量
1 整流器  1
2 电磁电容 104 6
3 电磁电容 20 2
4 极性电容 470uf 2
5 极性电容 22uf 1
6 三端稳压器 7805 1
7 发光二极管  4
8 7段数码显示器  4
9 保险丝  1
10 继电器  4
11 蜂鸣器  1
12 电阻 2.2K 8
13 电阻 4.7K 7
14 按钮  17
15 时钟芯片 DS12887 1
16 单片机 AT89C52 1
17 驱动器 ULN2003A 1
18 反相器 SN7404N 1
19 键盘编码器 74C922 1
20 晶振 6MHZ 1

 

附图1:DS12C887地址分布图

结论
 对于这一次的专题,我觉得真的有感觉到设计的感觉,跟实验问题有很不同的地方是我们可以自己构思功能,并且依据所要求的功能来设计自己的电路,完全要自己动手,因此在对于系统的功能都很清楚了。通过这次对单片机硬件、DS12C887的硬件结构、单片机C程序设计的学习,真的感觉收获不少,尤其是C语言的学习上,等于我利用了这次设计学习多了一门课程。如果事先就会C语言编程单片机我相信我能做的比目前好。
 在开始编程的时候,由于自己在学习单片机的时候学的不够深,又由于设计安排在学完单片机一年以后的时候,忘的比较多,使得我总是不明白单片机如何读取DS12C887时间芯片的数据,也不知该如何写入。后通过苏老师指导方知将DS12C887芯片当做一个普通的外部RAM进行读写。
 一开始我们是用AT89C51进行编程,遗憾的是我第一次编程完程序之后,我的电路板居然不能完全容纳我的程序,竟然在implementation 时告诉我design is too large。后来经过研究和老师指点,我明白是我整个设计以及程序写了太多,导致容量不足。后来我们只有舍弃了AT89C51,改用了AT89C52芯片。实现了电路板一开始要想要实现的功能。
 尽管如此,作专题重要的并不在于结果,而是自己在整个活动中的过程,经过了这一次专题,我体会到从设计到实际做出来的过程,而且也将我所学过的单片机知识完完全全的复习了一遍,并且还学到了不少,我想这才是做专题的最终目的,以及我的最大的收获。

 

参考文献:
徐爱华主编.单片机应用技术教程.北京:机械工业出版社,2003.7 
胡伟,季晓衡编著.单片机C程序设计及应用实例.人民邮电出版社  

【四路多段定时开关(一)】相关文章:

CAD多段体如何画08-14

CAD多段线绘制教程11-11

CAD绘制多段线的方法08-10

CAD设置多段线的宽度的方法08-13

AutoCAD直线命令和多段线命令教程10-17

考围棋业余一段规则10-18

英语阅读:一段伟大的友谊08-19

散文多一只碟子英译赏析11-02

怎么设计一个多图形标志10-09

flash怎么设计一段Windows屏保动画09-24