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