📄 file6.asm
字号:
;这是外部计数T/C1实验
;现象:LED1不停闪烁输出计数脉冲
;如果我们把P1.0(第1脚)和P3.5 T/C1 (第15脚)用导线直接相连
;我们就可以看到,在每次LED1闪烁一次以后,第一个数码管都会增加一次
;这里面显示的就是计数的结果(十六进制,并且数据没有经过译码)。
;用户可以自己参照实验3/5完成译码输出。
beep bit p3.7
segdata equ p0 ;数据 输出
sege equ p2.7 ;显示 选中
segb equ p2.6 ;位 选
segd equ p2.5 ;段 选
int_data equ 45h
count_data equ 44h
timer_data equ 43h
; ************* 以上为预定义部分 ******************
org 00h ;定义代码开始,由于单片机初始化为pc = 0000H
;因此,它执行的第一条指令必须从这里取得,
jmp main ;跳转到主程序开始处
org 1bh ;定时计数器1中断入口地址
jmp tim1 ;跳转到中断服务程序
org 030h ;这才是主程序真正的代码开始处
;也可以定义为不同的开始处,如 ORG 800H,
; 那么主程序代码从800H 开始,
main:mov sp,#30h ;这一条不能放在rest子程序中,否则
lcall rest ;子程序不能正确返回,为什么?
lcall pro_count ;计数程序开始
jmp main ;无限循环
;初始化程序
rest: mov a,#00h
mov b,#00h
mov p0,#0
mov p1,0ffh
mov p2,#255
clr beep
ret ;子程序返回
;中断服务程序
tim1:push psw ;现场保护
clr tr1 ;停止计数操作,防止意外
inc count_data ;计数单元加1
mov a,count_data ;得到计数结果
cjne a,#32,tlp1 ;如果没有计到32转移
mov count_data,#00h ;否则,将计数单元清零,重新计数
tlp1:mov th1,#255 ;写入计数初值高位
mov tl1,#254 ;写入计数初值低位
clr sege ;选中显示
mov segdata,#1
setb segb
nop
clr segb
mov a,count_data ;取出计数结果
mov dptr,#tab_nu ;查表显示结果
movc a,@a+dptr ;查表结果在累加器a中
mov segdata,a ;输出显示
setb segd
nop
clr segd
setb beep ;同时发出短音
lcall delay ;延时显示
pop psw ;现场恢复
setb tr1 ;开始计数
clr beep ;停止发音
reti ;中断返回
;//////// extern interrupt pro.. ///
; ************ 外部计数器程序
pro_count:
mov count_data,#00h
mov tmod,#50h ;设置计数方式1,设置不同的计数方式,参见指导书
setb ea ;允许总中断
setb et1 ;允许定时计数1中断,修改这里可得到不同的计数结果
mov th1,#255 ;计数初值,开始计数直到溢出,
mov tl1,#254 ;从而产生中断
setb it1 ;设置计数触发方式为下跳沿触发,clr it1则为低点平触发
;修改这个参数看看结果如何
setb tr1 ;开始计数操作
cl_p:clr ea ; 关闭所有中断 ? 为什么,到中断服务程序找答案
lcall delay ;软件延时
setb ea ;允许所有中断
cpl p1.0 ;将P1,0取反,从而输出2Hz方波
jmp cl_p ;反复输出,得到外部计数信号
ret ;返回
;******* count end *****************
;******* 显示数码表 *****************
;this delay program for 250 ms delay
;used r0, r1,r2 at psw.3 =0 and psw.4 = 0;
delay: push psw
clr psw.3
setb psw.4
mov r0,#2
mov r1,#250
mov r2,#2
dl1:djnz r0,dl1
mov r0,#250
dl2:djnz r1,dl1
mov r0,#240
mov r1,#248
dl3:djnz r2,dl1
nop
pop psw
ret
;********* delay 250ms end *******************
;这是数码管的显示字符编码,如果你要加入更多代码,请从后面加入,
;具体说明见以前的相关说明
tab_nu: db 0c0h,0f9h, 0a4h, 0b0h, 99h , 92h , 82h, 0f8h
db 80h , 90h, 88h , 83h , 0c6h, 0a1h, 86h, 8eh
db 40h , 79h, 24h , 30h , 19h , 12h , 02h, 78h
db 00h , 10h, 08h , 03h , 46h , 21h , 06h, 0eh
end ; 告诉编译器代码到此结束,这一条指令必须要
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -