单片机电子时钟课程设计实验报告

《单片机实践报告》

题    目  电子时钟设计     

专    业  电子信息工程    

学生姓名    王健吉         

准考证号                   

指导教师                   

  20##  10 

一,课程设计的目的和意义

   课程设计的目的与意义在于让我们将理论与实践相结合。培养我们综合运用电子课程中的理论知识解决实际性问题的能力。让我们对电子电路、电子元器件、印制电路板等方面的知识进一步加深认识,同时在软件编程、排错调试、焊接技术、相关仪器设备的使用技能等方面得到较全面的锻炼和提高,为今后能够独立完成某些单片机应用系统的开发和设计打下一个坚实的基础。

二,课程设计的基本任务

   利用89S51单片机最小系统,综合应用单片机定时器、中断、数码显示、键盘输入、蜂鸣报警等知识,设计一款单片机和简单外设控制的电子时钟。

三,主要功能要求

1)使用6位数码管,前两位显示小时(24小时制),中间两位显示分钟,后两位显示秒。时钟每走1秒,秒数码管加1显示,60秒后分钟数码管加1显示,60分钟后小时数码管加1显示。

2)设计89S51单片机最小系统

3)掌握使用Protel99 绘制原理图和布板的过程、方法和技巧。

4)掌握单片机开发软件(Keil C51或 Wave)的使用和调试。

5)编写并调试单片机定时及其中断程序,以实现电子时钟的功能。

6)设计八段数码管显示电路并编写驱动程序,输入并调试拆字程序和数码显示程序。

7)掌握硬件和软件联合调试的方法。

8)完成系统硬件电路的设计和制作。

9)完成系统程序的设计。

10)完成整个系统的设计、调试和制作。

11)完成课程设计报告。

四,整体设计框图及整机概述

整体设计框图

整机概述:1)开机为走时模式,正常显示时间。在此模式下整点闹时,定点闹时有效。

2)共设置3个按键,分别为模式键、功能键1、功能键2。按动模式键,模式将在‘走时/调时/日期显示及调整/闹钟显示及调整’4个模式下切换。

3)走时模式下,按动功能键1/功能键2停止闹时。

4)调时模式下,功能键1调整分钟数值,功能键2调整小时数值。

5)日期显示及调整模式下,功能键1调整日期数值,功能键2调整月份数值。

6)闹钟显示及调整模式下,功能键1调整闹钟分钟数值,功能键2调闹钟时钟数值。

五,软件流程图和流程说明

1)主程序流程图

流程图说明

初始化:包括定时器赋

初值,初始化各内存单

元。开定时器中断,开

CPU中断,送段码表头

地址给DPTR。


2)显示子程序流程图


              3)按键扫描子程序
4)模式查询子程序
日期显示及调整子程序与闹钟显示及调整子程序流程图与调时模式子程序大同小异。

a)日期显示及调整子程序送给R3/R4/R5的数据为日/月/年,按功能键1日期加1,按功能键2月份加1。至于数值的合法性在程序里有具体的判断。

b)闹钟显示及调整子程序送给R3/R4/R5的数据为闹钟开关值/闹钟分/闹钟时,按功能键1闹钟分加1,按功能键2闹钟时加1。至于数值的合法性在程序里有具体的判断。

 

5)闹钟查询子程序
六,总结设计及调试体会

硬件设计部分

首先要通过计算与参考资料等决定参数。而后通过仿真软件等调试,确定参数无误后再开始用Protel99 SE画原理图,进而生成PCB进行布板。

软件设计部分

设计软件首先要考虑要做的功能,确定出合理的算法。合理的算法不仅要可以实现功能,而且在添加功能的时候要方便灵活。有的人为了实现某种功能用了各种各样的方法来实现,结果程序结构吃死,当想要添加功能或者修改其他功能的时候,将修改程序大部分结构,也就是说要破坏程序现有的结构。

关于调试

Keil软件调试单片机程序的时候,编译通过并不代表程序是正确的。编译通过只能说明程序没有语法上的错误。进行软件仿真或者下载到开发板上进行调试,经常会出现各种各样的错误。许多超出预期效果的现象往往是一些微小错误引起的。例如没有现场保护跟恢复现场等,所以养成良好的编程习惯也很重要。有些想达成某些功能而添加的语句,实际上确一点效果也没有。举个编程中的小问题:当有按键按下时,我们都要有软件防抖。正常的方法是调用一个延时。在实际调试中,要跳过这个抖动,需要100MS左右。如果使用正常的延时,会导致按键按下时CPU100MS内无法进行其他操作,也就是说。平均1S内100MS不调用显示子程序,这样就会导致亮度降低。这时候,考虑到显示子程序一次有十几毫秒,就特别写了一个调用7次显示的子程序来作为按键防抖的延时,实际上效果也是很不错的。这个想法就是在修改了多次程序未达到想要的效果(有按键按下时显示亮度不降低)后最终想出来的办法。

最后在做完板,焊完电路后,在接通电源之前,要用万用表仔细检查电路是否有连接错,以免烧坏芯片和数码管。

五天以来的其他体会:态度要积极,不要认为很简单就不紧不慢。很多东西并不是自己设想的那么顺利,有时候一个小问题可以花上你半天甚至一天的时间。虽然自己在程序上并没遇到太大的问题,但是因为态度不够积极,对于没画过的PCB图迟迟不去下手,在周四晚上才解决。本以为周五一天可以做完板并完成整机调试,可是各种突发事件让自己措手不及。发现板来不及做完后才将程序功能进行扩展。这是我在这次实验中的一个教训,也让我明白了对于自己不能太过于自信,态度决定一切。

评语:                                               成绩:

 

第二篇:单片机电子时钟课程设计[1]

目录

一、   设计目的

二、   总体设计

系统硬件总框图

三、   硬件单元设计

电路总设计图

NE55P模块 

LED灯显示

数码管显示

DS1302模块 

时钟控制

蜂鸣器键盘扫描

AT89C52

四、   软件单元设计

程序清单

五、   调试

软件调试、硬件调试

六、   设计总结

七、   参考文献

一、设计目的

1总体要求

(1) 独立完成设计任务

(2) 绘制系统硬件总框图

(3) 绘制系统原理电路图

(4) 制定编写设计方案,编制软件框图,完成详细完整的程序清单和注释;

(5) 制定编写调试方案,编写用户操作使用说明书

    (6) 写出设计工作小结。对在完成以上文件过程所进行的有关步骤如设计思想、指标论证、方案确定、参数计算、元器件选择、原理分析等作出说明,并对所完成的设计作出评价,对自己整个设计工作中经验教训,总结收获和今后研修方向。

2 具体要求

本次工程实践的校内部分主要以单片机为基础,进行单片机软件编程,目的是为了提高学生的软件编程和系统设计能力,整个设计系统包括两个部分,硬件及软件部分,硬件部分已经制作成功,学生只需要掌握其原理和焊接相应的元器件,掌握元器件的辨别和元器件的作用以及应用场所即可,另外对所焊接的电路还需要进行仔细的检查,判断是否有焊接错误的地方或者短路的地方,对出现的异常情况要能够根据现象判别原因,并具备解决问题的能力,从而切实提高学生的硬件电子电路的分析、判断能力。

    软件编程是本次工程实践的重要环节。在为期两周的工程实践中,将占据主要时间,学生要完成的软件编程任务主要包括以下几点:

    1)、熟悉Keil C51编程平台及相关编程软件

    2)、编写、调试蜂鸣器、继电器动作、方波程序并进行软硬件联调

    3)、编写、调试LED流水灯(循环显示)程序并进行软硬件联调

    4)、编写、调试键盘扫描子程序并进行软硬件联调

    5)、编写、调试数码管动态扫描程序并进行软硬件联调

    6)、电子钟设计(包括键盘、时钟、显示等)

    7)、温度测量控制系统设计(包括键盘、显示、控制、报警等)

    其中前五个内容是后两个内容的基础,主要是编制一些子程序,为后继的整个系统设计打下基础。

    电子钟设计一个简单的单片机编程设计,要求电子钟软件程序必须具备键盘扫描、数码管显示、时钟以及日历、秒表和闹钟功能。

    温度测量与控制系统设计是一种非常简单而又应用普遍的温度控制系统、他包括温度采集、信号转换、单片机处理以及控制、报警等部分。要求学生采用声光报警方式。

