CQ Taiwan

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

搜索
查看: 3796|回復: 12

EME/AMAST用控制器 (核心碼含說明)

[複製鏈接]

58

主題

11

好友

11萬

積分

分區版主

辛勤的下层劳动者

Rank: 55Rank: 55Rank: 55

發表於 2012-9-27 09:07:48 |顯示全部樓層
本帖最後由 BV4WD 於 2012-9-27 09:12 編輯
0 `) ^/ n/ M: L8 ~, {: D( n
, s" J7 g- p* M. W! l$ ^' ^相關資料(PCB,原理,參考資料,編譯器.....)請參閱
0 z' V$ p( q9 l. v
: T# Z$ m6 U5 i, C" Ohttp://www.bv4wd.tw/diy/controler- t, p% Z* h) @4 n) s

" |' e! d. S: d0 c. h4 Z! M' F, F  y9 Z7 \% f0 k

: u9 H* O8 g+ C: g0 |, Y) s5 v' j5 E! ^: f& a' y3 m

7 \3 T' ~. I" `% W
  1. 9 _! b$ |; A- `+ O
  2. /*******************************************************************************    ! o# t/ N4 C2 p. x: K! [- n
  3. EME(月面反射通訊)/AMAST(業餘衛星通信)用控制器 (核心碼)
    , V; ?# E5 U' `7 K
  4. 利用 控制轉向設備(定向天線) 自動/手動 達成 EME / AMAST 時透過軟件追逐目標之功能2 I3 x1 e4 s4 @, ~+ z
  5. (PCB線路圖,程式檔案在頁尾)
    5 n" W9 r4 G& H" x- ~& T
  6. 9 h' p! d0 ^* {
  7. 主核心: PIC16F877A
    : Y. Z0 n3 d( Q% C) s
  8. 使用週邊:  GY-26  (電子羅盤0~360)[0~3600 通訊]! I5 C! i" g4 O$ f% c9 j
  9. SCA60C N1000060 單軸傾角傳感器  
    , o" o5 {) h- T; f+ p5 I" x. P6 i
  10.           (傾角器-90~+90)[0.5~4.5 VDC ] 為了要能偵測超過下限,下限建議至少定在0.8~1左右2 x' t" l/ n3 H0 K
  11. $ h: @2 c: o8 k9 J/ q' Q
  12. MAX232 (與上位機通訊)  _0 v# I: b! f
  13. 1602 (液晶顯示)* J4 d# D7 J: R, ^( }
  14. ! l, G4 `/ m( r& g$ C+ y
  15. 液晶顯示:  第一行 顯示 "方位角 傾角 自動A/手動M 模式"
    5 I  b4 t: X. C& z, {3 l2 ~- H. v6 l
  16. 第二行 顯示 "目前狀態" 左/右/上/下 旋轉"2 ]% O  ~$ C8 g# [! Z2 V+ E6 n
  17. 8 e3 Q8 Q. ]3 ^5 F* r
  18. 支援指令: GS-232A (部份指令)
    : L& b) O5 h% I- |3 N' ?+ p
  19. C  //要求 水平角度
    0 {0 _! l$ `$ i
  20. B //要求 傾角( H- y* |) ?" h2 b
  21. C2 //要求 水平 + 傾角
    4 N. `; ^0 A, ~) T- c
  22. M //指令 前往 Mxxx 水平角度xxx! A5 I) e0 F) q0 q  U
  23. W //指令 前往 Wxxx yyy 水平角度xxx 傾角yyy
    7 Z* |% S5 L) \. S8 F6 ^
  24. S //指令 All Stop
    ' L, Q7 r/ D. O  r- Z3 O; o
  25. R //指令 Clockwise Rotation0 g7 t' x3 q% c8 e) P% D
  26. L //指令 Counter Clockwise Rotation" _! \8 t$ y. l& p
  27. A //指令 CW/CCW Rotation Stop; i7 _- J' h& c5 n2 t
  28. U //指令 UP Direction Rotation# Q4 T, m& V8 \3 n( A
  29. D //指令 DOWN Direction Rotation  e" w; r. o2 o8 r2 i9 Q; x
  30. E //指令 UP/DOWN Direction Rotation Stop! P% X0 J+ P1 V/ P
  31. % t) R3 s+ I. `8 C7 E
  32. I/O定義:
    / Z6 [( `4 Y/ E9 t- c; }
  33. 定義  TRISx 1為輸入/ 0為輸出 / x 為未始用(1) (TRISA只有6個Bit)
    * M4 `8 {& l* T3 z) V2 @3 I+ ^- O
  34. TRISA x x 0 x 0 0 0 1 <--- Bit0:傾角電壓輸入 /Bit1:手[自]動(接地=手動) /Bit235:上下左4 B2 ?$ ?& t& ?
  35. TRISB 0 0 0 0 0 0 0 0 <--- LCD IO 輸出- R! L: y; x1 F1 @2 ~
  36. TRISC 1 0 0 0 0 0 0 0 <--- Bit01: 停右 /Bit2:PWM輸出/Bit34:I2C總線/Bit6:RS-232TX輸出/Bit7:RS-232RX輸入
    - m# }. n2 @9 H6 C: q1 N# s
  37. TRISD 0 0 0 0 0 0 0 0 <--- Bit01267:R.L.OUTPUT / Bit345:LCD command
    / S5 ~; t" K4 i* ^4 o7 X
  38. ! y7 S  U% G. ~! s  s; Y
  39. 定義 PORTx 1為高電平/ 0為低電平 / x 為未始用 
    ' [$ `0 X" d7 @  ?
  40.       (TRISA只有6個Bit)電壓輸入口設低電平/其他需要改變狀態(拉成低電平)的設成高電平/再其他亦可都設成高電平6 a; R7 s, w2 \, T9 p
  41. PORTA x x 1 1 1 1 1 0 <--- Bit0:傾角電壓輸入 /Bit1:手[自]動(接地=手動) /Bit235:上下左輸入
    , Y) w, p* x! D
  42. PORTB 1 1 1 1 1 1 1 1 <--- LCD IO 輸出; V2 z% K; ^4 a! b
  43. PORTC 1 0 0 0 0 0 0 0 <--- Bit01:停右輸入/Bit2:PWM輸出/Bit34:I2C總線/Bit6:RS-232TX輸出/Bit7:RS-232RX輸入
    ( h0 u* w2 r. P+ C$ M2 Y
  44. PORTD 1 1 1 1 1 1 1 1 <--- Bit01267:R.L.OUTPUT (高電平 = 1 = 不動作 )/ Bit345:LCD command
    ) H! y& W" G* p5 z/ j

  45. 5 R+ u; o! _& L- h
  46. 接線注意 :  控制雲台轉向的繼電器實際接線時,  L: F* @6 W0 K2 o7 t7 C
  47. 將110V電源其中一線接到 上(COM) 再將 上(NC)->下(COM) 以此類推 ->左-->右
    6 x* r# q& O- \6 P5 R
  48. 這樣可以防止萬一繼電器同時動作時,110V的控制電源同時輸出(雖然程式有保護了,還是要有硬線防呆!)
    4 Q$ V2 A7 |% b
  49.                PS.控制線接在NO
    " Z( j0 A3 {0 u# m/ _

  50. 8 s+ b& D( n, p. n; e! X% z7 X
  51. 維護記錄:  2012-07-207 _& i+ c# r1 ?( D6 F7 O2 f" U
  52. ***************************************************************************************************/( D* _2 n0 d/ Q7 @( c" Z% g" X# L
  53. #include <pic.h> //頭文件在HI-TECH安裝目錄下\HI-TECH Software\PICC\std\9.60\include
    + u# F* c" q3 e! e
  54. #include <stdio.h>
    & p: K: c1 Q5 ~4 ]. I( |2 t+ Y5 K
  55. #include <string.h>
    ) V3 G# K7 ]5 j, }- l9 }* O: D' i

  56. ) R9 j( D1 I1 Y) D9 ^( R1 C
  57. #define uchar unsigned char
    6 m+ H0 k) V5 d7 `: X& v
  58. #define uint  unsigned int
    $ H8 ?! o7 B- s+ k/ B
  59. #define GY_26_ADDR  0xE0 //定義電子指南針器件地址(出廠默認為0XE0)) F$ `8 Y% Q. j7 a1 \8 x- i
  60. #define rs RD5           //LED 命令/數據選擇+ H6 @/ p# b! \7 ^+ n8 C0 o9 b
  61. #define rw RD4           //LED 讀寫口4 g2 g7 y8 ~7 ?9 Z
  62. #define e  RD3           //LED 鎖存控制1 X3 B& Y- I  G9 m8 Z# {2 c. |
  63. #define Dataport PORTB   //LED 數據口定義
    * u% w+ M& y) c& E
  64. 7 y0 c0 h9 F! ?5 L2 f
  65. void delay_20us(uint nus);6 d% D- T: u- ]
  66. void mcu_init(void);" U+ V7 y0 z$ X/ ?
  67. void nms_delay(uint nms);
    8 J6 T9 I9 f) s2 w
  68. uint  get_GY_26(uchar read_begin_address,uchar GY_26_cmd);) n) x+ m! [  @4 O1 K1 b/ ^
  69. uint  get_AD(void);
    6 [& g% W+ }4 H$ j( Y8 V! d
  70. void  conversion(uint i);
    " G' H2 O  b! q/ v5 A( `4 q# j
  71. void  cmdIU(uint i);
    ) |% D8 i1 r3 q% ]

  72. , j, o3 C6 ~2 m0 j
  73. //iic使用函數********************************//1 T. D+ d6 y$ o8 O( l; I
  74. void   iic_Start(void){SEN=1;while(SEN);}    //啟動iic
    : [% r+ u  D( b
  75. void   iic_Stop (void){PEN=1;while(PEN);}   //停止iic# s# O: f' @, y9 Z( w& k8 X
  76. void   iic_rest (void){RSEN=1;while(RSEN);}  //重啟iic 0 [) `! c* b5 H# k8 \' @
  77. void   iic_Write8Bit(uchar x){SSPIF=0;SSPBUF=x;while(!SSPIF);SSPIF=0;}//向iic總線寫8bit數據                2 k4 b) E' e# o3 T
  78. uchar  iic_read8Bit(void){RCEN=1;while(!BF);ACKEN=1;while(ACKEN);return SSPBUF;}//向iic總線讀8bit數據 ) Y: H- r& e) {: i: ]- L% @
  79. //****LCD定位點*********012345678901234567***************//
    ' a+ O- s  Q, [7 e0 `
  80. bank2 uchar  dis1[18]={"---- BV4WD -----\0"}; //顯示兩行7 f# a  i& m5 j
  81. bank2 uchar  dis2[18]={"-- Waitting ! --\0"}; //開機預設的顯示畫面,等待雲臺離開死點後進入程式會刷新) c; C- `. @$ W4 `( h% o" I* l
  82. bank2 unsigned int CMP_DATA;. Y+ k& W4 a& k) P) O- Y& K/ Q
  83. bank2 unsigned int result;1 i. a* @) x: k) h( L8 H* d

  84. 7 i3 g1 y% g5 M/ L4 q
  85. bank3 uchar disAZ[14]={"+00000000000\0"}; //水平
    4 }) w. i' V$ w: Z
  86. bank3 uchar disEL[14]={"+00000000000\0"}; //傾角' ^! u, Z  Z. N7 t) G6 V& X
  87. bank3 uchar disAZEL[14]={"+0000+000000\0"};  //水平 + 傾角9 y/ T2 r4 I7 m1 V2 n3 N# X
  88. 2 |- o1 S; u0 P. l# J
  89. bank1 uint AZ; // 檢測到的目前 水平角度. C2 J; X0 b( E' a& F1 z
  90. bank1 uint EL; // 檢測到的目前 傾角
    ' o# n; A+ q) I3 J' @
  91. bank1 uint cmd_AZ; // 指令 至 水平角度
    * o( O1 F' L, V# _) [
  92. bank1 uint cmd_EL; // 指令 至 傾角. G, K9 T% A2 N% n9 f: S* H0 s
  93. //**************************************以下僅做旗標用***********//! t+ `" V. \, d/ S, K( r9 z
  94. bank1 int rd_AZ; //要求 水平角度
    - u' _! Z$ i4 V2 ^6 ?6 [
  95. bank1 int rd_EL; //要求 傾角
    6 m+ N& p, K: i- t3 M- Q
  96. bank1 int rd_AZEL; //要求 水平 + 傾角& W, Q# B# ?1 {+ H0 |* |7 q' ^  N
  97. bank1 int rd_M; //指令 前往 Mxxx 水平角度xxx" F; e3 L0 t* a% d5 F
  98. bank1 int rd_W; //指令 前往 Wxxx yyy 水平角度xxx 傾角yyy( ]* Z9 p& r& f& _- [4 Z2 t+ R
  99. bank1 int rd_S; //指令 All Stop
    ! j: N4 N% M. F9 c1 t
  100. bank1 int rd_R; //指令 Clockwise Rotation
    ) ~% z; s& X* `1 c& U
  101. bank1 int rd_L; //指令 Counter Clockwise Rotation4 l+ W2 V5 d) Q/ T- _, O  C( e
  102. bank1 int rd_A; //指令 CW/CCW Rotation Stop: ~. w9 _; s: |+ q( _6 }( F
  103. bank1 int rd_U; //指令 UP Direction Rotation! `$ i& l! W3 A' [. [
  104. bank1 int rd_D; //指令 DOWN Direction Rotation" z: e" e3 G& ~& F- X
  105. bank1 int rd_E; //指令 UP/DOWN Direction Rotation Stop
    9 ]* L$ |' a6 E* G! N7 ]
  106. //**************************************以上僅做旗標用***********//! z- e% B/ c! i3 G0 |
  107. ) I! t0 {; ?+ o0 `( e$ J% X4 @5 \
  108. //***********以下變數使用 BANK1 *****************************
    - ~% `* p$ d; b  E& b3 v8 S6 E
  109. bank1 int RecTemp; //rs-232資料讀入暫存
    : o# B' C6 [- w1 Y
  110. bank1 uchar RecArray[12]; //將 RS-232 命令 寫入EEPROM用字串介面
    ' {! J' G! I* Z7 T* N- h

  111. / ?0 I- P, x' I5 T5 @
  112. * w6 i& ?6 r- R: Y5 u
  113. //*********************************************
    # u( o( ~( L2 X# u% u; s
  114. //數據轉換,十六進制數據轉換成10進制 " J, {' v+ l& m/ a* q* `
  115. //輸入十六進制範圍:0x0000-0x270f(0-9999)! u0 p/ ]1 [5 x  W, B
  116. //結果分成個十百千位,以ascii存入顯示區
    " m$ O, E4 ]' Z1 B- J- c6 `; P, |
  117. //**********************************************5 h1 J3 `$ ?6 [0 G4 G; y% X( Y
  118. void conversion(unsigned int i)  , F" h+ C. W. S! f+ x+ X- x
  119. {
    : C7 _/ L2 t2 V4 c, g$ P
  120. $ M  M$ i; p- z  q* J  o, n
  121. unsigned int j;9 b& N7 Q! l: ]. ~
  122. j=i; //將j=i 使用 j 做PWM運算
    6 @5 \& ?( [# x. C! i' B
  123. AZ=i/10;
    , }8 Q* e3 X6 s$ D

  124. 6 S; a$ v! J3 }: `4 p
  125. /* 不需羅盤0~360度 轉 PWM 0~5vdc 時, 本區關閉 節省資源
    : V- D* f  K# a
  126. PR2 = 0b10111110; //經實測 PR2/T2CON/CCP1CON 使用固定數值/ @" D, P' r$ @9 {( M  `
  127. T2CON = 0b00000100; //CCPR1L從 0~190 大約可對應 0~5vDC輸出
    ( R3 _0 a, F0 s
  128. CCP1CON = 0b00111100; //j=0~3600 3600/19 =189(取整數)/ l" i& I2 z& \
  129. CCPR1L =(j/19)+1; //189+1=190 ;+1之後表示 0度~2度會有 "1"5 I' _4 |. o0 ]2 X5 u' g  E1 c0 G' Y
  130. //所以精度大約為2度(後面定位時會可採用+/-2度及算定位完成)/ {; D; |4 A+ w- S0 Y' E
  131. */, R: i! `& d$ t& a
  132. ) |* c& u; M5 x! h
  133. dis1[3]=i/1000+0x30; // i : 取自電子羅盤的角度7 Z6 V/ g7 I5 L: y: f
  134.     i=i%1000;     //取餘數運算# `. N: X4 }6 f
  135.     dis1[4]=i/100+0x30;- E2 Y" S, k& G1 J' ^6 L! z4 I. j
  136.     i=i%100; //取餘數運算7 f$ S/ |6 I  g6 D. U
  137.     dis1[5]=i/10+0x30;
    $ T! H+ N; H; |1 C  q- {) P9 U4 G
  138.     i=i%10; //取餘數運算
    # ^' C! D' s4 m# l  I( X
  139.     dis1[6]=0xDF; //(度)
    ) P" s  }' D; J. S! Y0 Y0 n- E$ j
  140. 3 N% X0 c& u4 t& H& a0 ]
  141. //*************************************************************
    - G& w3 p( I4 \! E- t7 O
  142. //這是電壓顯示部份,不顯示 不需運算$ Z7 ^8 t8 Y  Z1 U9 n; n$ [
  143. //*************************************************************$ _9 K# v8 S1 R' V+ X9 x' E7 b# U
  144. /*顯示 羅盤0~360度 轉 PWM 0~5vdc 時,的理論電壓值. x3 a) m" i- }# C& h8 W  T
  145. j=(((j/19)+1)*100)/38; // j : 計算出來的理論電壓$ ^& A0 ?; d  \1 I
  146. dis1[10]=j/100+0x30;
    9 d2 c" h7 E) i0 e6 B
  147.     j=j%100;     //取餘數運算% h, p6 h+ E) m7 u3 P* I& @7 i
  148.     dis1[11]=0x2E; //.(小數點)2 _- ^' [9 d8 x2 K
  149.     dis1[12]=j/10+0x30;
    - \2 q; ~+ u* O8 G/ l& H" x: r
  150.     j=j%10;      //取餘數運算
    ' H; `/ k3 U+ U* J; o! R0 ]4 W5 f5 p
  151.     dis1[13]=j+0x30;
    ( h: d/ S9 j* X8 _: [6 P% H) C
  152.     dis1[14]=0x30;3 z! A$ r5 N( D. b
  153.     dis1[15]=0x56; // V
    ' `9 o1 ]2 d: {: T1 w; _5 i: [

  154. , P) e& r3 \3 |# Z5 v( c+ D1 N
  155. //以下是 計算/顯示 至 小數位 但無意義
    ; d+ m) K% {1 \8 @
  156. dis1[3]=i/1000+0x30; // i : 取自電子羅盤的角度4 }+ Z  z4 y3 n& t& o
  157.     i=i%1000;     //取餘數運算4 k: u) D4 g2 T2 h7 J& g% q
  158.     dis1[4]=i/100+0x30;/ U# D& s, Z8 b: |/ E: N! S
  159.     i=i%100; //取餘數運算; {6 L. ^  a" R1 c
  160.     dis1[5]=i/10+0x30;
    + _9 m# C3 {9 k% I: E3 x' l
  161.     i=i%10; //取餘數運算
    - W/ r# N+ G& W; Z; s
  162.     dis1[6]=0x2E; //.(小數點)9 t4 G& }+ R! l& P% K6 ?# z/ n
  163.     dis1[7]=i+0x30;  Y& A! q8 @7 s9 n8 D2 F
  164.     dis1[8]=0xDF; //(度)
    9 u) {5 y$ ]; x. M' W
  165. */" w, \) j1 P9 ^7 _7 t9 p
  166. $ ^" R; B/ F4 t
  167. ; [; n, c  N+ i! w  {; E( a) _: \
  168. 1 E: q) K- E( Y7 {: K7 q' @
  169. //*****************************************
    3 b$ l  ]- R# m. y( ?, }
  170. //將水平 度數值放入暫存區等候RS-232 調用 4 d* K& u/ i: \' {) A+ G
  171. //****************************************** H4 Y1 p2 B. f2 j7 A

  172. 4 _( W8 j0 z1 _. L2 P2 [0 `0 D" W
  173. disAZ[2]=dis1[3]; //水平角度 百位) J! P1 N  d% h
  174. disAZ[3]=dis1[4]; //水平角度 十位5 @8 A1 X$ o, y7 G
  175. disAZ[4]=dis1[5]; //水平角度 個位$ h* s8 u* X+ F
  176. * ^- N0 p/ Z% k/ \6 c2 C3 f
  177. //*****************************************
    5 H) I$ k: q/ w8 I
  178. //將水平 + 傾角 角度放入暫存區等候RS-232 調用 ( T+ u* _& P0 H& c9 F# d) Y
  179. //*****************************************
    2 t( U% \; a7 U" t& D: P7 e
  180. 2 l: A8 |# D4 S; S0 P
  181. disAZEL[2]=dis1[3]; //水平角度 百位
    1 w* A+ g, @+ c' N% u7 L
  182. disAZEL[3]=dis1[4]; //水平角度 十位
    ; Q! q5 s& S- ?0 \0 L. F. S
  183. disAZEL[4]=dis1[5]; //水平角度 個位$ f4 o2 K* J" V+ j- Y, n
  184. 4 U6 }4 D4 D. }9 X# t
  185. }
    8 S) D8 J& u# ]/ S& ]

  186. / f3 Z# Z% ^3 }- C' W8 y
  187. //**************************************************************************************************# H. \( [/ Y% ?  ?  E1 K# T" u
  188. //數據轉換,AD轉換結果
    + p; l+ O' `0 F" X6 g; {) O
  189. //輸入十六進制範圍:0x0000-0x03FF(0-1023)/ |8 V! @' x  u! v; A
  190. //結果分成個十百千位,以ascii存入顯示區
    / b6 Q( g# I; S8 p/ ?) e
  191. //**************************************************************************************************
    7 {* Q1 k, r0 m" ]. \# S! p
  192. void conversion2(unsigned int d)    ^3 J5 g" C) }% s! w! n
  193. {
    ' F/ h, K3 M* r3 P1 t7 {: T
  194.    int  ad1,ad2,ad3,ad4;        //定義6個AD轉換臨時變量 整數常數 int 佔有 16 個 位元
    1 {  I4 g" o2 `& I
  195.    //float temp,temp1; //定義4個計算臨時變量 浮點常數 float 佔有 32 個 位元
    2 g8 s) [) L8 g1 g, h' r
  196.    float temp,temp1,ed1,ed2; //定義4個計算臨時變量 浮點常數 float 佔有 32 個 位元+ ]" |8 l7 u( y: q/ O
  197. temp=d*5.0/1023; //暫存AD轉換的結果 10位AD 2的10次方=1024
    # D  ]  y1 y4 T4 m& K0 O
  198. temp1=temp; //將數值暫存 temp 計算電壓 / temp1 計算角度; k0 C& M5 Q4 W" o, n$ P6 E
  199. ad1=(int)temp; //計算輸入電壓! v) F$ v% c1 s$ H4 R$ m6 i6 F
  200. ad2=((int)(temp*10)-ad1*10);3 G% ^7 G7 F+ X1 Z* o0 U
  201. ad3=((int)(temp*100)-ad1*100-ad2*10);* d! C* G  ~# R% ]
  202. ad4=((int)(temp*1000)-ad1*1000-ad2*100-ad3*10);
    : N4 {) i; V  Q6 Q; I, l
  203. //*************************************************************
    - v5 W! Y2 V- {! S
  204. //這是電壓顯示部份,不顯示 不需運算1 R+ E, F9 F, y* x. h
  205. //*************************************************************
    8 c2 y7 P$ Y# O8 e  a" ^
  206. //dis2[10]=(int)temp+0x30; //顯示 個位
    8 l( L3 n6 P8 ~0 {* `
  207.     //dis2[11]=0x2E; //.(小數點)
    ; e, T- a- j( O6 g+ N& I3 F3 L
  208. //dis2[12]=((int)(temp*10)-ad1*10)+0x30; //顯示 小數第一位$ s' s3 I6 N. v& W( v# J
  209. //dis2[13]=((int)(temp*100)-ad1*100-ad2*10)+0x30; //顯示 小數第二位: q! w2 @: j! d- N6 e4 }/ @% b
  210. //dis2[14]=((int)(temp*1000)-ad1*1000-ad2*100-ad3*10)+0x30; //顯示 小數第三位8 z' u) ]  h; K$ c" `) k
  211.     //dis2[15]=0x56; // V5 S# l1 O) U8 U! ]3 N" S( g
  212. //EEPROM_WRITE(0x08,0x01);
    4 w0 f! f2 t# G6 P) v) ?
  213. //EEPROM_WRITE(0x09,0x04);
    0 ]7 h- [) D1 F' \% u. i
  214. //********************************************************************************
    # d$ h/ O1 R9 Q& z4 P8 `
  215. //(傾角器-90~+90[共180])[0.5~4.5 VDC ] 為了要能偵測超過下限,下限建議至少定在高於0.8v
    9 s# ^* Z0 Z- ^# B2 k/ g
  216. //4.5-0.5=4 4/2=2 (VDC)<--只取中間90度用 下限取1.5v/上限取1.5+2=3.5V/中點2.5v. {. ]% }3 P) a* |1 e) ^
  217. //********************************************************************************
    : G1 Q$ ^- K! [4 m# e+ r' |2 _
  218. ed1=1.5; //電壓下限 0度
    " A/ G3 S! P8 C" I2 c
  219. ed2=3.5; //電壓上限 90度8 k& c; r3 @3 V: C5 N; ?! P8 _
  220. //*************************************************************
    % n5 l6 W+ e$ V' I, I/ J/ B( k
  221. temp1=(temp1-ed1)*(90.0/(ed2-ed1)); //計算角度 0~90
    $ Q. }/ ?( n0 Y9 O4 l' Y" G
  222. EL=(int)temp1;
    ! i0 x# O- ], k9 [  D( W8 [6 Q
  223. ad1=((int)(temp1/10));     //十
    ( A$ c0 h( _/ v, d
  224. ad2=((int)(temp1-ad1*10)); //個
    0 z0 X0 S9 K  ^' o' M2 ~( C8 n
  225. ad3=((int)(temp1*100)-ad1*10-ad2); //小數( Z) W( d0 G2 A) Y, `/ Y! f* X, x
  226. # L/ b1 W/ V( x& ^7 h
  227. dis1[11]=((int)(temp1/10))+0x30; //顯示 十位
    6 g7 E' d3 p0 P# F$ ^% A
  228. dis1[12]=((int)(temp1-ad1*10))+0x30; //顯示 個位
    3 t% |/ k2 Z( Y# M! v9 H" d; B  Y" {
  229.     dis1[13]=0xDF; //(度)( _3 |! }- g5 f1 m1 W4 T, E* x7 w$ v' e
  230. : P% P  v# R) {/ P. |
  231. //*************************************************************/ i1 B' A0 h. T
  232. //可計算/顯示 至 小數位 但無意義3 M7 X! l4 z8 l/ ?; i
  233. //*************************************************************
    % l* f' a" h; u: g% C- Y0 Y
  234.     //dis2[6]=0x2E; //.(小數點)5 \4 [( W) @* M
  235. //dis2[7]=((int)(temp1*100)-ad1*10-ad2)+0x30; //顯示 小數第一位# b5 A+ c: S- }# e6 Q& K: m" g

  236. : P; r. C3 t0 \# E* @

  237. 3 R! l5 e8 Q  W4 `4 y
  238. //*****************************************
    & U. j' j1 N9 H
  239. //將傾角 度數值放入暫存區等候RS-232 調用
    5 Y; g6 w7 S9 Q6 Q
  240. //*****************************************+ F6 J, Z; G, P+ M% q
  241. ' d# Y7 O" v3 K0 I( y3 o4 \
  242. disEL[2]=0x30; //水平角度 百位
    ; ]5 S( j4 P; i
  243. disEL[3]=dis1[11]; //水平角度 十位# n2 E! v$ b- Y. `8 |' F3 E
  244. disEL[4]=dis1[12]; //水平角度 個位
    ; K0 N+ e+ x+ e/ u4 _

  245. 8 {3 R0 o  c  A0 ?
  246. 8 F+ V1 w" R; f0 |! c3 q8 z2 m( B
  247. //*****************************************
    4 b% O8 `2 f/ ~( M. Y0 E* e9 |7 G
  248. //將 傾角 角度放入暫存區等候RS-232 調用 " j6 |2 i9 J9 r( \% ~, B$ N5 A8 g
  249. //*****************************************- n# m! G5 z  K2 s2 r
  250. disAZEL[7]=0x30; //傾角角度 百位: G- I" K, C1 _7 w" m/ J& f8 p
  251. disAZEL[8]=dis1[11]; //傾角角度 十位
    / v% J5 s2 g* ]4 s8 c  J. m. U/ p
  252. disAZEL[9]=dis1[12]; //傾角角度 個位; m% W# T* H: g: x3 e4 _
  253. % K2 \8 I5 {" ]' o/ c% B! F( L( T) @
  254. % Y3 @. K! X% }/ e) {
  255. if(temp<ed1) //當輸入電壓低於 電壓下限% P- e+ b0 b% x7 q+ C
  256. {# ~1 A/ ?# \- r( k6 W' U( i
  257. disEL[2]=0x30; //傾角角度 百位 設0/ K6 s) _( Z! {9 \$ h; C% j7 J
  258. disEL[3]=0x30; //傾角角度 十位 設0
    9 g4 y; T& n% S5 {0 q+ j! j, v
  259. disEL[4]=0x30; //傾角角度 個位 設0' F/ F1 Q2 y6 l' k. g

  260. 1 C9 t1 f% N% y1 f$ z) ^
  261. disAZEL[7]=0x30; //水平+傾角的 傾角角度 百位 設0
    ) d8 v9 m: y% m1 T3 @( l0 g
  262. disAZEL[8]=0x30; //水平+傾角的 傾角角度 十位 設0
    $ k" e5 z- `9 N% D7 O1 O1 R
  263. disAZEL[9]=0x30; //水平+傾角的 傾角角度 個位 設0
    & l8 z& x0 P# ]: e+ U

  264. # e5 R( B" X+ B6 h
  265. dis1[11]='L';
      N8 f. |, Y. L
  266. dis1[12]='o';
    5 J0 L6 b. ^6 v0 A% `/ ?! T0 V
  267. }
    9 J3 A1 ?" l' Q- _+ O5 H

  268. ( u1 u' E) `- }, z" L9 x" G
  269. if(temp>ed2) //當輸入電壓高於 電壓上限
    ) p6 Y, W5 f0 T4 ]7 s1 W& g  {( f
  270. {& F/ S% X; T. H0 B( u7 X6 W- J
  271. disEL[2]=0x30; //傾角角度 百位 設0
    : l. [% Z% l% o0 L6 @. N1 X, g* V
  272. disEL[3]=0x39; //傾角角度 十位 設9
    9 S+ m+ T5 G) ?. y( D+ |3 H
  273. disEL[4]=0x30; //傾角角度 個位 設03 ]/ f3 R4 s, X( v6 ?
  274. ( X2 g& @/ v* e& P& G3 B8 z
  275. disAZEL[7]=0x30; //水平+傾角的 傾角角度 百位 設0
    ' R. X; d" |9 O# a, a/ b
  276. disAZEL[8]=0x39; //水平+傾角的 傾角角度 十位 設9
    1 R1 B3 N+ p! ?5 a- M5 R  n
  277. disAZEL[9]=0x30; //水平+傾角的 傾角角度 個位 設0
    # u  U7 _; N  y$ f% q
  278. 3 V0 ~* @/ B$ g
  279. dis1[11]='O';: G9 s+ Q! L) V% p
  280. dis1[12]='v';
    5 G% _! E% O: d5 _2 J  S
  281. }
    $ a5 J4 W7 r9 \. L! d$ y9 A$ p

  282. : G5 B1 h; Y9 O2 t1 B3 ?* \3 G
  283.   f3 @3 ?+ h, _, T1 o

  284. 0 i# N5 {9 b- G7 B$ |2 w
  285. ; Y: j/ j% N; Q5 a, l5 {2 y
  286. }
    6 S: ~0 z- r( r+ `% `: E

  287. " I. N* M! R1 z/ M, Y
  288. //**************************************************************************************************
    7 V# m" p. d/ T2 y- @5 Q
  289. //數據轉換,ascii 轉換成 十六進制數據 5 R: ^9 v, ~( }4 q+ E
  290. //**************************************************************************************************( ?7 u; N4 _6 G4 q, {8 a
  291. void con_WB(void)    f4 \! Q9 m7 _0 P0 y5 k/ ?* \
  292. {
    3 t3 x7 e: K; F7 l
  293. unsigned int k,p;
    8 H, {: L, Y( C% ^
  294. k=0;2 f' q5 z1 J) z0 D; g7 K
  295. p=0;
    $ r7 C. J# x2 P: ?8 z
  296. k=(RecArray[1]-0x30)*100;3 ]2 D7 T3 c" O+ d6 \
  297. k=k+(RecArray[2]-0x30)*10;
    3 l. ^8 v' o* w
  298. k=k+(RecArray[3]-0x30);
    3 R2 M6 M7 l* Y8 n; y
  299. if(RecArray[0]=='M'|RecArray[0]=='W')
    1 q8 D' S2 W$ _0 h+ q3 w3 }5 y; e) r
  300. {
    4 g  o* b7 }+ C" Z2 K9 V7 t
  301. cmd_AZ=(int)k;
    , W( A3 [5 N. L% M8 t1 Z
  302. }2 }; b! @3 O* O1 S
  303. /*
    6 m6 Q! p4 ?5 C. x. [$ m, }
  304. if(k>=0xFF) //寫入 EEPROM 需耗費時間較長 不需要時不寫入
    0 p; o( F9 C4 ~% V+ z
  305. {
    1 M& L" _; ~# j
  306. k=k-0xff; //大於 2565 G* L4 ]! ~. i. w+ ^9 G$ J
  307. EEPROM_WRITE(0x00,0x01);         //寫入 水平數值 高位數 至EEPROM 位址0x00
    $ ^/ @' m+ ~- t( |) q& k
  308. EEPROM_WRITE(0x01,k);            //寫入 水平數值 低位數 至EEPROM 位址0x01
    4 o8 I. _# S! F; K7 E
  309. }  D1 x2 k$ D" K
  310. else
    4 e5 z7 B$ F6 j( f  O( u
  311. {( A  S0 K4 y) G7 w7 o: I# }
  312. EEPROM_WRITE(0x00,0x00);         //寫入 水平數值 高位數 至EEPROM 位址0x00$ E, f" A; o, Z" `* n3 u0 h
  313. EEPROM_WRITE(0x01,k);            //寫入 水平數值 低位數 至EEPROM 位址0x01
    + d0 S9 k+ r8 ~+ c
  314. }/ u8 `: q4 D8 u2 D' a
  315. */3 Z0 }. w6 w# I* b  G. F6 z$ I
  316. if(rd_W==1)
    # G( c  g* L7 h( F
  317. {: k( c. A5 r1 j1 v9 i( V8 I
  318. p=(RecArray[5]-0x30)*100;
    7 \$ ~) o) c: J7 c& A
  319. p=p+(RecArray[6]-0x30)*10;6 M: s: L1 |+ `$ U, C
  320. p=p+(RecArray[7]-0x30);/ L# m6 A' o2 g! F* D/ U
  321. if(RecArray[0]=='W')
    9 c7 S: t& ]5 L1 G# z
  322. {6 y7 S- I7 D( |2 J( g1 b
  323. cmd_EL=(int)p;
    9 H& K2 G. l7 K: `; _
  324. }
    # A3 F! F% B* i3 z5 a
  325. /*" D( o) _* Z. |# U. ~
  326. if(p>=0xFF) //寫入 EEPROM 需耗費時間較長 不需要時不寫入
    ' ?# F' c7 B2 q4 `0 A
  327. {
    ( t8 l: q/ G0 U1 @' P6 _4 D# _, V: @5 Z
  328. p=p-0xff; //大於 256
    * V. P; S0 l" v* @
  329. EEPROM_WRITE(0x03,0x01);         //寫入 傾角數值 高位數 至EEPROM 位址0x035 z  |% I$ u6 a
  330. EEPROM_WRITE(0x04,p);            //寫入 傾角數值 低位數 至EEPROM 位址0x04
    & U2 `0 `: n& v* r3 v+ A
  331. }7 s) a* P; I9 h8 Q
  332. else
    4 o( |7 z6 u% ~; A+ f
  333. {
    9 H; z& g4 ~/ y5 @- D
  334. EEPROM_WRITE(0x03,0x00);         //寫入 傾角數值 高位數 至EEPROM 位址0x03
    " \2 G2 U" \( S% i7 m, k
  335. EEPROM_WRITE(0x04,p);            //寫入 傾角數值 低位數 至EEPROM 位址0x04
    9 \- F  I1 _- j* S5 e4 T( v( ]6 y2 G* Q$ C
  336. }
    - a1 l+ c1 o5 O
  337. */5 n- V& P% S' }( \7 a: \
  338. }, D' f  l% K$ U( M  _. u/ H

  339. 0 O' r( q; m2 m; ]+ G0 T
  340. }
    2 }5 ~( E. b0 F5 ?" Z3 e0 z
  341. 3 X7 q* L7 D5 t# `+ e
  342. ' J' v/ G/ G0 F* U
  343. //**************************************************************************************************: v7 p! o- }8 T0 \2 N
  344. //單片機初始化
    7 t7 O% P0 v4 l  \: r+ @) H
  345. //**************************************************************************************************4 ?+ ~9 W# m! X) z

  346. " `9 [/ q* r; I  u' i7 r* H7 r
  347. void mcu_init(void)
    3 g& L/ x- _6 v7 r, G
  348. {
    9 X- S  B0 u* Z4 _1 L2 U+ F
  349. //TRISC=0x80;             //IIC通信引腳設為輸入 / h& G* M) C' X9 a8 Q/ q
  350. SSPSTAT = 0x80;         //IIC設置
    ' w7 `- s1 y- k5 U
  351. SSPCON  = 0x38;         //IIC設置; M1 c! t5 O) t8 f( P, j
  352. SSPCON2 = 0x00;         //IIC設置* S  e* @8 g; q
  353. SSPADD  = 50; //IIC設置                 1 K, U" o5 r% K7 G# j/ h4 _5 j
  354. }  _* c5 V2 F+ c: g! o; p
  355. //**************************************************************************************************
    / \8 }/ y( D! j9 [
  356. //延時大約20us
    ) r  h) i6 }( g' k% ?8 P2 z. r
  357. //**************************************************************************************************9 _. n& I3 b0 R% G
  358. void delay_20us(uint nus)
    7 f$ D9 A+ j& }% j
  359. {  uchar i;, t2 {  s- D% E0 v* }
  360.    while(--nus){
    / v/ W  B; a+ F% J" x
  361.    for(i=2;i>0;i--);
    ' {4 \$ x/ R$ m" @" t) O' `
  362.    }        
    2 E6 `4 y% j& y$ G/ Y. w9 M. q8 s- A
  363. }
    1 C0 r/ a# p/ b3 D- V& h

  364. ! }2 L# r7 X: U
  365. //**************************************************************************************************
    # x. r  J: W- [) @, ~
  366. //延時大約1ms9 e% z( ?5 y* i3 J0 l0 ^) `& K
  367. //**************************************************************************************************/ K. \; v" }+ F7 J* L6 T
  368. void nms_delay(uint nms)# q6 j- _& y  n4 S, c
  369. {
    : X3 \5 c, j- M! W8 E9 s
  370. while(nms--)- ]' v( S* p2 n7 b
  371. delay_20us(50);
      S: n; p7 A& G/ _# t5 a& V9 E4 [. l
  372. }
    ; I" j" ~0 A2 [7 K

  373. , E  w, e5 W% e$ S( c0 X; F  i
  374. //**************************************************************************************************
    4 J; ]( p6 A1 l( R! N% p% n4 r9 f
  375. //延時) K/ |. C3 |) G3 {
  376. //**************************************************************************************************9 a" |  H) O  e9 Q/ n% \% D
  377. void delay(uint time)( u& ]5 W  J- s0 T- g
  378. {
    9 ^: A( w9 y5 K0 r) G* o
  379. uint i,j;4 Z( R2 c) D3 n% l! T- U& |4 Z
  380. for(i = 0;i < time; i++);) q0 }- p  K  i2 B' z! c
  381. {6 |, R) }2 s- P! E+ l# {6 `0 q
  382.     for(j = 0;j <30; j++);
    $ f9 a, l1 {* l6 W2 l" P3 D4 G, j% J
  383.     }
    $ O+ @  l: U8 z, J* I& E1 Q
  384. }
    $ \+ w( }+ \2 @* [- A8 |
  385. ! @9 k  ]0 Z) |5 \: R1 e
  386. 4 u0 t- g: |. J' K
  387. //**************************************************************************************************' K- R3 A) X" {' d$ |; P
  388. //從IIC總線獲得電子指南針GY-26數據
    ) F" t0 g  H0 E- m. E1 Q
  389. //從開始地址連續讀出兩個8bit的值,併合成16bit數據
    ' @7 ]; [9 Q" w9 u! Q% s
  390. //**************************************************************************************************
    7 {/ d) x' n( P
  391. uint get_GY_26(uchar read_begin_address,uchar GY_26_cmd)( i$ D3 s6 B* J" j/ s( A1 v6 w
  392. { 2 N6 z' [, r$ l8 h+ g9 {8 B8 J" {
  393. unsigned int temp;, Y, [" e3 v) `& Z9 C, V
  394.     iic_Start();                        //iic啟動時序- x8 d3 M% D" C* ^
  395.     iic_Write8Bit(GY_26_ADDR);          //寫指南針器件地址
    1 W7 h2 s/ R3 l8 A# r. q
  396. iic_Write8Bit(0);                 //寫命令: e, n7 {4 O1 ^. R
  397.     iic_Write8Bit(GY_26_cmd); //寫指南針命令
    ( d0 Z( h1 Z* d1 r3 ^# a& `! ~
  398.     iic_Stop(); //iic寫停止時序
    : V' e6 S4 ?% M
  399.     nms_delay(60);                    //延時,可執行其他程序 原始值:55
    . ~6 f4 U, m; ^  N' M& U, E( O
  400.     iic_Start();                        //iic啟動時序
    # i2 C0 d2 z. D5 g& U
  401. ACKDT = 0; //允許應答ACK1 i  X( O# z# h& J) E# a
  402. //*******************************************************************************
    7 T% _* b; `/ n: o' K
  403. //需修正磁偏角時使用「台灣磁偏角目前試定為3.5度」
    " l! J  U2 |* G4 W- Q% i$ T! G# N
  404. //第一次使用時最好修正,因為GY-26大部分修正偏角是6度(或10度)
    ( V2 R0 ~; O* E9 v; l
  405. //*******************************************************************************0 B1 r7 m4 t- Y9 b' l! D
  406. //iic_Write8Bit(0x03);  //發送設定磁偏角高8位命令。
    4 w7 X) Y6 y! O& N* N/ f* D
  407. //iic_Write8Bit(0x00);  //發送磁偏角高8位的數據。
    5 R. F& Z9 R- \1 h$ ]
  408. //iic_Write8Bit(0x03);  //發送設定磁偏角低8位命令
    / A& E5 x. n' R  r7 ]5 A9 ?2 W2 E
  409. //iic_Write8Bit(0x23);  //發送磁偏角低8位的數據。此時磁偏角被設定為3.5度
    0 ]7 _2 J/ }  L9 n0 g
  410. " t/ @, F8 @6 k) R) ^/ O( |
  411.     iic_Write8Bit(GY_26_ADDR);          //寫指南針器件地址     
    $ @; V7 l& _" t% v
  412.     iic_Write8Bit(read_begin_address); //寫指南針內部數據地址
    , |7 d5 x( A, {5 V5 m
  413.     iic_rest();                         //iic重啟時序7 o! d( K8 t+ x2 b

  414. 6 [' ]  m, a1 u, ?8 x! I+ N3 m  L
  415.     iic_Write8Bit(GY_26_ADDR+1); //指南針器件地址+1=讀 % J5 i, n5 I7 _; Q
  416.     temp=iic_read8Bit();                //讀出8位數據. I1 M& l2 t6 B1 ?' e" T3 {
  417.     temp<<=8;                           //保存數據
      Z0 }9 \0 s1 O; \" }$ \
  418.     ACKDT = 1;                          //允許應答NO_ACK5 h+ T9 W: a. B& B; Q. x
  419.     temp+=iic_read8Bit(); //讀出8位數據4 |# Z4 ]% Y& `8 V8 D7 r: z. m" z3 o
  420.     iic_Stop();                         //發送停止時序
    ' [4 }6 p3 m' g1 z' d
  421. return temp;                        //返回本次測量數值
    & @" x2 N: o. D+ C  A' s
  422. }! y2 F2 ~' r9 v3 r+ S2 a

  423. 2 H5 z" E, U/ z0 `1 K0 m. K
  424. //**************************************************************************************************7 R( }; o3 H. ^/ u7 x% f% a1 R
  425. //從AN0讀取轉換電壓的相對值- f' R& i" j" J; d
  426. //從ADRESH ADRESL 讀出兩個8bit的值,併合成16bit數據3 X5 P) R' k1 C* b  f. Y! W9 |6 m
  427. //**************************************************************************************************
    ! n! w! x8 d, L) U8 {
  428. uint get_AD()
    ( F% M/ ?- T, Y/ m( G
  429. {
    ! \# k- B" Z6 F6 t) i  E, i
  430. unsigned int temp;8 w7 I9 w+ y( j/ }0 }2 C7 P$ b3 _- z4 V
  431.      result=0;                //轉換結果清0
      I8 v0 G" U* ^) u. V
  432.         ADGO=0x01;                //開啟轉換過程  L6 z  ~5 ^. p2 w
  433. delay(50);                    //保證採樣延時
    1 W. v5 o5 n/ W: s- K) z4 l
  434.         //ADGO=0x01;                ////ADGO=1放在此採樣不行4 }7 g  y" X7 k4 w1 B0 o
  435.        while(ADGO);             //等待轉換完成& O  I& K- f: z
  436.      temp=ADRESH;                //讀出8位數據  q- f% k9 ^( s1 E" c
  437. temp<<=8;                           //保存數據
    1 o4 a& z8 u, z  }; v8 d
  438.     temp+=ADRESL; //讀出8位數據2 S8 e* E/ ]  F7 i% r4 L8 ?
  439. return temp;                        //返回本次測量數值
    * Y. g" z4 k! s2 j8 Q, ?. X+ |" A
  440. }
    & h& ?- G3 Y( n# V+ Y1 T
  441. & Y0 y& ?- m; f6 J6 v: {4 @

  442. . x! n2 I& o: O( A' R
  443. //**************************************************************************************************
    : ^; @; k. k0 Y* T3 d
  444. //IO初始化操作* x3 ]& L4 I7 i5 ~! ]: o0 ]! N
  445. //定義 TRISx 1為輸入/ 0為輸出 / x 為未始用(1) (TRISA只有6個Bit)) g# d3 D& G& L
  446. // TRISA x x 0 x 0 0 0 1 <--- Bit0:傾角電壓輸入 /Bit1:手[自]動(接地=手動) /Bit235:上下左- C: m( H) |" n8 Q! i$ [! f5 a
  447. // TRISB 0 0 0 0 0 0 0 0 <--- LCD IO 輸出
    & l2 ^3 B6 Q2 m0 o: d6 n, P
  448. // TRISC 1 0 0 0 0 0 0 0 <--- Bit01: 停右 /Bit2:PWM輸出/Bit34:I2C總線/Bit6:RS-232TX輸出/Bit7:RS-232RX輸入% \  o! x  ~) J, T4 O: v2 y) s1 f
  449. // TRISD 0 0 0 0 0 0 0 0 <--- Bit01267:R.L.OUTPUT / Bit345:LCD command
    ! H4 }; ^5 R6 `& x1 Q4 z
  450. //
    / T. E1 G; j9 v: m9 ~/ }
  451. //定義 PORTx 1為高電平/ 0為低電平 / x 為未始用 ; ^$ J7 P# ^: k: Y0 w5 ?
  452. //      (TRISA只有6個Bit)電壓輸入口設低電平/其他需要改變狀態(拉成低電平)的設成高電平/再其他亦可都設成高電平
    ) ]* q# X2 d% T6 F
  453. // PORTA x x 1 1 1 1 1 0 <--- Bit0:傾角電壓輸入 /Bit1:手[自]動(接地=手動) /Bit235:上下左輸入
    - y6 Q' _* ?$ S; y
  454. // PORTB 1 1 1 1 1 1 1 1 <--- LCD IO 輸出8 _3 S( F" d" c0 `
  455. // PORTC 1 0 0 0 0 0 0 0 <--- Bit01:停右輸入/Bit2:PWM輸出/Bit34:I2C總線/Bit6:RS-232TX輸出/Bit7:RS-232RX輸入
    ; ~  M) m0 U' |# o2 f* l2 k2 X
  456. // PORTD 1 1 1 1 1 1 1 1 <--- Bit01267:R.L.OUTPUT (高電平 = 1 = 不動作 )/ Bit345:LCD command
    - e8 k5 @7 J  x! O% Y% ?( [$ ^, a
  457. //**************************************************************************************************
    9 O3 m' r/ m# }7 Y% {
  458. void IO_init(void)# y; p8 T  e- x2 I5 O7 b6 `
  459. {* m6 ?0 y/ H2 \! l' Z
  460. 2 {" N2 S& ]3 M. F6 D
  461. TRISA=0x01;       //RA0設置為輸入 00 0001
    3 u2 [1 q! T' d* B+ g" {5 ^( p
  462. PORTA=0x3e;       //設置RA0為低電平
    , T$ }& @# N5 z2 x
  463. % \5 V. w& w! L2 ~1 r
  464. TRISC=0x80;       //RC7設置為輸入 1000 0000  S2 _* t. h! Y6 E+ w
  465. PORTC=0xff;       //初始化為高電平
    + [* u- `  P, S8 |8 G1 x4 q3 ~0 U- N' V
  466.    
    % D$ H: \! V' z- ^$ B: L
  467. TRISB=0x00;       //RB設置為輸出 LCD IO6 o4 Q" c1 Y% _3 O0 M2 S
  468. PORTB=0xff;       //初始化為高 LCD IO 為高電平2 z( f9 k! Z* ]& ~% F
  469. * w8 l  {& O8 n( @% `. l
  470. TRISD=0x00;       //RD設置為輸出 LCD command
    0 r' H% t) I9 z, b# P3 p( b
  471. PORTD=0b11111111; //初始化 LCD command(Bit345) 為高電平 /R.L.OUTPUT為高電平! ~$ u  [' N% f9 f3 J

  472. ( V5 {  R: T# [2 S/ `) f5 W
  473.    ADCON1=0X8E;                //1000 1110  A/D 轉換用參數 需查表
    0 I$ w% Y+ l. X. P; s) r
  474.    ADCON0=0X41;                //0100 0001 . n% n. T; R7 n# R

  475. " V- ^! b8 B+ d

  476. 7 `/ X, e) d. E6 A3 M/ r
  477. }
    4 G. ~# E" c# X7 c5 \" Q. O; L
  478. //**************************************************************************************************
    ! V& A8 K0 v1 P  R5 _
  479. //雲臺初始化操作 (離開限位點)$ ~6 K0 F8 V" M- l( O: z5 a
  480. //向上轉3秒 向下轉2秒
    ; g8 H5 ~  X2 K: ?7 r
  481. //向左轉3秒 向右轉2秒5 I- `% B, X; _1 t/ ]
  482. //**************************************************************************************************+ h2 }; ?6 w# w5 O3 E: A

  483. - z2 |3 \4 t8 X- D" ~
  484. void Init_wt(void)
    ; ]4 l( M1 e# ^* V# ~, O  c
  485. {
    # m/ a3 U) P  q
  486. /*+ p8 [' f( ~! A. P. d
  487. 9 Z0 {: r- j% D9 E! D' n$ t
  488. RD0=0x00;
    8 J" a( L3 U5 R* B+ n! R8 z
  489. RD1=0x00;5 {. ^5 y7 w% T
  490. RD6=0x00;
    " a/ z  q+ x8 b; `8 D) i
  491. RD7=0x00;+ d$ d; O( I1 \) g! c
  492. nms_delay(1000);4 l3 l5 M1 u" N$ d. V5 q  ]1 o
  493. RD2=0x01; //RD2 失能(亮)
    * H- T" m% [) c0 f1 u. U1 j
  494. nms_delay(1000); //可將訊號接至 雲臺旁 閃爍紅燈警示
    ! h$ d4 k5 Y" J* E
  495. RD2=0x00; //RD2 致能(確認完成開機,控制雲臺電源可輸出[實驗板LED亮->熄滅]); C% x" x; V5 R, m; R
  496. nms_delay(1000); //等待 進入旋轉初始化2 _: a% J) X" t, I1 P3 l

  497. % {8 M6 {7 i0 g
  498. RD0=0x01; //指令 UP Direction Rotation
    & _% u5 z# l0 T! y2 x) o$ Y  Y
  499. RD6=0x01; //指令 Counter Clockwise Rotation: K5 b4 W- ^5 `9 V7 y2 f) D
  500. nms_delay(3000);4 b- k. h. g/ P7 M' |) h. g" g
  501. RD0=0x00; //指令 UP Direction Rotation8 q9 T( D# ^6 L
  502. RD6=0x00; //指令 Counter Clockwise Rotation
      y, R- ?1 {  P1 ], q' U  m
  503. RD0=0x00; //指令 UP Direction Rotation" O$ c  a# G& R) s4 {1 I5 L. ^
  504. nms_delay(500);0 S2 b  J  R1 a: P5 W3 P

  505.   C; L; `* B3 {: u
  506. RD1=0x01; //指令 DOWN Direction Rotation
    & n& \9 b# h: }5 p) j. V! `0 N
  507. RD7=0x01; //指令 Clockwise Rotation2 w' l. B0 ~) P# i2 S
  508. nms_delay(3000);9 {7 p9 z5 i  p7 J3 n2 M4 |
  509. RD1=0x00; //指令 DOWN Direction Rotation
    $ G! q  M* b  R4 b' `. w
  510. RD7=0x00; //指令 Clockwise Rotation
    + T; ]3 I) l$ w0 G0 j$ W0 @
  511. nms_delay(500);4 K- v3 @+ U. U' y: b, Q4 a5 k9 s( K
  512. */  X4 W, e6 G2 h1 y# t
  513. nms_delay(1000); //等待
    $ I8 ^9 W; t( z5 n* D2 n. W
  514. //*******************************************************************************9 C2 w2 _# H( y+ h0 g
  515. //完成轉動後重新將LCD內容刷新
    6 j& ^9 ]9 a: I8 U7 r3 b; k
  516. //*******************************************************************************
    , f7 W/ [% c5 @& ?& ~! R  {
  517. dis1[0]='A';
    " Y3 L9 I/ O$ ~0 {" u
  518. dis1[1]='Z';
    + j7 f3 ^& N# A+ W, n7 X' M
  519. dis1[2]=':';4 k9 X$ ]" f4 a
  520. dis1[3]='0';
    8 Z3 U6 f. ^4 b5 q) |0 P  x
  521. dis1[4]='0';
    8 q% D  X0 {+ F, C; ]) ], h
  522. dis1[5]='0';9 |4 G' v9 k4 o' h" K9 k; R
  523. dis1[6]=' ';
    8 ]1 g! s0 V7 A
  524. dis1[7]=' ';
    , B# X3 `5 Q9 {
  525. dis1[8]='E';/ h$ r4 k% [$ S; P9 U: ?
  526. dis1[9]='L';
    - \2 s1 B: R$ G, Y7 m1 ?
  527. dis1[10]=':';# |9 k; s5 G; U( R' q
  528. dis1[11]='0';( ?7 V" W3 g6 C
  529. dis1[12]='0';
    0 ?' H- m0 ]  Q& B- B3 a" J
  530. dis1[13]=' ';& b7 n& Z+ X3 l3 }
  531. dis1[14]=' ';
    8 n8 ~4 g5 B! z4 |, r' _
  532. dis1[15]=' ';
    / y: K, f: M7 B; X% j/ y4 @
  533. " d: `* c( x) f/ ~( w
  534. dis2[0]='-';$ ~4 ?6 ]. m0 \4 x  u, A
  535. dis2[1]='-';
    / A! H/ g) S& p
  536. dis2[2]='-';6 Y' A  L- @! S7 p% r: }
  537. dis2[3]='-';
    " U7 G7 j* L3 _; ~
  538. dis2[4]='-';( |. E: B3 Y, A" k, `3 ?8 p5 Q
  539. dis2[5]='-';6 n, [4 ?% P% v3 ~3 c! {7 Z3 y$ d
  540. dis2[6]='-';+ _& W* M4 [2 g1 m
  541. dis2[7]='-';
    * Y4 D% l9 E$ c" _) n7 r
  542. dis2[8]='-';; ?( F6 v# |5 l6 O
  543. dis2[9]='-';
    + C& ~' C5 A: H6 o6 E
  544. dis2[10]='-';% X& {- x$ f% l* Q
  545. dis2[11]='-';1 @: ~( |3 z# ^# R2 n5 ^  a/ g3 k
  546. dis2[12]='-';
    . X, \0 p7 a& {2 B
  547. dis2[13]='-';9 |& j- e$ _. P+ b4 U7 b
  548. dis2[14]='-';1 }* U& Y4 h1 e* O& o
  549. dis2[15]='-';
    5 d( `5 N5 |6 V& u7 X8 ~# r9 `- U' A
  550. }  U% K' `( `2 {1 M: a
  551. //**************************************************************************************************
    4 P" {& g; X+ f/ ?7 V
  552. //向LCD寫一命令* C5 ~3 Y5 x6 e: A% z
  553. //**************************************************************************************************
    " L, q0 d3 l0 a. N  I
  554. wcode(uchar t)5 N. s7 @" s# c4 }% R% y
  555. {) q# F3 ], D0 E. F6 o
  556.   rs=0;           // 寫的是命令6 u! g# E; `5 m& H0 p/ B( l9 a& t
  557.   rw=0;           // 寫狀態
    ; w* _% P" c- N; w0 s0 H5 y
  558.   e=1;            //使能
    ) m" d" T8 [5 b8 |0 Y
  559.   Dataport=t;     //寫入命令
    + e2 H% }% e: ^; G
  560.   delay(45);      //等待寫入,如果時間太短,會導致液晶無法顯示2 e% {2 ?9 O' O
  561.   e=0;            //數據的鎖定6 Z0 H2 k7 h- E- T% T
  562. }
    ; R4 U. }$ f% }- l& n% |
  563. //**************************************************************************************************% b( F  }& s- ]% |0 U9 K: i5 @
  564. //向LCD寫一數據& F0 X* y6 R6 r6 }+ n
  565. //**************************************************************************************************- ?7 ]; T% ]+ \2 G3 @. t$ ?, H
  566. wdata(uchar t)
    ; S# s, P* n) I9 v3 Q" k( r7 K" r
  567. {
    * L0 U4 s' R; P9 l* C
  568.   rs=1;          // 寫的是數據0 y! S, S$ D. N
  569.   rw=0;          // 寫狀態8 L: C8 T% w% C& u
  570.   e=1;           //使能! J! M; ^4 `8 T( V6 x
  571.   Dataport=t;    //寫入數據
      _+ l) g0 N  M
  572.   delay(45);     //等待寫入,如果時間太短,會導致液晶無法顯示, ?$ Z& P/ T* B2 v0 `) _+ X
  573.   e=0;           //數據的鎖定: A& U. J" q6 m: a2 ]
  574. }
    * y5 x, p( C3 Q, F
  575. //**************************************************************************************************
    + ~, @) b/ H: g/ T& Y6 j3 u
  576. //LCD顯示第一行
    ) G( x! Y4 z, W/ F' O
  577. //**************************************************************************************************
    ! O6 o; V, ]2 m( @" a9 J# H2 A; U
  578. xian1(void)/ e7 @& P; O) Z* O
  579. {
      h  {% e+ \7 `8 z+ ~' z
  580.   uchar i;
    ( j, B; |4 H) F9 A, [+ j6 k
  581.   wcode(0x80);          //設置第一行顯示地址* f7 V  K8 U+ J4 ?3 b0 B
  582.   for(i=0;i<16;i++)     //循環16次,寫完1行  R% q9 P/ e3 @# u5 _" l& U
  583.     {
    8 T6 C9 d3 `. r6 W* V/ [- d, {
  584.       wdata(dis1[i]);   //寫入該行數據
    : C/ u( k, t3 ^0 M9 X
  585.     }% V1 ~3 P  B2 q" o4 c0 f
  586. }- V. F$ b6 M$ L7 \8 k6 p; L. K1 @
  587. //**************************************************************************************************8 w4 Q- V2 f- P; u, E
  588. //LCD顯示第二行
    5 \7 X' O; G4 G% W6 j& F, i
  589. //**************************************************************************************************& c4 G* ~- ]" m+ R- u) {  g
  590. xian2(void)
    ; c) t! L& J7 d8 _  D6 f
  591. {' H: v& y& w# K6 u
  592.    uchar i;
    $ X2 a5 c0 \$ b& t
  593.    wcode(0xc0);        //設置第二行顯示地址
    ' V6 w& R1 T5 h2 T  C  g
  594.    for(i=0;i<16;i++)   //循環16次,寫完1行6 y: k; V4 I. O8 J5 d! n. Q
  595.     {
    . d9 }3 T, Z" `: a9 W4 e
  596.       wdata(dis2[i]);  //寫入該行數據
      @# u  L3 \' [" B- B: ^( P
  597.     }
    ' \' h3 n* Q8 Z1 G4 o
  598. }
    ) t) k* J' P$ P- a$ H
  599. 4 ]- v5 x8 {: b1 B; z
  600. //**************************************************************************************************+ ?6 e7 O. L; _6 y& l7 @5 f
  601. //LCD 初始化' W3 q) W2 |- |' G% f4 Z
  602. //**************************************************************************************************# h# R; ]! |3 G' r" m7 ?% ]1 I
  603. InitLCD(void)" ]& g0 @) r7 v1 O, x
  604.    {    0 N5 A* t  l- {. L7 k/ ~
  605.    wcode(0x01);   //清屏* T3 O& e# n8 {. V$ L
  606.    wcode(0x06);   //輸入方式控制,增量光標不移位0 `: O& g- _; T, M2 D
  607.    wcode(0x0e);   //顯示開關控制
    ( k) l* }8 ]6 s' l
  608.    wcode(0x38);   //功能設定:設置16x2顯示,5x7顯示,8位數據接口      
    ! J+ X! b/ `; t8 ]( _6 ]
  609.    }  
    9 e: w( D0 O" ^1 Y
  610. //**************************************************************************************************
    & u1 r$ t/ i/ I# g& q
  611. //初始化串口, i& l6 i5 K, |4 h$ d+ f
  612. //**************************************************************************************************
    " N# B8 m4 m7 E  d% b0 t

  613. 4 h% P/ l, I3 K
  614. void init_com( void ) : M* n. E8 I9 B4 [5 }
  615. {      9 h* P" A* G# V4 j# x
  616.     TXSTA=0x24;//發送數據控制位配置00100100,異步方式、高波特率,波特率=Fosc/16*(SPBTG+1);
    ) K* E  P8 _8 C- Y6 F) S6 s
  617.                //TXSTA寄存器的D5(TXEN)=1,啟動UART的發送功能
    / F( |- q9 _1 ?! G- L: \# t
  618. RCSTA=0x90;//接收數據控制位配置10010000,設置連續接收數據
    9 o& y1 ~7 Y. r7 S: z( Y
  619.                //RCSTA寄存器的D4(CREN)=1,啟動UART的接收功能
    ; W# p3 I; g) p& Z) h8 J
  620. SPBRG=25;  //設置波特率9600,系統時鐘4MHZ,波特率=4000000/16/(25+1)=9615(Bps) 51! `  h5 Y8 [7 v' T% t! p% F
  621. //設置波特率4800,系統時鐘4MHZ,波特率=4000000/16/(51+1)=4807(Bps)! Q$ }" I" O: Y6 J: I7 R, C
  622. RCIE=1;    //接收中斷使能
    ! V) R# j. o7 L' U0 O$ s; [
  623. TXIE=0;    //發送中斷使/失能
    $ C5 i* R# D" q1 g3 V; h4 ?
  624. PEIE=1;    //INTCON的D6(PEIE)=1,外圍中斷開關打開$ z  M, R9 J0 a# _8 ~
  625. RCIF=0;4 P- U; ], t3 \4 i( K4 \
  626. RCREG=0;) ]. v" Z0 G: s
  627. GIE=1;     //總中斷開啟
    / S. u. j" c1 Z, q: T6 m; h
  628. } . Q! i  z5 G& n$ Z) f8 @3 f

  629. : O3 k5 n7 P& M6 F
  630. //**************************************************************************************************
    # e. W! a8 T# `: ~. c* P4 K
  631. //寫RS-232. N8 g5 ]. }) S, L# o
  632. //**************************************************************************************************
    & I$ U9 i4 y1 R$ M$ e* x
  633. void  WriteByte(unsigned char byte) {
      x% c% c" d- r0 V
  634. while(!TXIF);
    : R# l3 ]: b% ^0 P& z
  635. {* B; b9 b; l0 K9 A4 H+ P3 `: v
  636. TXREG = byte;" r5 r; w( c* }# L/ f3 z! R
  637. }% S- L/ ]2 j# p+ T6 F1 m5 f
  638. }8 v  ~! x* H+ S/ _+ y2 P7 |
  639. 0 ~5 `" v- e8 r2 X$ p' d, m/ c
  640. //**************************************************************************************************( e. V/ p7 s) C2 m7 ]$ [
  641. //向RS-232寫一字串數據
    1 b/ C4 f: \+ J8 U" u3 A
  642. //**************************************************************************************************6 [; t6 `, L6 z9 F9 N# @
  643. void WriteStringConst(const unsigned char* str) 5 ]6 N" v" N6 L3 N9 V* w, R
  644. {9 e9 i& K$ u+ f7 T  P8 Q- U, T+ V
  645. int n,m;
    4 Y7 e! I4 K8 U7 W
  646. & }9 d; }" ]) B  q- T2 A/ m
  647. for(n=0;n<=11;n++)
    " N! j: K& J% {
  648. {
    4 W+ I* ~% B. y* L" V# G
  649. //TXREG = str[n];# ?+ @) R* z* |/ n$ j' b. Y/ `4 V
  650. WriteByte(str[n]);
    5 }% q+ y6 s1 V) p+ Z$ Q, D2 P
  651. }
      F9 F# {6 V+ [: f5 x& d

  652. + ~* m0 `  Z3 L( ?1 {6 h
  653. }) }4 ~; U" p; W
  654. //**************************************************************************************************& }7 @3 g2 n5 [  ^" A( H# R7 C
  655. //雲臺轉向控制
    ! l6 R, P9 Y- g+ \" t6 z+ ~  d2 \1 T
  656. // 選用的雲臺 傾角 動作時會稍微干擾電子羅盤5 j  N( J3 _% N' P6 Z( I3 v
  657. // 雖然已經將 羅盤 與 馬達 距離拉開,但在做 傾角 動作時,還是先 不旋轉 以免因為誤判角度而亂轉
    3 r+ G/ ^# ~7 p9 y6 c
  658. //**************************************************************************************************
    1 ^9 @0 m* t, j4 }
  659. conTIO(void)
    ; ?) i9 T) R. K. B
  660. {
    4 E6 x& h7 T" U

  661. ! Q) c8 v+ e6 H% P1 J
  662. RD0= !rd_U; //指令 UP Direction Rotation(反邏輯 單片機輸出"0"=低電平=繼電器動作)2 {' }) u3 ?1 I
  663. RD1= !rd_D; //指令 DOWN Direction Rotation(反邏輯 單片機輸出"0"=低電平=繼電器動作)1 B( {5 E! {/ Z
  664. if(rd_U==0&&rd_D==0) //傾角動作優先,傾角動作完成之後再旋轉* X: O" F( B2 R) m5 {
  665. {" s& p# j+ ]! v/ m! T; I
  666. RD6= !rd_L; //指令 Counter Clockwise Rotation(反邏輯 單片機輸出"0"=低電平=繼電器動作)4 Y4 t6 ^& @' u% X- f5 S1 F! I% p  g
  667. RD7= !rd_R; //指令 Clockwise Rotation(反邏輯 單片機輸出"0"=低電平=繼電器動作)
    7 k6 D7 q5 h5 n4 A  r
  668. }# e' \, C( `+ y
  669. }
    6 l- u% Z. e. a+ o" d( x: Z/ Q% {3 U
  670. //**************************************************************************************************2 ?" [3 K. ^9 h6 s: y8 [$ G
  671. //check 資料要求 COMMAND! I3 ~2 Y: w8 C8 O# D
  672. // ; Y% B- j4 q# O% q
  673. //int rd_AZ; //要求 水平角度
    ' E& o3 {# a( L- U, N# T
  674. //int rd_EL; //要求 傾角/ H' B8 g" s# \( X% D9 G
  675. //int rd_AZEL; //要求 水平 + 傾角
    ! w3 [5 h* K% q  F1 I
  676. //**************************************************************************************************
    6 |4 x2 Q/ A7 l* T5 R+ ]
  677. cmdCHK(void)  6 d4 l  \1 I# ~1 o/ R
  678. {" k: N; w( q$ f0 u% _
  679. if(rd_AZ==1)" d1 I7 T' C/ _4 H; b+ m: `; u/ h
  680. {
    ) V" u. ^* L2 X# s: o
  681. WriteStringConst(disAZ);# T5 K* J. M& l. `
  682. rd_AZ=0;
    / u8 @8 _- g! k" l$ [4 y
  683. }
    $ |- u) x" J, z$ H$ j
  684. if(rd_EL==1)
    $ b6 T# ~# x; O) o
  685. {
    2 Y. ]3 Y# w2 Y: L
  686. WriteStringConst(disEL);
    ) i% G5 o4 z& m4 `& E8 ~/ Q+ V
  687. rd_EL=0;
    % s9 k# {# S: i/ `
  688. }+ ~  q1 w( S. M  A; J# e' w
  689. if(rd_AZEL==1)# I9 \+ E: i6 \; t9 u: h1 d  }
  690. {. j$ U4 ]: T$ p- w- [. b+ P, a% |
  691. WriteStringConst(disAZEL);5 r" c2 r" u  B9 T' ?
  692. rd_AZEL=0;
    / L; A9 x/ `! C4 e+ g4 ]) s7 h6 `
  693. }
    + Z6 D& m( ~2 W7 g  z% N; B

  694. , D6 ]8 i8 T4 S$ _
  695. }4 K! j: X1 f! y. E- i3 e

  696. % S7 i# e& J/ S/ [+ j: A" B
  697. //**************************************************************************************************
    8 ~# Z( ?& g( D" c* I# T
  698. //雲臺自動轉向 COMMAND
    ( o4 J% W" ^: ^: Y7 M
  699. // ; ^9 b; d: ?+ F7 ^
  700. //int rd_M; //自動指令 前往 Mxxx 水平角度xxx5 A, t: s' S/ s
  701. //int rd_W; //自動指令 前往 Wxxx yyy 水平角度xxx 傾角yyy/ X8 p5 U5 n3 @, @1 H# Y
  702. //int rd_S; //指令 All Stop/ k9 H! ^3 q( J
  703. //int rd_R; //指令 Clockwise Rotation
    ! a' V# n8 Z5 w; F% |1 d* s
  704. //int rd_L; //指令 Counter Clockwise Rotation
    # l; {# n1 j9 T& A! P6 ?* ^
  705. //int rd_A; //指令 CW/CCW Rotation Stop
    . d& g3 z3 h: O
  706. //int rd_U; //指令 UP Direction Rotation
    : d: P4 m7 J$ ^# t' B
  707. //int rd_D; //指令 DOWN Direction Rotation
    " U- A- K& l% d
  708. //int rd_E; //指令 UP/DOWN Direction Rotation Stop0 J+ J) f% V- A9 k
  709. //**************************************************************************************************7 p4 I0 _! R" P
  710. void turn_cmd(void) / c* h; s. v+ T
  711. {! G+ x6 c" f- W1 K
  712. //if(cmd_AZ>AZ&&(cmd_AZ-AZ)>3 &&(cmd_AZ-AZ)<30); D! M2 Y' H' `0 M+ z
  713. if(cmd_AZ>AZ&&(cmd_AZ-AZ)>3)
    5 u5 U* b- @" i) ]* k7 G  [# ^
  714. {
    % o& Z" s/ d3 a- L2 I9 ?& a
  715. nms_delay(100); //防止繼電器高速跳動+ j1 B# M) D( l+ k9 s: F5 P9 b
  716. rd_R=1;
    ( \9 p$ C" G  \; r9 O# T
  717. rd_L=0;
    . N! \9 t; e( @6 p/ `% F) M7 ^) ?
  718. }' W, q" s1 Q! H' j4 P  w7 \
  719. //if(AZ>cmd_AZ&&(AZ-cmd_AZ)>3&&(AZ-cmd_AZ)<30)
    0 T4 V! I1 V+ u9 @' g5 n" r
  720. if(AZ>cmd_AZ&&(AZ-cmd_AZ)>3)
    # U2 K1 Y% F6 s
  721. {
      v4 x3 O+ O; R$ ~$ l
  722. nms_delay(100); //防止繼電器高速跳動
    7 T) H4 T4 b2 b  r( f! U. t
  723. rd_R=0;1 q+ p0 W8 r5 T& T1 q3 ]5 |
  724. rd_L=1;
    8 n2 a1 E: v0 W
  725. }
    6 I/ C! j$ X0 r) \% F' U' X

  726. 5 u9 @) M4 l/ h
  727. //if(AZ >345 && cmd_AZ <15 )  // tracking cross left 過 360'
    ; @3 l6 z6 O3 f) u
  728. //{
    ( U' W2 y; ^- i, q
  729. // rd_R=1;) h* ?% |- h, z8 a  C/ t" H& L2 i0 q
  730. //}! H) z" f% k+ W0 L4 c% ]- n1 B
  731. //if(AZ <15 && cmd_AZ >345 )  // tracking cross right 過 360'
    : Q" z: ]+ q5 g( ]3 [
  732. //{4 V( L6 \& d! B! b. b6 S* E
  733. // rd_L=1;
    - X$ ~4 @" X) a5 V5 j$ U' Y9 R
  734. //}& q2 E1 X' _6 x& u

  735. 9 O- x, J2 G/ d) v
  736. if(cmd_AZ>AZ&&(cmd_AZ-AZ)<3)) w: n; Q  ^: F! l+ _6 z: Z* \
  737. {
    6 U- X4 v/ X8 C* m, o# J
  738. rd_R=0;! _9 [* b, G, q; n
  739. }, i: Z6 y( b+ \9 i" n0 H% k
  740. if(AZ>cmd_AZ&&(AZ-cmd_AZ)<3)* X8 P! e! _; @; S
  741. {7 g$ {3 _6 T, X0 P
  742. rd_L=0;0 L+ q9 @4 r+ r9 L
  743. }+ K2 O7 H, P  ^1 P# _# }. a
  744. 8 J* A8 o# R& A. b7 M+ ^
  745. if(rd_R==0&&rd_L==0)
    3 w8 n3 F7 l  I7 V6 U2 i( N; V
  746. {6 w8 j* Y3 G; \
  747. rd_M=0;4 k* V, F( j* P7 z6 r/ h' _; p; `
  748. }
    " |" r+ y; M& V+ S; ~
  749. if(rd_W==1), V1 s/ g. F8 r+ \5 v" @
  750. {
    : P. z) z: O% s' h8 R7 }; ]+ Y& G
  751. //if(cmd_EL>EL&&(cmd_EL-EL)>2&&(cmd_EL-EL)<20&&EL<90)( C: N( ?% K( Y' M& @  a
  752. if(cmd_EL>EL&&(cmd_EL-EL)>2&&EL<90)3 Z9 @! L" ]4 H4 {
  753. {& G3 w" G$ C# j, V% G( x( o4 c
  754. nms_delay(100); //防止繼電器高速跳動
    7 P; s5 S! t( J9 w. x  G
  755. rd_U=1;
    4 n. J& i$ R, O
  756. rd_D=0;
    $ w  ?6 o' V& U7 x5 C& A, B
  757. }: |; n4 n" L3 C! `* a  [
  758. //if(EL>cmd_EL&&(EL-cmd_EL)>2&&(EL-cmd_EL)>20&&EL>0)
    2 M" q+ }: r& z2 l: V$ O( P" T
  759. if(EL>cmd_EL&&(EL-cmd_EL)>2&&EL>0)+ K/ s9 ~- t" g
  760. {. y4 Y9 d* A/ D5 g
  761. nms_delay(100); //防止繼電器高速跳動
    ! \0 E! ^" N7 @, N2 j# M
  762. rd_D=1;$ u9 @3 T! q) {% j6 U! [
  763. rd_U=0;. [# n5 J" _( S' l; x( U3 w& f( J
  764. }
    8 V& z* r) k+ Q3 Y
  765. if(cmd_EL>EL&&(cmd_EL-EL)<2); c% m. ~- j& f, J, A8 B
  766. {
    . T3 Q: t! h5 ?' d/ L% u
  767. rd_U=0;
    4 w2 X& {8 p/ N! \( E: m. j2 _
  768. }1 U& u! R5 B, m' a' W0 }
  769. if(EL>cmd_EL&&(EL-cmd_EL)<2)$ v" A( s) M2 \* x' u7 c
  770. {
    . N9 ~) K) r5 M4 ?+ z& R9 t- y
  771. rd_D=0;' l9 U7 c4 I: T$ E% }6 d6 w: @
  772. }
    0 `8 M# F  E( X4 y" \
  773. if(EL==0&&cmd_EL==0)1 j! B6 v3 {- l$ S! q& @/ t
  774. {3 e3 `! |3 r: W2 N7 Y; Z
  775. rd_D=0;
    0 k! K# P: Y: R* ]) F3 W& V
  776. rd_U=0;
    6 _! o# K' H, f" ]
  777. }, Y, s& U8 o: F8 @. Z0 y# j& B- H
  778. if(rd_R==0&&rd_L==0&&rd_U==0&&rd_D==0)
    , _9 l6 V. o# n% g/ `
  779. {
    % U! Z! F  T5 C: [  n* ]9 m
  780. rd_W=0;
    2 d3 m5 c! M/ H" Z
  781. }5 w" f! j4 P7 r  R! v2 H
  782. }
    9 Y6 @0 n5 x+ m
  783. if(rd_A==1)
    0 p# d- M/ S/ t
  784. {3 d* f2 [" K3 G* ]. r
  785. rd_R=0;
    # O8 W: Q9 ]( o' K
  786. rd_L=0;4 Q' e0 u8 M2 K  i" @2 `& X  y
  787. rd_A=0;
    % I- y9 @# u4 V' U* C5 i! T
  788. }
    4 r9 R; E+ r- l: ~
  789. if(rd_E==1): `  i3 F6 u( e$ T6 l; K
  790. {1 p' N6 ]4 M# C# A0 k, @7 ^4 e
  791. rd_D=0;# [; k, p* p+ y6 N" \* ~/ k& H
  792. rd_U=0;4 I! E$ H7 q- L- `0 Q! x* i
  793. rd_E=0;, s% ?& n$ ]5 L# T
  794. }
    . r0 K" U- j$ E9 s3 \3 q
  795. ! ^4 B& [% P5 N0 c& E& y0 u
  796. }
    1 Y$ F! i* }! v) [9 V! ~
  797. //**************************************************************************************************+ x6 W3 f6 D5 A$ c9 F$ C
  798. //check 雲臺轉向 指示 及 過頭.回一點 控制
    , [1 V3 s) ?- t7 `' N  v- {
  799. //
    . P% E) d( p! U% v) o* f4 h
  800. //int rd_M; //自動指令 前往 Mxxx 水平角度xxx% C9 k( V. W; [8 i
  801. //int rd_W; //自動指令 前往 Wxxx yyy 水平角度xxx 傾角yyy4 h! |# L6 q1 t5 F
  802. //int rd_S; //指令 All Stop5 b+ I7 L# _/ Z" x+ w9 S
  803. //int rd_R; //指令 Clockwise Rotation
    6 f# e6 ^; B. N, G3 R/ }5 \5 L6 l2 }
  804. //int rd_L; //指令 Counter Clockwise Rotation, |7 M' i0 t, y% O8 F  `4 u
  805. //int rd_A; //指令 CW/CCW Rotation Stop
    . s1 }- q, P+ N1 o
  806. //int rd_U; //指令 UP Direction Rotation
    + y$ D; q2 C& j( N2 d/ t9 ]0 T
  807. //int rd_D; //指令 DOWN Direction Rotation: F( A; N( b) Q2 m1 L( m
  808. //int rd_E; //指令 UP/DOWN Direction Rotation Stop4 Q" j( g* q* k) F- p
  809. //**************************************************************************************************
    9 F2 \, k1 C, K' I) ^
  810. void turn_dsp(void)
    8 T8 ]0 p% ^* z. H, K) g/ L: G, W
  811. {  {+ _. \7 M8 C# v. H4 H
  812. if(dis1[11]=='L'&&dis1[12]=='o'&&result>>0) //指令 傾角過低 low(回頭)(當 傾角 輸入=0V(將該腳位接地)  時 不做「過頭回一點」的控制)
    + H; M& F" {, |
  813. {4 `' B- A4 z' i! w# _
  814. RD1=!0x00;
    & c- v$ E3 d# V
  815. RD0=!0x01;
    5 V* D" t4 N- ~# F8 V$ _
  816. nms_delay(300);
    / e. g" @5 B+ A4 L0 B
  817. RD1=!0x00;) B7 c% H- Y9 H; z$ ?' k% `  X. T/ N
  818. RD0=!0x00;4 v2 i9 u& f' }$ {2 q) o9 w& j0 O( f5 w
  819. }
    8 c' \% O2 M3 B1 c  s3 Q( g+ ^
  820. if(dis1[11]=='O'&&dis1[12]=='v'&&result>>0) //指令 傾角過高 over(回頭)(當 傾角 輸入=0V(將該腳位接地)  時 不做「過頭回一點」的控制)
    ! o5 \. L& g& x1 j( y+ J
  821. {
    ' i% g9 ^0 ^& W! e8 `
  822. RD0=!0x00;9 k6 S! A' l+ p/ V) C
  823. RD1=!0x01;& \5 U3 r) h  C9 [6 K
  824. nms_delay(300);$ S5 ?  L3 X, ?% V) _( t+ u
  825. RD1=!0x00;4 @, o0 N& U5 s/ D
  826. RD0=!0x00;
    - {. t- ^* g' m+ W: t9 S
  827. }, d. j8 u8 K/ L. `1 Q  z7 c

  828. , g3 n( w; e& |
  829. //******012345678901234567***************//
    : T" J  E8 r9 Q) Z; v
  830. //dis2{"Turn! Right Down\0"};
    3 e% I0 ~) ^) s3 H6 M8 Z# E, e+ J2 S0 J
  831. //    {"Turn! Left   UP \0"};; P  r$ F- k& S; ]
  832. //    {"------STOP------\0"};
    , m6 S; @) G& I- D7 y% W
  833. //***********************************//: @7 \+ Y: I( E8 M: T  \
  834. if(rd_U==1|rd_D==1|rd_L==1|rd_R==1)" }* ~  i2 u+ I+ G- d
  835. {
    ) q  {. x, f# ~+ F1 \4 v8 S+ T
  836. dis2[0]='T';
    8 W' _( x! o8 O- k  i
  837. dis2[1]='u';
    # @2 v6 g$ K% A, U
  838. dis2[2]='r';5 M8 e- @; L1 M  ]4 R( b
  839. dis2[3]='n';& u1 w  D: y- s  N' P0 `! J* Q
  840. dis2[4]='!';
    . A7 ?6 J+ e5 Z  J+ ]6 {
  841. dis2[5]=0x20;3 c- C' l+ C/ L+ f% j  c! N, {
  842. dis2[6]=0x20;;8 z2 }, r1 E+ F; |1 z3 ^
  843. dis2[7]=0x20;;6 b7 ^2 r- g; A  \
  844. dis2[8]=0x20;;  V; d5 f, z8 w3 Z
  845. dis2[9]=0x20;;
    9 G( ]9 T1 `* J, E9 p
  846. dis2[10]=0x20;
    ( t8 K" k& z" X5 ^
  847. dis2[11]=0x20;;* ~) i3 h5 H3 N6 Y$ k( G# |; x
  848. dis2[12]=0x20;;
    3 \$ P2 M4 Q- p, l
  849. dis2[13]=0x20;;  z! u* i* O& [0 B: }0 F
  850. dis2[14]=0x20;;
    ' I' Z" o/ [& u
  851. dis2[15]=0x20;;
    " X& B& K6 m. f8 X  D# [  g+ l
  852. }
    9 ~$ W: e! J4 Z. b/ H
  853. if(rd_U==1)8 w& W1 e/ E( C$ n3 C5 O! P' M
  854. {& G& ]+ C# [" I) Z) Q! x! U: x  X9 B
  855. dis2[12]=0x20;9 p9 s) w0 ?+ j3 R% c
  856. dis2[13]='U';4 t4 I! I2 b5 z9 p' Y( I' X
  857. dis2[14]='P';: O" }; ^3 m" }, G6 e
  858. dis2[15]=0x20;  v4 k4 _' N  x
  859. }
    0 ^: x  s! M" Z% P. Q* a. w7 a
  860. if(rd_D==1)
    4 j$ C' ~; L9 h
  861. {$ G' m8 @! d( J- j7 F" e
  862. dis2[12]='D';
    ! ], M$ j. j9 u0 [. x
  863. dis2[13]='o';
    & H4 h, \1 `# j" h9 @
  864. dis2[14]='w';
    ! M- w3 y$ P. J! [
  865. dis2[15]='n';) K/ X, l  o  U& [6 }
  866. }/ a, ^6 a- k7 ]: U
  867. if(rd_L==1)2 s' e( e1 X( e) A% E  L
  868. {7 P5 C( U6 X% q9 g
  869. dis2[6]='L';8 D! ^9 u& A8 {5 M. m- w
  870. dis2[7]='e';
    9 @8 f! I. o( o6 N7 w: K$ {
  871. dis2[8]='f';/ M, C3 x2 H$ o- O
  872. dis2[9]='t';
      ]# Q/ d* {$ ~# |
  873. dis2[10]=0x20;& G0 ]4 X$ f$ t0 V3 z
  874. }/ b1 V( m+ y9 }4 k7 Z; L% i
  875. if(rd_R==1)& o6 J  c5 Y* d3 E
  876. {5 N9 r9 j5 h8 S1 @) `
  877. dis2[6]='R';
    # t; M# B8 c+ I" F9 E$ T
  878. dis2[7]='i';
    ' D+ Y9 S4 G9 V; m1 G1 y# h$ l* g1 `
  879. dis2[8]='g';
    2 M* L7 o3 c1 _/ R
  880. dis2[9]='h';1 m' f1 P7 A8 y/ L( F" v: f
  881. dis2[10]='t';2 U1 D/ J& K  c5 U. K) ^
  882. }
    6 N: X: o3 C8 I  p8 ~
  883. if(rd_U==0&&rd_D==0)
    ' G5 |9 F! `$ C% m8 y
  884. {: O6 F- c1 X& V5 r4 B. w1 x! t6 `
  885. dis2[12]=0x20;
    + C* B( _, Y' e$ F; L2 U
  886. dis2[13]=0x20;
    9 @4 Z4 b6 k3 d
  887. dis2[14]=0x20;0 I' Y4 A2 m, \+ z0 D
  888. dis2[15]=0x20;/ k8 Z! j- [' d7 P7 ~
  889. }' V& e0 t* u# q3 }: K
  890. if(rd_L==0&&rd_R==0)6 n' G% t  ~. O3 f$ z2 X: ^  p
  891. {; T- N8 i$ m! a: `* C% |( O
  892. dis2[6]=0x20;
    : }2 D( |+ F/ r
  893. dis2[7]=0x20;
    % ]) C, D5 `0 f* a
  894. dis2[8]=0x20;
    : j" }; m) i$ e
  895. dis2[9]=0x20;
      p& J6 ^8 A2 f7 \$ F+ ~
  896. dis2[10]=0x20;
    * R3 l& a" k! G
  897. }; _/ w  g' r! E9 b
  898. if(rd_U==0&&rd_D==0&&rd_L==0&&rd_R==0)
    . K; w* a, M! U* b
  899. {! E8 O) |: S# b, P6 p
  900. dis2[0]='-';# a; r# L5 V6 ~  p* ~1 c  u
  901. dis2[1]='-';6 N7 a: |1 t2 M. k& A
  902. dis2[2]='-';
    9 v2 @  t1 c- X: G. e- W7 T& M: E
  903. dis2[3]='-';
    3 ^3 F& H" Z  z3 X
  904. dis2[4]='-';7 i7 i, I5 ]* \1 F5 O( J
  905. dis2[5]='-';
    1 ]3 }# ~, P1 e( m
  906. dis2[6]='-';
    ! h5 |" j1 K  \) \
  907. dis2[7]='-';
    % @* c6 ]; [0 z; P2 k9 i
  908. dis2[8]='-';* H6 I5 [: F# ^- l4 e
  909. dis2[9]='-';
    3 O! B) y0 j0 m6 @
  910. dis2[10]='-';
    9 S- J# r7 x/ m5 U# C( [/ U
  911. dis2[11]='-';6 @. J) s* B0 |$ e6 F% b
  912. dis2[12]='-';" y. u8 `6 t2 w8 t% T0 F' y/ ?6 I
  913. dis2[13]='-';
    4 `( R9 `- \( r, A' z' i
  914. dis2[14]='-';6 r* _. h1 h9 ~; l9 r
  915. dis2[15]='-';
    " a  p5 \5 H9 \& J1 f
  916. }
    : f- b$ r* |* }- u3 Z, H1 h# _
  917. + U' M& x) s  k3 _% f
  918. }   
    - ], V# u  c. u# m+ B- X! |
  919. : D" u4 s1 K! {3 \' @( L' v7 N' y5 a
  920. //*********************************************. N) E/ H: ?; C. D/ h( d
  921. //雲臺 手動 轉向 COMMAND
    1 l; v+ ~. f: k2 O1 F8 q
  922. //
    " h' ?4 \1 j" ^" [  }" L
  923. //int rd_S; //指令 All Stop5 [  u$ t! M5 g; B; o
  924. //int rd_R; //指令 Clockwise Rotation
    & U2 k" ], d, A- c8 E8 e+ ~
  925. //int rd_L; //指令 Counter Clockwise Rotation
    2 l& T  r. A8 H  }# M
  926. //int rd_A; //指令 CW/CCW Rotation Stop. b4 ]; _. X$ L8 k8 p( }& D
  927. //int rd_U; //指令 UP Direction Rotation* A& a+ X' x0 v5 @2 m( l5 g0 L
  928. //int rd_D; //指令 DOWN Direction Rotation! l1 G: I6 b( {  q0 z
  929. //int rd_E; //指令 UP/DOWN Direction Rotation Stop2 d- h/ i4 n  g# m3 [  B0 Z
  930. //**********************************************- O; \* I) e4 @" ?) S
  931. void PB_cmd(void)   ], u! s+ j% D: Z& m' q$ q% K
  932. {
    / z( v2 j5 c# p
  933. rd_M=0;! b$ Z; ~# l$ h* y$ J; `
  934. rd_W=0;" b2 C0 O  X8 e. q0 u9 `
  935. rd_L=0;
    * z  ~1 p9 U0 q9 r2 U# l  Q( h
  936. rd_R=0;# r" w+ H7 y  y, w/ S8 a* V: ~& M
  937. rd_A=0;
    3 F! B" b0 l3 O7 \' R
  938. rd_U=0;
    0 b3 u' a" j4 A; W( l
  939. rd_D=0;
    3 k! j6 j8 Y$ Z- V* X* S
  940. rd_E=0;
    3 T" X' _. ~: z: C& x6 m
  941. rd_S=0; : q. r0 c2 L3 t9 @5 ?" W, q" w8 a
  942. if(RA2==0) //檢查按鍵 上
    9 x7 e  Q  j# W: {8 `- y
  943. {
    1 u8 {# l$ [# H  s  T$ {
  944. nms_delay(5);
    $ J6 L8 G4 A% U1 v. q2 L5 O
  945. if(RA2==0)
    8 R( H5 D' G& q* p7 s
  946. {
    + m5 K, t* s; S$ s6 f& X" v
  947. rd_D=0; //互鎖5 ?4 g) y  M) l
  948. rd_U=1;! d! X* n# l9 D% p
  949. }6 D2 L/ H+ F' `+ H
  950. }
    ' v( I, M: s8 S2 Y" A# @
  951. else
    2 Q; W0 o. U) f& Z0 f4 v/ t  y1 J- G2 l8 d
  952. {1 |( X* X" E& \7 F
  953. rd_U=0;: ?3 v9 F* V4 U. P  R& f: o
  954. }( n, g; Z: C5 \/ E

  955. 3 ]0 y& @9 Z' _  h( u
  956. if(RA3==0) //檢查按鍵 下+ K( w& r4 ^; t, D+ F2 n! g& O
  957. {
    / }4 W& q- Q& B5 ^
  958. nms_delay(5);! K: \- J" h% d
  959. if(RA3==0)
    $ O$ E. l# U! O3 {  |
  960. {
    2 v" g. s) a4 v6 `8 a
  961. rd_U=0; //互鎖4 F. l( [7 Y; X, J) Q* U
  962. rd_D=1;
    " r. Q& z  V# i2 K
  963. }
    6 B+ `; u9 `8 \" J. \) i
  964. }. t2 G/ V- H2 v3 Z
  965. else
    : K- c1 Z) Q" d
  966. {
      X0 {! ]/ ]9 ]8 s2 O/ C1 J" x# U
  967. rd_D=0;
    ) w- \8 ]& j7 s' ~2 H4 }
  968. }0 ~0 ^6 x& j" N1 i9 H  f
  969. # l, K! X+ _( T+ h$ x
  970. if(RC1==0) //檢查按鍵 左  N" W1 M1 r8 N; Z- D
  971. { // (RA4 不可以用(無法改變數值+狀態不定) /改用 RC1)
    + i' n9 s0 ]3 u1 d/ I# T
  972. nms_delay(5);  G7 C+ b& j- Y; A" Y" a, s
  973. if(RC1==0)/ c! ~; n( O* i! e
  974. {
    + `8 G2 q4 `- ?
  975. rd_R=0;& K) w( p1 S8 H( X
  976. rd_L=1;
    / N1 ?. R% Q( {
  977. }
    3 P$ K0 q& j! v/ ^& S
  978. }+ `' ?" p- X  i1 ?" }6 H7 J' c
  979. else8 e& E* _& G# z( n
  980. {% w% C, I) Y( O6 b4 P
  981. rd_L=0;
    : p  u/ z) V) U/ Z. ^$ p1 s
  982. }
    ) _: v/ z7 r" d

  983. + M; W2 u2 j' B! Q
  984. if(RA5==0) //檢查按鍵 右% F3 ?& X0 W5 t' v
  985. {' U8 }8 e# J( H1 H4 @5 d3 R0 O" _
  986. nms_delay(5);
    3 F+ v8 r2 C) ~0 u3 I
  987. if(RA5==0)
    : b6 H; x. k7 s" N8 R, J
  988. {
    % ^1 d# F* n: R9 _0 q, @$ H
  989. rd_L=0;3 ]% q1 m3 F7 R9 g" [
  990. rd_R=1;# w" n& D+ X2 |6 |/ G% Q  ~% s! E
  991. }( O! z( G& S& E, s+ M9 c
  992. }- B3 ?$ b8 ~0 Z- |! {; I
  993. else- K# g: G8 Y1 a7 ^9 o" b
  994. {
    : a$ J0 Q6 _3 G* a1 z) D8 F+ r& \
  995. rd_R=0;
    , |" a2 f% F  l: V
  996. }% g9 A- e5 I2 [

  997. : X: a! A% H: n2 R
  998. if(RC0==0) //檢查按鍵 停
    ) {3 a' r- S7 v0 E6 U. A0 L- f- q; y
  999. {
    % F6 H9 N5 c; }5 h" H+ U' R( r7 k
  1000. nms_delay(5);- A. n$ u9 ^" w& w4 H! |2 Z, P3 h7 L
  1001. if(RC0==0)
    + T+ ^) g* C8 p4 `, L) }
  1002. {
    " D  k& y. [! ?0 ]7 }
  1003. rd_L=0;- r9 R! n# P$ E. K& f# |" U
  1004. rd_R=0;  Z" n  C3 |7 u
  1005. rd_U=0;4 L' }% @$ V! w7 ]
  1006. rd_D=0;
    / y4 t9 Z9 E+ I, t9 W+ |7 Z
  1007. rd_S=1;4 O" p' J  T$ ~, o+ X8 V
  1008. }
    / j7 `& @! z% N; `
  1009. }% T& |  \' L" I# z6 w0 F8 |
  1010. else
    / m+ `" |/ d* s/ {
  1011. {
    6 }/ l9 P4 x, y% o& g9 T3 t3 u: E: w9 G
  1012. rd_S=0;
    1 S1 N9 N6 U0 R. g1 e
  1013. }5 M3 O' n& n8 I/ t

  1014. 3 ]5 L* z3 I% A. t
  1015. }
    7 \1 C$ N+ K( w# R3 F3 [

  1016. - I2 Q2 N% I9 C
  1017. //*********************************************7 U8 {0 D, X5 i8 b* W4 @) W- K
  1018. //CHECK STOP COMMAND
    + d0 a! v# ]! P$ }
  1019. //int rd_S; //指令 All Stop2 n* x( [' h) F
  1020. //**********************************************: `! o2 ?6 Z: v9 s) Q" A; N- n' C
  1021. void CHK_stop(void) 7 W- \, ~; e% K$ h% I
  1022. {
    % a6 c5 w: u2 \
  1023. if(RC0==0) //檢查按鍵 停
    # K% t. Z  l) x: `. h8 |
  1024. {# ^* A1 a  B$ U8 E4 ]: f+ ]
  1025. nms_delay(5);7 K- M$ H+ s* K* F. G3 F$ r* m
  1026. if(RC0==0)
    * R! q8 T. c. Y! S. C$ M( k
  1027. {; L3 X8 L3 F0 E2 e
  1028. rd_L=0;* e& C7 T; \) J  y
  1029. rd_R=0;
    " f" V: t5 Y- u+ L
  1030. rd_U=0;
    ( j3 p. g) Y! ^: i0 ?/ c3 B
  1031. rd_D=0;0 p! W% |; V. p1 M. U" ~
  1032. rd_S=1;) [% U9 h( j& O; Y8 u
  1033. }' P5 a& H1 B. F9 w
  1034. }( x# d8 d2 k9 a; L$ e, ~
  1035. else" M' l. N. p2 `& Y! K  ~
  1036. {
    & Y5 j& c, P! w2 f% F  w: A
  1037. rd_S=0;
    " J3 h# n, K: o+ C' \* h
  1038. }
    5 q: t: E4 U) Z" O) K! ]9 R
  1039. ) P6 k+ @- R# m& C
  1040. }
    $ X' j5 P5 ?. k

  1041. / g0 \- }' {4 Q6 d
  1042. - J' m* x5 V2 H4 v; X9 D
  1043. //**************************************************************************************************
    7 J+ u! A9 J2 _/ I' i
  1044. //串口中斷函數, I1 m/ R( _. l/ c3 ?, M9 ~  J
  1045. //接收要求或指令 並改變旗標
    6 }! A9 w# |. f: ~6 n/ Y9 V
  1046. //int rd_AZ; //要求 水平角度
    4 e6 }$ s- N: `1 n
  1047. //int rd_EL; //要求 傾角' u; t: u+ G, B7 v2 Z4 ?$ Q3 g5 q
  1048. //int rd_AZEL; //要求 水平 + 傾角
    ( B+ }3 A6 H% M) O$ w$ q; M3 \3 I
  1049. //
    - V7 f  Q* Y6 A5 ~! [( i& Q" T
  1050. //int rd_M; //指令 前往 Mxxx 水平角度xxx
    ! G  p" H. F. D! }) O3 c5 e; T
  1051. //int rd_W; //指令 前往 Wxxx yyy 水平角度xxx 傾角yyy
    7 Z" d, H6 [( B. p6 W
  1052. //7 p/ `1 M: n  ~+ X9 a# F" n6 D
  1053. //int rd_R; //指令 Clockwise Rotation
    * f3 J- d/ E7 R" Q5 U
  1054. //int rd_L; //指令 Counter Clockwise Rotation+ J5 ?3 S) S/ X/ P% |
  1055. //int rd_A; //指令 CW/CCW Rotation Stop: P1 ?3 l6 {% K2 H
  1056. //$ u2 [7 y) g& O6 ]
  1057. //int rd_U; //指令 UP Direction Rotation
    2 d8 e1 a1 Q: r3 u) g, D
  1058. //int rd_D; //指令 DOWN Direction Rotation0 G; I& n% h* c1 W% h: r
  1059. //int rd_E; //指令 UP/DOWN Direction Rotation Stop
    7 ~9 n5 p$ G8 t$ y7 ~8 L
  1060. //
    4 X5 l/ c4 G" I+ A* n9 Q& h
  1061. //int rd_S; //指令 All Stop* ~' Y8 j3 C6 Y: P  J& V: q
  1062. //**************************************************************************************************\
    ) b. ]% K( K. C- v
  1063. void interrupt usart(void)6 P! ?1 l1 t* X, N
  1064. {/ H! o2 ~( Z. w6 w' R/ V
  1065. int i;1 S+ d6 ^! D; ~' }
  1066. if(RCIF)8 ^8 l# N5 E3 [
  1067. {& R" g* r2 {8 @/ z
  1068. RecArray[i] = RCREG;5 d# D9 y# c+ B& I! l
  1069. i=i++;) t& L3 t( s; N3 C7 f+ Q
  1070. //if(RCREG==0x0D|RCREG==0x20)
    ' a/ K. U5 ^% |: {$ n7 i
  1071. if(RCREG==0x0D)7 e0 U* {1 f1 ~# r, J$ e8 J0 {! o# {
  1072. {
    ; P0 d. X9 H: q; s. K1 \' B. y6 J
  1073. //if(RecArray[0]==0x43&&rd_M!=1&&rd_W!=1)  // 如果抓到開頭為 C 並且無自動指令 M W3 ^' Y* a) [* c% ?* Y# q
  1074. if(RecArray[0]==0x43)  // 如果抓到開頭為 C 並且無自動指令 M W; c) x' O) \: Z- r/ M& P9 f
  1075. {! O: \- h( Z0 i1 n* h% C
  1076. rd_AZ=1;
    " x* {$ f3 _0 D7 z& q3 V3 ^
  1077. }/ a8 L4 ?1 T* q) D: `$ P
  1078. //if(RecArray[0]==0x42&&rd_M!=1&&rd_W!=1)  // 如果抓到開頭為 B 並且無自動指令 M W
    ) Q: |4 B/ ~3 ?3 ?4 {* _0 b
  1079. if(RecArray[0]==0x42)  // 如果抓到開頭為 B 並且無自動指令 M W# W; ~  ?$ b. N9 M. P5 Z
  1080. {/ b- j! g# ^" s" ?' o% n
  1081. rd_EL=1;
    # _6 J) o+ D* `% d* S
  1082. }
    / g0 j2 G; [1 z3 T- o
  1083. //if(RecArray[0]==0x43 && RecArray[1]==0x32&&rd_M!=1&&rd_W!=1)  // 如果抓到開頭為 C2 並且無自動指令 M W" _3 R: u' \: E! I+ g# u% z) ~
  1084. if(RecArray[0]==0x43 && RecArray[1]==0x32)  // 如果抓到開頭為 C2 並且無自動指令 M W
    ) `# K4 M8 i2 Z- F' ]' l9 i# n/ I
  1085. {
    % J" l$ |4 p2 j6 {! o" ~
  1086. rd_AZ=0;
    ' n9 \: B$ F1 A: J
  1087. rd_EL=0;; A$ N- u& O. S0 P9 {7 a7 S, B3 u
  1088. rd_AZEL=1;
    ' \  @$ `) z* V, B7 u! [
  1089. }7 j! `+ a' M: q: q+ I
  1090. if(RecArray[0]==0x4D)   // 如果抓到開頭為 M 水平自動指令" Q7 r/ H) A  e. J7 W- @
  1091. {9 \6 i8 X4 b- [" }/ P, e* k
  1092. rd_M=1;+ z4 h. T# X2 ^& [5 f$ ~
  1093. }* `5 M* W* U  [  z9 S6 b
  1094. if(RecArray[0]==0x57)   // 如果抓到開頭為 W 水平+傾角自動指令
    : |( |  [$ J+ T; [
  1095. {
    ) j4 g& d4 g( D$ G
  1096. rd_W=1;- Q( o4 c+ F- d
  1097. }
    1 ?6 I" K8 l9 q5 i3 r6 h. Y. B; h

  1098. ; K/ R$ T$ T; k' C+ u- C) q2 ^
  1099. if(RecArray[0]==0x52)   // 如果抓到開頭為 R6 d# ?6 z+ M* O# n$ N6 i1 N
  1100. {! p* ]" I1 r1 Z+ k2 O; \5 _
  1101. rd_L=0;
    : }& h3 O) n2 n+ f, r, ]' U
  1102. rd_R=1;: \5 z" Y8 ]2 E1 Y6 D) T2 Z* Z
  1103. }6 L9 J8 _' |1 C% T* P3 c( C. c
  1104. if(RecArray[0]==0x4C)   // 如果抓到開頭為 L
    & n8 D  X8 l) P4 y( `7 H
  1105. {; V! c$ F0 ]& e9 T/ N5 }
  1106. rd_R=0;
    6 e. c3 u5 O( J! i/ ^1 x
  1107. rd_L=1;6 m- C. V' @, [, U
  1108. }# Y. H: n. j' X% y9 A6 j, i5 y
  1109. if(RecArray[0]==0x41)   // 如果抓到開頭為 A
    6 m7 F3 i' q8 b+ j2 c; i5 E4 t( E
  1110. {
    0 _+ c9 ]; d) b+ h) L
  1111. rd_L=0;
    6 N; x+ t9 T( F) U! m, z
  1112. rd_R=0;7 W8 [* ^! G6 @& v3 I) k; q
  1113. rd_A=1;
    8 c( p  i/ K! c3 g7 `" Y1 ~( a- o
  1114. }
    . e+ f% }# X5 g+ A) l) I/ Q/ o
  1115. if(RecArray[0]==0x55)   // 如果抓到開頭為 U6 ~9 j( L$ _3 N
  1116. {/ n- K( O) g3 b: W& n5 ^; G
  1117. rd_D=0;! i8 D3 ?5 `5 o
  1118. rd_U=1;  Q# `& y! s8 E6 }. a3 J: p
  1119. }* Y) j3 v5 {: g% N+ Z$ N
  1120. if(RecArray[0]==0x44)   // 如果抓到開頭為 D+ G# H) O$ {5 y8 r- Y2 X
  1121. {
    ) X8 W+ }& Z$ h+ H, g
  1122. rd_U=0;$ A6 d& w7 v, B* l' S" t: f
  1123. rd_D=1;
    5 ?: E1 F+ o+ v# O& m% J- y
  1124. }6 A0 ~) x: M/ S$ c
  1125. if(RecArray[0]==0x45)   // 如果抓到開頭為 E5 E8 w1 K: I8 r
  1126. {/ P8 |) n1 w1 ^) n* W
  1127. rd_U=0;
    7 t! a6 D- U/ `+ f) X4 q" v
  1128. rd_D=0;6 B2 y" x" q; N  [2 J
  1129. rd_E=1;. J0 n' j- {. j2 V5 X- Y
  1130. }  \+ v( B+ A) f. I: ^1 a
  1131. if(RecArray[0]==0x53)   // 如果抓到開頭為 S( W% O* q% x% o' n3 x
  1132. {( B4 P  i1 i+ n- {: Z
  1133. rd_M=0;6 m0 [0 U: }; W6 W  B- z3 T! D
  1134. rd_W=0;3 p$ O+ @$ |( ?9 e; k' z
  1135. rd_L=0;+ v8 D- m- k- s" R) [! f
  1136. rd_R=0;7 x; c6 W( j3 k- Y+ X
  1137. rd_A=0;
    # L6 P4 ~- l& x; |# G# B) h( y
  1138. rd_U=0;
    - Y2 A  a. k% u8 F" K+ T! B' p
  1139. rd_D=0;  W& L0 |7 e1 T' r" D
  1140. rd_E=0;
    " H1 j5 D, S+ V
  1141. rd_S=1;
    / n& y. N2 G. V% n
  1142. }) h/ r  z& ^+ X. x! T8 A# }6 |
  1143. i=0;
    * {( q% }  q% z' z& h; g
  1144. }
    ! o3 C6 c! I+ r. X4 n1 V  w! f+ u
  1145. if(i>=11)
      R( `; c; d; r. k$ Q! H/ i
  1146. {
    # }4 \* U0 M; |
  1147. i=0; //如果超過12(0~11)個字元就把i歸零(一直重複,將此次訊號收完,防止溢位)
    # b6 g0 n% l6 |( Q" H
  1148. }
    , }3 p5 w9 D) ]4 f8 P% ^
  1149. }2 a  y! o+ \0 ~, Q
  1150. }4 A" O. R( `0 v: v
  1151. 2 x( f  c- d0 q7 Q- ~( v

  1152. 9 M% k# [9 p' }4 n8 U
  1153. //****************************************************************************************5 G& L: I/ I" X/ L
  1154. //主函數
    , F2 W9 J1 ^. h! a5 O; a% D
  1155. //****************************************************************************************
    % o: h; I3 V( ^( |* h
  1156. main()$ ?$ }* o. L4 L3 z
  1157. {  3 `# N+ g* y: n. O& f
  1158. uchar cntl;
    ' x: D) ^* y0 c. z

  1159. - O0 l! G6 w( T( S# A6 h3 W
  1160.    //__CONFIG(XT&WDTEN&LVPDIS);//配置,設置為晶振XT方式振蕩,看門狗,禁低電壓編程5 m0 U0 a% x7 _% |- _
  1161.    __CONFIG(XT&WDTDIS&LVPDIS);//配置,設置為晶振XT方式振蕩,禁看門狗,禁低電壓編程: n" G, T2 @9 D4 S" o  F
  1162. ; i3 r4 T" o; X2 P4 W. k
  1163.    mcu_init(); //晶片初始化
    , o) z- o( x5 n& g
  1164.    IO_init(); //IO初始化
    - {8 ~" ~5 c6 _% Q* g! P6 U1 _: V
  1165.    init_com(); //初始化串口9 b5 B' S% R& M' O4 w' ?
  1166.    InitLCD(); //初始化1602
    ; e/ P- v) @' k7 C' E& B' J
  1167.    xian1();                   //顯示 等待訊息
    9 L0 p, \4 `) d- x4 g! K7 H
  1168.    xian2();                   //顯示 等待訊息# G4 [# P# V2 v% `
  1169.    Init_wt(); //初始化雲臺(確保不會正好在 Over0 或是 Over360)- |+ E6 _) ^; p: O) B
  1170.    while(1) //進入while死循環
    3 _# ]3 i; q  O7 }
  1171.       {: Y' |; Q* B% o; _+ e* K

  1172.   Z; I3 {. z+ r, J0 ]/ t6 M; V. [
  1173. result=get_AD(); //讀取傾角電壓/ W6 e/ S; i' x/ T5 ~
  1174.      conversion2(result);         //數據轉換出個,十,百,千 位
    6 ]) o6 B7 ]2 Q% j& t3 P2 z
  1175. if(rd_U==0&&rd_D==0)
    $ f3 S( m; E* M% z5 j" d
  1176. {
    : t. g3 j$ O9 |  }
  1177.         CMP_DATA=get_GY_26(1,0x31);   //讀取角度
    ) A  d% x# v' T! e$ z% t
  1178.      conversion(CMP_DATA);         //數據轉換出個,十,百,千 位* W4 r) a& ]! l/ P1 N( `; l
  1179. }3 |$ T. o( v& \/ d1 z4 t6 {
  1180.         xian1();                   //顯示 第1行刷新
    $ j, b' b" |/ C( z
  1181.         xian2();                   //顯示 第2行刷新
    , _: s- C8 w! d$ c' d
  1182. conTIO();( D0 e7 f* i  ?; O
  1183. cmdCHK();. ^7 {0 T& |& A, `8 k
  1184. if(RA1==1) //檢查模式 自動=1 手動=0
    3 Z; p) Y. d( m" A$ E6 d
  1185. {
    9 a7 p! @' k: r+ M
  1186. dis1[15]='A';4 l3 S7 i( u- Q; ~+ ^4 X
  1187. if(rd_M==1|rd_W==1): F! f' m4 g/ L6 H" U
  1188. {2 T1 R6 e) z( g+ e  H
  1189.       con_WB();          //轉換指令後之「文字」變成「數字」* w) V/ H1 `) d4 ]
  1190. turn_cmd(); //檢測是否要旋轉
    ! p, {* `7 T% Y/ |& k6 [
  1191. //turn_dsp(); //旋轉狀態顯示0 Z- q/ \' z1 N/ Z5 e
  1192. }! e2 P! g& U" f+ u
  1193. CHK_stop(); //檢測是否STOP有按下1 V( n1 L6 o, K1 ]2 c
  1194. turn_dsp(); //旋轉狀態顯示) |$ o2 \2 o* J( V- R
  1195. }1 D* N$ O1 T' _# ^
  1196. if(RA1==0) //檢查模式 自動=1 手動=0
    9 ^% y" p# i4 [( u! a+ B' r
  1197. {4 r: \$ Z7 C) @1 V) z5 _
  1198. dis1[15]='M';2 a, u( R* ~) U, f6 ]
  1199. rd_M=0;% P! F) u* b3 H. ]/ F3 O$ A* {  [
  1200. rd_W=0;
    9 s' z0 y. D' C- W3 C
  1201. PB_cmd(); //掃描按鍵狀態: J9 `9 b% ~& C/ _2 h$ G8 x" `
  1202. turn_dsp(); //旋轉狀態顯示& }% z; A$ @+ H, U
  1203. }
    ; @  R" z; W- }3 k- ~+ F
  1204. 9 E0 ~4 r% R% y7 k- D6 N* v. t$ x5 c
  1205.    }
    5 g* f4 }& }5 [! W
  1206. }
    1 g; N" @1 z( N1 Z' d
  1207. ; Z2 u! `) K; r- Z4 y5 h
複製代碼
已有 1 人評分威望 論壇幣 貢獻 收起 理由
BX2AI + 3 + 5 + 3 贊一個!

總評分: 威望 + 3  論壇幣 + 5  貢獻 + 3   查看全部評分

403 笨牛「145.78/431.72」

我的主頁: http://www.bv4wd.tw

3

主題

4

好友

3373

積分

Wiskey

Rank: 23Rank: 23Rank: 23Rank: 23Rank: 23Rank: 23Rank: 23

發表於 2012-9-27 10:25:26 |顯示全部樓層
這東西真專業,完全看不懂,感謝樓主分享.
回復

使用道具 舉報

5

主題

2

好友

670

積分

Papa

Rank: 16Rank: 16Rank: 16Rank: 16

發表於 2012-9-27 13:17:11 |顯示全部樓層
眼前一片模糊
( R7 A5 I+ V' I+ H但是還是感謝樓主分享
方位 : 338
台號 : 巴比Q ( B.B.Q )
回復

使用道具 舉報

1

主題

0

好友

150

積分

Hotel

Rank: 8Rank: 8Rank: 8Rank: 8

發表於 2012-9-28 12:06:52 |顯示全部樓層
謝謝分享喔!! 讚啦
$ l4 o$ @3 ]) B' F& c3 x+ d- V0 ^5 V' t8 k
de bv3ba
回復

使用道具 舉報

10

主題

6

好友

9萬

積分

分區版主

Rank: 55Rank: 55Rank: 55

發表於 2012-10-3 09:11:11 |顯示全部樓層
感謝分享,很讚,我目前使用的是一位大陸OM BH4TDV開發的控制盒,接的是舊型Kenpro水平和仰角馬達。
回復

使用道具 舉報

58

主題

11

好友

11萬

積分

分區版主

辛勤的下层劳动者

Rank: 55Rank: 55Rank: 55

發表於 2012-10-3 09:21:20 |顯示全部樓層
BX2AI 發表於 2012-10-3 09:11
6 Z! e, h" R5 s( L, e* T0 o感謝分享,很讚,我目前使用的是一位大陸OM BH4TDV開發的控制盒,接的是舊型Kenpro水平和仰角馬達。 ...

. i+ ^, }: \. h0 e+ x: gBH4TDV開發的控制盒 是很優秀的產品
  R: x) \) E$ w' H我本來也是要跟他買的,這次自主開發這東西,其實從頭到尾的花費是高於跟BH4TDV購買控制盒的!
. g5 h) W3 a" G5 t% o(當然是把研發設備都算了進去...單製作控制器是不用那麼貴的!)
4 h9 m2 ]" v- B/ h- N3 e: N6 ~% h0 n% X. O6 ]; h" d. W* m4 a
使用原有設備是最經濟的,但是我沒有仰角馬達...所以只能胡搞一通了!!!!
% T% K$ e, C+ x$ E% `+ D  }
' k8 X3 W1 z: D" s" p
8 I/ A6 b% n8 _% e. \2 g( S9 D但是就是想自己試試看,真的不行至少還有都洗可以買來用!!!
2 g9 H- o4 E/ o& ]' P- j在這次的開發中,台北蕭醫師(BM2CAJ)給了關鍵的提示(上位機通訊方式)才能讓這東西生出來!!
403 笨牛「145.78/431.72」

