📄 bringforthpulse.asm
字号:
/*本程序利用定时中断T0产生固定频率为200Hz的脉冲信号(在P1.1输出),通过示波器进行观察//
初始脉宽为高电平3ms,低电平2ms;占空比可通过按键循环调整,步进宽度为0.1ms//
编程思路:固定频率为200Hz的脉冲方波信号即脉冲周期为5毫秒,单片机采用12MHz
的晶体,T0用方式1,初始值高电平为65536-3000(即高电平持续时间为3毫秒),低电平为65536-2000(低电平持续2毫秒)
在单片机的P3.1上接一个高电平的持续时间增加的按键,在P3.5上接一个高电平持续时间
减小的按键,每按一次增加键时,高电平的定时初始值为65536-3000-100*按键的次数,
低电平的定时初始值为65536-2000+100*按键的次数; 每按一次减小键时,
高电平的定时初始值为65536-3000+100*按键的次数, 低电平的定时初始值为65536-2000-100*按键的次数;
用R0统计增加键按的次数,由于产生脉冲的周期是固定的最大为5毫秒,所以高定时的初始值最小也只
能为65536-5000,即当统计增加按键按下的次数超过20次时,就不能再统计了,同时将R1置0。
同理当用R1统计减小键按的次数时,当统计的次数超过30次时,就不能再统计了,同时将R0置0。
用R2作标志位,当R2==0时,定时器为高电平的定时时长,当R2不等于0时为低电平的定时量长
用30H,31H存放高电平的初始值(30H存高8位);用32H,33H存放低电平的初始值(33H为高8位)
*/
org 0000h
ajmp main
org 000BH
ajmp T0Interrupt
main:mov R0,#00H ;用R0统计增加键按的次数
mov R1,#00H ;用R1统计减小键按的次数
mov R2,#00H ;T0定时时长的标志位
mov R3,#00H ;用R3作按键标志,R3=1时,增加键按下,R3=2时减小键按下
mov sp,#70H ;将堆栈指针移位
mov 30H,#48H ;存放高电平定时初始值
mov 31H,#0f4H
mov 32H,#30H ;存放低电平定时初始值
mov 33H,#0f8H
call T0Init
loop:call key
ajmp loop
T0Init: ;T0初始化子函数
setb ET0 ;为中断作准备
clr TF0 ;若采用中断模式,此语句可以不要
mov A,TMOD ; T0模式设置为方式一,定时,不需外部控制,T1模式不变
anl A,#0f0H
orl A,#01H
mov TMOD,A
mov A,31H ;赋初始值,刚开始时,产生高电平(即65536-3000=62536)
mov TH0,A
mov A,30H
MOV TL0,A
setb P1.1 ;将P1.1输出置为高电平
setb TR0 ;定时计数器打开(即开始工作)
setb EA ;中断打开
ret
T0Interrupt: ;T0的中断函数
clr EA ;关中断
clr TR0 ;T0停止计数
mov A,R2 ;将R2的值取反
cpl A
mov R2,A
cjne R2,#00H,InfraPotential
mov A,31H ;赋初始值,产生高电平
mov TH0,A
mov A,30H
MOV TL0,A
setb P1.1 ;P1.1输出高电平
ajmp OkEnd
InfraPotential: clr P1.1 ;P1.1输出低电平
mov A,33H ;赋初始值,产生低电平
mov TH0,A
mov A,32H
MOV TL0,A
OkEnd:setb TR0 ;定时计数器打开(即开始工作)
setb EA ;中断打开
reti
key: mov c,P3.1 ;按键子函数
jnc R1INc00 ;如有按键跳到R1减1,如没有按键隹下继续检测P3.3
mov c,P3.5
jc MidFinish ;如有按键順序隹下执行对R0作加法,如没有按键则跳到子函数返回处
cjne R0,#1eH,R0Inc ;判断R0中的值是否加到30,没到30跳到R0Inc处执行
mov R0,#00H ;R0中的值等于20将R0重新赋值为0
mov 30H,#48H ;存放高电平定时初始值
mov 31H,#0f4H
mov 32H,#30H ;存放低电平定时初始值
mov 33H,#0f8H
ajmp waintKeyOpen0 ;跳到按键松开处
R0Inc: inc R0 ;R0中的值加1
cjne R1,#00H,R1dec ;2006.11.12增加的三条指令
ajmp R0Inc11
R1dec: dec R1
R0Inc11: mov B,#64H
mov A,#01H
mul AB ;要将乘得的结果与30H,31H中值相加,32、33中的值减去乘得的结果
mov R7,A ;将A中的值放入R7中,为作加减法作准备
mov R6,B ;将B中的值放入R6中,为作加减法作准备
;*********************下面这一小段完成两个16位数加法
clr c
mov A,30H
add a,R7
mov 30H,A
mov A,31H
addc A,R6
mov 31H,A
;********************下面这一小段完成两个16位数减法
clr c
mov A,32H
subb A,R7
mov 32H,A
mov A,33H
subb A,R6
mov 33H,A
waintKeyOpen0: mov c,P3.5 ;等待松开按键
jnc waintKeyOpen0
MidFinish:ajmp finish ;清0处理完毕跳到子函数返回处
;************下面这一小段对减法键按下进行处理
R1INc00: cjne R1,#14H,INCR1 ;判断R1中的值是否加到30,没到30跳到DecR1处执行
mov R1,#00H ;R1中的值等于30将R1重新赋值为0
mov 30H,#48H ;存放高电平定时初始值
mov 31H,#0f4H
mov 32H,#30H ;存放低电平定时初始值
mov 33H,#0f8H
ajmp waintKeyOpen1 ;跳到按键松开处
INCR1: inc R1 ;R1中的值减1
cjne R0,#00H,R0dec ;2006.11.12增加的三条指令
ajmp R1Inc
R0dec: dec R0
R1Inc: mov B,#64H
mov B,#64H
mov A,#01H
mul AB ;要将乘得的结果与30H,31H中值相加,32、33中的值减去乘得的结果
mov R7,A ;将A中的值放入R7中,为作加减法作准备
mov R6,B ;将B中的值放入R6中,为作加减法作准备
;*********************下面这一小段完成两个16位数加法
clr c
mov A,32H
add a,R7
mov 32H,A
mov A,33H
addc A,R6
mov 33H,A
;********************下面这一小段完成两个16位数减法
clr c
mov A,30H
subb A,R7
mov 30H,A
mov A,31H
subb A,R6
MOV 31H,A
waintKeyOpen1: mov c,P3.1 ;等待松开按键
jnc waintKeyOpen1
finish: ret ;子程序返回
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -