最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

Proteus仿真单片机实验

IT圈 admin 28浏览 0评论

2024年10月13日发(作者:公羊雯)

目录

引言.................................................................................................... 2

实验1 PROTUES环境及LED闪烁综合实验 ............................ 7

实验2 多路开关状态指示............................................................. 10

实验3 报警产生器......................................................................... 13

实验4 I/O并行口直接驱动LED显示 ...................................... 16

实验5 按键识别方法之一............................................................. 19

实验6 一键多功能按键识别技术................................................. 22

实验7 定时计数器T0作定时应用技术 ...................................... 25

实验8定时计数器T0作定时应用技术 ....................................... 28

实验9 “嘀、嘀、……”报警声 ................................................... 32

实验10 8X8 LED点阵显示技术 ................................................ 36

实验11电子琴 ................................................................................ 40

1

引言

单片机体积小,重量轻,具有很强的灵活性而且价格便宜,具有逻辑判断,定时计数等多

种功能,广泛应用于仪器仪表,家用电器,医用设备的智能化管理和过程控制等领域。以单

片机为核心的嵌入式系统已经成为目前电子设计最活跃的领域之一。在嵌入式系统的中,开

发板成本高,特别是对于大量的初学者而言,还可能由于设计的错误导致开发板损坏。利用

Proteus我们可以很好地解决这个问题,由此我们可以快速地建立一个单片机仿真系统。

1. Proteus介绍

Proteus是英国Labcenter Electronics公司开发的一款电路仿真软件,软件由两部分组成:

一部分是智能原理图输入系统ISIS(Intelligent Schematic Input System)和虚拟系统模型

VSM(Virtual Model System);另一部分是高级布线及编辑软件ARES

(Advanced Routing and Editing Software)也就是PCB。

1.1 Proteus VSM的仿真

Proteus可以仿真模拟电路及数字电路,也可以仿真模拟数字混合电路。

Proteus可提供30多种元件库,超过8000种模拟、数字元器件。可以按照设计的要求

选择不同生产厂家的元器件。此外,对于元器件库中没有的元件,设计者也可以通过软件自

己创建。

除拥有丰富的元器件外,Proteus还提供了各种虚拟仪器,如常用的电流表,电压表,

示波器,计数/定时/频率计,SPI调试器等虚拟终端。支持图形化的分析功能等。

Proteus特别适合对嵌入式系统进行软硬件协同设计与仿真,其最大的特点是可以仿真

8051,PIA,AVR,ARM等多种系列的处理器。Protues包含强大的调试工具,具有对寄存

器和存储器、断点和单步模式IAR C-SPY, Keil, MPLAB等开发工具的源程序进行调试的功

能;能够观察代码在仿真硬件上的实时运行效果;对显示,按钮,键盘等外设的交互可视化

进行仿真。

1.2 Proteus PCB

Proteus 的PCB设计除了有自动布线仿真功能外,还集成了PCB设计,支持多达16个

布线层,可以任意角度放置元件和焊接连线;集成了高智能的布线算法,可以方便地进行

PCB设计。

2. 一个基于Protesus的单片机实例

2.1 软件的编写

本例题采用8个LED,编写程序使之闪烁起来。

2

软件的编写是采用汇编语言,芯片的型号选择AT89C51, 编写文件,利用

Proteus本身的51汇编功能进行编译,编译成功后生成文件。

2.2 绘制电路图

运行Proteus的ISIS,进入仿真软件的主界面,如图1所示。主界面分为菜单栏,工具

栏,模型显示窗口,模型选择区,元件列表区等。

图1 ISIS启动界面

通过左侧的工具栏区的P(从库中选择元件)命令,在Pick devices窗口中选择系统所需元

器件,还可以选择元件的类别,生产厂家等。本例所需主要元器件有:AT89C51芯片,电

阻、电容、石英晶振和发光二极管,详见表1。

表1 元器件清单

选择元器件后连接图2所示电路。

3

图2 电路原理图

Microproccessor ICs类的芯片的引脚与实际的芯片基本相同, 唯一的差别是隐去了GND

和VCC引脚,系统默认的是把它们分别连接到地和+5V直流电源。故在电路连线时可以不

考虑电源和地的连接。

电路连接完成后,选中AT89C51单击鼠标左键,打开“Edit Component”对话窗口如图3

所示,可以直接在“Clock Frequency”后进行频率设定,设定单片机的时钟频率为12MHz。在

“Add/remove source file”栏中选择已经编好的文件,然后单击“OK”按钮保存设计。

至此,就可以进行单片机的仿真。

4

图 3 单片机属性的设定

2.3 Proteus仿真结果

单片机的仿真结果图如图4,模拟信号经A/D转换后,结果送入单片机,再在数码管上

显示;通过调节可调电阻的阻值,可以得到不同的显示结果。仿真结果表明,系统达到了预

先的设计要求。

在仿真的过程中每个管脚旁边会出现一个小方块,红色的方快表示高电平,蓝色的表示

低电平。 通过方快颜色的变化可以很方便地知道每个管脚电平的变化,从而能对系统的运

行有更直观的了解,这对程序的调试有很大的帮助。

5

图4 仿真结果

3.总结

本文结合一个LED闪烁的单片机电路详细说明了Proteus在单片机开发中的应用。可以

看出,Proteus功能十分强大,能仿真各种数字模拟电路,且操作简单,使用方便。能快速

地进行单片机仿真,加快系统开发的过程,降低开发成本。

6

实验1 PROTUES环境及LED闪烁综合实验

1. 实验任务

做单一灯的左移右移,硬件电路如图所示,八个发光二极管L1-L8分别接在单片机

的P1.0-P1.7接口上,输出“0”时,发光二极管亮,开始时P1.0→P1.1→P1.2→P1.3→┅

→P1.7→P1.6→┅→P1.0亮,重复循环。

2. 电路原理图

图1

3. 程序设计内容

我们可以运用输出端口指令MOV P1,A或MOV P1,#DATA,只要给累加器值

或常数值,然后执行上述的指令,即可达到输出控制的动作。

每次送出的数据是不同,具体的数据如下表1所示 :

P1.7 P1.6 P1.5 P1.4 P1.3 P1.2 P1.1 P1.0

L8 L7 L6 L5 L4 L3 L2 L1

1 1 1 1 1 1 1 0

1 1 1 1 1 1 0 1

1 1 1 1 1 0 1 1

7

说明

L1亮

L2亮

L3亮

1

1

1

1

0

1

1

1

0

1

1

1

0

1

1

1

0

1

1

1

0

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

L4亮

L5亮

L6亮

L7亮

L8亮

4. 程序框图

图2

5. 汇编源程序

ORG 0

START: MOV R2,#8

MOV A,#0FEH

SETB C

LOOP: MOV P1,A

LCALL DELAY

RLC A

DJNZ R2,LOOP

MOV R2,#8

LOOP1: MOV P1,A

LCALL DELAY

RRC A

DJNZ R2,LOOP1

LJMP START

DELAY: MOV R5,#20 ;

D1: MOV R6,#20

8

D2: MOV R7,#248

DJNZ R7,$

DJNZ R6,D2

DJNZ R5,D1

RET

END

9

实验2 多路开关状态指示

1. 实验任务

如图1所示,AT89S51单片机的P1.0-P1.3接四个发光二极管L1-L4,P1.4-P1.7

接了四个开关K1-K4,编程将开关的状态反映到发光二极管上。(开关闭合,对应的灯亮,

开关断开,对应的灯灭)。

2. 电路原理图

图1

3. 程序设计内容

3.1 开关状态检测

对于开关状态检测,相对单片机来说,是输入关系,我们可轮流检测每个开关状态,

10

根据每个开关的状态让相应的发光二极管指示,可以采用JB P1.X,REL或JNB P1.X,

REL指令来完成;也可以一次性检测四路开关状态,然后让其指示,可以采用MOV A,

P1指令一次把P1端口的状态全部读入,然后取高4位的状态来指示。

3.2 输出控制

根据开关的状态,由发光二极管L1-L4来指示,我们可以用SETB P1.X和CLR

P1.X指令来完成,也可以采用MOV P1,#1111XXXXB方法一次指示。

4. 程序框图

读P1口数据到A

CC

A

CC

内容右移4次

A

CC

内容与F0H相或

A

CC

内容送入P1口

图2

5. 解决方案

方法一(汇编源程序)

ORG 00H

START: MOV A,P1

ANL A,#0F0H

RR A

11

RR A

RR A

RR A

ORl A,#0F0H

MOV P1,A

SJMP START

END

方法二(汇编源程序)

ORG 00H

START: JB P1.4,NEXT1

CLR P1.0

SJMP NEX1

NEXT1: SETB P1.0

NEX1: JB P1.5,NEXT2

CLR P1.1

SJMP NEX2

NEXT2: SETB P1.1

NEX2: JB P1.6,NEXT3

CLR P1.2

SJMP NEX3

NEXT3: SETB P1.2

NEX3: JB P1.7,NEXT4

CLR P1.3

SJMP NEX4

NEXT4: SETB P1.3

NEX4: SJMP START

END

12

实验3 报警产生器

1. 实验任务

用P1.0输出1KHz和500Hz的音频信号驱动扬声器,作报警信号,要求1KHz信号响

100ms,500Hz信号响200ms,交替进行,P1.7接一开关进行控制,当开关合上响报警信号,

当开关断开告警信号停止,编出程序。

2. 电路原理图

图1

3. 程序设计内容

3.1 信号产生的方法

500Hz信号周期为2ms,信号电平为每1ms变反1次,1KHz的信号周期为1ms,信号

电平每500us变反1次;

13

4. 程序框图

图2

5. 汇编源程序

FLAG BIT 00H

ORG 00H

START: JB P1.7,START

JNB FLAG,NEXT

MOV R2,#200

DV: CPL P1.0

LCALL DELY500

LCALL DELY500

DJNZ R2,DV

CPL FLAG

NEXT: MOV R2,#200

DV1: CPL P1.0

LCALL DELY500

DJNZ R2,DV1

14

CPL FLAG

SJMP START

DELY500: MOV R7,#250

LOOP: NOP

DJNZ R7,LOOP

RET

END

15

实验4 I/O并行口直接驱动LED显示

1. 实验任务

如图1所示,利用AT89S51单片机的P0端口的P0.0-P0.7连接到一个共阴数码管的

a-h的笔段上,数码管的公共端接地。在数码管上循环显示0-9数字,时间间隔0.2秒。

2. 电路原理图

图1

3 程序设计内容

(1) LED数码显示原理

七段LED显示器内部由七个条形发光二极管和一个小圆点发光二极管组成,根据各管

的极管的接线形式,可分成共阴极型和共阳极型。

16

LED数码管的g~a七个发光二极管因加正电压而发亮,因加零电压而不以发亮,不同

亮暗的组合就能形成不同的字形,这种组合称之为字形码,下面给出共阴极的字形码见表2

“0”

“1”

“2”

“3”

“4”

“5”

“6”

“7”

3FH

06H

5BH

4FH

66H

6DH

7DH

07H

“8”

“9”

“A”

“b”

“C”

“d”

“E”

“F”

7FH

6FH

77H

7CH

39H

5EH

79H

71H

(2) 由于显示的数字0-9的字形码没有规律可循,只能采用查表的方式来完成我们所需

的要求了。这样我们按着数字0-9的顺序,把每个数字的笔段代码按顺序排好!建立的表

格如下所示:TABLE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH。

4.程序框图

图2

5. 汇编源程序

ORG 0

START: MOV R1,#00H

NEXT: MOV A,R1

MOV DPTR,#TABLE

MOVC A,@A+DPTR

17

MOV P0,A

LCALL DELAY

INC R1

CJNE R1,#10,NEXT

LJMP START

DELAY: MOV R5,#20

D2:

D1:

MOV R6,#20

MOV R7,#248

DJNZ R7,$

DJNZ R6,D1

DJNZ R5,D2

RET

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

END

18

实验5 按键识别方法之一

1. 实验任务

每按下一次开关SP1,计数值加1,通过AT89S51单片机的P1端口的P1.0到P1.3显

示出其的二进制计数值。

2. 电路原理图

3程序设计方法

(1)其实,作为一个按键从没有按下到按下以及释放是一个完整的过程,也就是说,当我

们按下一个按键时,总希望某个命令只执行一次,而在按键按下的 过程中,不要有干扰进

来,因为,在按下的过程中,一旦有干扰过来,可能造成误触发过程,这并不是我们所想要

的。因此在按键按下的时候,

19

图2

要把我们手上的干扰信号以及按键的机械接触等干扰信号给滤除掉,一般情况下,我

们可以采用电容来滤除掉这些干扰信号,但实际上,会增加硬件成本及硬件电路的体积,这

是我们不希望,总得有个办法解决这个问题,因此我们可以采用软件滤波的方法去除这些干

信号,一般情况下,一个按键按下的时候,总是在按下的时刻存在着一定的干扰信号,

按下之后就基本上进入了稳定的状态。具体的一个按键从按下到释放的全过程的信号图如上

图所示:

从图中可以看出,我们在程序设计时,从按键被识别按下之后,延时5ms以上,从而

避开了干扰信号区域,我们再来检测一次,看按键是否真得已经按下,若真得已经按下,这

时肯定输出为低电平,若这时检测到的是高电平,证明刚才是由于干扰信号引起的误触发,

CPU就认为是误触发信号而舍弃这次的按键识别过程。从而提高了系统的可靠性。

由于要求每按下一次,命令被执行一次,直到下一次再按下的时候,再执行一次命令,

因此从按键被识别出来之后,我们就可以执行这次的命令,所以要有一个等待按键释放的过

程,显然释放的过程,就是使其恢复成高电平状态。

(1)对于按键识别的指令,我们依然选择如下指令JB BIT,REL指令是用来检测

BIT是否为高电平,若BIT=1,则程序转向REL处执行程序,否则就继续向下执行程序。

或者是 JNB BIT,REL指令是用来检测BIT是否为低电平,若BIT=0,则程序转向REL

处执行程序,否则就继续向下执行程序。

(2)但对程序设计过程中按键识别过程的框图如右图所示:

图3

20

4. 程序框图

图4

6. 汇编源程序

ORG 0

START: MOV R1,#00H

MOV A,R1

CPL A

MOV P1,A

JNB P3.7,REL

JNB P3.7,REL

INC R1

MOV A,R1

CPL A

MOV P1,A

JNB P3.7,$

;初始化R1为0,表示从0开始计数

;

;取反指令

;送出P1端口由发光二极管显示

;判断SP1是否按下

;再判断SP1是否真得按下

;若真得按下,则进行按键处理,使

;计数内容加1,并送出P1端口由

;发光二极管显示

;

;等待SP1释放

;继续对K1按键扫描

;延时10ms子程序

REL:

LCALL DELAY10MS ;若按下,则延时10ms左右

SJMP REL

DELAY10MS: MOV R6,#20

L1: MOV R7,#248

DJNZ R7,$

DJNZ R6,L1

RET

END

21

实验6 一键多功能按键识别技术

1.实验任务

如图1所示,开关SP1接在P3.7/RD管脚上,在AT89S51单片机的P1端口接有四个

发光二极管,上电的时候,L1接在P1.0管脚上的发光二极管在闪烁,当每一次按下开关SP1

的时候,L2接在P1.1管脚上的发光二极管在闪烁,再按下开关SP1的时候,L3接在P1.2

管脚上的发光二极管在闪烁,再按下开关SP1的时候,L4接在P1.3管脚上的发光二极管在

闪烁,再按下开关SP1的时候,又轮到L1在闪烁了,如此轮流下去。

2.电路原理图

图1

3.程序设计方法

(1)设计思想由来

在我们生活中,我们很容易通过这个叫张三,那个叫李四,另外一个是王五;那是因

为每个人有不同的名子,我们就很快认出,同样,对于要通过一个按键来识别每种不同的功

能,我们给每个不同的功能模块用不同的ID号标识,这样,每按下一次按键,ID的值是不

22

相同的,所以单片机就很容易识别不同功能的身份了。

(2)设计方法

从上面的要求我们可以看出,L1到L4发光二极管在每个时刻的闪烁的时间是受开关

SP1来控制,我们给L1到L4闪烁的时段定义出不同的ID号,当L1在闪烁时,ID=0;当

L2在闪烁时,ID=1;当L3在闪烁时,ID=2;当L4在闪烁时,ID=3;很显然,只要每

次按下开关K1时,分别给出不同的ID号我们就能够完成上面的任务了。下面给出有关程

序设计的框图。

4.程序框图

图2

5. 汇编源程序

ID EQU 30H

SP1 BIT P3.7

L1 BIT P1.0

L2 BIT P1.1

23

L3 BIT P1.2

L4 BIT P1.3

ORG 0

MOV ID,#00H

START: JB K1,REL

LCALL DELAY10MS

JB K1,REL

INC ID

MOV A,ID

CJNE A,#04,REL

MOV ID,#00H

REL: JNB K1,$

MOV A,ID

CJNE A,#00H,IS0

CPL L1

LCALL DELAY

SJMP START

IS0: CJNE A,#01H,IS1

CPL L2

LCALL DELAY

SJMP START

IS1: CJNE A,#02H,IS2

CPL L3

LCALL DELAY

SJMP START

IS2: CJNE A,#03H,IS3

CPL L4

LCALL DELAY

SJMP START

IS3: LJMP START

DELAY10MS: MOV R6,#20

LOOP1: MOV R7,#248

DJNZ R7,$

DJNZ R6,LOOP1

RET

DELAY: MOV R5,#20

LOOP2: LCALL DELAY10MS

DJNZ R5,LOOP2

RET

END

24

实验7 定时计数器T0作定时应用技术

1. 实验任务

用AT89S51单片机的定时/计数器T0产生一秒的定时时间,作为秒计数时间,当一秒

产生时,秒计数加1,秒计数到60时,自动从0开始。硬件电路如下图所示

2. 电路原理图

3.程序设计内容

AT89S51单片机的内部16位定时/计数器是一个可编程定时/计数器,它既可以工作在

13位定时方式,也可以工作在16位定时方式和8位定时方式。只要通过设置特殊功能寄存

器TMOD,即可完成。定时/计数器何时工作也是通过软件来设定TCON特殊功能寄存器来

完成的。

现在我们选择16位定时工作方式,对于T0来说,最大定时也只有65536us,即

65.536ms,无法达到我们所需要的1秒的定时,因此,我们必须通过软件来处理这个问题,

25

假设我们取T0的最大定时为50ms,即要定时1秒需要经过20次的50ms的定时。对于这

20次我们就可以采用软件的方法来统计了。

因此,我们设定TMOD=00000001B,即TMOD=01H

下面我们要给T0定时/计数器的TH0,TL0装入预置初值,通过下面的公式可以计算

TH0=(216-50000) / 256

TL0=(216-50000) MOD 256

当T0在工作的时候,我们如何得知50ms的定时时间已到,这回我们通过检测TCON

特殊功能寄存器中的TF0标志位,如果TF0=1表示定时时间已到。

5. 程序

图2

26

框图

6. 汇编源程序(查询法)

SECOND EQU 30H

TCOUNT EQU 31H

ORG 00H

START: MOV SECOND,#00H

MOV TCOUNT,#00H

MOV TMOD,#01H

MOV TH0,#(65536-50000) / 256

MOV TL0,#(65536-50000) MOD 256

SETB TR0

DISP: MOV A,SECOND

MOV B,#10

DIV AB

MOV DPTR,#TABLE

MOVC A,@A+DPTR

MOV P0,A

MOV A,B

MOVC A,@A+DPTR

MOV P2,A

WAIT: JNB TF0,WAIT

CLR TF0

MOV TH0,#(65536-50000) / 256

MOV TL0,#(65536-50000) MOD 256

INC TCOUNT

MOV A,TCOUNT

CJNE A,#20,NEXT

MOV TCOUNT,#00H

INC SECOND

MOV A,SECOND

CJNE A,#60,NEX

MOV SECOND,#00H

NEX: LJMP DISP

NEXT: LJMP WAIT

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

END

27

实验8定时计数器T0作定时应用技术

1. 实验任务

用AT89S51的定时/计数器T0产生2秒钟的定时,每当2秒定时到来时,更换指示灯

闪烁,每个指示闪烁的频率为0.2秒,也就是说,开始L1指示灯以0.2秒的速率闪烁,当2

秒定时到来之后,L2开始以0.2秒的速率闪烁,如此循环下去。0.2秒的闪烁速率也由定时

/计数器T0来完成。

2. 电路原理图

28

3.程序设计内容

(1)由于采用中断方式来完成,因此,对于中断源必须它的中断入口地址,对于定时/计数

器T0来说,中断入口地址为000BH,因此在中断入口地方加入长跳转指令来执行中断服务

程序。书写汇编源程序格式如下所示:

ORG 00H

LJMP START

ORG 0BH ;定时/计数器T0中断入口地址

LJMP INT_T0

START: NOP ;主程序开始

.

INT_T0: PUSH ACC ;定时/计数器T0中断服务程序

PUSH PSW

POP PSW

POP ACC

RETI ;中断服务程序返回

END

(2)定时2秒,采用16位定时50ms,共定时40次才可达到2秒,每50ms产生一中断,

定时的40次数在中断服务程序中完成,同样0.2秒的定时,需要4次才可达到0.2秒。对于

中断程序,在主程序中要对中断开中断。

(3)由于每次2秒定时到时,L1-L4要交替闪烁。采用ID来号来识别。当ID=0时,L1

在闪烁,当ID=1时,L2在闪烁;当ID=2时,L3在闪烁;当ID=3时,L4在闪烁

5. 程序框图

T0中断服务程序框图

主程序框图

29

6.汇编源程序

TCOUNT2S EQU 30H

TCNT02S EQU 31H

ID EQU 32H

ORG 00H

LJMP START

ORG 0BH

LJMP INT_T0

START: MOV TCOUNT2S,#00H

30

MOV TCNT02S,#00H

MOV ID,#00H

MOV TMOD,#01H

MOV TH0,#(65536-50000) / 256

MOV TL0,#(65536-50000) MOD 256

SETB TR0

SETB ET0

SETB EA

SJMP $

INT_T0: MOV TH0,#(65536-50000) / 256

MOV TL0,#(65536-50000) MOD 256

INC TCOUNT2S

MOV A,TCOUNT2S

CJNE A,#40,NEXT

MOV TCOUNT2S,#00H

INC ID

MOV A,ID

CJNE A,#04H,NEXT

MOV ID,#00H

NEXT: INC TCNT02S

MOV A,TCNT02S

CJNE A,#4,DONE

MOV TCNT02S,#00H

MOV A,ID

CJNE A,#00H,SID1

CPL P1.0

SJMP DONE

SID1: CJNE A,#01H,SID2

CPL P1.1

SJMP DONE

SID2: CJNE A,#02H,SID3

CPL P1.2

SJMP DONE

SID3: CJNE A,#03H,SID4

CPL P1.3

SID4: SJMP DONE

DONE: RETI

END

31

实验9 “嘀、嘀、……”报警声

1. 实验任务

用AT89S51单片机产生“嘀、嘀、„”报警声从P1.0端口输出,产生频率为1KHz,

根据上面图可知:1KHZ方波从P1.0输出0.2秒,接着0.2秒从P1.0输出电平

信号,如此循环下去,就形成我们所需的报警声了。

2. 电路原理图

图1

3. 程序设计方法

(1)生活中我们常常到各种各样的报警声,例如“嘀、嘀、…”就是常见的一种声音报警声,

但对于这种报警声,嘀0.2秒钟,然后断0.2秒钟,如此循环下去,假设嘀声的频率为1KHz,

则报警声时序图如下图所示:

32

上述波形信号如何用单片机来产生呢?

(2) 由于要产生上面的信号,我们把上面的信号分成两部分,一部分为1KHZ方波,占

用时间为0.2秒;另一部分为电平,也是占用0.2秒;因此,我们利用单片机的定时/计数器

T0作为定时,可以定时0.2秒;同时,也要用单片机产生1KHZ的方波,对于1KHZ的方

波信号周期为1ms,高电平占用0.5ms,低电平占用0.5ms,因此也采用定时器T0来完成

0.5ms的定时;最后,可以选定定时/计数器T0的定时时间为0.5ms,而要定时0.2秒则是

0.5ms的400倍,也就是说以0.5ms定时400次就达到0.2秒的定时时间了。

5. 程序框图

主程序框图

中断服务程序框图

33

图2

6. 汇编源程序

T02SA EQU 30H

T02SB EQU 31H

FLAG BIT 00H

ORG 00H

LJMP START

ORG 0BH

LJMP INT_T0

START: MOV T02SA,#00H

MOV T02SB,#00H

CLR FLAG

MOV TMOD,#01H

MOV TH0,#(65536-500) / 256

MOV TL0,#(65536-500) MOD 256

SETB TR0

SETB ET0

SETB EA

SJMP $

INT_T0:

MOV TH0,#(65536-500) / 256

MOV TL0,#(65536-500) MOD 256

INC T02SA

34

MOV A,T02SA

CJNE A,#100,NEXT

INC T02SB

MOV A,T02SB

CJNE A,#04H,NEXT

MOV T02SA,#00H

MOV T02SB,#00H

CPL FLAG

NEXT: JB FLAG,DONE

CPL P1.0

DONE: RETI

END

35

实验10 8X8 LED点阵显示技术

1. 实验任务

在8X8 LED点阵上显示柱形,让其先从左到右平滑移动三次,其次从右到左平滑移

动三次,再次从上到下平滑移动三次,最后从下到上平滑移动三次,如此循环下去。

2. 电路原理图

3. 程序设计内容

(1). 8X8 点阵LED工作原理说明

8X8点阵LED结构如下图所示:

36

图2

从图2中可以看出,8X8点阵共需要64个发光二极管组成,且每个发光二极管是放置

在行线和列线的交叉点上,当对应的某一列置1电平,某一行置0电平,则相应的二极管就

亮;因此要实现一根柱形的亮法,如图49所示,对应的一列为一根竖柱,或者对应的一行

为一根横柱,因此实现柱的亮的方法如下所述:

一根竖柱:对应的列置1,而行则采用扫描的方法来实现。

一根横柱:对应的行置0,而列则采用扫描的方法来实现。

5.汇编源程序

ORG 00H

START: NOP

MOV R3,#3

LOP2: MOV R4,#8

MOV R2,#0

LOP1: MOV P1,#0FFH

MOV DPTR,#TABA

MOV A,R2

37

MOVC A,@A+DPTR

MOV P3,A

INC R2

LCALL DELAY

DJNZ R4,LOP1

DJNZ R3,LOP2

MOV R3,#3

LOP4: MOV R4,#8

MOV R2,#7

LOP3: MOV P1,#0FFH

MOV DPTR,#TABA

MOV A,R2

MOVC A,@A+DPTR

MOV P3,A

DEC R2

LCALL DELAY

DJNZ R4,LOP3

DJNZ R3,LOP4

MOV R3,#3

LOP6: MOV R4,#8

MOV R2,#0

LOP5: MOV P3,#00H

MOV DPTR,#TABB

MOV A,R2

MOVC A,@A+DPTR

MOV P1,A

INC R2

LCALL DELAY

DJNZ R4,LOP5

DJNZ R3,LOP6

MOV R3,#3

LOP8: MOV R4,#8

MOV R2,#7

LOP7: MOV P3,#00H

MOV DPTR,#TABB

MOV A,R2

MOVC A,@A+DPTR

MOV P1,A

DEC R2

LCALL DELAY

DJNZ R4,LOP7

38

DJNZ R3,LOP8

LJMP START

DELAY: MOV R5,#10

D2: MOV R6,#20

D1: MOV R7,#248

DJNZ R7,$

DJNZ R6,D1

DJNZ R5,D2

RET

TABA: DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH

TABB: DB 01H,02H,04H,08H,10H,20H,40H,80H

END

39

实验11电子琴

1. 实验任务

(1)由4X4组成16个按钮矩阵,设计成16个音。

(2)可随意弹奏想要表达的音乐。

2. 电路原理图

图1

3. 相关程序内容

(1)4X4行列式键盘识别;

(2)音乐产生的方法;

40

一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不

同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方

便,我们可以利用单片机的定时/计数器T0来产生这样方波频率信号,因此,我们只要把一

首歌曲的音阶对应频率关系弄正确即可。现在以单片机12MHZ晶振为例,例出高中低音符

与单片机计数T0相关的计数值如下表所示

音符

低1 DO

#1 DO#

低2 RE

#2 RE#

低 3 M

低 4 FA

# 4 FA#

低 5 SO

# 5 SO#

低 6 LA

# 6

低 7 SI

中 1 DO

# 1 DO#

中 2 RE

# 2 RE#

中 3 M

中 4 FA

频率(HZ)

262

277

294

311

330

349

370

392

415

440

466

494

523

554

587

622

659

698

简谱码(T值)

63628

63731

63835

63928

64021

64103

64185

64260

64331

64400

64463

64524

64580

64633

64684

64732

64777

64820

音符

# 4 FA#

中 5 SO

# 5 SO#

中 6 LA

# 6

中 7 SI

高 1 DO

# 1 DO#

高 2 RE

# 2 RE#

高 3 M

高 4 FA

# 4 FA#

高 5 SO

# 5 SO#

高 6 LA

# 6

高 7 SI

频率(HZ)

740

784

831

880

932

988

1046

1109

1175

1245

1318

1397

1480

1568

1661

1760

1865

1967

简谱码(T值)

64860

64898

64934

64968

64994

65030

65058

65085

65110

65134

65157

65178

65198

65217

65235

65252

65268

65283

下面我们要为这个音符建立一个表格,有助于单片机通过查表的方式来获得相应的数

低音0-19之间,中音在20-39之间,高音在40-59之间

TABLE: DW 0,63628,63835,64021,64103,64260,64400,64524,0,0

DW 0,63731,63928,0,64185,64331,64463,0,0,0

DW 0,64580,64684,64777,64820,64898,64968,65030,0,0

DW 0,64633,64732,0,64860,64934,64994,0,0,0

DW 0,65058,65110,65157,65178,65217,65252,65283,0,0

DW 0,65085,65134,0,65198,65235,65268,0,0,0

DW 0

2、音乐的音拍,一个节拍为单位(C调)

曲调值

调4/4

调3/4

调2/4

DELAY

125ms

187ms

250ms

曲调值

调4/4

调3/4

调2/4

DELAY

62ms

94ms

125ms

对于不同的曲调我们也可以用单片机的另外一个定时/计数器来完成。

下面就用AT89S51单片机产生一首“生日快乐”歌曲来说明单片机如何产生的。

在这个程序中用到了两个定时/计数器来完成的。其中T0用来产生音符频率,T1用来

产生音拍。

41

5. 程序框图

6. 汇编源程序

KEYBUF EQU 30H

STH0 EQU 31H

STL0 EQU 32H

TEMP EQU 33H

ORG 00H

LJMP START

ORG 0BH

LJMP INT_T0

START: MOV TMOD,#01H

SETB ET0

SETB EA

WAIT:

MOV P3,#0FFH

CLR P3.4

MOV A,P3

ANL A,#0FH

XRL A,#0FH

JZ NOKEY1

LCALL DELY10MS

MOV A,P3

ANL A,#0FH

XRL A,#0FH

JZ NOKEY1

MOV A,P3

ANL A,#0FH

CJNE A,#0EH,NK1

MOV KEYBUF,#0

42

LJMP DK1

NK1: CJNE A,#0DH,NK2

MOV KEYBUF,#1

LJMP DK1

NK2: CJNE A,#0BH,NK3

MOV KEYBUF,#2

LJMP DK1

NK3: CJNE A,#07H,NK4

MOV KEYBUF,#3

LJMP DK1

NK4: NOP

DK1:

MOV A,KEYBUF

MOV DPTR,#TABLE

MOVC A,@A+DPTR

MOV P0,A

MOV A,KEYBUF

MOV B,#2

MUL AB

MOV TEMP,A

MOV DPTR,#TABLE1

MOVC A,@A+DPTR

MOV STH0,A

MOV TH0,A

INC TEMP

MOV A,TEMP

MOVC A,@A+DPTR

MOV STL0,A

MOV TL0,A

SETB TR0

DK1A: MOV A,P3

ANL A,#0FH

XRL A,#0FH

JNZ DK1A

CLR TR0

NOKEY1:

MOV P3,#0FFH

CLR P3.5

MOV A,P3

ANL A,#0FH

XRL A,#0FH

JZ NOKEY2

LCALL DELY10MS

43

MOV A,P3

ANL A,#0FH

XRL A,#0FH

JZ NOKEY2

MOV A,P3

ANL A,#0FH

CJNE A,#0EH,NK5

MOV KEYBUF,#4

LJMP DK2

NK5: CJNE A,#0DH,NK6

MOV KEYBUF,#5

LJMP DK2

NK6: CJNE A,#0BH,NK7

MOV KEYBUF,#6

LJMP DK2

NK7: CJNE A,#07H,NK8

MOV KEYBUF,#7

LJMP DK2

NK8: NOP

DK2:

MOV A,KEYBUF

MOV DPTR,#TABLE

MOVC A,@A+DPTR

MOV P0,A

MOV A,KEYBUF

MOV B,#2

MUL AB

MOV TEMP,A

MOV DPTR,#TABLE1

MOVC A,@A+DPTR

MOV STH0,A

MOV TH0,A

INC TEMP

MOV A,TEMP

MOVC A,@A+DPTR

MOV STL0,A

MOV TL0,A

SETB TR0

DK2A: MOV A,P3

ANL A,#0FH

XRL A,#0FH

JNZ DK2A

CLR TR0

44

NOKEY2:

MOV P3,#0FFH

CLR P3.6

MOV A,P3

ANL A,#0FH

XRL A,#0FH

JZ NOKEY3

LCALL DELY10MS

MOV A,P3

ANL A,#0FH

XRL A,#0FH

JZ NOKEY3

MOV A,P3

ANL A,#0FH

CJNE A,#0EH,NK9

MOV KEYBUF,#8

LJMP DK3

NK9: CJNE A,#0DH,NK10

MOV KEYBUF,#9

LJMP DK3

NK10: CJNE A,#0BH,NK11

MOV KEYBUF,#10

LJMP DK3

NK11: CJNE A,#07H,NK12

MOV KEYBUF,#11

LJMP DK3

NK12: NOP

DK3:

MOV A,KEYBUF

MOV DPTR,#TABLE

MOVC A,@A+DPTR

MOV P0,A

MOV A,KEYBUF

MOV B,#2

MUL AB

MOV TEMP,A

MOV DPTR,#TABLE1

MOVC A,@A+DPTR

MOV STH0,A

MOV TH0,A

INC TEMP

MOV A,TEMP

MOVC A,@A+DPTR

MOV STL0,A

45

MOV TL0,A

SETB TR0

DK3A: MOV A,P3

ANL A,#0FH

XRL A,#0FH

JNZ DK3A

CLR TR0

NOKEY3:

MOV P3,#0FFH

CLR P3.7

MOV A,P3

ANL A,#0FH

XRL A,#0FH

JZ NOKEY4

LCALL DELY10MS

MOV A,P3

ANL A,#0FH

XRL A,#0FH

JZ NOKEY4

MOV A,P3

ANL A,#0FH

CJNE A,#0EH,NK13

MOV KEYBUF,#12

LJMP DK4

NK13: CJNE A,#0DH,NK14

MOV KEYBUF,#13

LJMP DK4

NK14: CJNE A,#0BH,NK15

MOV KEYBUF,#14

LJMP DK4

NK15: CJNE A,#07H,NK16

MOV KEYBUF,#15

LJMP DK4

NK16: NOP

DK4: MOV A,KEYBUF

MOV DPTR,#TABLE

MOVC A,@A+DPTR

MOV P0,A

MOV A,KEYBUF

MOV B,#2

MUL AB

MOV TEMP,A

MOV DPTR,#TABLE1

46

MOVC A,@A+DPTR

MOV STH0,A

MOV TH0,A

INC TEMP

MOV A,TEMP

MOVC A,@A+DPTR

MOV STL0,A

MOV TL0,A

SETB TR0

DK4A: MOV A,P3

ANL A,#0FH

XRL A,#0FH

JNZ DK4A

CLR TR0

NOKEY4:

LJMP WAIT

DELY10MS:

MOV R6,#10

D1: MOV R7,#248

DJNZ R7,$

DJNZ R6,D1

RET

INT_T0:

MOV TH0,STH0

MOV TL0,STL0

CPL P1.0

RETI

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

DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H

TABLE1: DW 64021,64103,64260,64400

DW 64524,64580,64684,64777

DW 64820,64898,64968,65030

DW 65058,65110,65157,65178

