您的当前位置:首页正文

基于51单片机的六位十进制计数器论文

2024-04-10 来源:好走旅游网
 常州大学硬件实习报告

序号:

学号: 10446234

ZHOUUNIV实 习 报 告

实习课程名称: 硬 件 综 合 设 计 学 生 姓 名: 朱京 学 院(系): 信息科学与工程 专 业 班 级: 电子102班 校内指导教师: 周炯如 专业技术职务: 高级实验师 _ 实 习 单 位: 信息科学与工程学院实验中心 校外指导教师: 职务/职称:

实习时间: 2013 年 6 月 14 日  2013 年 6 月 28 日

RSCHANGE ITY 常州大学硬件实习报告

硬件实习任务书

一、设计题目 六位十进制计数器设计(LED显示计数值) 二、设计背景 七段LED显示屏在很多场合有着广泛的应用,LED显示产品的使用存在于社会的各个角落。如银行利率电子显示屏,价格表电子显示屏,车站班次时刻表,安全天数电子显示屏等。了解LED显示技术及其相关的电路组成和显示控制方法非常重要,在很多智能化仪表中,键盘和显示器是不可能缺少的一部分。 三、设计内容及目的 设计内容: 利用8255键盘显示接口电路,设计一个十进制计数器,对外部脉冲进行计数,计满即清0,用小键盘设置计数值及计数器的启、停.显示器由右向左为个,十,百,千,万。1、C键:清零.2、A键:开始计数,3、D键:停止计数,4、B键:设置计数值。5、E键:程序退出。 设计目的: 1. 进一步撑握8255键盘显示电路的编程方法。 2. 进一步撑握定时器的使用和编程方法。 3. 进一步撑握中断处理程序的编程方法。 四、进度安排 周次 第1周周一 第1周周二 第1周周三 工 作 内 容 选题,图书馆查阅相关资料 系统硬件设计及软件设计 设计成果检查及指导 预 定 目 标 写出该题的过去、现在、未来及应用场合 书面画出系统框图、软件框图并上交 组长汇报方案,完善设计方案 画出系统硬件原理图、软件详细框图 调试好系统,写出硬件实习报告 完善实习报告。 答辩并上交实习报告 第1周周四、周五 完善硬件及软件设计; 第2周一至周二 第2周三周至四 第2周五 完成硬件静态测试、软件调试 完成实习任务; 答辩并验收实习报告 五、设计时间:12 年 4 月 20 到 12 年 6 月 20 日 通信工程 系 指导教师: 周炯如

常州大学硬件实习报告

1. 前言 ............................................................................................................................................................ 1

1.1 设计背景 .......................................................................................................................................... 1 2. 设计要求 .................................................................................................................................................... 1

2.1 设计内容 .......................................................................................................................................... 1 2.2 硬件实习的目的 .............................................................................................................................. 1 3. 硬件设计 .................................................................................................................................................... 1

3.1 设计方案 .......................................................................................................................................... 1 3.2 芯片介绍 ......................................................................................................................................... 2

3.2.1 MCS-51芯片介绍 .............................................................................................................. 2 3.2.2 8255可编程芯片 ........................................................................................................................ 3 3.2.3 74LS138译码器 ......................................................................................................................... 5 3.2.4 74LS373锁存器 ......................................................................................................................... 6 3.3 硬件原理图设计 .............................................................................................................................. 8

3.3.1 并行I/O口扩展 ............................................................................................................... 8 3.3.2 LED数码管驱动及显示设计 ............................................................................................ 8 3.3.3 键盘接口 ............................................................................................................................. 11 3.3.4 最小系统图 ......................................................................................................................... 11

4. 软件设计 .................................................................................................................................................. 13

4.1 程序流程图设计 ............................................................................................................................ 13 4.2程序代码分析 ................................................................................................................................. 14

4.2.1汇编程序代码分析 .............................................................................................................. 14 4.2.2 C语言代码分析 .................................................................................................................. 23

5. 系统调试及分析 ...................................................................................................................................... 29 6. 实物图 ...................................................................................................................................................... 29 7.心得体会 .................................................................................................................................................... 30 8.参考文献 .................................................................................................................................................... 30

常州大学硬件实习报告

1. 前言

1.1 设计背景

七段LED显示屏在很多场合有着广泛的应用,LED显示产品的使用存在于社会的各个角落。如银行利率电子显示屏,价格表电子显示屏,车站班次时刻表,安全天数电子显示屏等。了解LED显示技术及其相关的电路组成和显示控制方法非常重要,在很多智能化仪表中,键盘和显示器是不可能缺少的一部分。

利用数字电路技术数出给定时间内所通过的脉冲数并显示计数结果的数字化仪器。电子计数器是其他数字化仪器的基础。在它的输入通道接入各种模-数变换器,再利用相应的换能器便可制成各种数字化仪器。电子计数器的优点是测量精度高、量程宽、功能多、操作简单、测量速度快、直接显示数字,而且易于实现测量过程自动化,在工业生产和科学实验中得到广泛应用。 电子计数器可具有以下三种基本功能: ①频率测量 ②周期或时间间隔测量 ③累加计数

在这些功能的基础上再增加某些辅助电路或装置,计数器还可完成多周期平均、时间间隔平均、频率比值和频率扩展等功能。电子计数器性能指标主要包括:频率、周期、时间间隔测量范围、输入特性(灵敏度、输入阻抗和波形)、精度、分辨度和误差(计数误差、时基误差和触发误差)等。 电子计数器按功能可分三类:

①通用计数器:可测频率、周期、多周期平均、时间间隔、频率比和累计等。 ②频率计数器:专门用于测量高频和微波频率的计数器,主要用于测频率。

③计算计数器:一种带微处理器的具有计算功能的计数器,除了具有通用计数器的功能之外,还能进行数学运算,求解比较复杂的方程式,可靠程序控制进行测量计算和显示等全部工作。

2. 设计要求

2.1 设计内容

利用8255键盘显示接口电路,设计一个十进制计数器,对外部脉冲进行计数,计满即清0,用小键盘设置计数值及计数器的启、停。显示器由左向右为个,十,百,千,万,十万。1、C键:清零.2、A键:开始计数,3、D键:停止计数,4、B键:设置计数值。4、E键:程序退出。

2.2 硬件实习的目的

(1)进一步撑握8255键盘显示电路的编程方法。

(2)进一步撑握定时器的使用和编程方法。

(3)进一步撑握中断处理程序的编程方法。

(4)进一步掌握8255多个七段码的动态显示方法。

3. 硬件设计

3.1 设计方案

本计数器系统以ATMEL公司生产的单片微处理器AT89C51为核心,外接扩展接口、晶振电路、复位电路、LED驱动电路、键盘接口,外部脉冲等构成,硬件结构框图如图2-6所示。本系统利用单片机的内部振荡器外加石英晶体构成时钟源,为了工作可靠,晶体振荡频率选为11.0592MHz。

1

常州大学硬件实习报告

本系统的计数脉冲信号从外部获取,选用计数器0,T0(P3.4)接手动脉冲,高电平计数。

六位数码管 单 片 机 8255扩展芯片 键盘扫描

图3-1 六位十进制计数系统框图

3.2 芯片介绍

3.2.1 MCS-51芯片介绍

单片微型计算机简称为单片机,又称为微型控制器,是微型计算机的一个重要分支。单片机是70年代中期发展起来的一种大规模集成电路芯片,是CPU、RAM、ROM、I/O接口和中断系统于同一硅片的器件。80年代以来,单片机发展迅速,各类新产品不断涌现,出现了许多高性能新型机种,现已逐渐成为工厂自动化和各控制领域的支柱产业之一。

MCS-51是标准的40引脚双列直插式集成电路芯片,引脚分布如图3-2。

图3-2 MCS-51芯片引脚图

2

常州大学硬件实习报告

按照引脚功能可分为电源引脚VCC与VSS;外接晶振引脚XTAL1与XTAL2;控制和复位引脚ALE,PSEN,EA,RST;32个I/O引脚。其中P2与P0作为地址总线,P2作为地址线的高8位,P0作为地址线的低八位,P0还可以作为数据总线负责传出或传入数据,P1为用户自定义I/O引脚,P3主要作为控制总线,包括了串行输入与输出端,外部中断0,1触发端,定时器0,1外部脉冲计数端,允许读写信号端。

8051单片机内部有4KB的程序存储器,地址范围为0000H到0FFFH,当EA引脚为高电平时,程序存储空间的0000H到0FFFH在单片机内部,1000H到FFFFH在单片机外部;8051单片机内部有128B的数据存储器,地址范围为00H到7FH

8051单片机内部地址范围从80H到FFH为特殊功能寄存区,单片机的输入输出端口,计数器/定时器,串行通信口,累加器以及一些控制寄存器等都在这个地址空间。

8051单片机有5个中断源,分别为外部中断0,外部中断1,时钟中断0,时钟中断1和串行通信中断,这些中断分为两个优先级,每个中断源的优先级都是可编程的

8051单片机有两个16位定时/计数器,通过编程可以实现4中工作方式,内部RAM开设了4个通用工作寄存区,共32个通用寄存器,以适应多种中断或子程序嵌套的使用。

8051单片机有一个功能齐全的指令系统。包括加、减、乘、除等算术运算指令,逻辑运算指令,位操作指令,数据传送指令及多种程序转移指令。

3.2.2 8255可编程芯片

8255A是目前应用最广的可编程并行接口电路。不可编程并行接口电路的特点是电路简单,使用方便。但是,它们在硬件连接好了之后,功能就很难改变。可编程并行接口电路的特点就在于使用灵活,可以在不改变硬件的情况下通过软件编程来改变芯片的功能。8255A可以与MCS-51系统单片机以及外设直接相连,广泛用作外部并行I/O扩展接口。其内部结构图及引脚图如下图3-3。

图3-3 8255内部结构与引脚图

⑴引脚介绍

由图可见,8255由以下几个部分组成:数据端口A、B、C(其中,C口被分成C口上半部分和C口下半部分两个部分),A组和B组控制逻辑,数据总线缓冲器和读/写控制逻辑。8255部包含3个8位的输入输出端口A、B和C,通过外部的24根输入输出线与外设交换数据或进行通信联络。端口A和端口B都可以用作一个8位的输入口或8位的输出口,C口既可以作为一个8位的输入口或

3

常州大学硬件实习报告

输出口用,又可作为两个4位的输入输出口(C口上半部分和C口下半部分)使用,还常常用来配合A口和B口工作,分别用来产生A口和B口的输出控制信号和输入A口和B口的端口状态信号。

⑵内部结构

8255A由数据总线缓冲器、读/写控制逻辑电路、A组和B组控制电路以及数据端口A、B和C组成。数据总线缓冲器是8255A与系统数据总线的接口,CPU输入输出的数据、CPU输出的控制字和外设的状态信息都是通过这个缓冲器传送的。

读/写控制逻辑电路把CPU的控制命令或输出数据送至相应的端口,把外设的状态信息或输入数据通过相应的端口送至CPU。

数据端口PA和PB都包含一个8位输出锁存器/缓冲器和一个8位输入锁存器,PC口包含一个8位输出锁存器/缓冲器和一个8位输入缓冲器(不锁存输入信号)。在工作方式1或方式2下,PC口分成高4位和低4位两个输入口作为PA和PB的控制信号输出或状态信号输入。

CS、A0、A1、RD和WR决定端口的地址。

⑶引脚功能

8255A的引脚功能如表3-1所示。 ①数据总线(8条):D0~D7,用于传送CPU和8255A间的数据、命令和状态字。 ②控制总线(6条):

·RESET:复位信号,高电平有效。该信号有效时,将8255控制寄存器内容都清0,并将所有的端口(A、B和C)都置成输入方式。

·CS:片选信号,低电平有效,由地址总线经I/O端口译码电路产生。只有当该信号有效时,CPU与8255之间才能进行通信,也就是CPU可对8255进行读/写等操作。 ·/RD、/WR:/RD为读命令线,/WR为写命令线,皆为低电平有效。

·A0、A1:用于选中PA、PB、PC口和控制寄存器中哪一个工作。当A1A0=000时,选中端口A;A1A0=01时,选中端口B;A1A0=10时,选中端口C;A1A0=11时,选中控制字寄存器端口。 ③并行I/O总线(24条):用于和外设相连,共分A、B、C三组。

4

常州大学硬件实习报告 表3-1 8255引脚功能表

⑷8255A控制字

8222A有两类控制字,一类控制字用于定义各端口的工作方式,称为方式选择控制字;另一类控制字用于对C端口的任一位进行置位或复位操作,称为置位复位控制字。对8255A进行编程时,这两种控制字都被写入控制字寄存器中。但方式选择控制字的D7位总是1,而置位复位控制字的D7位总是0。8255A正是利用这一位来区分这两个写入同一端口的不同控制字的,D7位也称为这两个控制字的标志位。

8255A具有3种基本的工作方式,在对8255A进行初始化编程时,应向控制字寄存器写入方式选择控制字,用来规定8255A各端口的工作方式。这3种基本工作方式是:方式0—基本输入输出方式;方式1—选通输入输出方式;方式2—双向总线I/O方式。

当系统复位时,8255A的RESET输入端为高电平,使8255A复位,所有的数据端口都被置成输入方式;当复位信号撤除后,8255A继续保持复位时预置的输入方式。如果希望它以这种方式工作,就不用另外再进行初始化。

通过用输出指令对8255A的控制字寄存器编程,写入设定工作方式的控制字,可以让3个数据口以不同的方式工作。其中,端口A可工作于3种方式中的任一种;端口B只能工作于方式0和方式1,而不能工作于方式2;端口C常被分成两个4位的端口,除了用作输入输出端口外,还能用来配合A口和B口工作,为这两个端口的输入输出操作提供联络信号。 方式选择控制字的格式如图3-4所示:

D71D6D5D4A 口 I/O D3C 口高4位 I/O D2B 组方式 D1B 口 I/O D0C 口低4位 I/O A 组方式 00=方式 0 0= OUT 0= OUT1= IN01=方式 11= IN1X=方式 20=方式 0 0= OUT 0= OUT1= IN1=方式11= IN图3-4 方式选择控制字格式

其中,D7位为标志位,它必须等于1;D6D5位用于选择A口的工作方式;D2位用于选择B口的工作方式;其余4位分别用于选择A口、B口、C口高4位和C口低4位的输入输出功能,置1时表示输入,置0表示输出。

3.2.3 74LS138译码器