我的主頁: http://www.bv4wd.tw
回復

使用道具 舉報

10

主題

6

好友

9萬

積分

分區版主

Rank: 55Rank: 55Rank: 55

發表於 2012-10-3 09:30:52 |顯示全部樓層
哈,能自行開發出來很讚呀!
! N! e4 q. w: O8 q/ ~7 Q! d蕭醫師和您都很厲害呢! :D    o2 x9 {1 n1 X+ Z
BH4TDV 馬工,年輕有為,我的馬達是很舊的二手品,原本是沒有設計可來接電腦的,但在利用馬工的控制盒來改裝使用時,馬工在QQ上很熱心地協助最終我順利可以來利用電腦實行自動衛星追踨。' D# D/ Z3 A% r5 e) W( x

* t# X! y5 y. ?5 s我的下一個project是打算來弄個可portable的衛星追踨系統,市區V/U 干擾不少,我想portable 到遠離干擾的地方來作衛星通訊是個可嘗試的方式。
回復

使用道具 舉報

58

主題

11

好友

11萬

積分

分區版主

辛勤的下层劳动者

Rank: 55Rank: 55Rank: 55

發表於 2012-10-3 09:47:18 |顯示全部樓層
BX2AI 發表於 2012-10-3 09:30
4 }1 p" {4 h; F6 p" j哈,能自行開發出來很讚呀!9 y  K& Y  T9 G- C
蕭醫師和您都很厲害呢! :D  - o' I, r2 X: J+ _8 d! M
BH4TDV 馬工,年輕有為,我的馬達是很舊的二手品, ...