END

47

2024年10月13日发(作者:公羊雯)

目录

引言.................................................................................................... 2

实验1 PROTUES环境及LED闪烁综合实验 ............................ 7

实验2 多路开关状态指示............................................................. 10

实验3 报警产生器......................................................................... 13

实验4 I/O并行口直接驱动LED显示 ...................................... 16

实验5 按键识别方法之一............................................................. 19

实验6 一键多功能按键识别技术................................................. 22

实验7 定时计数器T0作定时应用技术 ...................................... 25

实验8定时计数器T0作定时应用技术 ....................................... 28

实验9 “嘀、嘀、……”报警声 ................................................... 32

实验10 8X8 LED点阵显示技术 ................................................ 36

实验11电子琴 ................................................................................ 40

1

引言

单片机体积小,重量轻,具有很强的灵活性而且价格便宜,具有逻辑判断,定时计数等多

种功能,广泛应用于仪器仪表,家用电器,医用设备的智能化管理和过程控制等领域。以单

片机为核心的嵌入式系统已经成为目前电子设计最活跃的领域之一。在嵌入式系统的中,开

发板成本高,特别是对于大量的初学者而言,还可能由于设计的错误导致开发板损坏。利用

Proteus我们可以很好地解决这个问题,由此我们可以快速地建立一个单片机仿真系统。

1. Proteus介绍

Proteus是英国Labcenter Electronics公司开发的一款电路仿真软件,软件由两部分组成:

一部分是智能原理图输入系统ISIS(Intelligent Schematic Input System)和虚拟系统模型

VSM(Virtual Model System);另一部分是高级布线及编辑软件ARES

(Advanced Routing and Editing Software)也就是PCB。

1.1 Proteus VSM的仿真

Proteus可以仿真模拟电路及数字电路,也可以仿真模拟数字混合电路。

Proteus可提供30多种元件库,超过8000种模拟、数字元器件。可以按照设计的要求

选择不同生产厂家的元器件。此外,对于元器件库中没有的元件,设计者也可以通过软件自

己创建。

除拥有丰富的元器件外,Proteus还提供了各种虚拟仪器,如常用的电流表,电压表,

示波器,计数/定时/频率计,SPI调试器等虚拟终端。支持图形化的分析功能等。

Proteus特别适合对嵌入式系统进行软硬件协同设计与仿真,其最大的特点是可以仿真

8051,PIA,AVR,ARM等多种系列的处理器。Protues包含强大的调试工具,具有对寄存

器和存储器、断点和单步模式IAR C-SPY, Keil, MPLAB等开发工具的源程序进行调试的功

能;能够观察代码在仿真硬件上的实时运行效果;对显示,按钮,键盘等外设的交互可视化

进行仿真。

1.2 Proteus PCB

Proteus 的PCB设计除了有自动布线仿真功能外,还集成了PCB设计,支持多达16个

布线层,可以任意角度放置元件和焊接连线;集成了高智能的布线算法,可以方便地进行

PCB设计。

2. 一个基于Protesus的单片机实例

2.1 软件的编写

本例题采用8个LED,编写程序使之闪烁起来。

2

软件的编写是采用汇编语言,芯片的型号选择AT89C51, 编写文件,利用

Proteus本身的51汇编功能进行编译,编译成功后生成文件。

2.2 绘制电路图

运行Proteus的ISIS,进入仿真软件的主界面,如图1所示。主界面分为菜单栏,工具

栏,模型显示窗口,模型选择区,元件列表区等。

图1 ISIS启动界面

通过左侧的工具栏区的P(从库中选择元件)命令,在Pick devices窗口中选择系统所需元

器件,还可以选择元件的类别,生产厂家等。本例所需主要元器件有:AT89C51芯片,电

阻、电容、石英晶振和发光二极管,详见表1。

表1 元器件清单

选择元器件后连接图2所示电路。

3

图2 电路原理图

Microproccessor ICs类的芯片的引脚与实际的芯片基本相同, 唯一的差别是隐去了GND

和VCC引脚,系统默认的是把它们分别连接到地和+5V直流电源。故在电路连线时可以不

考虑电源和地的连接。

电路连接完成后,选中AT89C51单击鼠标左键,打开“Edit Component”对话窗口如图3

所示,可以直接在“Clock Frequency”后进行频率设定,设定单片机的时钟频率为12MHz。在

“Add/remove source file”栏中选择已经编好的文件,然后单击“OK”按钮保存设计。

至此,就可以进行单片机的仿真。

4

图 3 单片机属性的设定

2.3 Proteus仿真结果

单片机的仿真结果图如图4,模拟信号经A/D转换后,结果送入单片机,再在数码管上

显示;通过调节可调电阻的阻值,可以得到不同的显示结果。仿真结果表明,系统达到了预

先的设计要求。

在仿真的过程中每个管脚旁边会出现一个小方块,红色的方快表示高电平,蓝色的表示

低电平。 通过方快颜色的变化可以很方便地知道每个管脚电平的变化,从而能对系统的运

行有更直观的了解,这对程序的调试有很大的帮助。

5

图4 仿真结果

3.总结

本文结合一个LED闪烁的单片机电路详细说明了Proteus在单片机开发中的应用。可以

看出,Proteus功能十分强大,能仿真各种数字模拟电路,且操作简单,使用方便。能快速

地进行单片机仿真,加快系统开发的过程,降低开发成本。

6

实验1 PROTUES环境及LED闪烁综合实验

1. 实验任务

做单一灯的左移右移,硬件电路如图所示,八个发光二极管L1-L8分别接在单片机

的P1.0-P1.7接口上,输出“0”时,发光二极管亮,开始时P1.0→P1.1→P1.2→P1.3→┅

→P1.7→P1.6→┅→P1.0亮,重复循环。

2. 电路原理图

图1

3. 程序设计内容

我们可以运用输出端口指令MOV P1,A或MOV P1,#DATA,只要给累加器值

或常数值,然后执行上述的指令,即可达到输出控制的动作。

每次送出的数据是不同,具体的数据如下表1所示 :

P1.7 P1.6 P1.5 P1.4 P1.3 P1.2 P1.1 P1.0

L8 L7 L6 L5 L4 L3 L2 L1

1 1 1 1 1 1 1 0

1 1 1 1 1 1 0 1

1 1 1 1 1 0 1 1

7

说明

L1亮

L2亮

L3亮

1

1

1

1

0

1

1

1

0

1

1

1

0

1

1

1

0

1

1

1

0

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

L4亮

L5亮

L6亮

L7亮

L8亮

4. 程序框图

图2

5. 汇编源程序

ORG 0

START: MOV R2,#8

MOV A,#0FEH

SETB C

LOOP: MOV P1,A

LCALL DELAY

RLC A

DJNZ R2,LOOP

MOV R2,#8

LOOP1: MOV P1,A

LCALL DELAY

RRC A

DJNZ R2,LOOP1

LJMP START

DELAY: MOV R5,#20 ;

D1: MOV R6,#20

8

D2: MOV R7,#248

DJNZ R7,$

DJNZ R6,D2

DJNZ R5,D1

RET

END

9

实验2 多路开关状态指示

1. 实验任务

如图1所示,AT89S51单片机的P1.0-P1.3接四个发光二极管L1-L4,P1.4-P1.7

接了四个开关K1-K4,编程将开关的状态反映到发光二极管上。(开关闭合,对应的灯亮,

开关断开,对应的灯灭)。

2. 电路原理图

图1

3. 程序设计内容

3.1 开关状态检测

对于开关状态检测,相对单片机来说,是输入关系,我们可轮流检测每个开关状态,

10

根据每个开关的状态让相应的发光二极管指示,可以采用JB P1.X,REL或JNB P1.X,

REL指令来完成;也可以一次性检测四路开关状态,然后让其指示,可以采用MOV A,

P1指令一次把P1端口的状态全部读入,然后取高4位的状态来指示。

3.2 输出控制

根据开关的状态,由发光二极管L1-L4来指示,我们可以用SETB P1.X和CLR

P1.X指令来完成,也可以采用MOV P1,#1111XXXXB方法一次指示。

4. 程序框图

读P1口数据到A

CC

A

CC

内容右移4次

A

CC

内容与F0H相或

A

CC

内容送入P1口

图2

5. 解决方案

方法一(汇编源程序)

ORG 00H

START: MOV A,P1

ANL A,#0F0H

RR A

11

RR A

RR A

RR A

ORl A,#0F0H

MOV P1,A

SJMP START

END

方法二(汇编源程序)

ORG 00H

START: JB P1.4,NEXT1

CLR P1.0

SJMP NEX1

NEXT1: SETB P1.0

NEX1: JB P1.5,NEXT2

CLR P1.1

SJMP NEX2

NEXT2: SETB P1.1

NEX2: JB P1.6,NEXT3

CLR P1.2

SJMP NEX3

NEXT3: SETB P1.2

NEX3: JB P1.7,NEXT4

CLR P1.3

SJMP NEX4

NEXT4: SETB P1.3

NEX4: SJMP START

END

12

实验3 报警产生器

1. 实验任务

用P1.0输出1KHz和500Hz的音频信号驱动扬声器,作报警信号,要求1KHz信号响

100ms,500Hz信号响200ms,交替进行,P1.7接一开关进行控制,当开关合上响报警信号,

当开关断开告警信号停止,编出程序。