当一个选通端(S1)为高电平,另两个选通端(/S2和/S3)为低电平时,可将地址端(A0、A1、A2)的二进制编码在Y0至Y7对应的输出端以低电平译出。比如:A2A1A0=110时,则Y6输出端输出低电平信号,引脚功能如表3-2.。

利用 E1、E2和E3可级联扩展成 24 线译码器;若外接一个反相器还可级联扩展成 32 线译码器。若将选通端中的一个作为数据输入端时,74LS138还可作数据分配。

5

常州大学硬件实习报告

图3-5 74LS138引脚图 表3-2 三八译码器真值表

3.2.4 74LS373锁存器

373为三态输出的八 D 透明锁存器,共有54S373 和 74LS373 两种线路。我们使用的是74LS373,其引脚图如下图3-6。

表3-3 74LS373真值表 图3-6 74LS373引脚图

引出端符号:D0~D7是数据输入端;/OE是三态允许控制端(低电平有效);LE是锁存允许端;Q0~Q7是输出端。其引脚功能如表3-3所示。

当三态允许控制端 /OE 为低电平时,Q0~Q7为正常逻辑状态,可用来驱动负载或总线。当 /OE 为高电平时,Q0~Q7 呈高阻态,即不驱动总线,也不为总线的负载,但锁存器内部的逻辑操作不受影响。

当锁存允许端 LE 为高电平时,Q 随数据 D 而变。当 LE 为低电平时,D 被锁存在已建立的数据电平。当 LE 端施密特触发器的输入滞后作用,使交流和直流噪声抗扰度被改善 400mV。

6

常州大学硬件实习报告

3.2.5 74LS04反相器

74LS04是反相器。其结构图和真值表如图3-7。

图3-7 74LS04结构图和真值表

由真值表可知,当输入为高电平时,输出为低电平;当输入为低电平时,输出为高电平。

7

常州大学硬件实习报告

3.3 硬件原理图设计

3.3.1 并行I/O口扩展

8255A可以工作在3种工作方式,图3-8是其一种接口逻辑。

图3-8 I/O接口扩展电路

单片机的P0口作数据总线,引到8255芯片的数据输入端D0~D7,用于传送CPU和8255A间的数据、命令和状态字。

P0经过锁存器用作地址总线,锁存器的Q0,Q1接到8255的口地址选择信号线A0,A1,用来选择8255的输出端口PA、PB和PC;锁存器的Q3、Q4、Q5接到译码器的地址端(A、B、C),译出Q3、Q4、Q5的编码信号;Q6和Q7接译码器的使能端/E2和/E3。P2.7接译码器的使能端E1,高电平有效。

控制线有/RD、/WR、RESET、/CS。

3.3.2 LED数码管驱动及显示设计 ⑴ LED数码管介绍

按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管,共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮,当某一字段的阴极为高电平时,相应字段就不亮。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管,共阴数码管在应用时应将公共极COM接

到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮,当某一字段的阳极为低电平时,相应字段就不亮。数码管的外形及其结构如图3-9及3-10。

8

常州大学硬件实习报告

图3-9数码管外形图 图3-10数码管结构图

此次使用到的是共阳极数码管,低电平点亮,每个字符对应的编码如下图所示:

表3-4 LED字符编码表

⑵驱动设计方案 ①静态显示驱动

静态驱动也称直流驱动。静态驱动是指每个数码管的每一个段码都由一个单片机的I/O端口进行驱动,或者使用如BCD码二-十进制译码器译码进行驱动。静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O端口多,如驱动6个数码管静态显示则需要6×8=48根I/O端口来驱动。实际应用时必须增加译码驱动器进行驱动,增加了硬件电路的复杂性。

②动态显示驱动

动态驱动是将所有数码管的显示的每一段\"a,b,c,d,e,f,g,dp\"的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动。在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管

9

常州大学硬件实习报告

的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。

需要点亮6个数码管,经以上论证分析,我们选用更为灵活的动态显示。 ⑶LED驱动及显示

8255A的PA口用来段选,以控制每个数码管显示的字形。PA后接反相器,所以当PA口输出高电平时LED被点亮,如图3-11所示。

图3-11 LED驱动原理图

8255A的PC口的PC3~PC5后接3-8译码器用来位选,位选表3-5如下:

PC5 0 0 0 0 1 1 PC4 0 0 1 1 0 0

PC3 0 1 0 1 0 1 PC口 00H 08H 10H 18H 20H 28H 选中的数码管 8(个位) 7(十位) 6(百位) 5(千位) 4(万位) 3(十万位) 表3-5 LED位选表

10

常州大学硬件实习报告

3.3.3 键盘接口

如图3-12所示,8255A的PC口作扫描线,输出键盘的扫描信号,PB口作输入口,用来接收键盘读入的信号。先给PC0赋值0,扫描键盘第一行,若PB口不全为高电平,则先延时10ms去抖动,然后接着读B口,若仍不全为高,说明确实有键按下,由B口的低电平可确定按键。