5 q1 B" f0 e" k: ?& v* `, t傳統的 旋轉/仰角 馬達,輸入到控制盒的訊號反而很單純,就是電壓訊號..3 G  r. j+ D! h7 T3 w% C7 q
如果要攜帶出門,馬工的產品加上能帶著走的雲臺是不錯的選擇!! z2 i9 E) _( o0 [6 u/ P) d" Z
至於 馬工 有用步進電機做的攜帶式設備,我也有考慮過!
  y" i8 b9 X$ j9 M# n/ p* L/ G* `3 J, V3 Q; O% I3 @! x3 q
但是步進電機(+機械架構)在我這邊不好取得(應該說我的領域不知道哪邊方便取得吧!),所以就暫時擱著了!1 Q5 c5 B1 f) U, F
其實構想都是人家的,我只是用自己能想到的方法山寨一下..." U' c" c$ ~+ o/ k" W, V/ s2 Z
403 笨牛「145.78/431.72」

我的主頁: http://www.bv4wd.tw
回復

使用道具 舉報

4

主題

1

好友

469

積分

November

Rank: 14Rank: 14Rank: 14Rank: 14Rank: 14Rank: 14

發表於 2012-10-3 11:51:27 |顯示全部樓層
非常讚!
' V: U) p3 f* ^9 ?4 l2 Q( B: T請問你的雲台是自製? 還是買的? 看來很勇!
& l1 [5 V% G- @9 D9 {8 `7 u  `0 J9 M; m- x
我的雲台載重 10Kg 最近猶豫要不要改?
! w9 J1 _% h4 B2 @, m' b/ N$ C8 N5 E: B2 j' N; \  l/ I8 j1 x2 M
73 de BM2CAJ
! p$ X$ w2 S+ U4 x
回復

使用道具 舉報

58

主題

11

好友

11萬

積分

分區版主

辛勤的下层劳动者

Rank: 55Rank: 55Rank: 55

發表於 2012-10-3 14:09:31 |顯示全部樓層
BM2CAJ 發表於 2012-10-3 11:51
. {0 `' {4 [5 j/ k8 o. ]; K4 g3 O非常讚!  l" j8 j/ Y# F! O4 O  M
請問你的雲台是自製? 還是買的? 看來很勇!

  }- K. q' Y9 n9 G( c2 N才說要感謝您呢!
$ ?1 c  c! i9 O5 q3 j* S0 @雲台我目前用的是跟朋友A的....... VICON V330APT 110VAC "閹割版" ( @) m; ^; Q1 }8 r1 |9 r! }$ p5 f
因為裡面的 可變電阻回授部分都沒有 限位器也沒有回授(只有自保護)...
1 Q+ r) u/ B* y+ m4 l# Z3 M0 U( X$ ^. c, l0 c2 [4 }
完整版的說明書: _; M2 F: s6 |& B, w1 x: z
+ L! v9 ~6 v- A  N  r/ q5 B6 A
看資料載重應該是16KG...
* @; D/ X5 u( o2 u
$ K" S2 n3 j. j( {9 G% q但是我有試過在室內,我人(約90KG)坐在上面腳離地...' D3 B6 q( s5 s8 a$ i) Z
旋轉沒問題, 但是俯仰不行 會一直跑掉需要修正!6 O2 s3 N8 K4 M( Y  u
+ @& F- H" x0 o% }! _6 H
73
403 笨牛「145.78/431.72」

我的主頁: http://www.bv4wd.tw
回復

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 立即註冊

Archiver|手機版|CQ Taiwan

GMT+8, 2019-3-20 04:50 , Processed in 0.499629 second(s), 6 queries , Apc On.

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回頂部 回頂部