2. 电路原理图

图1

3. 程序设计内容

3.1 信号产生的方法

500Hz信号周期为2ms,信号电平为每1ms变反1次,1KHz的信号周期为1ms,信号

电平每500us变反1次;

13

4. 程序框图

图2

5. 汇编源程序

FLAG BIT 00H

ORG 00H

START: JB P1.7,START

JNB FLAG,NEXT

MOV R2,#200

DV: CPL P1.0

LCALL DELY500

LCALL DELY500

DJNZ R2,DV

CPL FLAG

NEXT: MOV R2,#200

DV1: CPL P1.0

LCALL DELY500

DJNZ R2,DV1

14

CPL FLAG

SJMP START

DELY500: MOV R7,#250

LOOP: NOP

DJNZ R7,LOOP

RET

END

15

实验4 I/O并行口直接驱动LED显示

1. 实验任务

如图1所示,利用AT89S51单片机的P0端口的P0.0-P0.7连接到一个共阴数码管的

a-h的笔段上,数码管的公共端接地。在数码管上循环显示0-9数字,时间间隔0.2秒。

2. 电路原理图

图1

3 程序设计内容

(1) LED数码显示原理

七段LED显示器内部由七个条形发光二极管和一个小圆点发光二极管组成,根据各管

的极管的接线形式,可分成共阴极型和共阳极型。

16

LED数码管的g~a七个发光二极管因加正电压而发亮,因加零电压而不以发亮,不同

亮暗的组合就能形成不同的字形,这种组合称之为字形码,下面给出共阴极的字形码见表2

“0”

“1”

“2”

“3”

“4”

“5”

“6”

“7”

3FH

06H

5BH

4FH

66H

6DH

7DH

07H

“8”

“9”

“A”

“b”

“C”

“d”

“E”

“F”

7FH

6FH

77H

7CH

39H

5EH

79H

71H

(2) 由于显示的数字0-9的字形码没有规律可循,只能采用查表的方式来完成我们所需

的要求了。这样我们按着数字0-9的顺序,把每个数字的笔段代码按顺序排好!建立的表

格如下所示:TABLE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH。

4.程序框图

图2

5. 汇编源程序

ORG 0

START: MOV R1,#00H

NEXT: MOV A,R1

MOV DPTR,#TABLE

MOVC A,@A+DPTR

17

MOV P0,A

LCALL DELAY

INC R1

CJNE R1,#10,NEXT

LJMP START

DELAY: MOV R5,#20

D2:

D1:

MOV R6,#20

MOV R7,#248

DJNZ R7,$

DJNZ R6,D1

DJNZ R5,D2

RET

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

END

18

实验5 按键识别方法之一

1. 实验任务

每按下一次开关SP1,计数值加1,通过AT89S51单片机的P1端口的P1.0到P1.3显

示出其的二进制计数值。

2. 电路原理图

3程序设计方法

(1)其实,作为一个按键从没有按下到按下以及释放是一个完整的过程,也就是说,当我

们按下一个按键时,总希望某个命令只执行一次,而在按键按下的 过程中,不要有干扰进

来,因为,在按下的过程中,一旦有干扰过来,可能造成误触发过程,这并不是我们所想要

的。因此在按键按下的时候,

19

图2

要把我们手上的干扰信号以及按键的机械接触等干扰信号给滤除掉,一般情况下,我

们可以采用电容来滤除掉这些干扰信号,但实际上,会增加硬件成本及硬件电路的体积,这

是我们不希望,总得有个办法解决这个问题,因此我们可以采用软件滤波的方法去除这些干

信号,一般情况下,一个按键按下的时候,总是在按下的时刻存在着一定的干扰信号,

按下之后就基本上进入了稳定的状态。具体的一个按键从按下到释放的全过程的信号图如上

图所示:

从图中可以看出,我们在程序设计时,从按键被识别按下之后,延时5ms以上,从而

避开了干扰信号区域,我们再来检测一次,看按键是否真得已经按下,若真得已经按下,这

时肯定输出为低电平,若这时检测到的是高电平,证明刚才是由于干扰信号引起的误触发,

CPU就认为是误触发信号而舍弃这次的按键识别过程。从而提高了系统的可靠性。

由于要求每按下一次,命令被执行一次,直到下一次再按下的时候,再执行一次命令,

因此从按键被识别出来之后,我们就可以执行这次的命令,所以要有一个等待按键释放的过

程,显然释放的过程,就是使其恢复成高电平状态。

(1)对于按键识别的指令,我们依然选择如下指令JB BIT,REL指令是用来检测

BIT是否为高电平,若BIT=1,则程序转向REL处执行程序,否则就继续向下执行程序。

或者是 JNB BIT,REL指令是用来检测BIT是否为低电平,若BIT=0,则程序转向REL

处执行程序,否则就继续向下执行程序。

(2)但对程序设计过程中按键识别过程的框图如右图所示:

图3

20

4. 程序框图

图4

6. 汇编源程序

ORG 0

START: MOV R1,#00H

MOV A,R1

CPL A

MOV P1,A

JNB P3.7,REL

JNB P3.7,REL

INC R1

MOV A,R1

CPL A

MOV P1,A

JNB P3.7,$

;初始化R1为0,表示从0开始计数

;

;取反指令

;送出P1端口由发光二极管显示

;判断SP1是否按下

;再判断SP1是否真得按下

;若真得按下,则进行按键处理,使

;计数内容加1,并送出P1端口由

;发光二极管显示

;

;等待SP1释放

;继续对K1按键扫描

;延时10ms子程序

REL:

LCALL DELAY10MS ;若按下,则延时10ms左右

SJMP REL

DELAY10MS: MOV R6,#20

L1: MOV R7,#248

DJNZ R7,$

DJNZ R6,L1

RET

END

21

实验6 一键多功能按键识别技术

1.实验任务

如图1所示,开关SP1接在P3.7/RD管脚上,在AT89S51单片机的P1端口接有四个

发光二极管,上电的时候,L1接在P1.0管脚上的发光二极管在闪烁,当每一次按下开关SP1

的时候,L2接在P1.1管脚上的发光二极管在闪烁,再按下开关SP1的时候,L3接在P1.2

管脚上的发光二极管在闪烁,再按下开关SP1的时候,L4接在P1.3管脚上的发光二极管在

闪烁,再按下开关SP1的时候,又轮到L1在闪烁了,如此轮流下去。

2.电路原理图

图1

3.程序设计方法

(1)设计思想由来

在我们生活中,我们很容易通过这个叫张三,那个叫李四,另外一个是王五;那是因

为每个人有不同的名子,我们就很快认出,同样,对于要通过一个按键来识别每种不同的功

能,我们给每个不同的功能模块用不同的ID号标识,这样,每按下一次按键,ID的值是不

22

相同的,所以单片机就很容易识别不同功能的身份了。

(2)设计方法

从上面的要求我们可以看出,L1到L4发光二极管在每个时刻的闪烁的时间是受开关

SP1来控制,我们给L1到L4闪烁的时段定义出不同的ID号,当L1在闪烁时,ID=0;当

L2在闪烁时,ID=1;当L3在闪烁时,ID=2;当L4在闪烁时,ID=3;很显然,只要每

次按下开关K1时,分别给出不同的ID号我们就能够完成上面的任务了。下面给出有关程

序设计的框图。

4.程序框图

图2

5. 汇编源程序

ID EQU 30H

SP1 BIT P3.7

L1 BIT P1.0

L2 BIT P1.1

23

L3 BIT P1.2

L4 BIT P1.3

ORG 0

MOV ID,#00H

START: JB K1,REL

LCALL DELAY10MS

JB K1,REL

INC ID

MOV A,ID

CJNE A,#04,REL

MOV ID,#00H

REL: JNB K1,$

MOV A,ID

CJNE A,#00H,IS0

CPL L1

LCALL DELAY

SJMP START

IS0: CJNE A,#01H,IS1

CPL L2

LCALL DELAY

SJMP START

IS1: CJNE A,#02H,IS2

CPL L3

LCALL DELAY

SJMP START

IS2: CJNE A,#03H,IS3

CPL L4

LCALL DELAY

SJMP START

IS3: LJMP START

DELAY10MS: MOV R6,#20

LOOP1: MOV R7,#248

DJNZ R7,$

DJNZ R6,LOOP1

RET

DELAY: MOV R5,#20

LOOP2: LCALL DELAY10MS

DJNZ R5,LOOP2

RET

END

24

实验7 定时计数器T0作定时应用技术

1. 实验任务

用AT89S51单片机的定时/计数器T0产生一秒的定时时间,作为秒计数时间,当一秒

产生时,秒计数加1,秒计数到60时,自动从0开始。硬件电路如下图所示

2. 电路原理图

3.程序设计内容

AT89S51单片机的内部16位定时/计数器是一个可编程定时/计数器,它既可以工作在

13位定时方式,也可以工作在16位定时方式和8位定时方式。只要通过设置特殊功能寄存

器TMOD,即可完成。定时/计数器何时工作也是通过软件来设定TCON特殊功能寄存器来

完成的。

现在我们选择16位定时工作方式,对于T0来说,最大定时也只有65536us,即

65.536ms,无法达到我们所需要的1秒的定时,因此,我们必须通过软件来处理这个问题,

25

假设我们取T0的最大定时为50ms,即要定时1秒需要经过20次的50ms的定时。对于这