二 、总体设计

2.1 系统硬件总框图

系统设计总框图

此次课程设计,AT89C52是一种带2K字节闪烁可编程可擦除只读存储器(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低电压,高性能CMOS 8位微处理器,俗称单片机。

此次课程设计的电子钟就是由AT89C52单片机、时钟电路、报警电路,LED流水灯电路,动态数码管显示电路、音乐电路等组成。运用汇编语言来控制单片机AT89C52来实现LED流水灯、报警器、动态数码显示、电子音乐等功能,并在此基础上综合运用上述功能,实现电子钟的设计(包括键盘、时钟、显示等),温度测量控制系统(包括键盘、显示、控制、报警等)。且本设计中的AT89C52单片机是整个工作过程的核心,是整个设计灵魂,它控制了脉冲时序的产生,显示信号的发送控制显示LED的选择。同时也考虑到AT89C52单片机来制作电子时钟其最大的好处就是可最大的调整时钟使其准确度更高。

三、硬件单元设计

3.1电路总设计图

电路总设计图

3.2  NE555P模块

555定时器可构成多谐振荡器,是一种性能较好的时钟源。调节电位器RW1,使在555输出端3获得频率为50—60Hz的矩形波信号,当基本RS触发器Q为1时,门5开启,此时脉冲信号通过门5作为计数脉冲加于计数器的计数输入端CP。

3.3 LED灯显示

Led灯原理图

本次课程设计中,“程序语言”通过“翻译”软件“翻译”成单片机所需的二进制代码,单片机可工作。要用外加电源和分压电阻来控制低电平驱动点亮,因为单片机不能直接高电平驱动LED灯。如图D1-D8和R1、R2以及R6-R11连接到单片机IO口,当P1口某脚变低时相应LED发光。实现LED灯的闪烁,只需利用编程方法依次从低位到高位逐个变为低电平,等待少许时刻再变高即可。

3.4  数码管显示

为了能使电路简单我们采用数码管动态显示方式。数码管不同位显示的时间间隔可以通过调整延时程序的延时长短来完成。数码管显示的时间间隔也能够确定数码管显示时的亮度,若显示的时间间隔长,显示时数码管的亮度将亮些,若显示的时间间隔短,显示时数码管的亮度将暗些。若显示的时间间隔过长的话,数码管显示时将产生闪烁现象。

数码管显示图

3.5  DS1302模块

DS1302的RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。

其管脚图如下:

  DS1302管脚图

各引脚功能:Vcc1为后备电源,VCC2为主电源,X1和X2是振荡源,

SCLK为输入端

RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据的传送手段。

3.6时钟控制

   石英晶体振荡器是利用石英晶体的压电效应制成的一种谐振器件,它的基本构成大致是:从一块石英晶体上按一定方位角切下薄片,在它的两个对应面上涂敷银层作为电极,在每个电极上各焊一根引线接到管脚上,再加上封装外壳就构成了石英晶体谐振器。其产品一般用金属外壳封装,也有用玻璃壳、陶瓷或塑料封装的。HMOS型MCS-51外部时钟源的接发:在XTLA1和XTLA2两端跨接晶体或陶瓷振荡器,与内部反相器构成稳定的自激振荡器。其发出的时钟脉冲直接送入片内定时控制部件,其中C电容对频率有微调作用。

时钟电路

3.7 蜂鸣器

蜂鸣器原理图

蜂鸣器发声原理是电流通过电磁线圈,使电磁线圈产生磁场来驱动振动膜发声的。因此需要一定的电流才能驱动它,单片机IO口输出的电流较小,其TTL电平基本上驱动不了蜂鸣器,因此需要增加一个电流放大的电路。程序中通过改变单片机对应IO口输出波形的频率,就可以调整控制蜂鸣器音调,产生各种不同音色、音调的声音。另外,改变其占空比,也可以控制蜂鸣器的声音大小。可以有两种驱动方式,即用PNP或NPN三极管电流放大电路驱动。本电路通过一个PNP三极管9012来放大驱动蜂鸣器,当输出高电平时,三极管Q1截止,没有电流流过线圈,蜂鸣器不发声;当输出低电平时,三极管导通,这样蜂鸣器的电流形成回路,发出声音。因此,我们可以通过程序控制IO口输出的电平来使蜂鸣器发出声音和关闭,从而实现各种可能音响的产生。

启动报警子程序如下:                  停止报警子程序如下:

START:  SETB     P1.0                 STOP:   CLR      P1.0

RET                                   RET

3.8 键盘

键盘扫描流程图

在MCS-51系列单片机的指令系统中设有散转指令JMP @A+DPTR,可看成是专门配合键入程序是整个应用程序的核心部分。

键盘的操作,无论是按键或键盘都是利用机械触点的合、断作用。一个电压信号通过机械触点的闭合、断开过程。由于机械触点的弹性作用,在闭合及断开瞬间均有抖动过程,会出现一系列负脉冲。抖动时间的长短,与开关的机械特性有关,一般为5—10ms。

一组按键或键盘都要通过I/O口线查询按键的开关状态。且独立式按键电路配置灵活,软件结构简单,但每个按键必须占用一根I/O口线,在按键数量较多时,I/O口线浪费较大。

3.9 AT89C52

     AT89C52是此次课程设计的核心部分。其管脚图如下:

AT89C52管脚图

AT89C52是低功耗、高性能的CMOS8位单片机。片内带有8KB的Flash存储器,且允许在系统内改写或用编程器编程。另外,AT89C52的指令系统和引脚与80C52完全兼容。

AT89C52各管脚功能如下:

VCC:供电电压;GND:接地;P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。;P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流;P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流;P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入;P3口管脚功能: P3.0是RXD(串行输入口);P3.1是TXD(串行输出口);P3.2是/INT0(外部中断0);P3.3是/INT1(外部中断1);P3.4是T0(记时器0外部输入);P3.5是T1(记时器1外部输入);P3.6是/WR(外部数据存储器写选通);P3.7是/RD(外部数据存储器读选通);P3口同时为闪烁编程和编程校验接收一些控制信号。RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。ALE/PROG:当访问外部存储器时,地址锁存允许输出电平用于锁存地址的地位字节。/PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。/EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。XTAL2:来自反向振荡器的输出。

四、软件单元设计

程序清单

T_R Bit P3.4 ;实时时钟复位线引脚

        T_C Bit P3.2 ;实时时钟时钟线引脚

        T_I Bit P3.3  ;实时时钟数据线引脚

        SEC EQU 30H

        MIN EQU 31H

        H EQU 32H

        D EQU 33H

        MON EQU 34H

        W EQU 35H

        Y EQU 36H       

        ORG 0000H

        LJMP start

        ORG  001bH    

        AJMP INTT1       

        ORG  0030H

START:  LCALL KEY       

        AJMP START

;*******蜂鸣器*******

KEY0:   SETB P3.4

        LCALL DELAY

        LCALL DELAY

        CLR  P3.4

        LCALL DELAY

        LCALL DELAY

SETB P3.4

LCALL DELAY

LCALL DELAY

CLR  P3.4

LCALL DELAY

LCALL DELAY

SETB P3.4

LCALL DELAY

LCALL DELAY

CLR  P3.4

RET   

;*******流水灯*******

KEY1:   MOV R2,#2

REB:    MOV R1,#8

        MOV A,#0AFH

LOOPB:  MOV P2,A       

 RL A

 LCALL DELAY

 DJNZ R1,LOOPB

 DJNZ R2,REB

 RET

;*******日期*******       

KEY2:   CLR     T_R

        CLR     T_C

        MOV SP,#60H                 ;修改堆栈

        MOV SEC,#00H             ;初始时间设为10:00:00

        MOV MIN,#00H

        MOV H,#10H

        LCALL SETDS1302

        LCALL GET1302

        LCALL DISPLAY

        MOV R3,#25

        MOV TMOD,#01H

        MOV TH0,#70H                ;置定时器初值(定时40ms)

        MOV TL0,#00H

        SETB TR0                     ;启动定时器0

LP1:    JBC TF0,LP2                  ;查询计数溢出

        SJMP LP1                      ;未到40 ms继续计数

LP2:    MOV TH0,#0B8H                ;重新置定时器初值

        MOV TL0,#00H

        LCALL DISPLAY                 ;显示

        DJNZ R3,LP1                  ;未到1 S继续循环

        LCALL GET1302                 ;每过1s从DS1302读取一次时间

        MOV     r3,#25

        SJMP LP1                      ;数码显示子程序

DISPLAY:

        MOV     DPTR,#DIG_CODE         ;显示分钟

        MOV     P1,#11110111b

        MOV     A,MIN

        ANL     A,#0FH

        MOVC    A,@A+DPTR

        MOV     P0,A

        LCALL   DIS_DELAY

        MOV     P1,#11111011b

        MOV     A, MIN

        SWAP    A

        ANL     A,#07H

        MOVC    A,@A+DPTR

        MOV     P0,A

        LCALL   DIS_DELAY                ;显示小时

        MOV     P1,#11111101b

        MOV     A,H

        ANL     A,#0FH

        MOVC    A,@A+DPTR

        MOV     P0,A

        LCALL   DIS_DELAY

        MOV     P1,#11111110b

        MOV     A,H

        SWAP    A

        ANL     A,#03H

        MOVC    A,@A+DPTR

        MOV     P0,A

        LCALL   DIS_DELAY

        RET                             ;显示延时5ms子程序

DIS_DELAY:

        PUSH PSW

        MOV R7,#10

D1:     MOV R6,#248

D2:     DJNZ R6,$

        DJNZ R7,D1

        POP PSW

        RET                             ;设置DS1302初始时间,并启动计时

SETDS1302:

        CLR     T_R

        NOP

        CLR     T_C

        NOP

        SETB    T_R

        NOP

        MOV     B,#8EH          ;写控制命令字

        LCALL   INPUTBYTE      

        MOV     B,#00H          ;写保护关闭

        LCALL   INPUTBYTE

        SETB    T_C

        NOP

        CLR     T_R

        MOV     R0,#SECOND      ;内存中的时间首地址

        MOV     R1,#80H         ;DS1302中的时间首地址

        MOV     R7,#7           ;字节数

SETLOOP:

        CLR     T_R

        NOP

        CLR     T_C

        NOP

        SETB    T_R

        NOP

        MOV     B,R1            ;写命令字

        LCALL   INPUTBYTE

        MOV     A,@R0           ;设置时间

        MOV     B,A

        LCALL   INPUTBYTE      

        INC     R0

        INC     R1

        INC     R1

        SETB    T_C

        NOP

        CLR     T_R

        NOP

        DJNZ    R7,SETLOOP

        CLR     T_R

        NOP

        CLR     T_C

        NOP

        SETB    T_R

        NOP

        MOV     B,#8EH

        LCALL   INPUTBYTE

        MOV     B,#80H          ;开写保护

        LCALL   INPUTBYTE

        SETB    T_C

        NOP

        CLR     T_R

        NOP

        RET

;从DS1302读取时间

GET1302:

        MOV     R0,#SECOND    

        MOV     R1,#81H        ;DS1302中读时间的首地址

        MOV     R7,#7

GETLOOP:

        CLR     T_R

        NOP

        CLR     T_C

        NOP

        SETB    T_R

        NOP

        MOV     B,R1

        LCALL   INPUTBYTE       ;写命令字

        LCALL   OUTPUTBYTE      ;读时间

        MOV     @R0,A           ;将从DS1302中读取的时间从内存中保存

        INC     R0              ;修改地址指针

        INC     R1

        INC     R1

        SETB    T_C

        NOP

        CLR     T_R

        NOP

        DJNZ    R7,GETLOOP

        RET

;向DS1302写一个字节

INPUTBYTE:

        MOV     R4,#8

INPUTLOOP:

        MOV     A,B

        RRC     A

        MOV     B,A

        MOV     T_I,C

        SETB    T_C

        NOP

        NOP

        NOP

        CLR     T_C

        DJNZ    R4,INPUTLOOP

        RET

;从DS1302读一个字节

OUTPUTBYTE:

        CLR     a

        CLR     c

        MOV     R4,#8

OUTPUTLOOP:

       

        NOP

        NOP

        MOV     C,T_I

        RRC     A

        SETB    T_C

        NOP

        NOP

        NOP

        CLR     T_C

        DJNZ    R4,OUTPUTLOOP

        RET

KEY:   MOV P1,#0F0H

       MOV A,P1

       MOV B,A

       ACALL DELAY

       MOV A,P1

       CJNE A,B,DO

       CJNE A,#0E0H,K1

       AJMP KEY0

K1:    CJNE A,#0D0H,K2

       AJMP KEY1

K2:    CJNE A,#0B0H,K3

       AJMP KEY2

K3:    CJNE A,#070H,DO

       AJMP KEY3

DO:    RET

DELAY:  MOV R6,0ffh

DL1:  MOV R5,#250

      DJNZ R5,$

 DJNZ R6,DL1

      RET

DEL1:  MOV R7,#02

       DL2:MOV R6,#0FFH

       DJNZ R6,$

       DJNZ R7,DL2

       RET

DELAYY1:MOV R7,#02

DELAY10:MOV R4,#187

DELAY11:MOV R3,#248

       DJNZ R3,$

       DJNZ R4,DELAY11

       DJNZ R7,DELAY10

       DJNZ R5,DELAYY1

      RET

key3: MOV SP,#60H

      MOV TMOD,#10H

      SETB ET1

      SETB EA

      SETB TR1

START0:clr p3.4

      MOV 30H,#00H

NEXTT:MOV A,30H

     MOV DPTR,#TABLE

     MOVC A,@A+DPTR

     MOV R2,A

     JZ ENDD

     ANL A,#0FH

     MOV R5,A

     MOV A,R2

     SWAP A

     ANL A,#0FH

     JNZ SING

     CLR TR1

     AJMP DD1

SING:DEC A

     MOV 22H,A

     RL A

     MOV DPTR,#TABLE1

     MOVC A,@A+DPTR

     MOV TH1,A

     MOV 21H,A

     MOV A,22H

     RL A

     INC A

     MOVC A,@A+DPTR

     MOV TL1,A

     MOV 20H,A

     SETB TR1

DD1: LCALL DELAYY

     INC 30H

     AJMP NEXTT

ENDD:CLR TR1

     AJMP START0

INTT1:PUSH PSW

      PUSH ACC

      MOV TL1,20H

      MOV TH1,21H

      CPL p3.4

      POP ACC

      POP PSW

      RETI

DELAYY:MOV R7,#02

DELAY0:MOV R4,#187

DELAY1:MOV R3,#248

       DJNZ R3,$

       DJNZ R4,DELAY1

       DJNZ R7,DELAY0

       DJNZ R5,DELAYY

       RET

TABLE:

      DB 82H,01H,81H,94H,84H,0B4H,0A4H,04H

      DB 82H,01H,81H,94H,84H,0C4H,0B4H,04H

      DB 82H,01H,81H,0F4H,0D4H,0B4H,0A4H,94H

      DB 0E2H,01H,0E1H,0D4H,0B4H,0C4H,0B4H,04H

      DB 82H,01H,81H,94H,84H,0B4H,0A4H,04H

      DB 82H,01H,81H,94H,84H,0C4H,0B4H,04H

      DB 82H,01H,81H,0F4H,0D4H,0B4H,0A4H,94H

      DB 0E2H,01H,0E1H,0D4H,0B4H,0C4H,0B4H,04H,00H

TABLE1:

      DW 64260,64400,64524,64580,64684,64777,64820,64898

      DW 64968,65030,65058,65110,65157,65178,65217

;字符显示码表

DIG_CODE:

        DB 14H,0d7H,4cH,45H,87H,25H,24H,57H,04H,44H

        END

五、调试

(一)软件调试步骤

1、打开软件后,在Project菜单中选择New Project命令,打开一个新项目。保存此项目,输入工程文件名后,并保存工程文件的目录。

2、为项目文件选择一个目标器件,即选择8051的类型。在Data base 列表框中选择“ATML 89C52”,确定。

3、上述设置好后,创建源程序文件并输入程序代码。输入好代码后点击“文件/保存”。

4、把源文件添加到项目中,用鼠标指在目标工作区的目标1,点击右键在弹出的菜单中选择添加文件到源代码组,在弹出的添加文件框中,选择需要添加到项目中的文件。

5、开始编译,对项目文件进行编译。若没有错误后进行硬件调试

(二)硬件调试

    按照此次课程设计的要求调试过程如下:按键KEY0,KEY1,KEY2,KEY3分别对应LED流水灯,蜂鸣器,数码管,音乐四个功能。

1、LED流水灯测试

通过按按键KEY0,观察到LED流水灯显示,并循环2次;与相应的程序代码相比较,结果正确。

2、蜂鸣器测试

    通过按按键KEY1,听到蜂鸣器发出“嘀” ,“嘀”的响声;与相应的程序代码相比较,结果正确。

      3、数码管测试

    通过按按键KEY2,观察到数码管从“1000” 开始计时,依次显示“1001” ,“1002” ,“1003”  …… ;与相应的程序代码相比较,结果正确。因为程序要求数码管显示的时间是小时和分钟,所以要观察到数码管的变化要等一分钟的时间。

      4、 音乐测试

   通过按按键KEY3,听到蜂鸣器响起“生日快乐”的音乐;

六、设计总结

经过为期两周的忙碌,终于完成了单片机的课程设计,在此期间不仅将课堂上所学的东西进行了巩固,而且在实验的过程中有所提高,当然这里少不了老师的指导和小组之间的团队合作。

前几天我们在教室集中,并根据报告要求查找相关资料。该课程设计中应用到了蜂鸣器、LED流水灯、数码管,并且要求在一个电路板上将各个功能集成在一起,也就是能实现LED灯流水工作,数码管计时以及蜂鸣器发生。以前我们做试验都是一个功能一个功能的完成,从来没有一起实现过,这样问题就来了,比如三种程序放在一起相互冲突怎么办?经过老师的讲解和分析,我们可以用键盘扫描的程序来解决,将各个功能设置在不同的模块作为子程序一一调用,这样就可以实现全部功能并互不干扰。

之后我们在实验室进行调试,结果出了一些问题,首先是LED流水灯只亮一个,不进行流水工作,然后就是复位以后再按下蜂鸣器的工作开关,放出的不是音乐而是噪音。经过分析以后发现是时间设定的有问题,之前是DELAY:  MOV R6,200应改成DELAY:  MOV R6,0ffh。关于音乐的问题,其实也很简单,就是音乐响起之前没有清零,之前如果蜂鸣器工作过的话,对现在的执行有干扰,两种不同频率的声音在一起肯定会有影响的。

进行最后的调试和下载,终于正常工作,并能顺利实现所有的功能。

七、参考文献

曲泊涛,《微型计算机系统原理,接口与组装》,大连理工大学出版社,1998年

李大有,《单片机应用与设计》,电子工业大学出版社,1998年

徐惠民,《单片微型计算机原理接口应用》,北京邮电大学出版社,1999年。

钟睿.MCS-51 单片机原理及应用开发技术.北京:中国铁道出版社,20##年

李有才,《单片机课程设计纲要》,电子科技大学出版社,20##年

                                                                                                                                                                                                    

相关推荐