📄 2051a-d.txt
字号:
,此程序是利用2051单片机P1.0,P1.1精密比较器功能实现a/d转换
通过P1.0电位器调节,控制七只电磁铁动作间隔
;***********************************************
;65.536us吸合时间程序 @120 =1
;***********************************************
AJMP star
;***********************************************
;INT0 interrupt server
;***********************************************
ORG 0003H
RETI
;***********************************************
;T0 interrupt server
;***********************************************
ORG 000BH
ajmp go1
;************************************************
;T1 interrupt server
;***********************************************
ORG 001BH
push a
;定时间隔计数减1
clr c
mov a,r6
subb a,#01
mov r6,a
mov a,r7
subb a,#0
mov r7,a
jnc tint50 ;定时未到转移
;定时到,启动T0吸合定时
setb tr0
clr tr1
;读取工作节拍模式
mov a,119 ;读取工作节拍模式于119号单元
;***输出当前节拍脉冲间
jnz tint3 ;非单节拍转
;****单节拍模式
mov p1,#0feh ;输出全1高电平
setb p3.7
sjmp tint50
tint3: cjne a, #01,tint6 ;非双节拍转
;****双节拍模式
inc r3
cjne r3,#1,beat12 ;r3中为节拍指示器
;****输出节拍1
mov p1,#56h ;2,4,6=1
clr p3.7 ;7=0
sjmp tint50
;****输出节拍2
beat12: mov p1,#0aah ;1,3,5=1
setb p3.7 ;7=1
mov r3,#0
sjmp tint50
tint6: cjne a,#02,tint9 ;不是三节拍模式转
;***三节拍模式
inc r3
cjne r3,#1,beat32 ;r3中为节拍指示器
;****输出节拍1
mov p1,#2ah ;3,5=1
clr p3.7 ;7=0
sjmp tint50
beat32:cjne r3,#2,beat33
;****输出节拍2
mov p1,#56h ;2,4,6=1
clr p3.7 ;7=0
sjmp tint50 ;
beat33:mov p1,#82h ;输出节拍3 1=1
setb p3.7 ;7=1
mov r3,#0
sjmp tint50
;***四节拍模式
tint9: inc r3
cjne r3,#1,beat42 ;输出节拍1
mov p1,#2ah ;3,5=1
clr p3.7
sjmp tint50
beat42:cjne r3,#2,beat43 ;输出节拍2
mov p1,#82h ;输出节拍4 1=1
setb p3.7 ;7=1
sjmp tint50 ;
beat43:cjne r3,#3,beat44 ;输出节拍3
mov p1,#12h ;4=1
clr p3.7 ;7=0
sjmp tint50
beat44:mov p1,#46h ;2,6=1
clr p3.7 ;7=0
mov r3,#0
tint50:pop a
RETI
;******************************************************
;ORG 0100H ;star
;******************************************************
;设置P1,p3口
star: mov p1,#02h ;p1.1口设为输入,p1.0=0放电 P1.2--P1.7 口设为输出
mov p3,#1dh ;p3.0/RXD, p3.2, p3.3, p3.4口设为输1,其余为输出0
;清数据区0-128
clr a
mov r0,#7fh
star3: mov @r0,a
djnz r0,star3
;设置中断优先级和中断允许
mov IE,#8AH ;中断允许设置 set ETO,ET1=1 of IE (enabel timer0,1 INT)
MOV IP,#02H ;PTO=1 set timer0最高优先级
;设置定时器
mov tmod,#21h ;set timer0 mode1, set timer1 mode2
clr a
mov th0,a ;set timer0 vaul=0 对12MHz 为65.536ms 最长充放电时间
mov tl0,a
mov 120,#1 ;放电计时累计最高字节在120单元 3*65.536ms约195ms
clr 127 ;置放电标志
clr p1.0 ;p1.0放电
;clr p3.1 ;p3.1放电
SETB TR0 ;Start timer0
mov th1,a ;set timer1 vaul=0 对12MHz 为256us
mov tl1,a
clr 126 ;复位Timer1 启用标志
loop0: jnb 127,loop0 ;等待放电结束
;setb p3.6
loop3: jnb p3.6,loop3 ;充电并等待比较器输出翻转-p3.6变高
;***取充电时间于r5,r4中
clr TR0 ;停T0
mov r4,tl0 ;读充电比较计时值于r5,r4
mov r5,th0
;***再进行放电
clr a
mov th0,a ;set timer0 vaul=0 对12MHz 为65.536ms 最长充放电时间
mov tl0,a
mov 120,#1 ;放电计时累计最高字节在120单元 3*65.536ms约195ms
clr 127 ;置放电标志
clr p1.0
;***若>=最大计数38912(9600H)约10s则不产生节拍输出
clr c
mov a,r4
subb a,#00h
mov a,r5
subb a,#90h
jc loop4
setb tr0
sjmp loop0
;***若<最大计数38912(9600H)约10s则产生节拍输出
loop4: setb tr1 ;启动T1 timer1 mode2
;***计算单节拍脉冲间隔值于r7,r6中
clr c ;约1024(4800h)--30000计数范围,r5,r4=th0,tl0-8192
mov a,r5
rrc a
mov r5,a
mov a,r4
rrc a
mov r4,a ;(r5,r6)/4
mov a, #0h ;
add a,r4
mov r6,a
mov a,#04h
addc a,r5
mov r7,a
clr c
;读取工作节拍模式于119号单元(从p3.2(int0),p3.3(int1) )
loop6: mov a,p3
rr a
rr a
anl a,#03
mov 119,a ;读取工作节拍模式于119号单元
;***计算当前节拍脉冲间隔值于r7,r6中
jz loop0 ;单节拍转
cjne a, #01,loop8;非双节拍转
mov a,r7 ;双节拍=单脉冲间隔值/2
clr c
rrc a
mov r7,a
mov a,r6
rrc a
mov r6,a
sjmp loop0
loop8: mov a,119
cjne a, #02,loop10;非三节拍转
mov a,r7 ;三节拍=单脉冲间隔值/3
clr c
rrc a
mov r7,a
mov r5,a
mov a,r6
rrc a
mov r6,a
mov r4,a ;(r7,r6)/2
mov a,r5
clr c
rrc a
mov r5,a
mov a,r4
rrc a
mov r4,a ;(r7,r6)/4
add a,r6
mov r6,a
mov a,r5
addc a,r7
mov r7,a ;(r7,r6)/2+(r7,r6)/4=(r7,r6)/3
sjmp loop0
loop10:mov a,r7 ;四节拍=单脉冲间隔值/4
clr c
rrc a
mov r7,a
mov a,r6
rrc a
mov r6,a
mov a,r7
clr c
rrc a
mov r7,a
mov a,r6
rrc a
mov r6,a
loop18:sjmp loop0
;*****************************************************
;T0 int go1
;*****************************************************
go1: djnz 120,go5 ;
setb 127 ;放电时间到;置充电标志
;setb p3.1 ;置充电电位高
mov p1,#03h ;释放所有电磁铁,放电时间同时作为吸合定时
mov p3,#1fh ;
go5: RETI
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -