专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

自己写的地磁传感器程序

作者:佚名   来源:本站原创   点击数:  更新时间:2010年05月11日   【字体:

MOV A,ANGLE
 MOV B ,#19H
 add a,#01h
 mov 61H,a   ;25个脉冲的整数倍
;光电编码器信号处理程序
ORG 0000H
LJMP  MAIN
ORG  0003H ;外部中断0入口
LJMP SUB0
ORG 000BH ;定时器0中断入口
LJMP SUB1
ORG 0013H ;外部中断1入口
LJMP SUB2
org 002bh  ;定时器2中断入口
ljmp t2t1
org 00c0h
main:call    Init_Device
 mov wdtcn,#00deh
 mov wdtcn,#0adh  ;前面的外部中断重新配置
 mov th0,#0ffh
 mov tl0,#0ffh
 setb tr0   ;启动计数器0开始工作
 sjmp $ ;中断返回处
 org 100h
  ;外部中断0引发的x方向记转数
 sub0:inc 5eh  ;记脉冲数,为后面的定角度做准备
  mov a, 5eh
  cjne a,61h,L0 ;如果超过25个整数倍就清0
  Mov 5eh,#00H
  setb 6ah ;置内部某位为1作为标志
  l0:jnb p1.0,t0t ;判断P1.0为低电平则跳转
     mov a,52h
     add a,#01h ;高电平则为正转加1
     mov 52h,a
     mov a ,53h  ;如果C=1则跳至高字节操作
     addc a,#0
     mov 53h,a
     clr c    ;清楚C标志
     reti
     t0t:mov a,52h
     subb a,#01h   ;为低电平则为反转-1
     mov 52h,a
     mov a,53h
     subb a,#01
     mov 53h,a
     clr c
     ret
 ;Y方向引发的记转数
sub1: inc 5fh
  mov a, 5fh
  cjne a,61h,L1
  MOV 5fh,#00H
  setb 6bh

   L1:mov ie,#82h  ;开放T0中断禁止其他中断
  jnb p1.1,t1t
  mov a,54h
  add a,#01h
  mov 54h,a
  mov a,55h
  addc a,#0
  mov 55h,a
  mov ie,#3fh   ;恢复成初始值
  clr c
  reti

   t1t:  mov a,54h
  subb a,#01h
    mov 54h,a
     mov a,55h
    subb a,#0
    mov 55h,a
     mov ie,#3fh
     clr c
     mov ie,#3fh
     reti
 ;Z方向引发的计转数
sub2:inc 60h
 mov a,60h
 cjne a,61h,L2
 MOv 60h,#00H
 setb 6ch

 L2:mov ie,#84h
    jnb p1.2,t2t
  mov a,56h
    add a,#01h
  mov 56h,a
  mov a,57h
 addc a,#0
  mov 57h,a
    mov ie,#3fh
  clr c
    reti
  
    t2t:mov a,56h
  subb a,#01h
    mov 56h,a
   mov a,57h
   subb a,#0
   mov 57h,a
    mov ie,#3fh
    clr c
    mov ie,#3fh
    reti


;以下程序为地磁传感器接收程序,定时器1做波特率发生器,波特率为9600,采用内部时钟为16MHZ
 setb tr1  ;启动定时器1做波特率发生器,注意同时也启动了串口1
 setb ren
 mov r7,#04h
 trs:jnb ri,$ ;判断一帧是否接收完毕 ri为1时接收完毕
 clr ri
 mov a,sbuf0 
 mov 5ah,a
 inc 5ah
 djnz r7,trs
 mov r7,#04h  ;循环四次把数据发送至5A~5d四个单元
 ret
  ;以下为串口1的接收程序,PC和单片机的接收协议为A0+WORKMOD+参数+A0一共四个字节
;单片机收到A0后把收到的第一个字节送至30H单元存储,再根据WORKMOD的数据判断参数是存至31H还是32H
;如果WOKMOD是0,则参数在VB中的设置是为FF不存,如果是1存至31H,如果是2存至32H
 setb tr1
 setb ren
 mov r7,#04h
 rec:jnb ri,$ ;判断一帧是否接收完
 clr ri
 mov a, sbuf1
 subb a,#0ah
 jNZ,rec ;如果不等于A0则循环接收,等于则向下执行
   jnb ri,$
  clr ri
  mov a,sbuf1
  mov 30h,a ;把第一个字节存至30H
  jnb ri,$
  clr ri
  mov a ,30h
  cjne a,#0,recnum1 ;不为0则跳转
  ret  ;为0则退出重新接收
 recnum1: cjne a,#1,recnum2  ;不为1则跳转至方式2
  mov a,sbuf1
  mov 31h,a 
  ret
  recnum12: mov a,sbuf1
  mov 32h,a
  ret
 

 
 ;以下程序为数据发送程序,共为三部分,第一部分为定时发送,
 ;第二部分为定角度发送,第三部分为实时发送,它们的选择是由上位机发送过来的workmod的值判定的,约定为0为实时发送,1为
 ;定时,2为定角度
 


       ;定时发送为定时1ms的mscnt倍,实现的是一个mscnt倍1ms循环
certime:mov r1,50h  ;起始地址
    mov r2,0eh   ;一次发送14个字节
    setb tr2
    sjmp $

    t2t1: push 31H
      mov a,31H
      dec a
      jz sent
      reti
      sent: mov a,@r1
      mov sbuf1,a
      jnb ti,$
      clr  ti
      inc r1
      djnz r2 ,sent
      mov r2,#0eh
      pop 31H
 mov r2,#0eh
 mov a,30h
    cjne a,#0,choosemod3
    sjmp now
   choosemod3:mov a,30h
      cjne a,#2,cerangle
 reti  
    

  ;定角度发送实现的是对1.2°的angle倍,实现1.2°的angle次循环,原理同上,这里的1.2°是以光电编码器为基准,而且1.2°的
 ;时候正好是25个脉冲 ,不过缺点是最多只能5°,如果需要超过5°的定角度发送需要扩展
cerangle: jb 6ah,sent2
    jb 6bh,sent2
    jb 6ch,sent2;三个当中有一个走了1.2°的整数倍就发送
    sjmp $
    
    sent2: mov r1,#50h  ;起始地址
    mov r2,#0eh   ;一次发送14个字节
    setb tr1
    sjmp $
    L4: mov a,@r1
    mov sbuf1,a
    jnb ti,$
    clr  ti
    inc r1
    djnz r2 ,L4
    mov a,30h
    cjne a,#0,choosemod1
    sjmp NOW
    choosemod1:mov a,30h
    cjne a,#2,cerangle
    mov r2,#0eh
    ret

 ;实时发送
NOW: mov r1,50h  ;起始地址
 mov r2,0eh   ;一次发送14个字节
 setb tr1
 sjmp $

 L5: mov a,@r1
     mov sbuf1,a
     jnb ti,$
     clr  ti
     inc r1
     djnz r2 ,L5
     mov r2,#0eh
   mov a,30h
   cjne a,#0, choosemod2
   mov r2,#0eh
   ret
   choosemod2:mov a,30h
      cjne a,#2,cerangle
 sjmp  certime1
     end
 本例完整程序下载:http://www.51hei.com/ziliao/file/dici.rar

关闭窗口

相关文章