《微机原理及接口技术》
课程设计报告
题目:竞赛抢答器的设计
学 院: 中北大学信息与通信工程 专 业: 小组成员:
指导教师: 丁永红
2008 年 06 月 23 日
1、设计目的
1)了解竞赛抢答器的设计原理和方法。
2)掌握定时/计数器、并行接口芯片和中断控制的工作原理与使用方法。
2、所用元器件
1)80X86系列微机一台。
2)定时、计数器、并行接口芯片。 3)基本TTL电路芯片,七段数码管。
3、设计内容及步骤
1)设计要求
(1)可供4组同时抢答,由按钮控制。
(2)能显示出最先抢答的组号,而对其他组的抢答不予理睬。
(3)对主持人未曾按启动扭之前就按抢答按钮的犯规组,亮红灯警告。 (4)对抢答后的回答时间进行计时控制,如回答超时,则以音响报警。
2) 撰写设计报告
(1)各个硬件模块设计和原理图 (2)各个软件模块设计和流程图
4、硬件设计
1)总体设计
由于本次实验要用到数码显示、中断控制、倒计时等功能,故初步分析,需要8255、8253等芯片。
经过小组成员讨论,认为本实验的关键是准确判断出最先抢答者的信号并锁存,而同时不理睬其他抢答者的信号。为此,可将4个抢答按钮信号通过一个4位并行输入口接至微机中。当主持人启动抢答过程后,微机通过该并行输入口循环对4路抢答信号进行采样。当采样到那一组的抢答信号已经发出,则立即停止采样,并记录下该组的组号,每路抢答按钮电路可以参考下图进行设计。
图1 路抢答按钮电路
由图可知,当4组均未按下抢答按钮时,送入到并行接口的4位抢答状态都是0,而当微机采样到这4位数据不为0时,则表示有一组获得了抢答机会,然后通过逐位口查询个位口状态,即可判断出哪一组抢答成功,最后利用并行输出接口将抢答成功的组号现实出来.在实验中,可以仅用一位7段数码管来显示抢答选手的组号.
为了对抢答后的回答时间进行计时控制,可以利用一个可编程定时计时器,先置计数初值,再计时,当计时时间到后,由并行接口输出一个响铃信号提示抢答选手的回答时间已到。
由于本系统要求对犯规的组亮红灯警告,所以要设置一个启动按键,在主持人按下启动按键之前,如果有抢答钮被按下,则该抢答选手犯规,可以通过并行接口输出一个信号使该组的红色发光二级管点亮以示该组选手犯规。
综上所述,本实验的硬件电路可参考下图3示的硬件结构示意图进行设计。
图2 硬件结构示意图
其中8255与8086连接图如下图
4
图3 8086与8255连接图
实验原理图见附录一。
2)芯片介绍
(1)8255芯片
8255A内部有3个相互独立的8位数据端口,即端口A﹑端口B﹑端口C。设计人员可以用程序是他们分别作为输入端口或输出端口。不过,每个端口有着各自的特点。
端口A对应1个8位数据输入锁存器/缓冲器和1个8位数据输出锁存器/缓存器。所以,用端口A作为输入或输出时,数据均可以受到锁存。
端口B对应1个8位数据输入锁存器/缓冲器和1个8位数据输出锁存器/缓存器。
端口C对应1个8位数据输入锁存器/缓冲器和1个8位数据输出锁存器/缓存器。这样,当端口C作为输入端口时,对数据不作锁存,而作为输出端口时,对数据进行锁存。
在使用中,端口A﹑端口B和端口C可以相互独立,分别作为输入或者输出端口,也可以由端口C配合端口A﹑端口B作输入端口或者输出端口,此时,端口A和端口B作为独立的输入端口或输出端口,而端口C则配合端口A和端口B工作。具体得讲,端口C常常通过控制命令被分成两个4位端口,每个4位端口包含1个4位的输入缓冲器和1个4位的输出锁存器/缓冲器,他们分别用来位端口A和端口B提供控制信号和状态信号。 方式选择控制字
(2)8253芯片
8253的主要性能:8253可编程定时/计数器芯片时Intel公司生产的微型计算机通用外围芯片之一。采用24个引脚,双列直插式封装,其主要特性如下:采用NMOS工艺,用单一的+5V电源供电。片内有3个独立的16位减法计数器(或计数通道),每个计数器又可分为两个8位的计数器。计数频率为0~5MHz。两种计数方式,即二进制和BCD方式计数。6种工作方式,即可对系统时钟脉冲计数实现定时,又可对外部事件进行计数。可由软件或硬件控制开始计数或停止计数。
图4 8253引脚图
5、软件设计
1)主程序设计
实验的软件设计可以分为主程序﹑启动中断服务程序和定时中断服务程序三部分。
启动中断服务程序完成的任务较单一,只需要对启动标志进行记录。例如,可以在主程序中设置一个启动标志并清0,当启动按钮被按下后,系统进入中断服务程序。这时,只需要在中断服务程序中将启动标志置1即可,系统在返回主程序后将查询该标志,以确定抢答是否开始。
在主程序中,当判断有抢答钮被按下时,需要判断启动标志是否为1,如果系统还没有启动,则抢答结果为无效,且判断该抢答组犯规。此时,将通过并行接口送出点亮该组红色发光二极管的信号,提示有犯规行为。另外在主程序中,还要对抢答回答时间进行初始化赋值,当回答开始后,如果回答超时,则要通过并行接口送出响铃警报信息以提示超时。
在定时中断服务程序中,主要是完成对回答问题时间的计时操作时间计数器,当定时器每发一次定时中断时,时间计数器加1。
图5 主程序流程图
2)主程序
显示最先抢答组号及是否犯规程序
AAA:MOV AL,85H ;8255A的方式控制字,A口输出,B口输入
MOV DX,04A6H ;控制口的地址送DX OUT DX,AL ;初始化8255A AA:MOV DX,04A2H
IN AH,DX ;读PC3是否为0
AND AH,40H ;如果为零,说明抢答开始 CMP AH,00H ; JZ AA0 ;PB JNZ AA6
AA0:MOV DX,04A2H ;IN AL,DX
CMP AL,FFH ;JZ AA0 ;CMP AH,FEH ;1JZ AA1
CMP AH,FDH ;2JZ AA2
CMP AH,FDH ;3JZ AA3
CMP AH,F7H ;4JZ AA4 AA1:MOV DX,04A0H
MOV AL,79H ;JMP AA5 AA2:MOV DX,04A0H
MOV AL,24H ;JMP AA5 AA3:MOV DX,04A0H
MOV AL,30H ;JMP AA5 AA4:MOV DX,04A0H
MOV AL,19H ;JMP AA5 AA5:MOV DX,04A6H
IN AH,DX ; OR AH,DFH ; CMP AH,FFH ; JZ AAA JNZ AA5
AA6: MOV DX,04A2H ;IN AL,DX
转到读PB口的程序 口低电平有效 读B口的数据
读PB口值是否为FFH
如果是,表示没人抢答,继续等 号抢答成功 号抢答成功 号抢答成功 号抢答成功 显示1 显示2 显示3 显示4 读PC3是否为1
如果为1说明已复位 转到初始状态,否者等待 读B口的数据
CMP AL,FFH ;读PB口值是否为FFH
JZ AA ;如果是,表示没人抢答犯规,继续等 CMP AH,FEH ;1号抢答犯规 MOV DX,04A6H
MOV AL,09H ;LED1亮
CMP AH,FDH ;2号抢答犯规
MOV DX,04A6H
MOV AL,0AH ;LED2亮
CMP AH,FDH ;3号抢答犯规 MOV DX,04A6H
MOV AL,0DH ;LED3亮 CMP AH,F7H ;4号抢答犯规 MOV DX,04A6H
MOV AL,0FH ;LED4亮 8253初始化程序 AA7:MOV AL,15H ;写方式控制字(设计数器0工作于方式2)
MOV DX,04B6H ;控制口地址
OUT DX,AL ;控制字送8253控制寄存器 MOV DX,04B0H ;计数器0端口地址
MOV AL,60 ;将计数初值N=60写入计数器0 OUT DX,AH
6、心得体会
在这一周的微机原理课程设计里,我们小组完成了竞赛抢答器的设计,基本实现所有功能,通过这短短一周的实践,我们锻炼了自己动手设计软硬件的能力,大家分工明确,合作愉快,虽然我们每个人的分工很细致,但是在编写程序以及调试过程中还是遇到了很多问题,在同组同学和其他同学以及老师的帮助下,我们发现问题的所在,并进行修改,按时完成设计内容。
通过这次课程设计,我们了解到,即使书本上的知识掌握的更好,在将它付诸实践时,还是会遇到各种各样的问题。这次课程设计就是一次对自己所学知识的总结和综合应用,使我们对微机原理这门课程有了更深的了解。
7、参考文献
[1]李顺增,《微机原理及接口技术》,机械工业出版社,2006年第一版 [2] 冯博琴,《微型计算机原理及接口技术》,清华大学出版社 [3]王远,《模拟电子技术》,机械工业出版社
8、任务分工(具体到某些模块)
0506240117 刘轩 负责用七段数码管显示出最先抢答组号 0506240141 孟令章 负责用七段数码管显示出最先抢答组号 0506240107 李影 负责犯规控制 0506240120 葛晶 负责犯规控制 0506240103 侯久俊 负责计时控制 0506240110
于佳 负责计时控制
附录
程序2
;程序名字:抢答器
;功能:用户键(即抢答者):p32,p33;主持人键:p34,
;用法:1.主持人按开启键,以示开始;2.用户抢答,若到了10秒还没有按键就退出;3.显示用户号 ;4.等待主持人清除显示;5.清除后蜂鸣,以示庆祝
xsdat bit p1.4 ;定义驱动74164的数据脚为p1.4
xsclk bit p1.5 ;74164的时钟
gw bit p1.0 ;个位显示控制脚
sw bit p1.1 ;十位
;#############################################
org 00h
ajmp main
org 0bh
ajmp t0rup ;定时10秒钟,预防主持人已经按了开启键后无用户按键而死机
org 1bh
ajmp t1rup ;用于喇叭响0.5秒钟
org 30h
main: mov sp,#4fh
mov r3,#0 ;用于显示
mov r4,#0 ;用于定时,r2:蜂鸣
mov p0,#0ffh
mov p3,#0ffh
mov ie,#8ah
mov tmod,#11h
mov th0,#3ch
mov tl0,#0b0h ;每50ms中断一次
mov th1,#3ch
mov tl1,#0b0h ;每50ms中断一次
mov a,p3
orl a,#11110011b
cjne a,#0ffh,main ;以免有一或多个用户一直按住键
loop0:jb p3.4,loop0
mov p0,#0 ;主持开启键:p3.4,表示抢答开始
setb tr0 ;定时10秒钟,预防主持人已经按了开启键后无用户按键而死机
loop1:cjne r4,#200,ll;检测用户按键,若定时10s时间到了,即结束本次抢答
ajmp main
ll: mov a,p3
orl a, #11110011b
cjne a,#0ffh,ff
ajmp loop1 ;等待用户按键
ff:clr tr0 ;若有用户按键,就清除定时
rrc a
rrc a
loop4:rrc a
inc r3
jc loop4 ;将对应用户按键转化成用户号
nn: acall display
jb p3.4,nn ;等待主持人清除
acall delay
kk: jnb p3.4,kk ;等待主持人放开,以免主持人开启键与清除键相混淆
acall delay
acall fm ;蜂鸣,以做庆祝,同时将p0口全灭
mov p0,#0ffh
ajmp main
;#############################
fm: ;蜂鸣
setb tr1
clr p3.7
loop2:cjne r5,#20,tt
mov r5,#0 ;清零以备下次使用
setb p3.7 ;关闭扬声器,以免使它处于导通状态而不能发声
;用 cpl 反转驱动三极管的通断来发声要注意, ;在停止发声时一定要关闭三极管,不要让三极管长期处在导通状态!
;否则耗电很大,三极管发热严重,从而引起声音变小或无声。
clr tr1
ret
tt: cpl p3.7
mov r1,#122
djnz r1,$ ; 蜂鸣器都有谐振频率,一般在2kHz左右,不在这个范围声音就很小 ajmp loop2
;#############################
t0rup:mov tl0,#0b0h ;用于防死机定时
mov th0,#3ch
inc r4
reti
;###############################
t1rup: ;用于蜂鸣定时
mov tl1,#0b0h
mov th1,#3ch
inc r5
reti
;#############################
display:
MOV DPTR,#XSTAB
MOV A,r3 ;取得数据
MOVC A,@A+DPTR ;提取字模
ACALL DSOUT ;调用送出子程序
CLR GW
ACALL DS1MS ;调用显示1MS延时程序 SETB GW
MOV A,#0
MOVC A,@A+DPTR ;提取字模
ACALL DSOUT ;送出
CLR SW
ACALL DS1MS ;显示1MS
SETB SW
acall delay
ret
;#############################
delay:
mov r6,#00h
dl1: mov r7,#00h
djnz r7,$
djnz r6,dl1
ret
;---送出循环----------
DSOUT:
MOV R0,#8 ;传送一个字节8位
DSLOOP: RLC A ;左移
MOV XSDAT,C ;送数据到数据口
SETB XSCLK ;送一时钟
CLR XSCLK
DJNZ R0,DSLOOP
RET
;---显示延时----------
DS1MS: MOV R1,#10
DS1LO: MOV R2,#100
DJNZ R2,$
DJNZ R1,DS1LO
RET ;延时返回
;---------------------------------------------------------
;显示字表(共阴)
XSTAB: DB 3FH,06H,5BH,4FH ;
DB 7FH,6FH,77H,7CH ;
DB 39H,5EH,79H,71H ;
;****************************************************** end
《微机原理及接口技术》
课程设计报告
题目:竞赛抢答器的设计
学 院: 中北大学信息与通信工程 专 业: 小组成员:
指导教师: 丁永红
2008 年 06 月 23 日
1、设计目的
1)了解竞赛抢答器的设计原理和方法。
2)掌握定时/计数器、并行接口芯片和中断控制的工作原理与使用方法。
2、所用元器件
1)80X86系列微机一台。
2)定时、计数器、并行接口芯片。 3)基本TTL电路芯片,七段数码管。
3、设计内容及步骤
1)设计要求
(1)可供4组同时抢答,由按钮控制。
(2)能显示出最先抢答的组号,而对其他组的抢答不予理睬。
(3)对主持人未曾按启动扭之前就按抢答按钮的犯规组,亮红灯警告。 (4)对抢答后的回答时间进行计时控制,如回答超时,则以音响报警。
2) 撰写设计报告
(1)各个硬件模块设计和原理图 (2)各个软件模块设计和流程图
4、硬件设计
1)总体设计
由于本次实验要用到数码显示、中断控制、倒计时等功能,故初步分析,需要8255、8253等芯片。
经过小组成员讨论,认为本实验的关键是准确判断出最先抢答者的信号并锁存,而同时不理睬其他抢答者的信号。为此,可将4个抢答按钮信号通过一个4位并行输入口接至微机中。当主持人启动抢答过程后,微机通过该并行输入口循环对4路抢答信号进行采样。当采样到那一组的抢答信号已经发出,则立即停止采样,并记录下该组的组号,每路抢答按钮电路可以参考下图进行设计。
图1 路抢答按钮电路
由图可知,当4组均未按下抢答按钮时,送入到并行接口的4位抢答状态都是0,而当微机采样到这4位数据不为0时,则表示有一组获得了抢答机会,然后通过逐位口查询个位口状态,即可判断出哪一组抢答成功,最后利用并行输出接口将抢答成功的组号现实出来.在实验中,可以仅用一位7段数码管来显示抢答选手的组号.
为了对抢答后的回答时间进行计时控制,可以利用一个可编程定时计时器,先置计数初值,再计时,当计时时间到后,由并行接口输出一个响铃信号提示抢答选手的回答时间已到。
由于本系统要求对犯规的组亮红灯警告,所以要设置一个启动按键,在主持人按下启动按键之前,如果有抢答钮被按下,则该抢答选手犯规,可以通过并行接口输出一个信号使该组的红色发光二级管点亮以示该组选手犯规。
综上所述,本实验的硬件电路可参考下图3示的硬件结构示意图进行设计。
图2 硬件结构示意图
其中8255与8086连接图如下图
4
图3 8086与8255连接图
实验原理图见附录一。
2)芯片介绍
(1)8255芯片
8255A内部有3个相互独立的8位数据端口,即端口A﹑端口B﹑端口C。设计人员可以用程序是他们分别作为输入端口或输出端口。不过,每个端口有着各自的特点。
端口A对应1个8位数据输入锁存器/缓冲器和1个8位数据输出锁存器/缓存器。所以,用端口A作为输入或输出时,数据均可以受到锁存。
端口B对应1个8位数据输入锁存器/缓冲器和1个8位数据输出锁存器/缓存器。
端口C对应1个8位数据输入锁存器/缓冲器和1个8位数据输出锁存器/缓存器。这样,当端口C作为输入端口时,对数据不作锁存,而作为输出端口时,对数据进行锁存。
在使用中,端口A﹑端口B和端口C可以相互独立,分别作为输入或者输出端口,也可以由端口C配合端口A﹑端口B作输入端口或者输出端口,此时,端口A和端口B作为独立的输入端口或输出端口,而端口C则配合端口A和端口B工作。具体得讲,端口C常常通过控制命令被分成两个4位端口,每个4位端口包含1个4位的输入缓冲器和1个4位的输出锁存器/缓冲器,他们分别用来位端口A和端口B提供控制信号和状态信号。 方式选择控制字
(2)8253芯片
8253的主要性能:8253可编程定时/计数器芯片时Intel公司生产的微型计算机通用外围芯片之一。采用24个引脚,双列直插式封装,其主要特性如下:采用NMOS工艺,用单一的+5V电源供电。片内有3个独立的16位减法计数器(或计数通道),每个计数器又可分为两个8位的计数器。计数频率为0~5MHz。两种计数方式,即二进制和BCD方式计数。6种工作方式,即可对系统时钟脉冲计数实现定时,又可对外部事件进行计数。可由软件或硬件控制开始计数或停止计数。
图4 8253引脚图
5、软件设计
1)主程序设计
实验的软件设计可以分为主程序﹑启动中断服务程序和定时中断服务程序三部分。
启动中断服务程序完成的任务较单一,只需要对启动标志进行记录。例如,可以在主程序中设置一个启动标志并清0,当启动按钮被按下后,系统进入中断服务程序。这时,只需要在中断服务程序中将启动标志置1即可,系统在返回主程序后将查询该标志,以确定抢答是否开始。
在主程序中,当判断有抢答钮被按下时,需要判断启动标志是否为1,如果系统还没有启动,则抢答结果为无效,且判断该抢答组犯规。此时,将通过并行接口送出点亮该组红色发光二极管的信号,提示有犯规行为。另外在主程序中,还要对抢答回答时间进行初始化赋值,当回答开始后,如果回答超时,则要通过并行接口送出响铃警报信息以提示超时。
在定时中断服务程序中,主要是完成对回答问题时间的计时操作时间计数器,当定时器每发一次定时中断时,时间计数器加1。
图5 主程序流程图
2)主程序
显示最先抢答组号及是否犯规程序
AAA:MOV AL,85H ;8255A的方式控制字,A口输出,B口输入
MOV DX,04A6H ;控制口的地址送DX OUT DX,AL ;初始化8255A AA:MOV DX,04A2H
IN AH,DX ;读PC3是否为0
AND AH,40H ;如果为零,说明抢答开始 CMP AH,00H ; JZ AA0 ;PB JNZ AA6
AA0:MOV DX,04A2H ;IN AL,DX
CMP AL,FFH ;JZ AA0 ;CMP AH,FEH ;1JZ AA1
CMP AH,FDH ;2JZ AA2
CMP AH,FDH ;3JZ AA3
CMP AH,F7H ;4JZ AA4 AA1:MOV DX,04A0H
MOV AL,79H ;JMP AA5 AA2:MOV DX,04A0H
MOV AL,24H ;JMP AA5 AA3:MOV DX,04A0H
MOV AL,30H ;JMP AA5 AA4:MOV DX,04A0H
MOV AL,19H ;JMP AA5 AA5:MOV DX,04A6H
IN AH,DX ; OR AH,DFH ; CMP AH,FFH ; JZ AAA JNZ AA5
AA6: MOV DX,04A2H ;IN AL,DX
转到读PB口的程序 口低电平有效 读B口的数据
读PB口值是否为FFH
如果是,表示没人抢答,继续等 号抢答成功 号抢答成功 号抢答成功 号抢答成功 显示1 显示2 显示3 显示4 读PC3是否为1
如果为1说明已复位 转到初始状态,否者等待 读B口的数据
CMP AL,FFH ;读PB口值是否为FFH
JZ AA ;如果是,表示没人抢答犯规,继续等 CMP AH,FEH ;1号抢答犯规 MOV DX,04A6H
MOV AL,09H ;LED1亮
CMP AH,FDH ;2号抢答犯规
MOV DX,04A6H
MOV AL,0AH ;LED2亮
CMP AH,FDH ;3号抢答犯规 MOV DX,04A6H
MOV AL,0DH ;LED3亮 CMP AH,F7H ;4号抢答犯规 MOV DX,04A6H
MOV AL,0FH ;LED4亮 8253初始化程序 AA7:MOV AL,15H ;写方式控制字(设计数器0工作于方式2)
MOV DX,04B6H ;控制口地址
OUT DX,AL ;控制字送8253控制寄存器 MOV DX,04B0H ;计数器0端口地址
MOV AL,60 ;将计数初值N=60写入计数器0 OUT DX,AH
6、心得体会
在这一周的微机原理课程设计里,我们小组完成了竞赛抢答器的设计,基本实现所有功能,通过这短短一周的实践,我们锻炼了自己动手设计软硬件的能力,大家分工明确,合作愉快,虽然我们每个人的分工很细致,但是在编写程序以及调试过程中还是遇到了很多问题,在同组同学和其他同学以及老师的帮助下,我们发现问题的所在,并进行修改,按时完成设计内容。
通过这次课程设计,我们了解到,即使书本上的知识掌握的更好,在将它付诸实践时,还是会遇到各种各样的问题。这次课程设计就是一次对自己所学知识的总结和综合应用,使我们对微机原理这门课程有了更深的了解。
7、参考文献
[1]李顺增,《微机原理及接口技术》,机械工业出版社,2006年第一版 [2] 冯博琴,《微型计算机原理及接口技术》,清华大学出版社 [3]王远,《模拟电子技术》,机械工业出版社
8、任务分工(具体到某些模块)
0506240117 刘轩 负责用七段数码管显示出最先抢答组号 0506240141 孟令章 负责用七段数码管显示出最先抢答组号 0506240107 李影 负责犯规控制 0506240120 葛晶 负责犯规控制 0506240103 侯久俊 负责计时控制 0506240110
于佳 负责计时控制
附录
程序2
;程序名字:抢答器
;功能:用户键(即抢答者):p32,p33;主持人键:p34,
;用法:1.主持人按开启键,以示开始;2.用户抢答,若到了10秒还没有按键就退出;3.显示用户号 ;4.等待主持人清除显示;5.清除后蜂鸣,以示庆祝
xsdat bit p1.4 ;定义驱动74164的数据脚为p1.4
xsclk bit p1.5 ;74164的时钟
gw bit p1.0 ;个位显示控制脚
sw bit p1.1 ;十位
;#############################################
org 00h
ajmp main
org 0bh
ajmp t0rup ;定时10秒钟,预防主持人已经按了开启键后无用户按键而死机
org 1bh
ajmp t1rup ;用于喇叭响0.5秒钟
org 30h
main: mov sp,#4fh
mov r3,#0 ;用于显示
mov r4,#0 ;用于定时,r2:蜂鸣
mov p0,#0ffh
mov p3,#0ffh
mov ie,#8ah
mov tmod,#11h
mov th0,#3ch
mov tl0,#0b0h ;每50ms中断一次
mov th1,#3ch
mov tl1,#0b0h ;每50ms中断一次
mov a,p3
orl a,#11110011b
cjne a,#0ffh,main ;以免有一或多个用户一直按住键
loop0:jb p3.4,loop0
mov p0,#0 ;主持开启键:p3.4,表示抢答开始
setb tr0 ;定时10秒钟,预防主持人已经按了开启键后无用户按键而死机
loop1:cjne r4,#200,ll;检测用户按键,若定时10s时间到了,即结束本次抢答
ajmp main
ll: mov a,p3
orl a, #11110011b
cjne a,#0ffh,ff
ajmp loop1 ;等待用户按键
ff:clr tr0 ;若有用户按键,就清除定时
rrc a
rrc a
loop4:rrc a
inc r3
jc loop4 ;将对应用户按键转化成用户号
nn: acall display
jb p3.4,nn ;等待主持人清除
acall delay
kk: jnb p3.4,kk ;等待主持人放开,以免主持人开启键与清除键相混淆
acall delay
acall fm ;蜂鸣,以做庆祝,同时将p0口全灭
mov p0,#0ffh
ajmp main
;#############################
fm: ;蜂鸣
setb tr1
clr p3.7
loop2:cjne r5,#20,tt
mov r5,#0 ;清零以备下次使用
setb p3.7 ;关闭扬声器,以免使它处于导通状态而不能发声
;用 cpl 反转驱动三极管的通断来发声要注意, ;在停止发声时一定要关闭三极管,不要让三极管长期处在导通状态!
;否则耗电很大,三极管发热严重,从而引起声音变小或无声。
clr tr1
ret
tt: cpl p3.7
mov r1,#122
djnz r1,$ ; 蜂鸣器都有谐振频率,一般在2kHz左右,不在这个范围声音就很小 ajmp loop2
;#############################
t0rup:mov tl0,#0b0h ;用于防死机定时
mov th0,#3ch
inc r4
reti
;###############################
t1rup: ;用于蜂鸣定时
mov tl1,#0b0h
mov th1,#3ch
inc r5
reti
;#############################
display:
MOV DPTR,#XSTAB
MOV A,r3 ;取得数据
MOVC A,@A+DPTR ;提取字模
ACALL DSOUT ;调用送出子程序
CLR GW
ACALL DS1MS ;调用显示1MS延时程序 SETB GW
MOV A,#0
MOVC A,@A+DPTR ;提取字模
ACALL DSOUT ;送出
CLR SW
ACALL DS1MS ;显示1MS
SETB SW
acall delay
ret
;#############################
delay:
mov r6,#00h
dl1: mov r7,#00h
djnz r7,$
djnz r6,dl1
ret
;---送出循环----------
DSOUT:
MOV R0,#8 ;传送一个字节8位
DSLOOP: RLC A ;左移
MOV XSDAT,C ;送数据到数据口
SETB XSCLK ;送一时钟
CLR XSCLK
DJNZ R0,DSLOOP
RET
;---显示延时----------
DS1MS: MOV R1,#10
DS1LO: MOV R2,#100
DJNZ R2,$
DJNZ R1,DS1LO
RET ;延时返回
;---------------------------------------------------------
;显示字表(共阴)
XSTAB: DB 3FH,06H,5BH,4FH ;
DB 7FH,6FH,77H,7CH ;
DB 39H,5EH,79H,71H ;
;****************************************************** end