CQ Taiwan

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

搜索
查看: 3701|回復: 12

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

[複製鏈接]

58

主題

11

好友

11萬

積分

分區版主

辛勤的下层劳动者

Rank: 55Rank: 55Rank: 55

發表於 2012-9-27 09:07:48 |顯示全部樓層
本帖最後由 BV4WD 於 2012-9-27 09:12 編輯 ! y8 O+ G  T( l3 X, l6 t

2 p, G% \( g6 v# _: m相關資料(PCB,原理,參考資料,編譯器.....)請參閱; h/ b6 ~9 \3 M, R9 M* U) `5 Z
* m0 b2 n+ t5 R5 o( S8 Q$ P4 p
http://www.bv4wd.tw/diy/controler+ G. G- C3 J" r: o4 V/ D

( e$ r" x# ~5 s" W6 U: E
5 |6 H% L9 G. y6 e. E1 C: ~" T0 C$ E6 B. o7 E
% _9 l7 w; R( y
" |0 R, x3 M0 E1 f3 C2 i

  1. 5 v- `# U; e3 K' v
  2. /*******************************************************************************    ! z" P$ k5 u9 F. i5 d
  3. EME(月面反射通訊)/AMAST(業餘衛星通信)用控制器 (核心碼) 2 }) {' q# X, I- g& g
  4. 利用 控制轉向設備(定向天線) 自動/手動 達成 EME / AMAST 時透過軟件追逐目標之功能5 [5 ]5 W. Y# u1 V5 L2 s! e. e8 n; [
  5. (PCB線路圖,程式檔案在頁尾)
    4 ^- K! C3 H! C) h
  6. 4 n; o: A% e! K& D$ e& p& l+ w! a
  7. 主核心: PIC16F877A
    * A0 N/ {& E) K. K
  8. 使用週邊:  GY-26  (電子羅盤0~360)[0~3600 通訊]: |# ]+ K$ S! q* L* M5 r
  9. SCA60C N1000060 單軸傾角傳感器  
    / ]% F6 M. i# Z9 o: k9 ~7 T
  10.           (傾角器-90~+90)[0.5~4.5 VDC ] 為了要能偵測超過下限,下限建議至少定在0.8~1左右
    ) a& y+ i  E. l* v1 k6 H( N
  11. ) K1 y$ z  S8 [2 J0 I
  12. MAX232 (與上位機通訊)
    6 j6 L  c8 v6 l" j' b  n& c
  13. 1602 (液晶顯示)
    5 g; z0 }; s! |+ ^! I' ~2 R
  14. 2 h! c" l" ~* X: ^
  15. 液晶顯示:  第一行 顯示 "方位角 傾角 自動A/手動M 模式"# G8 ?7 ]  o* w8 P7 e0 r
  16. 第二行 顯示 "目前狀態" 左/右/上/下 旋轉", q* Q: m5 }2 K( {( ?

  17. # l* ^0 L1 O3 A; l( r
  18. 支援指令: GS-232A (部份指令), n5 g4 J( o) Y% s; d& t6 d2 `3 }
  19. C  //要求 水平角度/ m$ K, ]$ F* @  \
  20. B //要求 傾角: e% i$ t# `* N% n; C/ B
  21. C2 //要求 水平 + 傾角
    7 m- S9 V0 `- M* `6 C
  22. M //指令 前往 Mxxx 水平角度xxx
    2 b7 B3 `% S% u$ d% d
  23. W //指令 前往 Wxxx yyy 水平角度xxx 傾角yyy
    * `1 w0 T& S' m1 I; {
  24. S //指令 All Stop$ G& C5 y5 I, M; p9 |, e
  25. R //指令 Clockwise Rotation
    # D! F" p; ~, A
  26. L //指令 Counter Clockwise Rotation  Y+ O0 x. u; Y1 M) x& d
  27. A //指令 CW/CCW Rotation Stop& O/ ~' N+ i4 q0 `
  28. U //指令 UP Direction Rotation% R% t' e' ^+ X# ?! ]
  29. D //指令 DOWN Direction Rotation$ k  H- ?. h/ _$ d- ^# R
  30. E //指令 UP/DOWN Direction Rotation Stop
      C( i# s. _. T
  31. ; N% J, o4 M1 Q" i! B
  32. I/O定義:
    1 h& f) j! @' ^0 L
  33. 定義  TRISx 1為輸入/ 0為輸出 / x 為未始用(1) (TRISA只有6個Bit)
    6 b! @- ?7 p2 q- m2 u& U
  34. TRISA x x 0 x 0 0 0 1 <--- Bit0:傾角電壓輸入 /Bit1:手[自]動(接地=手動) /Bit235:上下左
    ; x; k" X! s+ j. R
  35. TRISB 0 0 0 0 0 0 0 0 <--- LCD IO 輸出
    ! I2 C& \' `  g+ c$ [- q
  36. TRISC 1 0 0 0 0 0 0 0 <--- Bit01: 停右 /Bit2:PWM輸出/Bit34:I2C總線/Bit6:RS-232TX輸出/Bit7:RS-232RX輸入; _- a- s+ l* X3 B
  37. TRISD 0 0 0 0 0 0 0 0 <--- Bit01267:R.L.OUTPUT / Bit345:LCD command, R7 x% c) Y7 B' Y! f

  38. * A* N, U3 F9 y2 N9 _) e
  39. 定義 PORTx 1為高電平/ 0為低電平 / x 為未始用 . D4 [7 i" O8 |" x( Z+ p
  40.       (TRISA只有6個Bit)電壓輸入口設低電平/其他需要改變狀態(拉成低電平)的設成高電平/再其他亦可都設成高電平; |+ ~3 A7 f% U4 u
  41. PORTA x x 1 1 1 1 1 0 <--- Bit0:傾角電壓輸入 /Bit1:手[自]動(接地=手動) /Bit235:上下左輸入* K' z; J' S3 r3 u) A: L$ B
  42. PORTB 1 1 1 1 1 1 1 1 <--- LCD IO 輸出! d: ]- B4 J! a" Y
  43. PORTC 1 0 0 0 0 0 0 0 <--- Bit01:停右輸入/Bit2:PWM輸出/Bit34:I2C總線/Bit6:RS-232TX輸出/Bit7:RS-232RX輸入
    # i$ }0 q5 S+ b2 O: o( ?, \
  44. PORTD 1 1 1 1 1 1 1 1 <--- Bit01267:R.L.OUTPUT (高電平 = 1 = 不動作 )/ Bit345:LCD command
    7 G; J! w' y8 e  H6 t# h

  45. : B; T. I4 k& N
  46. 接線注意 :  控制雲台轉向的繼電器實際接線時,8 S8 T& }4 ^; m8 W. Y
  47. 將110V電源其中一線接到 上(COM) 再將 上(NC)->下(COM) 以此類推 ->左-->右
    + _9 X$ v6 l/ K/ d2 A0 ], h
  48. 這樣可以防止萬一繼電器同時動作時,110V的控制電源同時輸出(雖然程式有保護了,還是要有硬線防呆!)! N* E& m. [1 e. K' q; V& M
  49.                PS.控制線接在NO" ~" @& S4 Q* y/ o1 k7 B

  50.   t2 @4 E; ^, M7 U7 u
  51. 維護記錄:  2012-07-20( d% [* w: P$ }+ _4 D
  52. ***************************************************************************************************/
    . y3 H  C& W6 k* N- ^/ k
  53. #include <pic.h> //頭文件在HI-TECH安裝目錄下\HI-TECH Software\PICC\std\9.60\include' J/ ]3 ~  r9 }6 x: Y) K$ d
  54. #include <stdio.h>6 T. f- x' J( `2 y
  55. #include <string.h>
    - Q  i' W# F% f) \9 H. \' g
  56. 7 m) _0 }7 [  x% n8 e6 H* O8 C
  57. #define uchar unsigned char
    ) i7 u9 Q) W/ c2 Y4 g. @& m
  58. #define uint  unsigned int& f1 X8 w9 N  Y# F
  59. #define GY_26_ADDR  0xE0 //定義電子指南針器件地址(出廠默認為0XE0)
    0 [& N8 X& p* S3 Z: z
  60. #define rs RD5           //LED 命令/數據選擇
    & o3 ?: h4 s# A+ c* p! @- U
  61. #define rw RD4           //LED 讀寫口
    1 |/ t0 o3 l( P: h5 h( ~, c
  62. #define e  RD3           //LED 鎖存控制
    7 M; o2 h0 `1 q& [
  63. #define Dataport PORTB   //LED 數據口定義4 L0 g$ a! v4 g6 F) p8 I

  64. 3 \9 h5 a2 H3 W# t, s" G% G
  65. void delay_20us(uint nus);+ |8 c% d3 }! A. }& o
  66. void mcu_init(void);
    - x! ^" Y& j% Z- P! V
  67. void nms_delay(uint nms);$ c; H( |7 g: u0 R6 ^( S: }6 P
  68. uint  get_GY_26(uchar read_begin_address,uchar GY_26_cmd);
    0 f9 d  I; ~- \% F1 v5 ^# Y/ M( q
  69. uint  get_AD(void);
    1 _* `' t; t& t% D
  70. void  conversion(uint i);
    + l+ ^. j" W1 d4 x0 I6 w' ~0 E* G
  71. void  cmdIU(uint i); 6 C5 x2 [2 @3 M. s; p
  72. 7 p+ J7 G2 D$ Y) @9 `- e* N
  73. //iic使用函數********************************//
    ' H) T# V- D  w! U  l) A' a
  74. void   iic_Start(void){SEN=1;while(SEN);}    //啟動iic
    ; N* O$ }5 f5 o5 q6 i# z' w
  75. void   iic_Stop (void){PEN=1;while(PEN);}   //停止iic: H+ S# W. o: I) \& }/ J: Q* J
  76. void   iic_rest (void){RSEN=1;while(RSEN);}  //重啟iic , h& ]; `* i% V9 g
  77. void   iic_Write8Bit(uchar x){SSPIF=0;SSPBUF=x;while(!SSPIF);SSPIF=0;}//向iic總線寫8bit數據               
    $ Q/ G1 ]' W* V3 S0 @
  78. uchar  iic_read8Bit(void){RCEN=1;while(!BF);ACKEN=1;while(ACKEN);return SSPBUF;}//向iic總線讀8bit數據
      k/ w& r" D$ p
  79. //****LCD定位點*********012345678901234567***************//
    7 g5 @2 B+ w& B, y
  80. bank2 uchar  dis1[18]={"---- BV4WD -----\0"}; //顯示兩行9 Z. Q' e  Y% T% R7 `0 K
  81. bank2 uchar  dis2[18]={"-- Waitting ! --\0"}; //開機預設的顯示畫面,等待雲臺離開死點後進入程式會刷新+ [' P# z" E. @) O* p2 e+ K- T4 [
  82. bank2 unsigned int CMP_DATA;
    , ?0 k  c/ O1 P  c! z4 z: a' Q& m& z3 ?
  83. bank2 unsigned int result;
    + ^! n* g6 l0 x/ c
  84. - z1 F9 l* G; W
  85. bank3 uchar disAZ[14]={"+00000000000\0"}; //水平
    * c6 P! p, Q+ w$ F
  86. bank3 uchar disEL[14]={"+00000000000\0"}; //傾角
    3 ^: M$ i  |1 m! O  z) T* ?; r
  87. bank3 uchar disAZEL[14]={"+0000+000000\0"};  //水平 + 傾角
    / ~: {' N6 j. w2 p

  88. ! h! T1 y7 V/ W* H, M- l
  89. bank1 uint AZ; // 檢測到的目前 水平角度2 o4 W& S2 P+ D$ C# Y
  90. bank1 uint EL; // 檢測到的目前 傾角
    4 T1 t1 u$ y4 U! p+ M( z
  91. bank1 uint cmd_AZ; // 指令 至 水平角度; ]4 S5 O6 ^! U2 L+ r7 [0 G. B; t
  92. bank1 uint cmd_EL; // 指令 至 傾角2 j: ~! O$ ?# L" g6 Q' ^1 j2 o
  93. //**************************************以下僅做旗標用***********//
    ; O' d- y7 H+ \$ s0 V" K5 ^
  94. bank1 int rd_AZ; //要求 水平角度$ {5 g8 R7 ]! I& |$ G
  95. bank1 int rd_EL; //要求 傾角3 V# ]2 G+ L! a
  96. bank1 int rd_AZEL; //要求 水平 + 傾角+ `/ s7 c! V' ^7 P
  97. bank1 int rd_M; //指令 前往 Mxxx 水平角度xxx8 u9 H' `- C  H' r
  98. bank1 int rd_W; //指令 前往 Wxxx yyy 水平角度xxx 傾角yyy- R, J, \; R, Z8 c" F3 r# S
  99. bank1 int rd_S; //指令 All Stop# Z  f4 E- E6 d  @" |
  100. bank1 int rd_R; //指令 Clockwise Rotation
    8 B' f% Z$ [9 ~6 k, _: H
  101. bank1 int rd_L; //指令 Counter Clockwise Rotation& m3 T' `' b  K; _4 X6 c; y
  102. bank1 int rd_A; //指令 CW/CCW Rotation Stop% ^  N/ V; L( {1 o; c
  103. bank1 int rd_U; //指令 UP Direction Rotation* Q6 R1 |1 M$ F# e' C5 g
  104. bank1 int rd_D; //指令 DOWN Direction Rotation' \% S9 X4 X3 P2 D2 I/ h) q/ [
  105. bank1 int rd_E; //指令 UP/DOWN Direction Rotation Stop0 K$ q1 z) g1 D. O  R4 G
  106. //**************************************以上僅做旗標用***********//% x  V) i8 p* A4 y
  107.   @$ W8 v7 G! y8 m5 d1 x! k2 s
  108. //***********以下變數使用 BANK1 *****************************
    8 q! w9 S. z) F3 E) }
  109. bank1 int RecTemp; //rs-232資料讀入暫存
    ' _1 H& _5 w) x& _
  110. bank1 uchar RecArray[12]; //將 RS-232 命令 寫入EEPROM用字串介面1 H7 h& v6 Z6 m  Y+ X" i  W

  111. - f1 t! j: H. U& K7 A

  112. " u& D# ~- I' z' y! e
  113. //*********************************************. d: A* {  N' F, _
  114. //數據轉換,十六進制數據轉換成10進制   i) i( w$ C1 H  P% z8 b* C0 K
  115. //輸入十六進制範圍:0x0000-0x270f(0-9999)% S8 }: M  r' S% Y" r
  116. //結果分成個十百千位,以ascii存入顯示區. V% T# j) Y1 `1 F7 |
  117. //**********************************************9 N, z) ~& M+ W( |) p: Z
  118. void conversion(unsigned int i)  
    0 [# k/ o6 G; a, s7 h3 }
  119. {
    5 {  G8 i. E8 y" |; ^! T- i

  120. ! r, d% l! H3 g! @- E4 M$ t2 ^
  121. unsigned int j;5 T& N# I/ W8 u
  122. j=i; //將j=i 使用 j 做PWM運算
    # u% [, a& K) R2 H7 z5 j
  123. AZ=i/10;) r9 m* Q' [9 k: h8 ^+ Z2 H) f

  124. # _0 K8 s4 R/ h. O# s  R
  125. /* 不需羅盤0~360度 轉 PWM 0~5vdc 時, 本區關閉 節省資源
    : o% ?- O0 Q" e% n! _3 }
  126. PR2 = 0b10111110; //經實測 PR2/T2CON/CCP1CON 使用固定數值( v8 e' @" Z+ M8 t
  127. T2CON = 0b00000100; //CCPR1L從 0~190 大約可對應 0~5vDC輸出
    / q2 ?, B  o- S$ U
  128. CCP1CON = 0b00111100; //j=0~3600 3600/19 =189(取整數)
    , {  e- d$ ?% a% ]; z
  129. CCPR1L =(j/19)+1; //189+1=190 ;+1之後表示 0度~2度會有 "1"7 l/ ]% b- g3 x, O" M
  130. //所以精度大約為2度(後面定位時會可採用+/-2度及算定位完成)
    2 u3 P/ V0 `; u% G
  131. */
    7 S7 Q" S( ~# e4 U- U

  132. 5 f3 B9 @7 Q% x/ @& ~
  133. dis1[3]=i/1000+0x30; // i : 取自電子羅盤的角度/ L  Q4 J" a6 [" C8 q
  134.     i=i%1000;     //取餘數運算
    9 x4 Q: M* r7 g5 @
  135.     dis1[4]=i/100+0x30;) t' q0 x  ?6 _3 b$ F. l1 Q2 B
  136.     i=i%100; //取餘數運算% k; T/ x! Z/ G% Z5 f" {7 t
  137.     dis1[5]=i/10+0x30;
    ' |7 _! y8 J) k1 V* y$ ^
  138.     i=i%10; //取餘數運算
    . G: A& Y4 G/ R+ z8 F; X% G
  139.     dis1[6]=0xDF; //(度)
    : V3 s' G7 U8 _5 `4 i

  140. . J% |( z. v+ u! V; ^8 o$ G; r
  141. //*************************************************************
    9 b+ ^5 S: f0 t* P/ C7 e5 }
  142. //這是電壓顯示部份,不顯示 不需運算4 z2 L8 H$ E8 J: ]  s( I$ b0 s! H& W
  143. //*************************************************************! D1 Y( R7 j$ X% K
  144. /*顯示 羅盤0~360度 轉 PWM 0~5vdc 時,的理論電壓值! k+ c  D5 x* M! a
  145. j=(((j/19)+1)*100)/38; // j : 計算出來的理論電壓0 J& h7 ]& t) ]; B
  146. dis1[10]=j/100+0x30;   \3 _. W: S1 \+ a2 J$ q! z
  147.     j=j%100;     //取餘數運算
    1 M; \5 C, n7 w  B: ^/ _
  148.     dis1[11]=0x2E; //.(小數點), w4 i* A, W, E7 j  @2 t
  149.     dis1[12]=j/10+0x30;+ T; B% q! I2 t! @( q- U8 z
  150.     j=j%10;      //取餘數運算
    # e0 `1 S$ y+ A1 s  L1 T. X
  151.     dis1[13]=j+0x30;% M& y" x; B( t/ o8 j
  152.     dis1[14]=0x30;1 Y5 D/ d1 M2 w2 K/ x
  153.     dis1[15]=0x56; // V
    ( e3 X" N/ t& H8 b5 u
  154. ; [5 ?* Z6 Y/ p) L
  155. //以下是 計算/顯示 至 小數位 但無意義4 r& p0 Z9 H* |8 B- W3 o! e4 O) t
  156. dis1[3]=i/1000+0x30; // i : 取自電子羅盤的角度8 y+ e: ^$ a3 }, G! D- y% `' E! Y! C
  157.     i=i%1000;     //取餘數運算
    3 S0 K3 h7 v1 O5 c- s& g3 H
  158.     dis1[4]=i/100+0x30;' y$ _+ a5 O/ n, h8 _: U
  159.     i=i%100; //取餘數運算
    $ @; Q& d7 I& W8 Q0 ]
  160.     dis1[5]=i/10+0x30;) I3 I) I" ~9 h6 A  ?
  161.     i=i%10; //取餘數運算- N2 o+ ]7 c  d' z/ s% C2 I& j4 o6 H
  162.     dis1[6]=0x2E; //.(小數點)
    ' L  `0 O) i/ O& U8 o  ^
  163.     dis1[7]=i+0x30;
    2 Z" v% J: b: l1 ^5 j
  164.     dis1[8]=0xDF; //(度)0 B( ^" j) Y/ w4 f  D) l
  165. */" _' B7 O2 [# b9 g- i0 M

  166. + n7 x& i7 |4 C3 |! t

  167. 6 [* Z' N3 t6 j' ~4 P5 r+ P
  168. * R1 D/ s+ v  J3 ^* e) ^
  169. //*****************************************: W5 A/ e7 i) `6 y8 q
  170. //將水平 度數值放入暫存區等候RS-232 調用
    % T2 v$ L9 O! D. W
  171. //*****************************************
    / E  N: b4 Z" C7 H8 Y4 @, o
  172. 2 k2 s+ {/ F8 m% k% W6 ^
  173. disAZ[2]=dis1[3]; //水平角度 百位
    ! q( z9 W% r4 X3 s/ K3 O" x9 \& N
  174. disAZ[3]=dis1[4]; //水平角度 十位6 ~4 i. W# a) n, J
  175. disAZ[4]=dis1[5]; //水平角度 個位+ d9 k$ I! F% R' d4 N0 s
  176. 5 I5 K# e+ C3 z! f# c' B
  177. //*****************************************3 w4 W) y9 e6 ~0 Z; F! r" d
  178. //將水平 + 傾角 角度放入暫存區等候RS-232 調用
    ' }( l. ~, K+ r, z
  179. //*****************************************
    " `9 J( A' ?& V0 o

  180. 3 R8 C  r6 j* G& f2 {$ P9 n, s
  181. disAZEL[2]=dis1[3]; //水平角度 百位
    1 J1 f3 L- U+ v! \3 O8 R8 c
  182. disAZEL[3]=dis1[4]; //水平角度 十位
    ' M- \) D( h% U! s2 D  m' l
  183. disAZEL[4]=dis1[5]; //水平角度 個位7 U$ p- E* e* Q0 o# v6 L3 d' k
  184. / L" t. [. x4 D
  185. }
    + l0 A) a% [& w' Q) g+ i
  186. + I7 a9 I4 N$ ^! M6 L
  187. //**************************************************************************************************
      A2 y0 _# B9 i
  188. //數據轉換,AD轉換結果
    , ], A% S# i) _
  189. //輸入十六進制範圍:0x0000-0x03FF(0-1023)7 m6 T/ D" Z# v
  190. //結果分成個十百千位,以ascii存入顯示區, e1 o8 Y& Y! Y7 U$ A
  191. //**************************************************************************************************# N. u' c& `  b' ]8 L
  192. void conversion2(unsigned int d)  7 g4 I* O( }8 t" H7 e1 c; u
  193. {
    * ~8 g/ j3 L/ x8 \% Q
  194.    int  ad1,ad2,ad3,ad4;        //定義6個AD轉換臨時變量 整數常數 int 佔有 16 個 位元
    ( Z. \  ?$ s+ O: K: r0 a: O
  195.    //float temp,temp1; //定義4個計算臨時變量 浮點常數 float 佔有 32 個 位元% W& z, w) N. c1 n- a
  196.    float temp,temp1,ed1,ed2; //定義4個計算臨時變量 浮點常數 float 佔有 32 個 位元
    5 w* W4 d( F( C- q1 E' q
  197. temp=d*5.0/1023; //暫存AD轉換的結果 10位AD 2的10次方=1024
    $ x" \! B3 e' \( x# X# X, S
  198. temp1=temp; //將數值暫存 temp 計算電壓 / temp1 計算角度
    8 m/ G. w2 a8 W2 i& z0 S
  199. ad1=(int)temp; //計算輸入電壓
    3 K! \0 f  I% _' H. h( Q! ~
  200. ad2=((int)(temp*10)-ad1*10);
    9 ^3 ]$ a0 X: \; o
  201. ad3=((int)(temp*100)-ad1*100-ad2*10);, F1 H* D8 w1 D* {1 Q
  202. ad4=((int)(temp*1000)-ad1*1000-ad2*100-ad3*10);
    7 P1 @6 {' I+ G. K9 m- `9 ?$ U
  203. //*************************************************************
    $ J& q# {# q. A. l4 |
  204. //這是電壓顯示部份,不顯示 不需運算
    ( h% J/ \6 I, }) B. P% V3 {
  205. //*************************************************************0 Y: K$ [# q/ \% K' e0 Y
  206. //dis2[10]=(int)temp+0x30; //顯示 個位
    & Z- ~4 {# \* k( ^# Y% z& H/ B
  207.     //dis2[11]=0x2E; //.(小數點)$ s9 Z. \; n# `# C7 l* R
  208. //dis2[12]=((int)(temp*10)-ad1*10)+0x30; //顯示 小數第一位" E- m2 ?( K) p9 |) T  b. E
  209. //dis2[13]=((int)(temp*100)-ad1*100-ad2*10)+0x30; //顯示 小數第二位
    3 g! Z" V: s( V5 x$ J. u
  210. //dis2[14]=((int)(temp*1000)-ad1*1000-ad2*100-ad3*10)+0x30; //顯示 小數第三位; D+ f% u0 b7 R( j
  211.     //dis2[15]=0x56; // V% k) m) X' h" k4 ?: i% V0 S
  212. //EEPROM_WRITE(0x08,0x01);  o* b/ J% ]! n
  213. //EEPROM_WRITE(0x09,0x04);% r0 ]3 q. G9 p+ W& ]+ ~9 f
  214. //********************************************************************************
    9 b  c0 e. M1 h7 m% \( a0 u% p% {
  215. //(傾角器-90~+90[共180])[0.5~4.5 VDC ] 為了要能偵測超過下限,下限建議至少定在高於0.8v( a0 }2 f: M7 c) \& t
  216. //4.5-0.5=4 4/2=2 (VDC)<--只取中間90度用 下限取1.5v/上限取1.5+2=3.5V/中點2.5v
    7 e. h# ]1 d! {0 v5 v
  217. //********************************************************************************8 o3 V- C3 |. w/ X6 |/ P1 H  n
  218. ed1=1.5; //電壓下限 0度
    ' c! _2 C! o% D( H0 ?+ g! F
  219. ed2=3.5; //電壓上限 90度
    % m# Z  h9 i2 \5 C) K+ Z) |
  220. //*************************************************************: |3 q# t- ^$ I$ y6 o
  221. temp1=(temp1-ed1)*(90.0/(ed2-ed1)); //計算角度 0~90
      W. @! Z% `4 M+ _
  222. EL=(int)temp1;
    % v8 h! Y  z* D; U8 K3 q
  223. ad1=((int)(temp1/10));     //十
    ' o' u, `. E. |. T" P' C- I
  224. ad2=((int)(temp1-ad1*10)); //個
    0 F, S4 t& P  O; F5 y
  225. ad3=((int)(temp1*100)-ad1*10-ad2); //小數
    1 Q5 L8 i3 |% |6 k6 X
  226. : h* G& d2 P+ f* x4 B  Z$ P
  227. dis1[11]=((int)(temp1/10))+0x30; //顯示 十位
    # R( N' K- y& s' L
  228. dis1[12]=((int)(temp1-ad1*10))+0x30; //顯示 個位
    ! r0 O8 H7 [" E: E( J2 U. y
  229.     dis1[13]=0xDF; //(度)
    ! D; g$ K' W( Y* V8 O& b

  230. 7 ^7 X' w+ v; _8 i4 [2 I* a
  231. //*************************************************************( L4 k4 y. K. M1 ~$ t! D/ l# u; y
  232. //可計算/顯示 至 小數位 但無意義- Y; K& f8 x- x* R- v
  233. //*************************************************************8 v* v  a, ]% X% p5 U( h
  234.     //dis2[6]=0x2E; //.(小數點)
    . `7 u! i# d5 X# R& g5 ~
  235. //dis2[7]=((int)(temp1*100)-ad1*10-ad2)+0x30; //顯示 小數第一位
    8 B6 l4 u) u3 m  I
  236. 4 A: y# K, C$ j. U8 K5 Z9 T* G7 X$ Q. f

  237. 1 C. }) m1 {) ~' J: i* @
  238. //*****************************************
      O/ h" o+ c# r
  239. //將傾角 度數值放入暫存區等候RS-232 調用 8 ~, i, z1 B, h# A9 v
  240. //*****************************************( N3 L0 K# |. E( y4 H. h% U* `

  241.   f& p+ m7 h9 Z2 K2 m3 u
  242. disEL[2]=0x30; //水平角度 百位6 l- a% Z7 Q% ^& m/ s/ }5 ^
  243. disEL[3]=dis1[11]; //水平角度 十位
    * s  V9 a' M; N
  244. disEL[4]=dis1[12]; //水平角度 個位" a' {2 T( |# }" ~1 o7 u

  245. ! [+ w7 `% ]/ M
  246. 7 K: s9 ^& C" P+ M6 _- R9 [- V
  247. //*****************************************
    " D# @3 V6 Q( }% {( K' R+ h. z
  248. //將 傾角 角度放入暫存區等候RS-232 調用
    7 @  s/ Q" X2 `5 L; f
  249. //*****************************************' L/ i4 p; W8 X6 ^
  250. disAZEL[7]=0x30; //傾角角度 百位
    ; o1 _6 k4 s, k( r% \2 O4 ]
  251. disAZEL[8]=dis1[11]; //傾角角度 十位
    . L. [, [5 Y& i" T# ]
  252. disAZEL[9]=dis1[12]; //傾角角度 個位
    7 M7 T- l  W8 _# E7 m2 G4 D8 _

  253. 1 r/ s4 B3 R3 a/ R$ G1 h# J1 e
  254. ( ~6 y1 V# p8 I
  255. if(temp<ed1) //當輸入電壓低於 電壓下限- ?; ^: O8 L3 H7 O
  256. {
      M, B1 G: p8 |4 }9 e; i% ^
  257. disEL[2]=0x30; //傾角角度 百位 設07 C4 s/ _, _; c$ z  s
  258. disEL[3]=0x30; //傾角角度 十位 設0. C5 J' e# P& N: ~' ^6 N# z, t. @
  259. disEL[4]=0x30; //傾角角度 個位 設0" y1 j" m0 x8 s8 P% G; V2 E" U

  260. * p' E! ~4 G1 }
  261. disAZEL[7]=0x30; //水平+傾角的 傾角角度 百位 設0& a6 }! ?9 Q& \+ m3 A: _$ g9 c
  262. disAZEL[8]=0x30; //水平+傾角的 傾角角度 十位 設0# ^) I1 L8 E* _1 l
  263. disAZEL[9]=0x30; //水平+傾角的 傾角角度 個位 設0
    ! V" ]0 B- y( Z; O4 Z
  264. & s+ f7 k2 g0 `+ h+ Y- R5 W- @" m
  265. dis1[11]='L';
    & J1 l: `$ s$ B
  266. dis1[12]='o';7 K; L8 A, K5 G9 |' ?, V
  267. }
    & d$ T6 k% E: M8 T& F( K" a

  268. & ~* a2 a: h  ^; y
  269. if(temp>ed2) //當輸入電壓高於 電壓上限
    - s0 v' E( E, V
  270. {, X: E0 J! [  L: i% q  L& I4 F
  271. disEL[2]=0x30; //傾角角度 百位 設0' C. P% d+ V0 E: B# m+ `
  272. disEL[3]=0x39; //傾角角度 十位 設9
    6 F8 L0 v! K( e- y2 z
  273. disEL[4]=0x30; //傾角角度 個位 設0
    3 }/ H* V, G. z$ l. B3 \

  274. % z+ o/ B  Z$ ?. F2 D, n7 _+ J
  275. disAZEL[7]=0x30; //水平+傾角的 傾角角度 百位 設0
    8 U" ^, R" S" L4 U3 M
  276. disAZEL[8]=0x39; //水平+傾角的 傾角角度 十位 設9; s) E0 b- Y1 {, ~$ g6 X& ?
  277. disAZEL[9]=0x30; //水平+傾角的 傾角角度 個位 設0
    ; i8 ]9 g7 }) H" m

  278. ; F3 S7 Y# j, a& Y3 T& b
  279. dis1[11]='O';% n, S$ V7 d9 K# G1 J+ R
  280. dis1[12]='v';
    1 }; B3 g% _! ?! |3 m- r' ^- y
  281. }* _0 d' V2 b% H' s
  282. - k" x, Z& q; @* Q
  283. 1 G' g' g' B4 c$ Z
  284.   p9 @. j% Z4 ^5 {6 w% }
  285.   t: ?. @3 J. t5 M/ m- N: W
  286. }3 K5 ?: i( {9 \

  287. " Z2 W2 J4 [( p: D3 g+ @( G
  288. //**************************************************************************************************1 `! V1 t- |1 }+ q
  289. //數據轉換,ascii 轉換成 十六進制數據 ' Q9 G+ l7 t% M1 u2 |2 X
  290. //**************************************************************************************************
    $ I' \" t% h/ X
  291. void con_WB(void)  6 U. e! N- b* l3 I: a, S' k3 O" i
  292. {7 q0 B% _/ g4 ]. F) p
  293. unsigned int k,p;
      r0 |3 T- ^1 h$ E* z4 f8 Q: {
  294. k=0;5 l7 O/ b7 t) [5 ~5 S7 F8 Y
  295. p=0;
    3 f- g! U$ u9 r6 ^
  296. k=(RecArray[1]-0x30)*100;3 }% W" B3 [7 s- j6 x$ ]$ W3 H( g. K
  297. k=k+(RecArray[2]-0x30)*10;0 ~' G# Z6 J* Q# o
  298. k=k+(RecArray[3]-0x30);
    8 T8 V4 p5 _1 Y5 J" J2 N' }
  299. if(RecArray[0]=='M'|RecArray[0]=='W')
    + k9 @, [! N) I! E% E: a
  300. { 2 j7 G" o4 ^7 V5 W+ d) [; H6 c
  301. cmd_AZ=(int)k;; b: B; l& W# ~' U) l! N& Y
  302. }6 \. w% n! |9 }2 k/ G: a
  303. /*
    0 C! A" v9 x* M: l# p
  304. if(k>=0xFF) //寫入 EEPROM 需耗費時間較長 不需要時不寫入
    6 m; X# Z5 V3 y+ ?5 ]
  305. {
    9 w9 }8 m: U3 }! B1 S( ~* J
  306. k=k-0xff; //大於 256
    , w4 X" |* N( n/ X/ j+ @1 n
  307. EEPROM_WRITE(0x00,0x01);         //寫入 水平數值 高位數 至EEPROM 位址0x00  B+ Z* ?) M; R$ h1 h" W" [
  308. EEPROM_WRITE(0x01,k);            //寫入 水平數值 低位數 至EEPROM 位址0x01
    / S) l6 P( P: X* ?3 `1 @! c& x, k
  309. }+ |+ O7 ]$ Q9 u
  310. else+ c$ L0 ~- I( r/ \4 |1 T2 w5 ]
  311. {2 l" U& v' P/ m% z: V- ]* b9 f
  312. EEPROM_WRITE(0x00,0x00);         //寫入 水平數值 高位數 至EEPROM 位址0x00& d, H$ \; j% c, E) N
  313. EEPROM_WRITE(0x01,k);            //寫入 水平數值 低位數 至EEPROM 位址0x01
    8 x9 p9 o7 T9 d
  314. }% G' H+ K% i1 O
  315. */
    ! s. Y7 }7 `0 r' r3 c  @
  316. if(rd_W==1)
    8 l7 m- x/ }3 V1 R; h$ p; H
  317. {# |7 _$ }* o3 V: P) f
  318. p=(RecArray[5]-0x30)*100;
    8 G* n9 O5 h1 G7 A
  319. p=p+(RecArray[6]-0x30)*10;
    $ [5 c" O9 k" Z/ @
  320. p=p+(RecArray[7]-0x30);
    3 h* q: f. R" `- t. Z2 g
  321. if(RecArray[0]=='W')$ c) G5 m- ^& W& E, |6 X
  322. {
    / m( Y% D/ ?% w9 h
  323. cmd_EL=(int)p;* C/ s5 ?/ R4 w4 i4 A6 a' f
  324. }: q8 W" l8 i/ i/ C8 s5 ^* r9 P
  325. /*8 S+ g$ n6 `! H
  326. if(p>=0xFF) //寫入 EEPROM 需耗費時間較長 不需要時不寫入
    ! F" W6 k/ O, l1 u
  327. {. K" o. f0 o, A# r
  328. p=p-0xff; //大於 2560 \: ?* T; s7 L: J, J9 w; a7 b
  329. EEPROM_WRITE(0x03,0x01);         //寫入 傾角數值 高位數 至EEPROM 位址0x037 u$ a5 F! Z) U2 a: _8 }
  330. EEPROM_WRITE(0x04,p);            //寫入 傾角數值 低位數 至EEPROM 位址0x04& U0 s' _+ [, u
  331. }4 f; m* z. \5 u% M: v/ {
  332. else
    - o) L, s* j: c$ B1 {( t  e
  333. {0 E4 L# D: d& V+ U- C
  334. EEPROM_WRITE(0x03,0x00);         //寫入 傾角數值 高位數 至EEPROM 位址0x03
    2 m& ^2 \/ Z% v, d) ~9 c4 D
  335. EEPROM_WRITE(0x04,p);            //寫入 傾角數值 低位數 至EEPROM 位址0x043 x. o$ E# y0 S4 z2 h- T
  336. }9 @9 G0 E9 x- H  j; J- F
  337. */
    , ~0 u6 O* P/ M, A
  338. }
    1 ?& S  s9 @/ y
  339. * i& Q" }! m' l$ I# R# B7 x, y' L
  340. }, H4 E* |; i; h- J( a# B

  341. 0 l: o  P, |3 Z& Z/ S
  342. / S# ^! I/ V4 i/ i! G& Y
  343. //**************************************************************************************************  w( t/ q8 A: S% I* ^  y8 j
  344. //單片機初始化/ Y" a' I; Q2 X, X6 B
  345. //**************************************************************************************************
    7 @9 o' D' {2 S
  346. $ M2 V) y0 W4 U# W
  347. void mcu_init(void)' c! ~8 l2 f* N
  348. {
    5 T( z7 ^6 I# N2 J; |9 m
  349. //TRISC=0x80;             //IIC通信引腳設為輸入
    / E0 X0 C6 A0 @6 e. j/ W
  350. SSPSTAT = 0x80;         //IIC設置7 ^: `1 R) w7 @! x0 V
  351. SSPCON  = 0x38;         //IIC設置
    ' n1 S% a9 K4 ]- M- t
  352. SSPCON2 = 0x00;         //IIC設置/ F% I# `6 T( q9 m
  353. SSPADD  = 50; //IIC設置                 
    2 q  ?; x7 {- M8 S1 g
  354. }% l$ @" v4 ^% {; K: G1 q0 t
  355. //**************************************************************************************************
    ( }& y7 l+ S$ \. [, r* I7 s' p
  356. //延時大約20us
    # \1 F9 f& o& C4 I' I1 D
  357. //**************************************************************************************************
    6 i! [! w+ L4 T2 y% T5 L
  358. void delay_20us(uint nus)
    2 A3 L$ y. W1 Q
  359. {  uchar i;0 F8 a. z" N* {; Z8 e
  360.    while(--nus){
    + G0 o0 ~( J4 K# F6 w8 j/ q
  361.    for(i=2;i>0;i--);$ M# R% u/ h: V) ]
  362.    }        ; @) B$ n# P8 n
  363. }6 F' O7 ?/ e. ^: _
  364. 0 S* j7 ]) L9 r3 a! T
  365. //**************************************************************************************************2 U, \8 y0 r/ |& c; l4 }7 A# V" @
  366. //延時大約1ms
      {  G9 }  N, A+ u0 u+ L
  367. //**************************************************************************************************
    6 y- K1 f3 S% p, Y# b+ g
  368. void nms_delay(uint nms)! \& u" V( ~/ V6 W
  369. {
    . F" n7 h% y/ G' M2 c' ^" i
  370. while(nms--)7 o6 y7 h% E3 q& x7 s# H! a. a
  371. delay_20us(50);+ x- Q* v: g, I0 F; j" F5 n7 j- w
  372. }
    7 d" Z) c* V% T" S# S

  373. $ P! [& n3 e( U; [; E
  374. //**************************************************************************************************
    2 |4 I2 B9 t6 b4 y. r$ W" \
  375. //延時5 @7 W& R8 c! [4 d2 ?0 P8 U
  376. //**************************************************************************************************
    - C4 H4 f* |! w8 z
  377. void delay(uint time)
    . n( l) _, D6 K% k4 `, r8 M
  378. {
    ) ?# @  N$ C0 u2 W
  379. uint i,j;
    ' A" b0 {1 M' W: P; h2 h% e0 u
  380. for(i = 0;i < time; i++);
    2 j7 q! B: z& K$ P
  381. {
    , `  z' T" i% `" I4 P* h5 z: y: R
  382.     for(j = 0;j <30; j++);3 ]# h& r- [5 \- z* \( [* X
  383.     }
    ! O+ b7 i/ b% Q4 t$ k
  384. }
    9 _4 j5 T; a9 Y: L5 V
  385. , U* @) r- @0 U- d6 T6 d. X8 ^

  386. 6 L; d' i+ Y( Q: I
  387. //**************************************************************************************************
    & L. A/ [! p& ?2 y8 ?# x5 x
  388. //從IIC總線獲得電子指南針GY-26數據* I2 ]/ M" V* I
  389. //從開始地址連續讀出兩個8bit的值,併合成16bit數據
    $ }! F/ a8 V9 t% G1 H2 [# u
  390. //**************************************************************************************************" a2 [9 g; e" x. [
  391. uint get_GY_26(uchar read_begin_address,uchar GY_26_cmd)8 Z) [4 a* q3 y3 J: V
  392. {
    ) p3 m4 B& D3 Z5 }4 f1 n- x
  393. unsigned int temp;
    ( {0 R  H( C% o8 V. p
  394.     iic_Start();                        //iic啟動時序  L; ~- d. V% U9 f' H
  395.     iic_Write8Bit(GY_26_ADDR);          //寫指南針器件地址
    $ j2 A3 o0 D$ I& s2 ^$ O
  396. iic_Write8Bit(0);                 //寫命令# }, N! G7 k9 Z% [  I; V* D; ]) l% z6 ^
  397.     iic_Write8Bit(GY_26_cmd); //寫指南針命令, S2 R0 ]% i* y4 ~6 M+ `7 t
  398.     iic_Stop(); //iic寫停止時序5 @, t  v  ]3 D2 K1 H* \  @
  399.     nms_delay(60);                    //延時,可執行其他程序 原始值:55
    * _1 A8 r! Q' z
  400.     iic_Start();                        //iic啟動時序
    % A- @( M* L0 O( [
  401. ACKDT = 0; //允許應答ACK
      @: h6 D3 I" O- J
  402. //*******************************************************************************) s4 h, p- z& G9 N6 \
  403. //需修正磁偏角時使用「台灣磁偏角目前試定為3.5度」
    , X1 U1 s3 F) T, W4 v
  404. //第一次使用時最好修正,因為GY-26大部分修正偏角是6度(或10度): Z& i. m7 q  W5 q' ^
  405. //*******************************************************************************
    / ]$ J( D# I, t
  406. //iic_Write8Bit(0x03);  //發送設定磁偏角高8位命令。
    4 t* W7 I1 T/ u: C5 A  a; A# |( q
  407. //iic_Write8Bit(0x00);  //發送磁偏角高8位的數據。+ H+ o7 ~# z4 O3 |* \! p
  408. //iic_Write8Bit(0x03);  //發送設定磁偏角低8位命令
    - I2 f! o# X" `: P
  409. //iic_Write8Bit(0x23);  //發送磁偏角低8位的數據。此時磁偏角被設定為3.5度
    & Z* J3 r9 T' h0 {3 L
  410. 6 y5 g+ a  f$ d6 L" d% Y
  411.     iic_Write8Bit(GY_26_ADDR);          //寫指南針器件地址     + u* r+ [8 |) B' T' H7 N! T! v
  412.     iic_Write8Bit(read_begin_address); //寫指南針內部數據地址
    ; T' B$ g/ S5 s: r7 Y
  413.     iic_rest();                         //iic重啟時序
    1 T4 x5 U3 o4 P/ Q! e: f

  414. 0 Z, L! c. n0 Y: `; W# m# l# N# m
  415.     iic_Write8Bit(GY_26_ADDR+1); //指南針器件地址+1=讀 . W+ w5 q6 t, J) @9 @  o0 v
  416.     temp=iic_read8Bit();                //讀出8位數據
    % r* S7 e+ N3 [3 Z, n
  417.     temp<<=8;                           //保存數據
    6 f2 j/ u+ c3 p: d5 O/ t3 S
  418.     ACKDT = 1;                          //允許應答NO_ACK
    , w* @9 a6 B9 T8 m5 v5 m
  419.     temp+=iic_read8Bit(); //讀出8位數據- s" M" K" f" I
  420.     iic_Stop();                         //發送停止時序; C: l3 Q  t3 F$ h7 |$ x
  421. return temp;                        //返回本次測量數值9 M& _% O7 K) u: o3 u* k: l
  422. }
    ; h- M; o' p( h) o& b

  423. 0 z5 u, m$ ^6 a, s
  424. //**************************************************************************************************
    " `9 _" v% u3 p
  425. //從AN0讀取轉換電壓的相對值+ k# M' ~" ^9 O6 @7 x
  426. //從ADRESH ADRESL 讀出兩個8bit的值,併合成16bit數據& w0 I( G* r) ~& @
  427. //**************************************************************************************************' B% ~3 W7 E( d
  428. uint get_AD()
    4 r; j( M, l, h  |/ X, t) \
  429. {
    + ]/ |3 Q/ n* }9 p! I
  430. unsigned int temp;
    & R; J9 X4 I1 t
  431.      result=0;                //轉換結果清0: x% F* l6 @; q# m2 [% Z
  432.         ADGO=0x01;                //開啟轉換過程
    & Z0 D% P# b$ ]& U" Q# E
  433. delay(50);                    //保證採樣延時
    ) q1 f+ T1 q. P
  434.         //ADGO=0x01;                ////ADGO=1放在此採樣不行: r; l/ D% {3 Y& p" V0 o+ M
  435.        while(ADGO);             //等待轉換完成* L: {. L) V3 i, v" S) f
  436.      temp=ADRESH;                //讀出8位數據
      G4 `/ o- @& k9 |- q* M
  437. temp<<=8;                           //保存數據- I4 g2 A  ], m9 m$ W
  438.     temp+=ADRESL; //讀出8位數據  Y% t* I5 z& s- t% m
  439. return temp;                        //返回本次測量數值3 O, @" G" _) t$ k0 F6 j
  440. }
    ' `* U4 _0 V4 d9 Q7 w9 D" K2 j/ M
  441. ( ~5 o" V, N( I2 d) F; P
  442. " s) v' ^% ], a! S% a
  443. //**************************************************************************************************
    % p1 e3 k1 F) r' T' m9 Z5 `
  444. //IO初始化操作) i1 }4 r9 s+ @  G4 B
  445. //定義 TRISx 1為輸入/ 0為輸出 / x 為未始用(1) (TRISA只有6個Bit)
    7 J2 ~6 u9 _2 V$ X6 @4 V% N' _9 h7 I
  446. // TRISA x x 0 x 0 0 0 1 <--- Bit0:傾角電壓輸入 /Bit1:手[自]動(接地=手動) /Bit235:上下左
    8 ~7 v: X1 T! _, E' |
  447. // TRISB 0 0 0 0 0 0 0 0 <--- LCD IO 輸出) B. ^/ @8 y: z4 }. K2 H; b4 b, h
  448. // TRISC 1 0 0 0 0 0 0 0 <--- Bit01: 停右 /Bit2:PWM輸出/Bit34:I2C總線/Bit6:RS-232TX輸出/Bit7:RS-232RX輸入
    ) L0 w* D* j/ Z  D2 }- l
  449. // TRISD 0 0 0 0 0 0 0 0 <--- Bit01267:R.L.OUTPUT / Bit345:LCD command
    $ ]0 z) O1 a+ v/ L5 D% E
  450. //4 {/ |. A. n3 N* j1 V/ f7 L9 _& z
  451. //定義 PORTx 1為高電平/ 0為低電平 / x 為未始用 
      e# q) S1 R! S% O
  452. //      (TRISA只有6個Bit)電壓輸入口設低電平/其他需要改變狀態(拉成低電平)的設成高電平/再其他亦可都設成高電平
    5 M, @8 z" @. K
  453. // PORTA x x 1 1 1 1 1 0 <--- Bit0:傾角電壓輸入 /Bit1:手[自]動(接地=手動) /Bit235:上下左輸入" N  q1 _. |7 q3 ^- b
  454. // PORTB 1 1 1 1 1 1 1 1 <--- LCD IO 輸出" A7 H: r9 J6 D9 B' R5 b
  455. // PORTC 1 0 0 0 0 0 0 0 <--- Bit01:停右輸入/Bit2:PWM輸出/Bit34:I2C總線/Bit6:RS-232TX輸出/Bit7:RS-232RX輸入
    / I% I0 l0 R3 P+ H; \
  456. // PORTD 1 1 1 1 1 1 1 1 <--- Bit01267:R.L.OUTPUT (高電平 = 1 = 不動作 )/ Bit345:LCD command
    & ?# w# W: P+ }) f! f% I* X
  457. //**************************************************************************************************2 I- \7 h6 X1 D& |: D3 z; @! G$ F
  458. void IO_init(void)2 d0 w) |  W; A7 H. v& S
  459. {5 F2 ]2 b6 s2 S

  460. " }1 k- u, F+ G& u; s; S$ }6 A
  461. TRISA=0x01;       //RA0設置為輸入 00 0001 , B! v, h5 k$ T1 w; s) X% b# R5 H! b
  462. PORTA=0x3e;       //設置RA0為低電平
    ; Y; v! }& r8 W6 m1 J" c

  463. ' [* U, ?# B/ U: K7 `
  464. TRISC=0x80;       //RC7設置為輸入 1000 0000, H3 q" v  g; B' m1 S/ \7 ~
  465. PORTC=0xff;       //初始化為高電平
    ! ]' x7 ^! P( u8 s' V
  466.    
    % L( N; [5 @; X/ M7 U
  467. TRISB=0x00;       //RB設置為輸出 LCD IO
    6 q5 [9 q& N7 m! N5 l
  468. PORTB=0xff;       //初始化為高 LCD IO 為高電平
    + B1 [- o3 j1 i# {6 g

  469. 9 d; o3 e8 @% y' |
  470. TRISD=0x00;       //RD設置為輸出 LCD command0 S, ^: r& D+ ]2 ?
  471. PORTD=0b11111111; //初始化 LCD command(Bit345) 為高電平 /R.L.OUTPUT為高電平
    4 p9 R. `9 p2 \& I* n/ D

  472. . n% L! I8 c  s3 O; \
  473.    ADCON1=0X8E;                //1000 1110  A/D 轉換用參數 需查表
    / Q' s4 A2 c; D
  474.    ADCON0=0X41;                //0100 0001 - `3 t6 V4 M' ?; C# @, ?$ M' K6 t/ @
  475. ' w# K7 |7 O, G  u% m( T3 J, I

  476. * d& a6 c: _; [7 G: o7 `# ^
  477. }
    5 \: w- b& v4 G2 d8 m. r; G. X9 t
  478. //**************************************************************************************************6 _& u' d: ~* [
  479. //雲臺初始化操作 (離開限位點)
    ! @' X8 j% s8 ?1 E5 S& L, A# \
  480. //向上轉3秒 向下轉2秒% y1 h6 |* e7 F3 a
  481. //向左轉3秒 向右轉2秒
    ! y6 K* m2 U2 K9 G
  482. //**************************************************************************************************
    2 r0 D! U' m5 {8 V" l/ G4 ]
  483. ( m7 y9 `  b  ^: L; X( l  ]
  484. void Init_wt(void)) D# X; u; @3 O5 L4 ^" o
  485. {# r5 B# y3 d6 L" K( R' v2 g, w6 N
  486. /*+ m. d- ?5 R7 e. @$ u+ h- w1 h

  487. 6 \2 W* t, C; b# {& ?1 ?
  488. RD0=0x00;5 ?# C. m* W7 O% y: j
  489. RD1=0x00;
    . E- m$ A" k' ~  |
  490. RD6=0x00;
    & D$ |6 b) }9 f, E
  491. RD7=0x00;5 s9 K) P' w6 ]
  492. nms_delay(1000);* }  _, O5 i6 P# Q
  493. RD2=0x01; //RD2 失能(亮)1 @& u' `- x' ?  a
  494. nms_delay(1000); //可將訊號接至 雲臺旁 閃爍紅燈警示" H8 q. \0 r. I/ w3 O" K* J# q
  495. RD2=0x00; //RD2 致能(確認完成開機,控制雲臺電源可輸出[實驗板LED亮->熄滅])
    # Z* ~/ F) d9 S
  496. nms_delay(1000); //等待 進入旋轉初始化
    & s) F9 \! m4 Z8 Q# v5 {, y) J" p
  497. & w/ }1 X4 O: v/ |) j3 W; Z# ^
  498. RD0=0x01; //指令 UP Direction Rotation* k; l7 w3 o1 j: ]' S- _
  499. RD6=0x01; //指令 Counter Clockwise Rotation
    # E" C9 X/ S  S( R$ O/ f
  500. nms_delay(3000);; @! }# J" _" F$ {6 _% K8 B6 @- L
  501. RD0=0x00; //指令 UP Direction Rotation: o. I& u" W8 N
  502. RD6=0x00; //指令 Counter Clockwise Rotation' t0 \' R$ p& I7 R+ {# i+ F
  503. RD0=0x00; //指令 UP Direction Rotation
    0 H4 R* ]0 }3 u5 w) S! s6 q
  504. nms_delay(500);
    ' g6 _$ \3 R2 |) @
  505. 8 D3 G, x6 J5 I
  506. RD1=0x01; //指令 DOWN Direction Rotation
    ! |$ o" ?+ \: C6 m
  507. RD7=0x01; //指令 Clockwise Rotation% \7 S2 }( e- g, K
  508. nms_delay(3000);
    $ }  Z. S2 N  e- {7 T
  509. RD1=0x00; //指令 DOWN Direction Rotation
    * ~) y0 r' w( E6 g  K/ ?  T
  510. RD7=0x00; //指令 Clockwise Rotation
    : Y% w4 n: g5 C# c# g6 U4 h0 t7 V  O
  511. nms_delay(500);8 `7 B4 i8 s& ~0 z6 B
  512. */4 _) w$ H2 i8 [4 v* D/ o# A
  513. nms_delay(1000); //等待3 G2 X& e& s- u, n) ^* `
  514. //*******************************************************************************
    ' a+ m; X4 G" ?% b+ X
  515. //完成轉動後重新將LCD內容刷新; s( r# W2 c1 u4 j& E
  516. //*******************************************************************************
    ) q- K7 w3 N" `8 e. G, ~. p
  517. dis1[0]='A';
    " b! R) S# w; e( _' f
  518. dis1[1]='Z';
    0 Z- ?1 N  D" ~1 f) `
  519. dis1[2]=':';! z4 K3 G2 e) G  |8 t
  520. dis1[3]='0';( Q) ~  r! `- S" t+ F
  521. dis1[4]='0';
    - b0 `& i* U# R% g
  522. dis1[5]='0';
    / {+ N' Y9 p  K8 L5 B6 a
  523. dis1[6]=' ';
    9 h7 E/ b0 {7 ]" l: Q5 p* e8 C
  524. dis1[7]=' ';4 D" s1 f6 X. o( X; S
  525. dis1[8]='E';4 [3 r, v% Q. ]! F
  526. dis1[9]='L';0 z: o6 H2 O& n: m% T
  527. dis1[10]=':';8 H7 m! M2 @, L9 R$ R
  528. dis1[11]='0';
    ( ~7 ~6 v# t: H! h* t
  529. dis1[12]='0';5 p8 H6 ^: S  G0 y: J& w& W* Y9 r9 }
  530. dis1[13]=' ';
    ( Z+ T2 l8 C1 L0 f! i6 Q$ F
  531. dis1[14]=' ';: g- j' {4 i/ R" b, s" d
  532. dis1[15]=' ';# C0 T1 {$ v& I+ O$ D6 ^  K8 t7 D

  533. * B; B* j; [# N. ~+ D
  534. dis2[0]='-';
    5 X  F! A" G' n
  535. dis2[1]='-';
    & q: V" [" _5 a3 M+ _
  536. dis2[2]='-';: C0 x4 @. O: k( b0 V; A
  537. dis2[3]='-';8 N- P7 x9 u0 E. h7 r) H2 s' b5 P
  538. dis2[4]='-';
    + g7 U& D7 A9 W9 g
  539. dis2[5]='-';. B. u. W5 x0 N  f3 U' a; C* B3 m
  540. dis2[6]='-';
    0 ]) n! D3 e  @; _7 ?4 }& r; D+ _. W9 V
  541. dis2[7]='-';4 v! E, c5 D& {5 _6 C0 ~
  542. dis2[8]='-';4 K* M# l3 |0 C6 F) s9 o) g* A
  543. dis2[9]='-';
    / l& Z# R$ `' c
  544. dis2[10]='-';
    1 x# p& b' p/ R# \; r7 k9 J) z
  545. dis2[11]='-';
    ' ~5 x/ {$ q( n. @7 ]) P
  546. dis2[12]='-';- f1 F9 [1 A: _: w* g
  547. dis2[13]='-';
    5 P# b8 I& s9 @" A
  548. dis2[14]='-';: E1 b3 r( R( D% y  @5 B. Z" U
  549. dis2[15]='-';7 d! Z& q5 O* i5 ]" E
  550. }
    7 p6 l: ?6 D; g
  551. //**************************************************************************************************1 V' b/ C) }- n* @" y
  552. //向LCD寫一命令
    5 G; |: Z2 i( \4 p! b% I* Y. `
  553. //**************************************************************************************************
    / Z4 c# ?4 Y2 g' e' `
  554. wcode(uchar t)
    7 }+ F, H  c! V% F
  555. {& l. |: O/ v/ j9 H$ L1 p
  556.   rs=0;           // 寫的是命令
    + P7 T" r' V7 }, M! @( B2 }  I
  557.   rw=0;           // 寫狀態
    : P; B1 |1 x" s* I9 q5 B' W3 C! q: e
  558.   e=1;            //使能( o1 l4 l- W) _# m' \3 G; Z0 c
  559.   Dataport=t;     //寫入命令
    * y0 A/ i: [/ ?
  560.   delay(45);      //等待寫入,如果時間太短,會導致液晶無法顯示. _' Y% q3 ^( _
  561.   e=0;            //數據的鎖定, K6 S* j2 y; T0 x
  562. }9 a5 T0 {5 o; Q
  563. //**************************************************************************************************( f. Q  e- ^, O5 `
  564. //向LCD寫一數據' R5 s( u- u1 r
  565. //**************************************************************************************************
    6 T/ l7 p! x( w7 a: a8 g
  566. wdata(uchar t)" n  ?, J! w+ E7 V( F
  567. {9 k0 U  O6 V* t1 r. Y
  568.   rs=1;          // 寫的是數據- i, y+ F9 m3 f$ T
  569.   rw=0;          // 寫狀態! ^  ~: P: D# `$ E. z8 Y: m4 D/ }% h
  570.   e=1;           //使能- W/ ?% T: H+ [% o6 D+ k( m
  571.   Dataport=t;    //寫入數據* D! K( @* |+ Y9 c8 D0 `! }
  572.   delay(45);     //等待寫入,如果時間太短,會導致液晶無法顯示
    1 x: V6 Q+ H$ M2 l
  573.   e=0;           //數據的鎖定
    " L0 {9 N6 V- Z( D! R! \
  574. }; e9 ^& x' j$ N% d
  575. //**************************************************************************************************+ Y! D6 N5 i' J* Q0 a7 ~& n
  576. //LCD顯示第一行5 d& w8 H4 `# z+ V: ]! n
  577. //**************************************************************************************************
      W' R! c5 o$ ?2 K5 E) Q
  578. xian1(void)
    7 A6 A  t, l/ u/ g( `
  579. {; s5 M1 O. V0 C5 G6 K1 |
  580.   uchar i;, f: ^1 d9 u% e
  581.   wcode(0x80);          //設置第一行顯示地址, v0 T$ P, w7 p4 G- Y! o9 @
  582.   for(i=0;i<16;i++)     //循環16次,寫完1行
    6 _" I; G* m+ }7 ~) V# \, T& K
  583.     {
    . T$ g0 Z' q- }  b& q( Z
  584.       wdata(dis1[i]);   //寫入該行數據! N1 |) j' x0 S9 k
  585.     }
    0 f2 T; d' V; w3 N9 \3 I
  586. }
    - Y! v: F" F- x, g% R
  587. //**************************************************************************************************
    0 n$ N- j& i2 S/ E
  588. //LCD顯示第二行
    5 _& Q% c/ @6 u4 y$ u
  589. //**************************************************************************************************
    ( n: H2 l/ k6 H- }# {* V
  590. xian2(void)# q# m9 C3 E' v5 d% \3 Q) e
  591. {
    # ~( n$ q( k" ?6 E
  592.    uchar i;
    5 j& E, g3 q, o  e3 `
  593.    wcode(0xc0);        //設置第二行顯示地址7 n* t2 L, U; A" N( g" w
  594.    for(i=0;i<16;i++)   //循環16次,寫完1行
    9 N9 E- h* }1 k6 z! ?: x
  595.     {) j& z8 L" o0 [- N3 ^0 o
  596.       wdata(dis2[i]);  //寫入該行數據
    7 ^& [+ @7 b+ c9 ^! @
  597.     }
    & G7 V, q5 l9 Y+ }. O
  598. }3 _9 e* \  W( B/ M; A7 Z

  599. # a5 u1 X0 W  \, C
  600. //**************************************************************************************************
    4 F# F; U: \# V+ m) x
  601. //LCD 初始化/ e& y# }9 r3 B6 G! z  R! x
  602. //**************************************************************************************************
    5 t# Y4 T1 v; c! _
  603. InitLCD(void)
    - k" u) ~% Q3 R0 Q3 m  F# p5 G
  604.    {   
    - ~2 D" n! f% E+ P" e4 p
  605.    wcode(0x01);   //清屏. V1 z7 r. |% y" s5 l
  606.    wcode(0x06);   //輸入方式控制,增量光標不移位$ e: F% J1 j0 F) f  Z/ p
  607.    wcode(0x0e);   //顯示開關控制
    - d: {. [9 d1 V. G
  608.    wcode(0x38);   //功能設定:設置16x2顯示,5x7顯示,8位數據接口      
    6 a- V; E, G  h& v
  609.    }  ( A) J# W1 H! _; a* ?8 Z- U) y: ]& k; }
  610. //**************************************************************************************************# Y; ?3 `4 M/ j7 g9 n
  611. //初始化串口
    + {, m4 I; }- }* {& r9 e/ t- e8 c
  612. //**************************************************************************************************
    / k: b/ U* L/ o7 Y9 E3 |! O

  613. # U( ?& |9 K4 g" k& |
  614. void init_com( void ) ' X! h7 h+ k+ }# H1 f' S+ {
  615. {      
    " ^2 q1 f7 K1 i7 S: ^( A- U
  616.     TXSTA=0x24;//發送數據控制位配置00100100,異步方式、高波特率,波特率=Fosc/16*(SPBTG+1);+ J" O) v' [6 d* y& L9 b
  617.                //TXSTA寄存器的D5(TXEN)=1,啟動UART的發送功能
    ' i0 T- Z8 G- J  X: F, j
  618. RCSTA=0x90;//接收數據控制位配置10010000,設置連續接收數據
    2 j! y4 w& i: N
  619.                //RCSTA寄存器的D4(CREN)=1,啟動UART的接收功能
    5 H5 a8 D! H6 D7 P: B! n
  620. SPBRG=25;  //設置波特率9600,系統時鐘4MHZ,波特率=4000000/16/(25+1)=9615(Bps) 51
    # o6 m& x: K# K9 T
  621. //設置波特率4800,系統時鐘4MHZ,波特率=4000000/16/(51+1)=4807(Bps)
    7 J! K2 u' \6 H7 g2 A
  622. RCIE=1;    //接收中斷使能1 C$ x( [8 W" h7 r
  623. TXIE=0;    //發送中斷使/失能
    : g8 m. o  a; S
  624. PEIE=1;    //INTCON的D6(PEIE)=1,外圍中斷開關打開
      z& V' k6 m3 P& S
  625. RCIF=0;2 N) ^! i, p: D  S! Q) }
  626. RCREG=0;" r( S2 J$ L5 R7 v
  627. GIE=1;     //總中斷開啟
    * N6 K( ]. x$ t- M
  628. } 8 H0 ]+ \4 v9 O, o0 v0 p
  629. - W4 Z# ~. H( I2 u- c, D% ?/ ]
  630. //**************************************************************************************************7 @4 p& {' ^2 u2 z( E, ^0 S: m4 C
  631. //寫RS-232
    5 d! q1 G9 e$ v. Z" A- h6 A' K7 M
  632. //**************************************************************************************************
    8 e) ?4 h7 h# r" y* B
  633. void  WriteByte(unsigned char byte) {
    / K+ |6 m+ r  O1 d& f: v1 o
  634. while(!TXIF);
    0 t$ r8 j0 w& e% }1 E0 w& a0 t8 C
  635. {; b* i8 Y5 m4 z- a
  636. TXREG = byte;
    # q$ i! [! y# J- _! W# i! F
  637. }% U) r2 j) K: d1 w  [$ s
  638. }
    ; ?" r: h( q# N
  639. " Y3 C3 ?) X. ?% \$ D
  640. //**************************************************************************************************
      o/ q4 ~( F9 ?. P0 j% v& b+ `
  641. //向RS-232寫一字串數據
    & }; O. z5 o; S/ V
  642. //**************************************************************************************************
    - ^, B% l* E8 L" D1 n* I4 m3 g
  643. void WriteStringConst(const unsigned char* str)
    ' J9 y' q$ j; [: b7 p6 r3 R) @
  644. {# P9 t/ m. m# [/ _+ J6 C1 a7 K
  645. int n,m;6 q3 O$ x# d% r' a/ Y1 Y

  646. % Q5 j; R& W5 Y2 ~
  647. for(n=0;n<=11;n++), n* v% @3 K" u% x! [
  648. {; i! V( O  O2 W0 x* E
  649. //TXREG = str[n];" i2 s; g6 x; _6 z7 v
  650. WriteByte(str[n]);
    4 c, M, P# A5 m" ]4 P) U
  651. }
    ; x3 {( I2 X9 Y  [/ p* J

  652. * j2 X3 M4 \2 o8 [  |" l
  653. }7 u. T" m# L, d' G
  654. //**************************************************************************************************
    - _( N/ F  z7 X9 g& q
  655. //雲臺轉向控制 5 p2 D$ T9 a, v4 b& A
  656. // 選用的雲臺 傾角 動作時會稍微干擾電子羅盤
    % o" D/ \! Y: D' W' P3 g
  657. // 雖然已經將 羅盤 與 馬達 距離拉開,但在做 傾角 動作時,還是先 不旋轉 以免因為誤判角度而亂轉3 R; }, g: k% G
  658. //**************************************************************************************************
    ; s( r4 L& i) r, I( r+ v( n
  659. conTIO(void)
    " O% x+ |! U0 q
  660. {* j) W6 a! {2 l1 t" O1 G4 ?# @

  661. + E, v7 z. V- }
  662. RD0= !rd_U; //指令 UP Direction Rotation(反邏輯 單片機輸出"0"=低電平=繼電器動作)
    0 M( u& X7 }- q3 x2 R( u
  663. RD1= !rd_D; //指令 DOWN Direction Rotation(反邏輯 單片機輸出"0"=低電平=繼電器動作)
    3 n, e6 |+ I" G8 q6 {0 [
  664. if(rd_U==0&&rd_D==0) //傾角動作優先,傾角動作完成之後再旋轉
    ' Y- O6 M$ i1 ~7 p0 v, k
  665. {
    # j1 n/ Q3 Z% y+ H# n9 s
  666. RD6= !rd_L; //指令 Counter Clockwise Rotation(反邏輯 單片機輸出"0"=低電平=繼電器動作)
    " D7 x# m" V. w2 b
  667. RD7= !rd_R; //指令 Clockwise Rotation(反邏輯 單片機輸出"0"=低電平=繼電器動作)
    ; u' I6 B' p6 B: @5 z' E
  668. }
    + A. r+ |$ C+ L) s5 ~% E' `1 M
  669. }
    1 i  H2 F$ F$ Z* N* c
  670. //**************************************************************************************************" d7 @' T( j% x  d. C; p
  671. //check 資料要求 COMMAND
    4 p0 t! G9 S: j3 V
  672. //
    , `- J# {) W4 G7 K: O3 q
  673. //int rd_AZ; //要求 水平角度
    * X4 w4 i$ D* }& B8 t5 x; z
  674. //int rd_EL; //要求 傾角2 [6 d7 Y4 R5 T! _  d, y
  675. //int rd_AZEL; //要求 水平 + 傾角$ s7 V' K: r: ]+ n5 a% l& O
  676. //**************************************************************************************************
    ! |8 r* v4 {5 S$ ~, K7 M' B
  677. cmdCHK(void)  ) L+ T. Q  G2 v, M
  678. {
    ; P% @+ N" y9 J" E% a" V4 O! O
  679. if(rd_AZ==1)' K7 ]4 S4 t6 p+ [9 Q
  680. {/ R, P( a) P" m
  681. WriteStringConst(disAZ);
    ) t- Y1 W; y& ]/ q2 u" f  e
  682. rd_AZ=0;6 o4 K+ @( Q0 g, o* a9 Q
  683. }
    6 F0 t$ R% U& S( p0 u
  684. if(rd_EL==1)
    " w3 c1 q/ V/ [  ^
  685. {
    9 d6 ?5 ]$ }0 n) f/ r) b4 p
  686. WriteStringConst(disEL);
    8 y, {9 f3 v9 Z
  687. rd_EL=0;
    ; D) y4 N" L  G5 ~, j8 J, h6 t
  688. }5 n/ l3 w' s, K: Y( ]2 n
  689. if(rd_AZEL==1)9 I/ k0 O% U9 T
  690. {0 T0 h8 D" |, G; O. E
  691. WriteStringConst(disAZEL);7 I3 v; j) Y* J  M% U/ g% r
  692. rd_AZEL=0;7 y0 X+ _5 `* u+ N
  693. }4 P. s4 }; K! E

  694. 8 ?) D, m+ q/ T8 [7 \
  695. }
    1 Z: s, b8 l5 i: i# q
  696. 3 U; G- N. ?% m: r! x/ c: ], {9 B
  697. //*************************************************************************************************** ]/ D, I8 O. u- C
  698. //雲臺自動轉向 COMMAND8 j. d1 e- Z, w" f$ p
  699. //
    + K( y/ B. W0 v
  700. //int rd_M; //自動指令 前往 Mxxx 水平角度xxx" f* j& T. R4 |1 m, K
  701. //int rd_W; //自動指令 前往 Wxxx yyy 水平角度xxx 傾角yyy) f2 ~) U* {3 |8 k1 U% @
  702. //int rd_S; //指令 All Stop! e! O- v. a0 j! n+ ^
  703. //int rd_R; //指令 Clockwise Rotation- ]8 L8 w/ F8 X
  704. //int rd_L; //指令 Counter Clockwise Rotation0 t6 o: c5 |7 s- X# o) t
  705. //int rd_A; //指令 CW/CCW Rotation Stop4 F/ U" C4 Z- A& @  z
  706. //int rd_U; //指令 UP Direction Rotation
    1 M+ B' L9 D0 Q# d3 ?' J' P
  707. //int rd_D; //指令 DOWN Direction Rotation1 n, \3 W8 H2 A
  708. //int rd_E; //指令 UP/DOWN Direction Rotation Stop0 {( [) N3 f: `5 z7 W
  709. //**************************************************************************************************% k2 d1 ]. T9 ~9 s/ j% K! X$ Q7 N
  710. void turn_cmd(void) 3 P# A! ?, j$ {6 k
  711. {
    ( I( ?3 d5 W5 }
  712. //if(cmd_AZ>AZ&&(cmd_AZ-AZ)>3 &&(cmd_AZ-AZ)<30)( v- @, g5 _4 G8 ?
  713. if(cmd_AZ>AZ&&(cmd_AZ-AZ)>3), @1 B; d1 F/ ^( }" q+ a' h6 @2 `8 T
  714. {
    2 Y# l( w: {) A' y! \4 d
  715. nms_delay(100); //防止繼電器高速跳動& v0 r8 B, @( t1 K; @0 Z
  716. rd_R=1;  N8 O) U: B1 R& v3 x
  717. rd_L=0;
    ! y! w* i% m3 a: a2 G
  718. }" ^  b$ `; D, ~0 f
  719. //if(AZ>cmd_AZ&&(AZ-cmd_AZ)>3&&(AZ-cmd_AZ)<30)
    3 D  ?% b! ]7 U3 v' [
  720. if(AZ>cmd_AZ&&(AZ-cmd_AZ)>3)
    ; U/ [( A  C* d& ]1 }* z; i
  721. {: F+ K( c0 k7 f' a; @% P( f" O) h
  722. nms_delay(100); //防止繼電器高速跳動
    # z8 v( v. k" Y' `- s
  723. rd_R=0;
    3 j8 d+ B6 t" N/ D% R
  724. rd_L=1;
    0 _  x* d+ O# m: {" J( s7 i
  725. }
      r3 S& y# p& q7 T6 L" r  a
  726. + J, ?1 Q5 A* Q2 _; |8 J4 V5 V. t6 z
  727. //if(AZ >345 && cmd_AZ <15 )  // tracking cross left 過 360'2 f( v( O5 [* m" A1 X2 m7 M( E
  728. //{4 `+ _. N! i- X% d* j3 o
  729. // rd_R=1;
    ! C  z3 r+ I4 Y
  730. //}% P( T+ c8 u% ?% Z; k
  731. //if(AZ <15 && cmd_AZ >345 )  // tracking cross right 過 360'
    7 ]# v* X4 l1 O7 W4 ~. L
  732. //{! [4 C0 O; L" t2 Q5 E: K7 ^
  733. // rd_L=1;4 R: H) ~; J; g7 N; W' F
  734. //}
    % o7 ^/ E0 f  Y8 c' s( B9 T  ^0 I/ m

  735. : M$ }& C$ f7 K1 r4 Z* f
  736. if(cmd_AZ>AZ&&(cmd_AZ-AZ)<3)
    , u2 c. B' o" i) g  b6 R6 Z8 j8 H
  737. {. S! O2 S# \  `/ A+ j2 I
  738. rd_R=0;- ~4 O; B2 d3 c  s
  739. }
    ' Q4 W+ L2 S/ n2 l
  740. if(AZ>cmd_AZ&&(AZ-cmd_AZ)<3)$ E8 y( y' D" B/ \( Y1 g9 O- N' L
  741. {9 I. o2 B) ?/ n3 u
  742. rd_L=0;
    ! j9 b. T  Y, L( y( s/ k( ^
  743. }# v! o6 G; b6 |; x; P" J" G% E* a4 ~
  744. 1 K. ^3 N+ C/ A, v2 P* x
  745. if(rd_R==0&&rd_L==0)6 T6 J/ y& H7 B) g* k
  746. {
    5 J& d; B% }$ h  Y1 C* e
  747. rd_M=0;* C7 m+ h, o8 {$ a% Q0 |" ]+ {
  748. }
    ' M( z$ j( f- R6 ?3 }
  749. if(rd_W==1)
    8 l; {/ H  @$ t, h" c) u
  750. {; l  C- D& ^4 W+ A! u" x$ w
  751. //if(cmd_EL>EL&&(cmd_EL-EL)>2&&(cmd_EL-EL)<20&&EL<90)
    ) G. L# {4 W4 T
  752. if(cmd_EL>EL&&(cmd_EL-EL)>2&&EL<90)4 x0 d! ?8 n5 [3 U3 Z7 b# n
  753. {  R2 ~3 S( }! s, v! {
  754. nms_delay(100); //防止繼電器高速跳動  r% T2 a" Q3 I! U! M
  755. rd_U=1;! t  W. ~. `/ d) u8 ]( E% a
  756. rd_D=0;' V  n% ^# o; F- r
  757. }$ ^8 ~: A, n' j1 P
  758. //if(EL>cmd_EL&&(EL-cmd_EL)>2&&(EL-cmd_EL)>20&&EL>0)0 @" G" f  Z! L* p# Z
  759. if(EL>cmd_EL&&(EL-cmd_EL)>2&&EL>0)/ {  t* P( \! K# `, i9 L
  760. {3 f: @  K4 {& G; n5 J
  761. nms_delay(100); //防止繼電器高速跳動
    2 [! ]7 _3 H; t  v# t+ R
  762. rd_D=1;
    % g. m3 W7 t1 q& ?/ x
  763. rd_U=0;2 Y) b, c2 _* }0 \' ~
  764. }
    ! {9 V; M$ u* r% R- n1 R) j( I
  765. if(cmd_EL>EL&&(cmd_EL-EL)<2)
    0 U+ w0 k7 f6 {8 Q
  766. {
    1 H1 F. _, Z  X& t; r
  767. rd_U=0;
    + ~: N8 o* _  m/ M$ k
  768. }
    + @; I2 d8 F' |% O  c6 `
  769. if(EL>cmd_EL&&(EL-cmd_EL)<2)! U% V# b& i+ p2 J1 A
  770. {
    1 M0 K& F9 f) c9 V
  771. rd_D=0;1 z* K8 ]& D* f9 ]$ k  U( m2 p. P
  772. }* O- Y; k# N9 b# ]
  773. if(EL==0&&cmd_EL==0)$ r# G& j: O2 O) y2 g
  774. {
    2 q' X& z! H- f& J' Y
  775. rd_D=0;
    # c  D1 {; x; t) B- M& G) U
  776. rd_U=0;, O) r' r3 Q2 ?
  777. }! ^2 j, q! A& {
  778. if(rd_R==0&&rd_L==0&&rd_U==0&&rd_D==0)3 M# i: g  z" n- o# F/ V
  779. {
    ! t; _' }! J% J
  780. rd_W=0;
    1 @% i% `8 G# Z% ]
  781. }7 Z$ R4 Y2 A4 W: Y0 ]4 F" p
  782. }' M; G" d# z# W4 N
  783. if(rd_A==1)6 I& S$ h( e; k6 B6 |) Q5 f
  784. {
    3 M4 u7 X6 K" j8 d, l
  785. rd_R=0;
    8 b" r* |9 z) O6 \' B) u" n
  786. rd_L=0;
    0 O. I5 v5 E- y9 J1 U
  787. rd_A=0;
    ( a! F( P- T. A$ F; q; s% Q0 W. z" D7 k
  788. }
    ) A" Y5 ^& M9 j2 u5 e0 e9 R
  789. if(rd_E==1)
    : A' {4 _9 W8 k6 m5 \+ w5 z
  790. {5 R; J- a* K: F2 R
  791. rd_D=0;6 T5 B% v( J2 v2 D  H$ E: l: Q$ r5 \' f
  792. rd_U=0;
    ; R' ]  g. v! \& w. H! B
  793. rd_E=0;
    & r' f$ N& G& Y! E6 b
  794. }7 g3 h5 [$ x* ]1 o. |0 u9 T2 Z
  795. 0 r0 @( W) d; L: n) a9 V/ {" r
  796. }. X) D0 U; H- [# S' Z6 a: v
  797. //**************************************************************************************************
      }2 s; |8 B$ T! q  v! X
  798. //check 雲臺轉向 指示 及 過頭.回一點 控制# |: {8 M& ~# f
  799. // - w( S  z/ [& @6 m
  800. //int rd_M; //自動指令 前往 Mxxx 水平角度xxx
    5 j6 w# W' N2 e! |# V+ p! _
  801. //int rd_W; //自動指令 前往 Wxxx yyy 水平角度xxx 傾角yyy
    ; |$ X7 U( F* \5 ~' N3 }* G$ L) E4 g
  802. //int rd_S; //指令 All Stop7 q; K' m2 D& W) C3 Y- Q
  803. //int rd_R; //指令 Clockwise Rotation
    4 J$ _9 \" G; E* t$ I
  804. //int rd_L; //指令 Counter Clockwise Rotation$ |  o$ ^, Q3 b$ P
  805. //int rd_A; //指令 CW/CCW Rotation Stop
    * w! c3 r& @% b. Q& N( U
  806. //int rd_U; //指令 UP Direction Rotation
    ' b9 s: e& L0 Z- i
  807. //int rd_D; //指令 DOWN Direction Rotation
    1 g1 U" L# {7 Y* G+ F9 k
  808. //int rd_E; //指令 UP/DOWN Direction Rotation Stop! g/ _. E- M3 w8 L
  809. //**************************************************************************************************) r7 K3 k+ f9 s' G
  810. void turn_dsp(void) 7 r0 D6 y; E& u3 o
  811. {2 b$ d2 f' V$ a
  812. if(dis1[11]=='L'&&dis1[12]=='o'&&result>>0) //指令 傾角過低 low(回頭)(當 傾角 輸入=0V(將該腳位接地)  時 不做「過頭回一點」的控制)* e8 |1 K' d; }* y# L
  813. {
    1 A0 N5 w1 B8 F3 x
  814. RD1=!0x00;
    , |5 I+ S8 R  s; R
  815. RD0=!0x01;
    0 @. p8 P( F* W4 `4 }8 d/ c% @9 |. n
  816. nms_delay(300);$ Z  `; v1 z& v
  817. RD1=!0x00;% a% n5 e0 o$ g0 B$ X
  818. RD0=!0x00;' e$ s1 i) }$ A( i# B
  819. }
    $ o: |8 H. B6 ~7 B0 z2 o
  820. if(dis1[11]=='O'&&dis1[12]=='v'&&result>>0) //指令 傾角過高 over(回頭)(當 傾角 輸入=0V(將該腳位接地)  時 不做「過頭回一點」的控制)
      @6 S  k# q8 O: g4 G
  821. {
    ( N/ z8 d4 A1 d" q0 a/ a
  822. RD0=!0x00;
    # R4 a4 M* C3 ?# f" d- u, w3 p
  823. RD1=!0x01;/ h$ h9 ^0 X6 w8 ~% \0 `) l+ p
  824. nms_delay(300);
    ( ?! k/ l. x! W, n" l
  825. RD1=!0x00;' i9 \) |$ f# N5 F" W3 n* C
  826. RD0=!0x00;+ X$ P; m, z; _& ]: o
  827. }
    6 ], \# S. [2 O$ \* ~1 p1 T) \- W
  828. , M0 _1 B8 n! d) j
  829. //******012345678901234567***************//
    ! x+ n) t) d; {2 v; s; w1 O
  830. //dis2{"Turn! Right Down\0"};
    & h, n) n# g; W% u/ w
  831. //    {"Turn! Left   UP \0"};: f! |( l; }4 ?4 ]! p
  832. //    {"------STOP------\0"};
    ; x/ S) e4 B. S5 L
  833. //***********************************//4 E. |& B& J6 R) C" n
  834. if(rd_U==1|rd_D==1|rd_L==1|rd_R==1)
    - P% t; }& W( p) x3 D* R
  835. {
    ) O9 d0 D0 v2 U$ X- @$ h
  836. dis2[0]='T';
    . M  h4 t5 Z% B: |
  837. dis2[1]='u';' e0 Z. b/ o. D5 @3 n& w
  838. dis2[2]='r';( E. q% k* p- ?( y' \1 |3 G
  839. dis2[3]='n';4 z4 Q. k5 W$ A' @
  840. dis2[4]='!';
    + ?& e" x  A* r% S
  841. dis2[5]=0x20;
    ! Y& V8 j* ]. M; B
  842. dis2[6]=0x20;;( c1 T3 V- i( Y9 q: c8 ~9 [- C: ]: {
  843. dis2[7]=0x20;;
    * q3 K# `4 |: y& G/ S
  844. dis2[8]=0x20;;# v! a0 T; ^3 C
  845. dis2[9]=0x20;;  A+ \- a/ w# b7 w9 C2 S2 W* ~" R
  846. dis2[10]=0x20;
    2 z& t; c- j. N
  847. dis2[11]=0x20;;5 d' p+ D0 r: `- A2 o
  848. dis2[12]=0x20;;
    % g/ U" s4 g' |  R' c0 g7 I
  849. dis2[13]=0x20;;. i' T/ N4 P& L( q- O7 k( F! Q
  850. dis2[14]=0x20;;
    7 [6 }0 f6 a  R1 b, F' {
  851. dis2[15]=0x20;;
    ) b! ]: R( h% K
  852. }
    6 G4 w  P) d6 S, I9 {9 v- _( j2 T  C
  853. if(rd_U==1)0 J1 ]+ S1 i- Z, `3 C+ C, _4 l
  854. {; P& i: m9 H4 u6 v
  855. dis2[12]=0x20;6 x- j# N) v9 `) V% c6 \
  856. dis2[13]='U';' _) A' Z5 p& o" A4 A- s/ j7 [
  857. dis2[14]='P';
    % l3 n! F% E, I, C; u) {2 N2 p
  858. dis2[15]=0x20;
    " ^# Z; c. K* o) d5 B
  859. }& m5 U- J# d. G0 E+ {
  860. if(rd_D==1)
    6 m0 X/ `) s6 G  p$ }  T
  861. {/ j0 \* {- w% h  s3 t& Z
  862. dis2[12]='D';
    ! Z6 f( B8 ]7 e) l3 P5 m
  863. dis2[13]='o';
    . H, N) z: E) p( [3 A8 l5 v% r% [% B
  864. dis2[14]='w';
    ' X2 n- e3 v3 T2 w# u2 q4 Z3 Z6 W) X( {
  865. dis2[15]='n';7 p7 z( l, h7 H  o1 m) O' a
  866. }
    ' ~" l. _  d+ b7 i# H" l
  867. if(rd_L==1): Q3 I; D9 r) `# |6 h6 c
  868. {8 H: N. a2 q# z7 \
  869. dis2[6]='L';$ h; ]1 C3 M  }- Y( Y- O* R( [
  870. dis2[7]='e';* k& \! f& N7 W1 u9 c
  871. dis2[8]='f';2 N! a! T9 n/ j  g& d4 e% s1 _, W
  872. dis2[9]='t';0 [! a. G" h( e9 e; ]' Z6 T3 g
  873. dis2[10]=0x20;, v3 _9 p) R  V# h
  874. }$ J( k  d6 q1 G* t% K- r& d
  875. if(rd_R==1)
    + R7 |6 G. z6 {' I- f  x
  876. {
    + I8 w% R; y$ J- c
  877. dis2[6]='R';
    * f8 z% U$ W7 r2 U7 C
  878. dis2[7]='i';6 k' b- N, p# n5 p: r- y" k
  879. dis2[8]='g';; o/ G  Q7 N" S' \# V" M$ ?* f
  880. dis2[9]='h';1 A/ J! B; i* g: M/ K% x
  881. dis2[10]='t';
    / B: u. w# f3 g' b* Y
  882. }
    $ ?: k8 a+ q2 P3 s% f$ b
  883. if(rd_U==0&&rd_D==0)- l6 u$ U: i8 T5 [2 m
  884. {
    8 ?& H# M1 I# x" H: T7 R; L6 t
  885. dis2[12]=0x20;  i. t$ m& f: }* c+ R6 ^+ K
  886. dis2[13]=0x20;' G" |( y- C' x
  887. dis2[14]=0x20;- D8 ~9 K% ~: u5 A8 K& ?
  888. dis2[15]=0x20;
    ! l, d2 r0 |0 V) j  T
  889. }. f4 e6 y* p# a) E
  890. if(rd_L==0&&rd_R==0)0 t- B/ D0 ]1 g8 [/ r
  891. {) j' Y; _5 G+ l! _+ l
  892. dis2[6]=0x20;
    + d* _9 A* o& d; R
  893. dis2[7]=0x20;9 B0 R, Y- a/ a/ E. j
  894. dis2[8]=0x20;
    5 V0 D% o: F, B
  895. dis2[9]=0x20;5 B: a0 R$ b0 P/ C6 y8 A* [& y
  896. dis2[10]=0x20;! I+ v/ x) M. o! N& P" ]; V" d6 Q, N
  897. }
    $ [) v0 s) q' R, \) I
  898. if(rd_U==0&&rd_D==0&&rd_L==0&&rd_R==0)
    $ I: _6 f' C5 l4 o1 _; b
  899. {  B0 T' n6 N$ X/ B
  900. dis2[0]='-';
    8 v* U. a2 D$ g; G( R- y
  901. dis2[1]='-';
    & k, o- v- Z# M  j5 M7 g$ |" F9 B
  902. dis2[2]='-';
    1 m7 g6 }' g! n; t! X, S5 ~
  903. dis2[3]='-';
    . W# G% }" g1 ^/ S7 P+ F8 m) m  ~
  904. dis2[4]='-';9 q+ y8 ?( G$ B0 s" V5 q8 l
  905. dis2[5]='-';
    9 q; f0 u& A9 n- L! K, ~; q% t
  906. dis2[6]='-';
    . J% d* ?4 d( V1 {2 P
  907. dis2[7]='-';# W2 q+ I$ v/ L: R
  908. dis2[8]='-';
    : D4 Q& u! G. v( N% ~" e) l0 q
  909. dis2[9]='-';+ ?. B; t: E( o. ?- E5 o6 \+ y
  910. dis2[10]='-';- X% [  ]7 [# i' b5 ]- _/ h& I
  911. dis2[11]='-';
    # Z( Q1 x: [' G% }' ~2 Y% u% U
  912. dis2[12]='-';
    3 H# B# J6 g# a+ e: o. B
  913. dis2[13]='-';) S  i/ g, [. H. O9 A- ^2 [2 S. p
  914. dis2[14]='-';$ ~' w. N% a6 a$ u; a
  915. dis2[15]='-';
    . R% B; a1 ~) s0 T8 }
  916. }
      E& O3 `' V! U6 e

  917. $ e; P8 n- b4 D0 }( N
  918. }   9 t8 `, x6 |0 E+ T& K6 O, C* U

  919.   p/ y9 j. U( q2 @: T
  920. //*********************************************  x- }" C; f0 n! ~! Z1 t2 ~
  921. //雲臺 手動 轉向 COMMAND
    ' W) f) n: A! l0 v
  922. // + V0 t0 E+ u, r# h
  923. //int rd_S; //指令 All Stop0 J! n/ ]- G: W4 ^4 [$ A
  924. //int rd_R; //指令 Clockwise Rotation
    % {$ P+ z: g& t$ ]
  925. //int rd_L; //指令 Counter Clockwise Rotation
    7 M$ d) J- G7 [; U- ~$ N
  926. //int rd_A; //指令 CW/CCW Rotation Stop; `' ~7 c% @6 W- g8 c$ v8 K& C
  927. //int rd_U; //指令 UP Direction Rotation
    4 e; U- V0 @+ w' u8 D
  928. //int rd_D; //指令 DOWN Direction Rotation
    - ]$ x  e4 @% X5 e; ?2 t4 s
  929. //int rd_E; //指令 UP/DOWN Direction Rotation Stop& i3 q' x* J! D& ?( M+ \2 j- b
  930. //**********************************************
    ; t" f5 k. a" D0 g1 S
  931. void PB_cmd(void) ; R* V! D5 G  w' ]) d
  932. {6 D9 a6 f0 r* [% y- V5 Z" Y
  933. rd_M=0;
    / i# I2 ]8 G8 o: W+ K" \
  934. rd_W=0;
    " H+ O& W/ _3 W
  935. rd_L=0;& K& |! E, J  w% e
  936. rd_R=0;8 P; f7 ^0 _, j7 \" {
  937. rd_A=0;
    8 H: }  e! K% ^1 }4 X9 b
  938. rd_U=0;6 }3 P" @0 s7 ^" t
  939. rd_D=0;
    # Y  `: j, {3 Z! M* f' y0 r) L
  940. rd_E=0;
    0 j  m, E6 k4 Z/ F9 c
  941. rd_S=0; ) p1 T3 Y1 c( a% n9 [  Q
  942. if(RA2==0) //檢查按鍵 上
    $ b' C" E- \% {" I6 j6 H. ^  A
  943. {" D2 `. X: |4 v! M# z& Y1 N* a
  944. nms_delay(5);0 P! L/ r* e, w
  945. if(RA2==0)6 i- ?1 z) j2 A! ~
  946. {3 }; g+ |0 Q. l& c4 E1 G
  947. rd_D=0; //互鎖
    - F% U1 k( ]. b% S( ~9 h  u0 [/ r
  948. rd_U=1;
      q9 p- |' V8 }
  949. }
    9 F. S) b% j% E, N$ R. ^& _! |% H
  950. }
    + E- j8 V8 X/ X/ a, u# I
  951. else* o  F! V+ N5 V1 Y9 }
  952. {+ u/ S, Z0 p: U. |/ f! s
  953. rd_U=0;
    ( I. a7 k* C- T$ u6 ~) [
  954. }  w: v5 y) K- I7 J# [5 ~
  955.   [2 N4 Y/ T' Y; |- u( \6 g1 I% c( k
  956. if(RA3==0) //檢查按鍵 下
    + v, ^. Z% i: O, j1 Y( C
  957. {
    1 o1 |& K  J; t: [* e( l, r9 q- d
  958. nms_delay(5);4 ]  q' `0 p$ O/ k; D( @
  959. if(RA3==0)
    . t9 W4 J6 o8 _, G5 E
  960. {7 U: g* C; m2 f: B
  961. rd_U=0; //互鎖9 ?* U  m; H6 U& E. Z; O
  962. rd_D=1;
    : w* F' C$ y, K+ f. t- W
  963. }& O; z0 h( _- V$ [8 y% n, l& Z
  964. }
    6 s+ N0 C6 a6 O4 T+ P& }
  965. else  F  ~  g" ~$ e/ S' G% R
  966. {: B$ r: i% p& `: z$ l- W0 d; U/ h& K
  967. rd_D=0;( _- A: \. o- ^; M6 F" O
  968. }
    ( S3 d& j3 M8 e( ^- `. L. I

  969. - M' b3 p( E/ i  T+ S
  970. if(RC1==0) //檢查按鍵 左
    6 {; ~2 ^, [$ N' k( e+ j
  971. { // (RA4 不可以用(無法改變數值+狀態不定) /改用 RC1)3 J* }. e" C) ]
  972. nms_delay(5);
    ! {! h! v/ H- }3 K7 X: h: f7 @
  973. if(RC1==0)
    9 S% x+ D5 Q% K1 T, s2 x; s+ ~
  974. {! j: f; S0 x6 M- ~/ y1 V( _
  975. rd_R=0;' S+ Y# @2 t" r0 m
  976. rd_L=1;
    , D  S( S7 w4 K, r
  977. }& T( p- A; {7 Y& Z5 Z
  978. }' ?6 I. }# j$ H% S2 E1 `: g: O. u* J
  979. else- }0 a5 r& f: e# ^& t% c4 D
  980. {
    : ?- R4 d6 f" e2 U0 x  V
  981. rd_L=0;
    + a8 ~, I% M7 {9 Y" d1 {$ h
  982. }
    ; o, \  T) X; S
  983. % M, g3 B& e% X8 z7 s6 s6 n' ?
  984. if(RA5==0) //檢查按鍵 右: Z5 \; B- h* ?9 j# F# |
  985. {
    6 I0 _$ G; b& V& n
  986. nms_delay(5);
    $ p2 U5 B  i% e7 u
  987. if(RA5==0)
    # F  @. E  J4 N# s7 _
  988. {4 ]+ c4 \5 S( h7 Y) i
  989. rd_L=0;
    5 g+ |/ w# ?9 A+ J: b! \& N8 \
  990. rd_R=1;
    + T) d$ e8 v. p6 V" E
  991. }6 Z3 J7 k4 ~; m% h+ e
  992. }
    ( d+ h1 Q# [+ D5 |( K7 G& c- G
  993. else$ W4 ]- t) t  _1 {+ |8 w4 Z2 P
  994. {( `/ b; w6 V; }5 B  B
  995. rd_R=0;
    1 C5 B$ ^+ ^; A9 @6 V6 d& B
  996. }; E1 q1 F. ~. {- _9 J) t/ }6 }& Z
  997.   q  C. J1 y: p2 Y# a5 d) G
  998. if(RC0==0) //檢查按鍵 停
    4 m3 V: `9 q' S  _5 q# @3 D
  999. {. p; R, `' a/ M# D% i1 {; z) @
  1000. nms_delay(5);
    # b. J' `8 d: C& A5 c
  1001. if(RC0==0)7 Q: i! ]( t) b' o( c8 V
  1002. {7 ~: F/ j0 j  d7 V, c
  1003. rd_L=0;. U7 I. G) m' T1 h9 Z# |
  1004. rd_R=0;( T4 a8 {+ ]2 L4 w: i2 i
  1005. rd_U=0;
    ) u5 _3 }# }1 x8 P' ]: x
  1006. rd_D=0;6 e) F$ D) `$ f. P* @2 v3 l
  1007. rd_S=1;3 ^/ _; {9 D& W( C& d$ f- z
  1008. }$ s* X1 h! P1 H- w0 d% Q
  1009. }
    6 T- z. i4 R$ [2 P0 ~# H
  1010. else
    9 z2 s) U( \, Y! S% x
  1011. {) C9 d7 z+ o- _+ G  h! A
  1012. rd_S=0;
    9 x5 y8 \, C; z# g; E
  1013. }- z/ L7 q, i- D6 `$ c3 h

  1014. & ?; o1 x" V4 m9 A1 b9 N
  1015. }- S" m( T- J' q6 }! ^+ D' |

  1016. / {0 O: o2 T1 G6 m/ G# z
  1017. //*********************************************- p) m$ W8 ^$ m0 ^
  1018. //CHECK STOP COMMAND7 R1 M, m2 ^& _3 g
  1019. //int rd_S; //指令 All Stop
    ! R% f  _7 p- v9 r
  1020. //**********************************************
    0 R* L" c  {% p2 M) V. D
  1021. void CHK_stop(void)
    8 d6 }9 P2 u( ^% c$ `. l
  1022. {3 s4 O$ b0 Q9 ~- r3 ]3 s3 \5 `( N
  1023. if(RC0==0) //檢查按鍵 停
    7 T8 ?; T! O( x
  1024. {# K6 i( n3 ]! ^% m% ?8 y
  1025. nms_delay(5);- [# b5 H* }7 ~( [  b2 Q6 Y% a
  1026. if(RC0==0)
    ! g' k: t1 X2 }6 ]$ a4 ^
  1027. {3 Y% B% E* C% E- d6 d
  1028. rd_L=0;
    $ @( k! X6 A, H% S' E! z. G
  1029. rd_R=0;4 T  X) e$ ]3 Y$ }$ L$ v
  1030. rd_U=0;) k5 V- `. n: o- \/ W2 `
  1031. rd_D=0;0 r0 C2 j. G6 o4 Z7 `; s  j
  1032. rd_S=1;
    . Y  [  [" T# E! ]% L* u, T
  1033. }- S- Y* r( c9 C6 j8 ^, x& K
  1034. }$ P- K: r5 M9 g$ |
  1035. else- ^/ k: X" U; A# P: z0 ?
  1036. {8 b& b3 }  ?3 ~/ W0 Z5 d! ^/ t/ ]
  1037. rd_S=0;
    4 L7 [; j! z7 S( D& U" f6 ^% O
  1038. }
    8 @0 y: O/ u+ V2 o+ v( {$ W+ ?

  1039. # k* c) z1 [$ A( {8 k& l; Z$ d
  1040. }# O! o3 s4 u" m: B

  1041. 3 |) D# t+ F& M% t; u8 N! z. K) ]8 i

  1042. + M9 U) W4 U3 x
  1043. //**************************************************************************************************
    , D' y3 E7 q- r- A+ C4 V
  1044. //串口中斷函數' ?7 B5 `5 n9 m8 ?8 e, Z/ ^9 N
  1045. //接收要求或指令 並改變旗標
    ) Q- ^) I' W) f+ L3 E( |5 |3 c) g
  1046. //int rd_AZ; //要求 水平角度
    ( m2 N+ n- R3 l$ A! B7 j- S# p& ^
  1047. //int rd_EL; //要求 傾角
    6 ~3 H) E0 m/ ^/ m/ \: m% @% ~) x
  1048. //int rd_AZEL; //要求 水平 + 傾角3 N1 q2 S% X3 J6 `/ }+ p
  1049. //- I- `# O& }8 F
  1050. //int rd_M; //指令 前往 Mxxx 水平角度xxx, j8 i% n' a6 y
  1051. //int rd_W; //指令 前往 Wxxx yyy 水平角度xxx 傾角yyy8 k7 Z! m) p8 Y; g$ l  s
  1052. //' h, R" U0 [4 f+ \& j% @
  1053. //int rd_R; //指令 Clockwise Rotation
    8 R) ?3 {; c( O
  1054. //int rd_L; //指令 Counter Clockwise Rotation
    8 }" ~2 a  `2 x- Z+ M0 a
  1055. //int rd_A; //指令 CW/CCW Rotation Stop
    8 H8 T# O4 O1 f3 @; R# u0 L
  1056. //
    ! h6 H) o9 o% j. V
  1057. //int rd_U; //指令 UP Direction Rotation
    2 X5 G! n4 R, U' m
  1058. //int rd_D; //指令 DOWN Direction Rotation1 K+ j/ @+ ^" _
  1059. //int rd_E; //指令 UP/DOWN Direction Rotation Stop
    % r& o& u% T5 K( L: F
  1060. //% j* Z% h. N: K6 {# j" \
  1061. //int rd_S; //指令 All Stop! j0 B  h) ~* U( L7 N, J, C  _0 d
  1062. //**************************************************************************************************\$ `  [$ {. y7 ~
  1063. void interrupt usart(void)0 Z- T2 \1 L; m8 _; z1 b
  1064. {. J: }7 Y$ U5 j0 B, N$ Z
  1065. int i;9 a; h8 U! b5 Y2 G7 Y6 B- [4 ?, P
  1066. if(RCIF)* ]: T4 y: W" ?# W; J& D6 [
  1067. {
    / j/ G& v+ T& ?  S
  1068. RecArray[i] = RCREG;: \, v/ U- F" e  n/ I
  1069. i=i++;
    + @" i  e" }& o. j- a
  1070. //if(RCREG==0x0D|RCREG==0x20)/ _3 X; S9 G5 W$ V
  1071. if(RCREG==0x0D)
    9 O' |* Y( j8 a2 S8 I0 s
  1072. {& r4 }$ `5 B8 g" U" R
  1073. //if(RecArray[0]==0x43&&rd_M!=1&&rd_W!=1)  // 如果抓到開頭為 C 並且無自動指令 M W+ E5 \: Q! U: ?- `
  1074. if(RecArray[0]==0x43)  // 如果抓到開頭為 C 並且無自動指令 M W2 V* @. X7 a; a' I" W/ f
  1075. {  K# ^+ R2 P  H' H
  1076. rd_AZ=1;: y$ X" @( r9 B: H! Y1 Q
  1077. }
    + s7 b8 D3 K; y; ?: Q" b/ @$ u! D
  1078. //if(RecArray[0]==0x42&&rd_M!=1&&rd_W!=1)  // 如果抓到開頭為 B 並且無自動指令 M W  `' L, ^" M0 O4 u% [/ q& [
  1079. if(RecArray[0]==0x42)  // 如果抓到開頭為 B 並且無自動指令 M W
    5 s7 A+ `  q8 p
  1080. {
    " I4 m$ U+ e- q+ g1 g5 Q
  1081. rd_EL=1;
    4 J7 y2 z) i) B$ U$ m0 Y$ f0 B
  1082. }- |7 n/ a& R# G
  1083. //if(RecArray[0]==0x43 && RecArray[1]==0x32&&rd_M!=1&&rd_W!=1)  // 如果抓到開頭為 C2 並且無自動指令 M W
    8 D0 W( T' i: U) \% e9 o- G0 g
  1084. if(RecArray[0]==0x43 && RecArray[1]==0x32)  // 如果抓到開頭為 C2 並且無自動指令 M W
    8 T" d- F9 a) i6 M
  1085. {
    1 i1 r: l8 }, D( x6 {) l+ V; V
  1086. rd_AZ=0;
    2 |) Y+ _, e. |" `7 Z! P
  1087. rd_EL=0;
    8 m/ v$ R. T" Q$ O; b: v
  1088. rd_AZEL=1;
    # P) Y6 P% U* |$ ~/ g# X
  1089. }( }3 X! U& q- h% ?% N4 e
  1090. if(RecArray[0]==0x4D)   // 如果抓到開頭為 M 水平自動指令
    9 i' B3 v. \' e/ Q9 t; ?
  1091. {
    ! k8 j+ r6 m/ d: D, [
  1092. rd_M=1;
    ! s; D2 N) n+ e5 s' g
  1093. }2 m2 E, N2 e) {5 b2 E6 s; `& E- \7 \
  1094. if(RecArray[0]==0x57)   // 如果抓到開頭為 W 水平+傾角自動指令1 B0 D3 u4 q8 X% a
  1095. {
    " g2 C& w. B6 i( [1 u- U
  1096. rd_W=1;
    6 z3 t5 w, i6 y) i% a
  1097. }
    . V7 Q: _! X4 ~" P+ Z  y. S
  1098. 1 N2 u0 D' `, s8 P
  1099. if(RecArray[0]==0x52)   // 如果抓到開頭為 R
    ; C5 U+ x; _# E3 }* |
  1100. {
    5 }8 J: B* Z+ ^4 n; n" u& E* Q
  1101. rd_L=0;
    8 q6 X% @$ p) S  \" h" G1 L4 h9 x) W
  1102. rd_R=1;0 o6 v) U, z' k; ^1 b# j. z
  1103. }
    : i4 T( X0 F( I: F0 r! h
  1104. if(RecArray[0]==0x4C)   // 如果抓到開頭為 L
    6 [. |; c7 V  {# B4 r; r. T, e
  1105. {" O, w9 W$ b* m4 [5 S5 X& g  s
  1106. rd_R=0;9 Q& X# G2 r% r: T6 z$ ?2 y% E
  1107. rd_L=1;
      C- ~3 n7 p( u' J
  1108. }
    7 B1 d& H/ R8 J& v& {! {
  1109. if(RecArray[0]==0x41)   // 如果抓到開頭為 A( Y1 n+ _: d( D/ g
  1110. {
    ) \) _+ \2 M! `
  1111. rd_L=0;
    * ^4 m& X3 O2 g* V. C
  1112. rd_R=0;
    / K9 K6 P$ \" R
  1113. rd_A=1;
    " c$ @, u' G8 X' l9 H6 G2 P! M% r1 T
  1114. }$ W* f& v: @; S
  1115. if(RecArray[0]==0x55)   // 如果抓到開頭為 U9 R9 i8 ?7 }5 o( C' D! P: u4 G% g
  1116. {
    6 X' v% k# b: y% O: u
  1117. rd_D=0;  W; E  b7 ]8 R
  1118. rd_U=1;
    . n; X7 m+ A3 R) n0 R3 [; [
  1119. }1 _5 t9 l7 s4 y  h+ ]
  1120. if(RecArray[0]==0x44)   // 如果抓到開頭為 D
    * D2 T/ E' z: \9 M
  1121. {
    % j: g" ?, V; H& s
  1122. rd_U=0;8 }4 ]- o( T. t1 U
  1123. rd_D=1;
    : _' r1 S' e- Z# H$ R6 T) L
  1124. }: f' e1 n' p# e1 A& }
  1125. if(RecArray[0]==0x45)   // 如果抓到開頭為 E
    $ m7 v5 D' h9 @- m$ d1 c5 w7 d1 m* v
  1126. {
    " x* l' t2 n. n# ]) L& t" V
  1127. rd_U=0;! y) d8 B- G( M# d. G1 T
  1128. rd_D=0;
    " n+ R6 u8 p; c- l
  1129. rd_E=1;; U; a7 w# z% C; D5 Q
  1130. }0 U/ T8 D/ E! O
  1131. if(RecArray[0]==0x53)   // 如果抓到開頭為 S
    . V+ t, B: L, i% S
  1132. {, E: d6 l; p/ [4 N& G% V8 P
  1133. rd_M=0;. N- t! C0 |, L, b
  1134. rd_W=0;& M- Q6 Y" `, ^5 R, e
  1135. rd_L=0;
    : U9 R" ~6 `5 {" U. [
  1136. rd_R=0;% e( S! T5 x5 Y* x' c2 b
  1137. rd_A=0;
    - l& p, a/ \' y8 t6 D) }: z" V
  1138. rd_U=0;
    2 f- a* X, N. a9 j: S, K
  1139. rd_D=0;% P; B+ F* o8 [6 R- P$ l
  1140. rd_E=0;- ~$ Z. q6 e. ~6 p0 l8 C. a: s9 C
  1141. rd_S=1;
    4 m2 A# d7 \# T
  1142. }
    2 S" C" [% J% p
  1143. i=0;
    4 v- _1 R' g/ ?8 Y8 Z, Q: @7 q
  1144. }7 }* c; Y" y$ O& u: y
  1145. if(i>=11)
    & k6 B- {! n' ]  K
  1146. {
    8 T9 b# u3 m% P9 V$ B, P
  1147. i=0; //如果超過12(0~11)個字元就把i歸零(一直重複,將此次訊號收完,防止溢位). l, b& m3 ?3 I+ ?* t* J
  1148. }
    - [) n3 v- S- o5 Z1 ]
  1149. }) x/ i( ?: e; [6 E# L* a4 h, x
  1150. }3 U0 ]. M( ^: a' b& h. T# o0 j
  1151. " c. r$ f$ z1 Q: E) d9 ^

  1152. 1 P. H, V5 r9 v, v  }# p$ }' K
  1153. //****************************************************************************************
    0 O; e4 p) Q  z
  1154. //主函數. e9 g; }3 Q6 I$ ^* `5 \* r9 A
  1155. //****************************************************************************************
    $ n8 B0 K- [. ^" q# b' ^1 t& T
  1156. main(). L- |8 X6 `, I7 {, s& w$ ~
  1157. {  
    : X7 Y  ~) _- k7 ]; @- a% r$ n
  1158. uchar cntl;
    % _, ?( H# H7 P4 a

  1159. 2 C5 @3 w. J  W8 E
  1160.    //__CONFIG(XT&WDTEN&LVPDIS);//配置,設置為晶振XT方式振蕩,看門狗,禁低電壓編程
    ' ]! U# n4 M2 z
  1161.    __CONFIG(XT&WDTDIS&LVPDIS);//配置,設置為晶振XT方式振蕩,禁看門狗,禁低電壓編程% y- i/ P4 `% I2 u' l6 \
  1162. . `: i+ Z: Q3 E) A7 K' v0 _' J
  1163.    mcu_init(); //晶片初始化" X, Z1 F- k( [5 a7 ^: w& U( }. z
  1164.    IO_init(); //IO初始化
    " H* H, y2 f1 ^' J
  1165.    init_com(); //初始化串口' v+ n/ o7 ^. X$ t) F% |9 q
  1166.    InitLCD(); //初始化1602
    $ ]0 t: z7 ?. y3 [
  1167.    xian1();                   //顯示 等待訊息
    0 p# g5 Z5 ^0 P/ a
  1168.    xian2();                   //顯示 等待訊息! T. @1 F+ B2 |; `1 n
  1169.    Init_wt(); //初始化雲臺(確保不會正好在 Over0 或是 Over360)
    " X& w7 H7 w; j; O8 ]( q8 F0 H/ M  q& `
  1170.    while(1) //進入while死循環
    4 c2 h( H  P  |3 O" J
  1171.       {
    ) t/ k, a- Z4 c5 u' f7 C& t

  1172. 6 G; [+ B9 E" D  E0 P
  1173. result=get_AD(); //讀取傾角電壓8 U) w6 \" Q9 |  F0 k. C
  1174.      conversion2(result);         //數據轉換出個,十,百,千 位. l& L# Q% c; G+ W4 l
  1175. if(rd_U==0&&rd_D==0)
    & Z* j0 \! f" x: \5 N# J5 P8 V
  1176. {
    . F) \% j) b* E+ q: x
  1177.         CMP_DATA=get_GY_26(1,0x31);   //讀取角度8 R3 C- V' m! V! y* I* q6 J
  1178.      conversion(CMP_DATA);         //數據轉換出個,十,百,千 位% Q- O& M+ w5 e8 R$ ]1 |
  1179. }
    - b- j7 {8 S; \9 m( f8 g
  1180.         xian1();                   //顯示 第1行刷新
    $ N2 c" t7 {1 x( ?. p& t- H' `
  1181.         xian2();                   //顯示 第2行刷新
    1 Z" m6 B* y, z/ m3 i0 z8 ^" E5 F
  1182. conTIO();4 H2 A* K& Q0 Q% P
  1183. cmdCHK();
    8 G8 K. H6 X# v5 D; u
  1184. if(RA1==1) //檢查模式 自動=1 手動=0
    ' n' K5 }  \6 f" I' N
  1185. {) \7 G, A. |2 Q+ [5 r% U
  1186. dis1[15]='A';
    " Q" m6 \+ t" V
  1187. if(rd_M==1|rd_W==1)
    4 e& C8 h& o. r
  1188. {1 g: Y+ ^' c( s0 T; l
  1189.       con_WB();          //轉換指令後之「文字」變成「數字」
    / B' f3 t* C+ a. E
  1190. turn_cmd(); //檢測是否要旋轉
    . J) T/ z0 S6 g- a7 B0 e" I
  1191. //turn_dsp(); //旋轉狀態顯示% O  ]& T- N4 p2 E
  1192. }
    5 z/ f. V& @5 l- P7 o" q8 T
  1193. CHK_stop(); //檢測是否STOP有按下0 `8 z# E" h) d. Q
  1194. turn_dsp(); //旋轉狀態顯示* |1 M+ ?7 E$ s* \0 \; Z9 l7 ]. q( I
  1195. }4 l* ^" B" {" x5 Q) z
  1196. if(RA1==0) //檢查模式 自動=1 手動=0
    9 d5 f3 A7 H' p, t8 d
  1197. {
    . z! @' `7 b. Q# F' ?+ ?
  1198. dis1[15]='M';/ d! @# {2 Q; N  x' X" k6 E$ q
  1199. rd_M=0;4 {7 R6 B5 A8 M& ~  B/ {) ~
  1200. rd_W=0;
    3 c% I2 Y( B" I, `
  1201. PB_cmd(); //掃描按鍵狀態* n% F( }6 M5 C: }" n7 @
  1202. turn_dsp(); //旋轉狀態顯示) F7 @! o! Z' x, [9 W9 U
  1203. }7 j9 v0 W5 |3 K* n' j

  1204. 9 e/ E& |6 A, {5 ]
  1205.    }2 y+ N/ }# f0 U' j# [4 I6 X
  1206. }0 ~7 Y. }& a7 {3 ^
  1207. ( k. Z6 t/ b# m; ?, a
複製代碼
已有 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 |顯示全部樓層
眼前一片模糊
; e( b0 p. R% K+ b但是還是感謝樓主分享
方位 : 338
台號 : 巴比Q ( B.B.Q )
回復

使用道具 舉報

1

主題

0

好友

150

積分

Hotel

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

發表於 2012-9-28 12:06:52 |顯示全部樓層
謝謝分享喔!! 讚啦* p; s! ?/ X* x: `0 ~$ p! A" d

, |7 Z# q0 t6 U  M; }6 A( gde 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 + d2 x$ `1 w/ }' d
感謝分享,很讚,我目前使用的是一位大陸OM BH4TDV開發的控制盒,接的是舊型Kenpro水平和仰角馬達。 ...
" x3 ], h" g% z) ]
BH4TDV開發的控制盒 是很優秀的產品
' N6 p3 o0 F0 d4 ]* f我本來也是要跟他買的,這次自主開發這東西,其實從頭到尾的花費是高於跟BH4TDV購買控制盒的!/ d/ A* W4 P- h3 n* g  E
(當然是把研發設備都算了進去...單製作控制器是不用那麼貴的!)6 @% a+ n# m! x; @

( z) U) A. q5 r$ a) W7 ?使用原有設備是最經濟的,但是我沒有仰角馬達...所以只能胡搞一通了!!!!- L3 `' M  b1 G# ]# r, L
; i+ h' P5 d- ~
) }/ v% Y, u( S0 n6 S$ r9 ~' \) v
但是就是想自己試試看,真的不行至少還有都洗可以買來用!!!& {; l8 k1 j, S( r$ f5 Y5 ^
在這次的開發中,台北蕭醫師(BM2CAJ)給了關鍵的提示(上位機通訊方式)才能讓這東西生出來!!
403 笨牛「145.78/431.72」

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

使用道具 舉報

10

主題

6

好友

9萬

積分

分區版主

Rank: 55Rank: 55Rank: 55

發表於 2012-10-3 09:30:52 |顯示全部樓層
哈,能自行開發出來很讚呀!
% m5 r% p' P2 m5 O# ?$ ?3 _蕭醫師和您都很厲害呢! :D  
8 _/ C: x- v) i: Y2 v/ n; VBH4TDV 馬工,年輕有為,我的馬達是很舊的二手品,原本是沒有設計可來接電腦的,但在利用馬工的控制盒來改裝使用時,馬工在QQ上很熱心地協助最終我順利可以來利用電腦實行自動衛星追踨。
+ Y$ Q* U) h# V$ p4 C3 ~! P. h6 T2 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 5 N6 P: g6 z9 R3 s' S6 {& |& `
哈,能自行開發出來很讚呀!
5 \8 }1 L. R( Q蕭醫師和您都很厲害呢! :D  
( v1 s: v0 V* ^) TBH4TDV 馬工,年輕有為,我的馬達是很舊的二手品, ...

3 a, F! B* ^( B( E. b" n5 F8 n+ C4 C, b; T傳統的 旋轉/仰角 馬達,輸入到控制盒的訊號反而很單純,就是電壓訊號..
6 l5 p# l2 ^1 x: o如果要攜帶出門,馬工的產品加上能帶著走的雲臺是不錯的選擇!$ I0 z( C& @# d; \8 t
至於 馬工 有用步進電機做的攜帶式設備,我也有考慮過!9 j, M) i- }2 X! {, r- F. v4 }4 k

' m& X5 g$ L$ v' t) Z, V. T但是步進電機(+機械架構)在我這邊不好取得(應該說我的領域不知道哪邊方便取得吧!),所以就暫時擱著了!9 y3 @; w9 E% n$ O( h3 N
其實構想都是人家的,我只是用自己能想到的方法山寨一下...
; L9 k8 k. P; ]7 `8 @
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 |顯示全部樓層
非常讚!
; _; K( p* m- a8 M請問你的雲台是自製? 還是買的? 看來很勇!; w! R2 c0 q2 Q0 Z/ ^; n6 x

) T# }& G- Z( E. e. z1 B) e我的雲台載重 10Kg 最近猶豫要不要改?
* y9 |  I  p3 f4 l  l/ ^) e! r/ j2 I) K3 z' h7 k& J1 a) o. j
73 de BM2CAJ
# t' H2 q  u2 T; a2 U$ i5 J) ?
回復

使用道具 舉報

58

主題

11

好友

11萬

積分

分區版主

辛勤的下层劳动者

Rank: 55Rank: 55Rank: 55

發表於 2012-10-3 14:09:31 |顯示全部樓層
BM2CAJ 發表於 2012-10-3 11:51
, v' s* p" W% E; X4 ~: T非常讚!
9 `' n) {- [, J( i2 q# d* G請問你的雲台是自製? 還是買的? 看來很勇!
  _$ `( f& t! Z  G# I* w
才說要感謝您呢!7 F4 ]. J( i* [; U& R
雲台我目前用的是跟朋友A的....... VICON V330APT 110VAC "閹割版"
' ?$ T7 o: x* l3 Z因為裡面的 可變電阻回授部分都沒有 限位器也沒有回授(只有自保護)...+ V$ U- h. I; ^6 _- Q
; T( n# c% P0 t3 K7 t
完整版的說明書
6 P  f1 i+ Y& s0 }+ f* @" x8 u  ^( A+ k2 b7 E
看資料載重應該是16KG...
9 U! x+ {3 s8 L. x- S
% S; O1 Y: R; [3 e6 P0 Y* s3 c但是我有試過在室內,我人(約90KG)坐在上面腳離地...+ n( x, V4 c& v$ B1 ?: G7 m+ V
旋轉沒問題, 但是俯仰不行 會一直跑掉需要修正!& I+ Z. [+ j! v; V4 [/ K: T2 P
/ x$ Z& M6 ]1 c% {! G% e
73
403 笨牛「145.78/431.72」

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

使用道具 舉報

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

Archiver|手機版|CQ Taiwan

GMT+8, 2019-1-17 08:12 , Processed in 0.863458 second(s), 6 queries , Apc On.

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回頂部 回頂部