專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

自己寫的地磁傳感器程序

作者:佚名   來(lái)源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2010年05月11日   【字體:

MOV A,ANGLE
 MOV B ,#19H
 add a,#01h
 mov 61H,a   ;25個(gè)脈沖的整數(shù)倍
;光電編碼器信號(hào)處理程序
ORG 0000H
LJMP  MAIN
ORG  0003H ;外部中斷0入口
LJMP SUB0
ORG 000BH ;定時(shí)器0中斷入口
LJMP SUB1
ORG 0013H ;外部中斷1入口
LJMP SUB2
org 002bh  ;定時(shí)器2中斷入口
ljmp t2t1
org 00c0h
main:call    Init_Device
 mov wdtcn,#00deh
 mov wdtcn,#0adh  ;前面的外部中斷重新配置
 mov th0,#0ffh
 mov tl0,#0ffh
 setb tr0   ;啟動(dòng)計(jì)數(shù)器0開始工作
 sjmp $ ;中斷返回處
 org 100h
  ;外部中斷0引發(fā)的x方向記轉(zhuǎn)數(shù)
 sub0:inc 5eh  ;記脈沖數(shù),為后面的定角度做準(zhǔn)備
  mov a, 5eh
  cjne a,61h,L0 ;如果超過(guò)25個(gè)整數(shù)倍就清0
  Mov 5eh,#00H
  setb 6ah ;置內(nèi)部某位為1作為標(biāo)志
  l0:jnb p1.0,t0t ;判斷P1.0為低電平則跳轉(zhuǎn)
     mov a,52h
     add a,#01h ;高電平則為正轉(zhuǎn)加1
     mov 52h,a
     mov a ,53h  ;如果C=1則跳至高字節(jié)操作
     addc a,#0
     mov 53h,a
     clr c    ;清楚C標(biāo)志
     reti
     t0t:mov a,52h
     subb a,#01h   ;為低電平則為反轉(zhuǎn)-1
     mov 52h,a
     mov a,53h
     subb a,#01
     mov 53h,a
     clr c
     ret
 ;Y方向引發(fā)的記轉(zhuǎn)數(shù)
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   ;恢復(fù)成初始值
  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方向引發(fā)的計(jì)轉(zhuǎn)數(shù)
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


;以下程序?yàn)榈卮艂鞲衅鹘邮粘绦,定時(shí)器1做波特率發(fā)生器,波特率為9600,采用內(nèi)部時(shí)鐘為16MHZ
 setb tr1  ;啟動(dòng)定時(shí)器1做波特率發(fā)生器,注意同時(shí)也啟動(dòng)了串口1
 setb ren
 mov r7,#04h
 trs:jnb ri,$ ;判斷一幀是否接收完畢 ri為1時(shí)接收完畢
 clr ri
 mov a,sbuf0 
 mov 5ah,a
 inc 5ah
 djnz r7,trs
 mov r7,#04h  ;循環(huán)四次把數(shù)據(jù)發(fā)送至5A~5d四個(gè)單元
 ret
  ;以下為串口1的接收程序,PC和單片機(jī)的接收協(xié)議為A0+WORKMOD+參數(shù)+A0一共四個(gè)字節(jié)
;單片機(jī)收到A0后把收到的第一個(gè)字節(jié)送至30H單元存儲(chǔ),再根據(jù)WORKMOD的數(shù)據(jù)判斷參數(shù)是存至31H還是32H
;如果WOKMOD是0,則參數(shù)在VB中的設(shè)置是為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則循環(huán)接收,等于則向下執(zhí)行
   jnb ri,$
  clr ri
  mov a,sbuf1
  mov 30h,a ;把第一個(gè)字節(jié)存至30H
  jnb ri,$
  clr ri
  mov a ,30h
  cjne a,#0,recnum1 ;不為0則跳轉(zhuǎn)
  ret  ;為0則退出重新接收
 recnum1: cjne a,#1,recnum2  ;不為1則跳轉(zhuǎn)至方式2
  mov a,sbuf1
  mov 31h,a 
  ret
  recnum12: mov a,sbuf1
  mov 32h,a
  ret
 

 
 ;以下程序?yàn)閿?shù)據(jù)發(fā)送程序,共為三部分,第一部分為定時(shí)發(fā)送,
 ;第二部分為定角度發(fā)送,第三部分為實(shí)時(shí)發(fā)送,它們的選擇是由上位機(jī)發(fā)送過(guò)來(lái)的workmod的值判定的,約定為0為實(shí)時(shí)發(fā)送,1為
 ;定時(shí),2為定角度
 


       ;定時(shí)發(fā)送為定時(shí)1ms的mscnt倍,實(shí)現(xiàn)的是一個(gè)mscnt倍1ms循環(huán)
certime:mov r1,50h  ;起始地址
    mov r2,0eh   ;一次發(fā)送14個(gè)字節(jié)
    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  
    

  ;定角度發(fā)送實(shí)現(xiàn)的是對(duì)1.2°的angle倍,實(shí)現(xiàn)1.2°的angle次循環(huán),原理同上,這里的1.2°是以光電編碼器為基準(zhǔn),而且1.2°的
 ;時(shí)候正好是25個(gè)脈沖 ,不過(guò)缺點(diǎn)是最多只能5°,如果需要超過(guò)5°的定角度發(fā)送需要擴(kuò)展
cerangle: jb 6ah,sent2
    jb 6bh,sent2
    jb 6ch,sent2;三個(gè)當(dāng)中有一個(gè)走了1.2°的整數(shù)倍就發(fā)送
    sjmp $
    
    sent2: mov r1,#50h  ;起始地址
    mov r2,#0eh   ;一次發(fā)送14個(gè)字節(jié)
    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

 ;實(shí)時(shí)發(fā)送
NOW: mov r1,50h  ;起始地址
 mov r2,0eh   ;一次發(fā)送14個(gè)字節(jié)
 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.torrancerestoration.com/ziliao/file/dici.rar

關(guān)閉窗口

相關(guān)文章