⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 2051a-d.txt

📁 此程序是利用2051单片机P1.0,P1.1精密比较器功能实现a/d转换通过P1.0电位器调节
💻 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 + -