📄 file11.asm
字号:
;该信号源可以产生 多种波形,包括:占空比为1:1的方波,频率可调节(1 -- 50 Hz)
;调制波,载波频率为1k,备调制频率 (1 -- 50 Hz)
;高频信号 : 高电平 5V, 低电平 0V 频率 500K;
;按键1选择 输出波形方式 1 ->非载波(LED3亮,LED1指示输出情况) 2 -> 载波(LED2亮,LED1指示输出);
;按键2选择 输出频率
;按键3 启动\停止
beep bit p3.7
led1 bit p1.0
led2 bit p1.1
led3 bit p1.2
led4 bit p1.3
led5 bit p1.4
led6 bit p1.5
led7 bit p1.6
led8 bit p1.7
s1 bit p0.0
s2 bit p0.1
s3 bit p0.2
s4 bit p0.3
s5 bit p0.4
s6 bit p0.5
s7 bit p0.6
s8 bit p0.7
t_l equ 41h ;定时初值低位
t_h equ 42h ;定时初值高位
mode equ 43h ;输出方式
fre equ 44h ;输出频率
dis_h equ 45h ;显示高位
dis_l equ 46h ;显示低位
intcout equ 47h ;需要定时的次数
start bit 00h
flag bit 01h
outmode bit 02h
outh bit 03h
led_data equ p2
key1 bit p3.3
key2 bit p3.4
key3 bit p3.5
key equ 46h
; ****************** 以上预定义部分
org 00h
jmp main
org 0bh
jmp tim0 ;定时器T0中断服务程序
org 1bh
jmp tim1 ;定时器T1中断服务程序
org 030h
main:mov sp,#30h
clr beep
lcall rest
lcall timer ;设置定时器工作方式
lp:lcall process ;分析命令
lcall out
jnb start,lp
lcall display
clr beep
jmp lp
; ********* 初始化 ************
rest: mov a,#00h ;寄存器初始化
mov b,#00h
mov fre,#00h
setb outmode ;带调制输出
clr outh ;输出低电平
mov mode,#01h ;工作模式 1
mov p0,#0 ;禁止数码管
mov p2,#255 ;
mov p1,0ffh ;禁止 LED
clr beep ;禁止蜂鸣器
clr start ;清除开始标志
mov dis_h,#00h ;清除频率值
mov dis_l,#00h ;
ret ;返回
;*********** 定时器T1中断服务程序 ****************
tim1: mov th1,t_h ;定时20ms
mov tl1, t_l ;
mov r0,intcout
djnz r0,tin1
cpl flag
tin1:clr flag
reti
;*********** 定时器T0中断服务程序 ****************
tim0: mov th0,0fch ;定时1ms
mov tl0, 17h ;
jnb flag,t_end ;flag运行标志,=1标示允许输出
jnb outh,t_end ;outh 表示输出高电平的状态
cpl p1.0
t_end:reti
; ************* 波形输出 ****************************
; 根据用户的输入指令,读入相应的数据,以产生不同频率的波形
; 数据表格存在 data_tab中
out: jnb start,o_end ; 开关状态,关闭则返回
jb outmode,out12
clr tr0 ;模式0,非载波输出
jnb flag,out11 ;查看定时器T1工作状态
setb p1.0 ;定时器T1前半周期,输出高电平
out11: clr p1.0 ;定时器T1后半周期,输出低电平
jmp o_end ;返回
out1: jnb flag,out12 ;工作方式1
setb tr0 ;定时器前半周期,定时器T0输出
out12: clr p1.0 ;定时器后半周期,输出低电平
o_end: ret ;返回
; ************ 读入数据 *****************************
indata: mov a,fre
mov b,#3
mul ab
mov a,b
mov dptr,#data_tab ;数据表头
movc a,@a+dptr ;读取数据
mov t_h,a ;保存数据高位
inc dptr ;找下一个
movc a,@a+dptr ;读取第二个数据
mov t_l,a ;保存低位
inc dptr
movc a,@a+dptr
mov intcout,a
ret ;返回
; ************ 工作协调子程序 **********************
process: mov key,#00h ;设置键值
lcall pro_key ;查询键盘
mov a,key ;得到键值
jz pro_end ;用户没有按键,直接返回
cjne a,#1,pro1 ;用户按 1 键
mov key,#00h ;重新设置键值
clr led3 ;点亮LED3指示灯
setb led2 ;熄灭LED2指示灯
inc mode ;设置输出模式
mov a,mode ;如果模式大于2
cjne a,#2,pro_end ;修改为 0
mov mode,#00h ;模式不能大于2
pro1:cjne a,#2,pro3 ;功能2设置频率
mov key,#00h ;清除键盘结果
inc fre ;频率自增
mov a,fre ;显示频率值
cjne a,#51,pro_end ;限制频率不大于50
mov fre,#00h ;
pro3: mov a,#03h ;运行状态设置
setb led3 ;设置指示灯状态
setb led2 ;
mov key,#00h ;清除键盘内容
cpl start ;如果没有设置启动状态,设置
pro_end: ret ;如果设置了启动状态
; ********* 码型变换 *************
bcd: mov b,#10
div ab
mov dis_h,a
mov dis_l,b
ret
; ********** 显示 **************
display: mov a,fre
mov b,#10
div ab
mov dis_h,a
mov dis_l,b
mov dptr,#tab_nu
mov a,dis_h
movc a,@a+dptr
mov led_data,a
setb s2
clr s1
lcall m_del
mov a,dis_l
movc a,@a+dptr
mov led_data,a
setb s1
clr s2
lcall m_del
ret
; ************ 键盘程序 *****************************
pro_key: ;键盘查询子程序
setb key1 ;首先输出低电平,检测高电平的到来
setb key2 ;不同电路,可能检测方式不一样
setb key3
jb key1,ke1 ;如果用户没有按第一个键,到第下个处理部分,
mov key,#1 ;表示用户按了第一个键
lcall delay20ms ;软件延时,防止干扰
jmp pro_key ;重新查询,直到用户释放按键
ke1:jb key2,ke2 ;处理第二个按键,如果没有到下一个处理部分
mov key,#2 ;以下和第一个处理单元相似。
lcall delay20ms
jmp pro_key
ke2:jb key3,ke3
mov key,#3
lcall delay20ms
jmp pro_key
ke3:
ret
; *********** 设置定时器T1 ************
timer:
mov tmod,#11h ;设置定时器T1为一个16位定时器
mov t_h,#0d8h
mov t_l, #0efh
mov th1,#0d8h ;定时10ms
mov tl1,#0efh ;
mov th0,#0fch ;定时1ms
mov tl0,#17h ;定时器T0
setb ea ;
setb et0 ;
clr tr0 ;定时器T1停止工作
ret ;返回
;************ 定时20 ms *************
delay20ms: push psw ; 保存原来的寄存器单元
clr psw.3 ; 设置新的寄存器
setb psw.4 ;
mov r0,#2 ; 延时参数1
mov r1,#250 ; 延时参数2
mov r2,#1 ; 延时参数3
dl1:djnz r0,dl1 ; 延时循环1
mov r0,#250 ; 重新设置循环数据
dl2:djnz r1,dl1 ; 开始第二道循环
mov r0,#240 ;
mov r1,#248 ;
dl3:djnz r2,dl1 ; 第三道循环
nop ; 修正定时精度
pop psw ; 恢复原来的寄存器组
ret ; 返回
;*********** end *******************
; ******* 显示定时 10 uS ****************
m_del: push psw
clr psw.3
setb psw.4
mov r7,#4
del1: nop
djnz r7,del1
pop psw
ret
; ******* data_tab 数据表格 **************
; th1, tl1,intcount ......
; ^ ^ ^
data_tab: db 12h, 00h, 01h,00h,01h,02h
db 00h
;***************************************************************************8
;这是数字显示表格,其中 带小数点的数字比不带小数点的数字大16
; 比如 0 的显示代码为 0;那么 0.的显示代码为 16;如此类推
tab_nu:
db 0c0h, 0f9h, 0a4h, 0b0h, 99h , 92h , 82h, 0f8h ; 数字0-7 不带小数点代码
db 80h , 90h, 88h , 83h , 0c6h, 0a1h, 86h, 8eh ; 数字8-f 不带小数点代码
db 40h , 79h, 24h , 30h , 19h , 12h , 02h, 78h ; 数字0-7 带小数点代码
db 00h , 10h, 08h , 03h , 46h , 21h , 06h, 0eh ; 数字8-f 带小数点代码
end ;告诉编译器本程序到此结束,一定需要加上,否则编译通不过。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -