(玩电子) 电子技术学习与研讨
当时方位:单片机教程网 >> MCU规划实例 >> 阅览文章

自己写的地磁传感器程序

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

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.62pa.com/ziliao/file/dici.rar

宣布谈论】【告知老友】【保藏此文】【封闭窗口

文章谈论

相关文章