图3-12 键盘接口电路

3.3.4 最小系统图

11

1C1C2RP2U4123ABC22pF22pF23456789

RP3RESPACK-8X1U5U2U1119XTAL1CRYSTAL18XTAL29111OELE74LS3736CS74LS138RDWRA0A1RESETRSTP0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7645E1E2E33938373635343332D0D1D2D3D4D5D6D7Q0Q1Q2Q3Q4Q5Q6Q7Y0Y1Y2Y3Y4Y5Y6Y7D0D1D2D3D4D5D6D7PA0PA1PA2PA3PA4PA5PA6PA7D0D1D2D3D4D5D6D734781314171825691215161915141312111097432140393837D0D1D2D3D4D5D6D7D034D133D232D331D430D529D628D727U7:CU7:DU7:E6U7:F1210U:A748LS048U:B748LS042U:C748LS044U:D748LS0423456789RESPACK-8R1C31k293031PSENALEEA 图3-13 最小系统图

常州大学硬件实习报告

12

1011121314151617PC0PC1PC2PC3PC4PC5PC6PC78255A141516171312111010uFP2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15PC0PC11232122232425262728PB0PB1PB2PB3PB4PB5PB6PB753698351819202122232425513119135674LS04131274LS0474LS04PB074LS04PB1PB2PB3PB4PB5PB6PB7R21kU3ABC12345678P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD80C51645E1E2E374LS138Y0Y1Y2Y3Y4Y5Y6Y7151413121110971351311913U6:AU6:BU6:C2U6:D46U:E746LS0412U:F746LS0410U:A747LS048U:B747LS04274LS04474LS0474LS0474LS04PC0RP1123456789RESPACK-8PC1PB0PB1PB2PB3PB4PB5PB6PB7 常州大学硬件实习报告

4.软件设计

4.1 程序流程图设计 (1)主程序

开始 A键,按下开 始计数 调用 start()函 外部中数,开断,对外部脉冲计数 调用zhishu()函数,键盘扫描置数值 调用clear()函数,数码管清零 调用ending()函数,关外部中断 调用exit()函数,退出所有程序 调用keyscan()函数,判断按键值 按下B键,设置计数值 按下C键,计数器清零 按下D键,停止计数 按下E键,退出程序 外部 脉 冲 计 数 数码管显示 结束 图4-1 主程序流程图

13

常州大学硬件实习报告

(2)置数

i<6 N

Y 按键扫描 数码管显示

转主程序 图4-2 置数模块框图

4.2程序代码分析

Y

置数 4.2.1汇编程序代码分析

C8255 EQU 0F22BH ;8255命令口地址 P8255A EQU 0F228H ;8255 PA口地址 P8255B EQU 0F229H ;8255 PB口地址 P8255C EQU 0F22AH ;8255 PC口地址

ORG 0000H

LJMP MAIN ORG 0020H

MAIN: MOV SP,#60H MOV TMOD,#05H ;P3.4脉冲:设定定时器T0为计数模式 MOV TH0,#00H

14

常州大学硬件实习报告

MOV TL0,#00H

MOV 36H,#00H ;存TL0,判断是否加1

MOV 30H,#00H ;个位 MOV 31H,#00H ;十位 MOV 32H,#00H ;百位 MOV 33H,#00H ;千位 MOV 34H,#00H ;万位 MOV 35H,#00H ;十万位

PANDUAN:

MOV DPTR,#C8255 ;写8255控制字 MOV A,#82H MOVX @DPTR,A MOV A,#01H ;扫描键盘第二行 MOV DPTR,#P8255C MOVX @DPTR,A MOV DPTR,#P8255B MOVX A,@DPTR CJNE A,#0FFH,KEYA ;有键按下则判断功能 LJMP DISP ;无键则显示当前计数值 KEYA: CJNE A,#0FBH,KEYB LCALL START ;开始计数 LJMP DISP KEYB: CJNE A,#0F7H,KEYC LJMP ZHSH ;置数

KEYC:

CJNE A,#0EFH,KEYD LCALL CLEAR ;清零 LJMP DISP KEYD: CJNE A,#0DFH,KEYE LCALL ENDING ;停止计数 LJMP DISP KEYE:

15

常州大学硬件实习报告

CJNE A,#0BFH,PANDUAN LJMP EXIT ;程序退出

;******************************************************************** START: SETB TR0 RET

;-------------------------------------------------- ZHSH:

KEY_L0:

MOV A,#02H ;键盘扫描第一行 MOV DPTR,#P8255C MOVX @DPTR,A MOV DPTR,#P8255B MOVX A,@DPTR

CJNE A,#0FFH,J_KEY_L0;判键是否按下,有键转J_KEY_L0 SJMP KEY_L1 ;无键扫描第二行 J_KEY_L0:

LCALL DELAY0 ;延时消抖 MOV DPTR,#P8255B ;读键值 MOVX A,@DPTR MOV R1,#00H ;键值从0开始 SJMP KEYCAL ;计算键值 KEY_L1:

MOV A,#01H ;扫描第二行 MOV DPTR,#P8255C MOVX @DPTR,A MOV DPTR,#P8255B

MOVX A,@DPTR

CJNE A,#0FFH,KEY8

LJMP XIANSHI ;无按键则显示 KEY8: CJNE A,#0FEH,KEY9 MOV R1,#08 ;给个位赋值8 SJMP CALC

16

常州大学硬件实习报告

KEY9: CJNE A,#0FDH,PANDUAN MOV R1,#09 ;给各位赋值9 LJMP CALC ;读取键值

KEYCAL: ;计算键码

MOV R0,#08H ;最多右移8次 SHIFT:

RRC A ;A右移,最低位进入C JNC CALC ;C为0转CALC

INC R1 ;R1的值就是键值 DJNZ R0,SHIFT

CALC: ;当前值左移,R1的值给个位 MOV 35H,34H MOV 34H,33H MOV 33H,32H MOV 32H,31H MOV 31H,30H MOV 30H,R1 SJMP KEYWAIT

KEYWAIT: MOV DPTR,#P8255B ;等待键释放 MOVX A,@DPTR CJNE A,#0FFH,KEYWAIT XIANSHI: MOV DPTR,#P8255C;位选 MOV A,#00H MOVX @DPTR,A MOV DPTR,#LED

MOV A,30H

MOVC A,@A+DPTR MOV DPTR,#P8255A MOVX @DPTR,A LCALL DELAY0

MOV DPTR,#P8255C;位选 MOV A,#08H

17

常州大学硬件实习报告

MOVX @DPTR,A MOV DPTR,#LED MOV A,31H

MOVC A,@A+DPTR MOV DPTR,#P8255A MOVX @DPTR,A LCALL DELAY0

MOV DPTR,#P8255C;位选 MOV A,#10H MOVX @DPTR,A MOV DPTR,#LED MOV A,32H

MOVC A,@A+DPTR MOV DPTR,#P8255A MOVX @DPTR,A LCALL DELAY0

MOV DPTR,#P8255C;位选 MOV A,#18H MOVX @DPTR,A MOV DPTR,#LED MOV A,33H

MOVC A,@A+DPTR MOV DPTR,#P8255A MOVX @DPTR,A LCALL DELAY0

MOV DPTR,#P8255C;位选 MOV A,#20H MOVX @DPTR,A MOV DPTR,#LED MOV A,34H

MOVC A,@A+DPTR MOV DPTR,#P8255A MOVX @DPTR,A LCALL DELAY0

18

常州大学硬件实习报告

MOV DPTR,#P8255C;位选 MOV A,#28H

MOVX @DPTR,A MOV DPTR,#LED MOV A,35H

MOVC A,@A+DPTR MOV DPTR,#P8255A MOVX @DPTR,A

LCALL DELAY0

LJMP KEY_L0

;-------------------------------------------------- CLEAR: MOV 30H,#00H MOV 31H,#00H MOV 32H,#00H MOV 33H,#00H MOV 34H,#00H MOV 35H,#00H MOV TH0,#00H MOV TL0,#00H MOV 36H,#00H RET

;---------------------------------------------------- ENDING: CLR TR0 RET

;----------------------------------------------------

DISP: MOV DPTR,#P8255C;位选 MOV A,#00H

MOVX @DPTR,A MOV DPTR,#LED MOV A,30H

MOVC A,@A+DPTR MOV DPTR,#P8255A MOVX @DPTR,A

LCALL DELAY0

19

常州大学硬件实习报告

MOV DPTR,#P8255C;位选 MOV A,#08H

MOVX @DPTR,A MOV DPTR,#LED MOV A,31H

MOVC A,@A+DPTR MOV DPTR,#P8255A MOVX @DPTR,A LCALL DELAY0

MOV DPTR,#P8255C;位选 MOV A,#10H

MOVX @DPTR,A MOV DPTR,#LED MOV A,32H

MOVC A,@A+DPTR MOV DPTR,#P8255A MOVX @DPTR,A LCALL DELAY0

MOV DPTR,#P8255C;位选 MOV A,#18H

MOVX @DPTR,A MOV DPTR,#LED MOV A,33H

MOVC A,@A+DPTR MOV DPTR,#P8255A MOVX @DPTR,A LCALL DELAY0

MOV DPTR,#P8255C;位选 MOV A,#20H

MOVX @DPTR,A MOV DPTR,#LED MOV A,34H

MOVC A,@A+DPTR MOV DPTR,#P8255A

20

常州大学硬件实习报告

MOVX @DPTR,A LCALL DELAY0

MOV DPTR,#P8255C;位选 MOV A,#28H

MOVX @DPTR,A MOV DPTR,#LED MOV A,35H

MOVC A,@A+DPTR

MOV DPTR,#P8255A

MOVX @DPTR,A LCALL DELAY0

LOOP: MOV A,TL0 CJNE A,36H,D0 AJMP PANDUAN D0: MOV 36H,A MOV A,30H CJNE A,#09H,D1 MOV A,31H

CJNE A,#09H,D2 MOV A,32H

CJNE A,#09H,D3 MOV A,33H

CJNE A,#09H,D4 MOV A,34H

CJNE A,#09H,D5 MOV A,35H

CJNE A,#09H,D6 MOV 30H,#00H MOV 31H,#00H MOV 32H,#00H MOV 33H,#00H MOV 34H,#00H

MOV 35H,#00H

;判断是否要加1 ;没有脉冲则判断有无功能键按下 ;TL0的值给36H供下一次判断 ;因为是十进制计数器所以要满10高位进位,低 位清零。

21

常州大学硬件实习报告

AJMP PANDUAN D1: MOV A,30H INC A MOV 30H,A AJMP PANDUAN D2: MOV A,31H INC A MOV 31H,A MOV 30H,#00H AJMP PANDUAN D3: MOV A,32H INC A MOV 32H,A MOV 30H,#00H MOV 31H,#00H AJMP PANDUAN D4:

MOV A,33H INC A MOV 33H,A MOV 30H,#00H MOV 31H,#00H MOV 32H,#00H AJMP PANDUAN D5: MOV A,34H INC A MOV 34H,A MOV 30H,#00H MOV 31H,#00H MOV 32H,#00H MOV 33H,#00H AJMP PANDUAN D6:

22

常州大学硬件实习报告

MOV A,35H INC A

MOV 35H,A MOV 30H,#00H MOV 31H,#00H MOV 32H,#00H MOV 33H,#00H MOV 34H,#00H AJMP PANDUAN

DELAY0: MOV R0,#80H ;延时20MS子程序 DELAY1:

MOV R3,#05H DJNZ R3,$

DJNZ R0,DELAY1

RET

LED: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH

EXIT: END

4.2.2 C语言代码分析

#include #include

#define PA XBYTE[0xF228] //8255 PA口地址 #define PB XBYTE[0xF229] //8255 PB口地址 #define PC XBYTE[0xF22A] //8255 PC口地址 #define COM XBYTE[0xF22B] //8255 命令口地址 unsigned char code dofly_DuanMa[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; // 显示段码值0~9 unsigned char code dofly_WeiMa[]={0x28,0x20,0x18,0x10,0x08,0}; //分别对应相应的数码管点亮,即位码

unsigned char TempData[6]={0x3f,0x3f,0x3f,0x3f,0x3f,0x3f};//存储显示值的全局变量 unsigned int num1; unsigned char a;

void Display(unsigned char FirstBit,unsigned char Num); //显示函数 unsigned char KeyScan(void); //键盘扫描 void DelayUs2x(unsigned char t); //us级延时函数 void DelayMs(unsigned char t); //ms级延时函数

23

常州大学硬件实习报告

void start(void); //开始计数 void zhishu(void); //置数 void clear(void); //清零 void ending(void); //停止计数 void exit(void); //退出程序 unsigned char zhsh(void); void main() { unsigned char i; while(1) { switch(KeyScan()) { case'A': start(); break; case'B': zhishu(); break; case'C': clear(); break; case'D': ending(); break; case'E': exit(); break; default: break; } i=10; while(i--) { Display(0,6); } } }

unsigned char KeyScan(void) //键盘扫描函数,使用行列逐级扫描法 { unsigned char val; COM=0x82; PC|=0x01; //扫描第二行 PB=0xff; if(PB!= 0xff && PC=0x01) { DelayMs(10); if( PB!=0xff) { switch(PB) { case 0xfe: val=8; break; case 0xfd: val=9; break;

24

常州大学硬件实习报告

case 0xfb: val='A'; break; case 0xf7: val='B'; break; case 0xef: val='C'; break; case 0xdf: val='D'; break; case 0xbf: val='E'; break; case 0x7f: val='E'; break; default: break; } while( PB!=0xff); return val; } } PC|=0x02; //扫描第一行 PB=0xff; if(PB!=0xff && PC=0x02) { DelayMs(10); if(PB!=0xff) { switch(PB) { case 0xfe: val=0; break; case 0xfd: val=1; break; case 0xfb: val=2; break; case 0xf7: val=3; break; case 0xef: val=4; break; case 0xdf: val=5; break; case 0xbf: val=6; break; case 0x7f: val=7; break; default: break; } while(PB!=0xff); return val; } } return 0xff; }

void DelayUs2x(unsigned char t) {

while(--t); }

void DelayMs(unsigned char t) {

25

常州大学硬件实习报告

while(t--) {

//大致延时1mS DelayUs2x(245); DelayUs2x(245); } }

void Display(unsigned char FirstBit,unsigned char Num) { unsigned char i; for(i=0;ivoid start(void) {

EA=1;

EX0=1; //外部中断0开 IT0=1; //边沿触发 }

unsigned char zhsh(void) { unsigned char val; while(1) { Display(0,6); PC|=0x02; //扫描第一行 PB=0xff; if(PB!=0xff && PC=0x02) { DelayMs(10); if(PB!=0xff) { switch(PB) { case 0xfe: val=0; break; case 0xfd: val=1; break; case 0xfb: val=2; break; case 0xf7: val=3; break; case 0xef: val=4; break;

26

常州大学硬件实习报告

case 0xdf: val=5; break; case 0xbf: val=6; break; case 0x7f: val=7; break; default: break; } while(PB!=0xff); return val; } } PC|=0x01; //扫描第二行 PB=0xff; if(PB!= 0xff && PC=0x01) { DelayMs(10); if( PB!=0xff) { switch(PB) { case 0xfe: val=8; break; case 0xfd: val=9; break; } while( PB!=0xff); return val; } } } }

void zhishu(void) { unsigned char k,i; unsigned char temp[6]; i=0; while(i<6) { // k=zhsh(); temp[i]=k; TempData[i]=dofly_DuanMa[k]; // DelayMs(20); Display(0,6);

27

常州大学硬件实习报告

i++; } a=(temp[0]*10+temp[1]); num1=(temp[2]*1000+temp[3]*100+temp[4]*10+temp[5]); }

void clear(void) { unsigned char j; // ending(); for(j=0;j<6;j++) { TempData[j]=0x3f; } num1=0; a=0; }

void ending(void) { EX0=0; }

void exit(void) { unsigned char i; for(i=0;i<6;i++) { TempData[i]=0; } EA=0; EX0=0; a=0; num1=0; }

void count(void) interrupt 0 { num1++; if(num1<=9999) { TempData[0]=dofly_DuanMa[a/10];//分解显示信息,如要显示68,则68/10=6 TempData[1]=dofly_DuanMa[a%10]; TempData[2]=dofly_DuanMa[num1/1000]; TempData[3]=dofly_DuanMa[(num1/100)%10];

28

68%10=8 常州大学硬件实习报告

}

TempData[4]=dofly_DuanMa[(num1/10)%10]; TempData[5]=dofly_DuanMa[num1%10];

} else { a++; num1=0; }

5. 系统调试及分析

1.在置数的时候,出现了不能有效置数的情况。连续调了好几天,都没有解决。后来对置数功能进行单步调试,发现了问题是没有对变量i进行初始化。使i是一个未定义的值没有进入循环。 2.在用C语言编程的时候出现了CODE SPACE MEMORY OVERLAP的问题,即地址重叠。原因是两个中断共用了一个地址。

3. MULTIPLE PUBLIC DEFINITIONS 是指重复定义,把你的头文件中的变量定义前加extern(只是变量声明不用初始化),再在某一个你要调用该变量的c文件的程序之前再定义。

6.实物图

1.置数981357

29

常州大学硬件实习报告

2.停止计数

3.清零

7.心得体会

每一件好的产品都需要创新的意识,严谨的科研作风,实事求是的工作态度,夜以继日的付出以及一个优秀的团体。这次课程设计,我们小组就是按照这样的要求来严于律己的,使得这次课程设计得以圆满的完成。

回首做课程设计的两个星期,从一开始分析课题到最后的调试成功,过程是曲折的,但却很充实。期间,我们应用到了数字电路,汇编语言,单片机接口技术等相关知识。通过写代码,硬件调试,不仅巩固了理论,而且有效的和实际结合在了一起,将理论付诸实践。

通过两个星期的单片机实习,我充分了解了单片机的各个引脚、8255扩展芯片的功能以及74LS138译码器。这次课程设计告诉了我模块化设计的重要性,把一个大的工程分成几个

模块分别编写和调试,提高了工作的效率,减少了出错的概率,也有利于调试的时候排查错误。

最后我们的设计结果是符合题意的,但我们不只在乎这一结果,更加在乎的,是这个过程。这个过程中,我们花费了大量的时间和精力,更重要的是,我们在学会创新的基础上,同时还懂得合作精神的重要性,学会了与他人合作。作为一名电子专业的大三学生,我觉得做类似单片机实习是十分必要的。我们在课堂上掌握的仅仅是专业课的理论知识,如何去锻炼我们的实践能力?如何把我们所学的专业基础课理论知识运用到实践中去呢?我想做类似实习就为我们提供了良好的发挥平台。

8.参考文献

【1】赵德安.《单片机原理与应用 第2版》.北京:机械工业出版社,2009.4 【2】周炯如,潘操.《EAT598单片机应用开发系统 实验指导书》.常州:常州大学出版

社,2010.7

【3】彭伟.《单片机C语言程序设计实训100例》.北京:北京航空航天出版社,2010.5

30

因篇幅问题不能全部显示,请点此查看更多更全内容