(玩電子) 電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

自己寫的地磁傳感器程序

作者:佚名   來源:本站原創   點擊數:x  更新時間: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.6718026.live/ziliao/file/dici.rar

發表評論】【告訴好友】【收藏此文】【關閉窗口

文章評論

相關文章

电子游戏三巨头 黑龙江体彩6加1开奖号 今天上海快三走势开奖结果 内蒙快3专家预测推荐 赌钱压的多顺口溜 河南快三走势图 福建11选五开奖一定牛 宝能集团股票代码 上海期货配资网 辽宁11选5遗漏一定牛 七乐彩玩法