20次我们就可以采用软件的方法来统计了。

因此,我们设定TMOD=00000001B,即TMOD=01H

下面我们要给T0定时/计数器的TH0,TL0装入预置初值,通过下面的公式可以计算

TH0=(216-50000) / 256

TL0=(216-50000) MOD 256

当T0在工作的时候,我们如何得知50ms的定时时间已到,这回我们通过检测TCON

特殊功能寄存器中的TF0标志位,如果TF0=1表示定时时间已到。

5. 程序

图2

26

框图

6. 汇编源程序(查询法)

SECOND EQU 30H

TCOUNT EQU 31H

ORG 00H

START: MOV SECOND,#00H

MOV TCOUNT,#00H

MOV TMOD,#01H

MOV TH0,#(65536-50000) / 256

MOV TL0,#(65536-50000) MOD 256

SETB TR0

DISP: MOV A,SECOND

MOV B,#10

DIV AB

MOV DPTR,#TABLE

MOVC A,@A+DPTR

MOV P0,A

MOV A,B

MOVC A,@A+DPTR

MOV P2,A

WAIT: JNB TF0,WAIT

CLR TF0

MOV TH0,#(65536-50000) / 256

MOV TL0,#(65536-50000) MOD 256

INC TCOUNT

MOV A,TCOUNT

CJNE A,#20,NEXT

MOV TCOUNT,#00H

INC SECOND

MOV A,SECOND

CJNE A,#60,NEX

MOV SECOND,#00H

NEX: LJMP DISP

NEXT: LJMP WAIT

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

END

27

实验8定时计数器T0作定时应用技术

1. 实验任务

用AT89S51的定时/计数器T0产生2秒钟的定时,每当2秒定时到来时,更换指示灯

闪烁,每个指示闪烁的频率为0.2秒,也就是说,开始L1指示灯以0.2秒的速率闪烁,当2

秒定时到来之后,L2开始以0.2秒的速率闪烁,如此循环下去。0.2秒的闪烁速率也由定时

/计数器T0来完成。

2. 电路原理图

28

3.程序设计内容

(1)由于采用中断方式来完成,因此,对于中断源必须它的中断入口地址,对于定时/计数

器T0来说,中断入口地址为000BH,因此在中断入口地方加入长跳转指令来执行中断服务

程序。书写汇编源程序格式如下所示:

ORG 00H

LJMP START

ORG 0BH ;定时/计数器T0中断入口地址

LJMP INT_T0

START: NOP ;主程序开始

.

INT_T0: PUSH ACC ;定时/计数器T0中断服务程序

PUSH PSW

POP PSW

POP ACC

RETI ;中断服务程序返回

END

(2)定时2秒,采用16位定时50ms,共定时40次才可达到2秒,每50ms产生一中断,

定时的40次数在中断服务程序中完成,同样0.2秒的定时,需要4次才可达到0.2秒。对于

中断程序,在主程序中要对中断开中断。

(3)由于每次2秒定时到时,L1-L4要交替闪烁。采用ID来号来识别。当ID=0时,L1

在闪烁,当ID=1时,L2在闪烁;当ID=2时,L3在闪烁;当ID=3时,L4在闪烁

5. 程序框图

T0中断服务程序框图

主程序框图

29

6.汇编源程序

TCOUNT2S EQU 30H

TCNT02S EQU 31H

ID EQU 32H

ORG 00H

LJMP START

ORG 0BH

LJMP INT_T0

START: MOV TCOUNT2S,#00H

30

MOV TCNT02S,#00H

MOV ID,#00H

MOV TMOD,#01H

MOV TH0,#(65536-50000) / 256

MOV TL0,#(65536-50000) MOD 256

SETB TR0

SETB ET0

SETB EA

SJMP $

INT_T0: MOV TH0,#(65536-50000) / 256

MOV TL0,#(65536-50000) MOD 256

INC TCOUNT2S

MOV A,TCOUNT2S

CJNE A,#40,NEXT

MOV TCOUNT2S,#00H

INC ID

MOV A,ID

CJNE A,#04H,NEXT

MOV ID,#00H

NEXT: INC TCNT02S

MOV A,TCNT02S

CJNE A,#4,DONE

MOV TCNT02S,#00H

MOV A,ID

CJNE A,#00H,SID1

CPL P1.0

SJMP DONE

SID1: CJNE A,#01H,SID2

CPL P1.1

SJMP DONE

SID2: CJNE A,#02H,SID3

CPL P1.2

SJMP DONE

SID3: CJNE A,#03H,SID4

CPL P1.3

SID4: SJMP DONE

DONE: RETI

END

31

实验9 “嘀、嘀、……”报警声

1. 实验任务

用AT89S51单片机产生“嘀、嘀、„”报警声从P1.0端口输出,产生频率为1KHz,

根据上面图可知:1KHZ方波从P1.0输出0.2秒,接着0.2秒从P1.0输出电平

信号,如此循环下去,就形成我们所需的报警声了。

2. 电路原理图

图1

3. 程序设计方法

(1)生活中我们常常到各种各样的报警声,例如“嘀、嘀、…”就是常见的一种声音报警声,

但对于这种报警声,嘀0.2秒钟,然后断0.2秒钟,如此循环下去,假设嘀声的频率为1KHz,

则报警声时序图如下图所示:

32

上述波形信号如何用单片机来产生呢?

(2) 由于要产生上面的信号,我们把上面的信号分成两部分,一部分为1KHZ方波,占

用时间为0.2秒;另一部分为电平,也是占用0.2秒;因此,我们利用单片机的定时/计数器

T0作为定时,可以定时0.2秒;同时,也要用单片机产生1KHZ的方波,对于1KHZ的方

波信号周期为1ms,高电平占用0.5ms,低电平占用0.5ms,因此也采用定时器T0来完成

0.5ms的定时;最后,可以选定定时/计数器T0的定时时间为0.5ms,而要定时0.2秒则是

0.5ms的400倍,也就是说以0.5ms定时400次就达到0.2秒的定时时间了。

5. 程序框图

主程序框图

中断服务程序框图

33

图2

6. 汇编源程序

T02SA EQU 30H

T02SB EQU 31H

FLAG BIT 00H

ORG 00H

LJMP START

ORG 0BH

LJMP INT_T0

START: MOV T02SA,#00H

MOV T02SB,#00H

CLR FLAG

MOV TMOD,#01H

MOV TH0,#(65536-500) / 256

MOV TL0,#(65536-500) MOD 256

SETB TR0

SETB ET0

SETB EA

SJMP $

INT_T0:

MOV TH0,#(65536-500) / 256

MOV TL0,#(65536-500) MOD 256

INC T02SA

34

MOV A,T02SA

CJNE A,#100,NEXT

INC T02SB

MOV A,T02SB

CJNE A,#04H,NEXT

MOV T02SA,#00H

MOV T02SB,#00H

CPL FLAG

NEXT: JB FLAG,DONE

CPL P1.0

DONE: RETI

END

35

实验10 8X8 LED点阵显示技术

1. 实验任务

在8X8 LED点阵上显示柱形,让其先从左到右平滑移动三次,其次从右到左平滑移

动三次,再次从上到下平滑移动三次,最后从下到上平滑移动三次,如此循环下去。

2. 电路原理图

3. 程序设计内容

(1). 8X8 点阵LED工作原理说明

8X8点阵LED结构如下图所示:

36

图2

从图2中可以看出,8X8点阵共需要64个发光二极管组成,且每个发光二极管是放置

在行线和列线的交叉点上,当对应的某一列置1电平,某一行置0电平,则相应的二极管就

亮;因此要实现一根柱形的亮法,如图49所示,对应的一列为一根竖柱,或者对应的一行

为一根横柱,因此实现柱的亮的方法如下所述:

一根竖柱:对应的列置1,而行则采用扫描的方法来实现。

一根横柱:对应的行置0,而列则采用扫描的方法来实现。

5.汇编源程序

ORG 00H

START: NOP

MOV R3,#3

LOP2: MOV R4,#8

MOV R2,#0

LOP1: MOV P1,#0FFH

MOV DPTR,#TABA

MOV A,R2

37

MOVC A,@A+DPTR

MOV P3,A

INC R2

LCALL DELAY

DJNZ R4,LOP1

DJNZ R3,LOP2

MOV R3,#3

LOP4: MOV R4,#8

MOV R2,#7

LOP3: MOV P1,#0FFH

MOV DPTR,#TABA

MOV A,R2

MOVC A,@A+DPTR

MOV P3,A

DEC R2

LCALL DELAY

DJNZ R4,LOP3

DJNZ R3,LOP4

MOV R3,#3

LOP6: MOV R4,#8

MOV R2,#0

LOP5: MOV P3,#00H

MOV DPTR,#TABB

MOV A,R2

MOVC A,@A+DPTR

MOV P1,A

INC R2

LCALL DELAY

DJNZ R4,LOP5

DJNZ R3,LOP6

MOV R3,#3

LOP8: MOV R4,#8

MOV R2,#7

LOP7: MOV P3,#00H

MOV DPTR,#TABB

MOV A,R2

MOVC A,@A+DPTR

MOV P1,A

DEC R2

LCALL DELAY

DJNZ R4,LOP7

38

DJNZ R3,LOP8

LJMP START

DELAY: MOV R5,#10

D2: MOV R6,#20

D1: MOV R7,#248

DJNZ R7,$

DJNZ R6,D1

DJNZ R5,D2

RET

TABA: DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH

TABB: DB 01H,02H,04H,08H,10H,20H,40H,80H

END

39

实验11电子琴

1. 实验任务

(1)由4X4组成16个按钮矩阵,设计成16个音。

(2)可随意弹奏想要表达的音乐。

2. 电路原理图

图1

3. 相关程序内容

(1)4X4行列式键盘识别;

(2)音乐产生的方法;

40

一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不

同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方

便,我们可以利用单片机的定时/计数器T0来产生这样方波频率信号,因此,我们只要把一

首歌曲的音阶对应频率关系弄正确即可。现在以单片机12MHZ晶振为例,例出高中低音符

与单片机计数T0相关的计数值如下表所示

音符

低1 DO

#1 DO#

低2 RE

#2 RE#

低 3 M

低 4 FA

# 4 FA#

低 5 SO

# 5 SO#

低 6 LA

# 6

低 7 SI

中 1 DO

# 1 DO#

中 2 RE

# 2 RE#

中 3 M

中 4 FA

频率(HZ)

262

277

294

311

330

349

370

392

415

440

466

494

523

554

587

622

659

698

简谱码(T值)

63628

63731

63835

63928

64021

64103

64185

64260

64331

64400

64463

64524

64580

64633

64684

64732

64777

64820

音符

# 4 FA#

中 5 SO

# 5 SO#

中 6 LA

# 6

中 7 SI

高 1 DO

# 1 DO#

高 2 RE

# 2 RE#

高 3 M

高 4 FA

# 4 FA#

高 5 SO

# 5 SO#

高 6 LA

# 6

高 7 SI

频率(HZ)

740

784

831

880

932

988

1046

1109

1175

1245

1318

1397

1480

1568

1661

1760

1865

1967

简谱码(T值)

64860

64898

64934

64968

64994

65030

65058

65085

65110

65134

65157

65178

65198

65217

65235

65252

65268

65283

下面我们要为这个音符建立一个表格,有助于单片机通过查表的方式来获得相应的数

低音0-19之间,中音在20-39之间,高音在40-59之间

TABLE: DW 0,63628,63835,64021,64103,64260,64400,64524,0,0

DW 0,63731,63928,0,64185,64331,64463,0,0,0

DW 0,64580,64684,64777,64820,64898,64968,65030,0,0

DW 0,64633,64732,0,64860,64934,64994,0,0,0

DW 0,65058,65110,65157,65178,65217,65252,65283,0,0

DW 0,65085,65134,0,65198,65235,65268,0,0,0

DW 0

2、音乐的音拍,一个节拍为单位(C调)

曲调值

调4/4

调3/4

调2/4

DELAY

125ms

187ms

250ms

曲调值

调4/4

调3/4

调2/4

DELAY

62ms

94ms

125ms

对于不同的曲调我们也可以用单片机的另外一个定时/计数器来完成。

下面就用AT89S51单片机产生一首“生日快乐”歌曲来说明单片机如何产生的。

在这个程序中用到了两个定时/计数器来完成的。其中T0用来产生音符频率,T1用来

产生音拍。

41

5. 程序框图

6. 汇编源程序

KEYBUF EQU 30H

STH0 EQU 31H

STL0 EQU 32H

TEMP EQU 33H

ORG 00H

LJMP START

ORG 0BH

LJMP INT_T0

START: MOV TMOD,#01H

SETB ET0

SETB EA

WAIT:

MOV P3,#0FFH

CLR P3.4

MOV A,P3

ANL A,#0FH

XRL A,#0FH

JZ NOKEY1

LCALL DELY10MS

MOV A,P3

ANL A,#0FH

XRL A,#0FH

JZ NOKEY1

MOV A,P3

ANL A,#0FH

CJNE A,#0EH,NK1

MOV KEYBUF,#0

42

LJMP DK1

NK1: CJNE A,#0DH,NK2

MOV KEYBUF,#1

LJMP DK1

NK2: CJNE A,#0BH,NK3

MOV KEYBUF,#2

LJMP DK1

NK3: CJNE A,#07H,NK4

MOV KEYBUF,#3

LJMP DK1

NK4: NOP

DK1:

MOV A,KEYBUF

MOV DPTR,#TABLE

MOVC A,@A+DPTR

MOV P0,A

MOV A,KEYBUF

MOV B,#2

MUL AB

MOV TEMP,A

MOV DPTR,#TABLE1

MOVC A,@A+DPTR

MOV STH0,A

MOV TH0,A

INC TEMP

MOV A,TEMP

MOVC A,@A+DPTR

MOV STL0,A

MOV TL0,A

SETB TR0

DK1A: MOV A,P3

ANL A,#0FH

XRL A,#0FH

JNZ DK1A

CLR TR0

NOKEY1:

MOV P3,#0FFH

CLR P3.5

MOV A,P3

ANL A,#0FH

XRL A,#0FH

JZ NOKEY2

LCALL DELY10MS

43

MOV A,P3

ANL A,#0FH

XRL A,#0FH

JZ NOKEY2

MOV A,P3

ANL A,#0FH

CJNE A,#0EH,NK5

MOV KEYBUF,#4

LJMP DK2

NK5: CJNE A,#0DH,NK6

MOV KEYBUF,#5

LJMP DK2

NK6: CJNE A,#0BH,NK7

MOV KEYBUF,#6

LJMP DK2

NK7: CJNE A,#07H,NK8

MOV KEYBUF,#7

LJMP DK2

NK8: NOP

DK2:

MOV A,KEYBUF

MOV DPTR,#TABLE

MOVC A,@A+DPTR

MOV P0,A

MOV A,KEYBUF

MOV B,#2

MUL AB

MOV TEMP,A

MOV DPTR,#TABLE1

MOVC A,@A+DPTR

MOV STH0,A

MOV TH0,A

INC TEMP

MOV A,TEMP

MOVC A,@A+DPTR

MOV STL0,A

MOV TL0,A

SETB TR0

DK2A: MOV A,P3

ANL A,#0FH

XRL A,#0FH

JNZ DK2A

CLR TR0

44

NOKEY2:

MOV P3,#0FFH

CLR P3.6

MOV A,P3

ANL A,#0FH

XRL A,#0FH

JZ NOKEY3

LCALL DELY10MS

MOV A,P3

ANL A,#0FH

XRL A,#0FH

JZ NOKEY3

MOV A,P3

ANL A,#0FH

CJNE A,#0EH,NK9

MOV KEYBUF,#8

LJMP DK3

NK9: CJNE A,#0DH,NK10

MOV KEYBUF,#9

LJMP DK3

NK10: CJNE A,#0BH,NK11

MOV KEYBUF,#10

LJMP DK3

NK11: CJNE A,#07H,NK12

MOV KEYBUF,#11

LJMP DK3

NK12: NOP

DK3:

MOV A,KEYBUF

MOV DPTR,#TABLE

MOVC A,@A+DPTR

MOV P0,A

MOV A,KEYBUF

MOV B,#2

MUL AB

MOV TEMP,A

MOV DPTR,#TABLE1

MOVC A,@A+DPTR

MOV STH0,A

MOV TH0,A

INC TEMP

MOV A,TEMP

MOVC A,@A+DPTR

MOV STL0,A

45

MOV TL0,A

SETB TR0

DK3A: MOV A,P3

ANL A,#0FH

XRL A,#0FH

JNZ DK3A

CLR TR0

NOKEY3:

MOV P3,#0FFH

CLR P3.7

MOV A,P3

ANL A,#0FH

XRL A,#0FH

JZ NOKEY4

LCALL DELY10MS

MOV A,P3

ANL A,#0FH

XRL A,#0FH

JZ NOKEY4

MOV A,P3

ANL A,#0FH

CJNE A,#0EH,NK13

MOV KEYBUF,#12

LJMP DK4

NK13: CJNE A,#0DH,NK14

MOV KEYBUF,#13

LJMP DK4

NK14: CJNE A,#0BH,NK15

MOV KEYBUF,#14

LJMP DK4

NK15: CJNE A,#07H,NK16

MOV KEYBUF,#15

LJMP DK4

NK16: NOP

DK4: MOV A,KEYBUF

MOV DPTR,#TABLE

MOVC A,@A+DPTR

MOV P0,A

MOV A,KEYBUF

MOV B,#2

MUL AB

MOV TEMP,A

MOV DPTR,#TABLE1

46

MOVC A,@A+DPTR

MOV STH0,A

MOV TH0,A

INC TEMP

MOV A,TEMP

MOVC A,@A+DPTR

MOV STL0,A

MOV TL0,A

SETB TR0

DK4A: MOV A,P3

ANL A,#0FH

XRL A,#0FH

JNZ DK4A

CLR TR0

NOKEY4:

LJMP WAIT

DELY10MS:

MOV R6,#10

D1: MOV R7,#248

DJNZ R7,$

DJNZ R6,D1

RET

INT_T0:

MOV TH0,STH0

MOV TL0,STL0

CPL P1.0

RETI

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

DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H

TABLE1: DW 64021,64103,64260,64400

DW 64524,64580,64684,64777

DW 64820,64898,64968,65030

DW 65058,65110,65157,65178

END

47

发布评论

评论列表 (0)

  1. 暂无评论