CQ Taiwan

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

搜索
查看: 3962|回復: 12

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

[複製鏈接]

58

主題

11

好友

11萬

積分

分區版主

辛勤的下层劳动者

Rank: 55Rank: 55Rank: 55

發表於 2012-9-27 09:07:48 |顯示全部樓層
本帖最後由 BV4WD 於 2012-9-27 09:12 編輯 ! }( @" ?. P) l/ i4 g" `0 _
2 r& N! F; W* d  K# Y0 e
相關資料(PCB,原理,參考資料,編譯器.....)請參閱: T8 Y) _' u6 n6 j* b
, m8 ~* P' l2 g
http://www.bv4wd.tw/diy/controler
/ g& n4 H% D2 K$ }
  {( J  v: g" w3 F. l7 M! u  W2 x4 i4 Y, I& n6 `. t8 l
% ^: I+ p5 K5 \* i  H9 A
' @8 |' T' _8 Y* q- y
3 B4 T% G# x0 ~0 b/ ~% B
  1. 9 r; u6 V' Y: |+ U/ X- x- q7 G0 d: g
  2. /*******************************************************************************   
    % T- W  @4 o+ B' B# f' q# O% \' z
  3. EME(月面反射通訊)/AMAST(業餘衛星通信)用控制器 (核心碼)
    4 ~3 S& N. U1 ^
  4. 利用 控制轉向設備(定向天線) 自動/手動 達成 EME / AMAST 時透過軟件追逐目標之功能
    9 G! l0 w3 u8 J& ?7 z7 _& H
  5. (PCB線路圖,程式檔案在頁尾)% W: W& `9 ]5 Z5 z" d, x
  6. ' x; g6 C$ D0 m$ V, n' C5 |  L! l
  7. 主核心: PIC16F877A
    9 q# U6 D. v+ T" b7 T4 U
  8. 使用週邊:  GY-26  (電子羅盤0~360)[0~3600 通訊]
    . z" @' W, r9 F/ d! q5 n+ W
  9. SCA60C N1000060 單軸傾角傳感器  # j/ F( g9 t+ O1 j! [& N. ^) N- \: R
  10.           (傾角器-90~+90)[0.5~4.5 VDC ] 為了要能偵測超過下限,下限建議至少定在0.8~1左右
    ) q0 O1 G2 b9 y! I3 C8 @
  11. 6 P1 f5 g2 \. V6 t) H3 [  ?
  12. MAX232 (與上位機通訊)2 g0 f" [$ n" O8 K; f4 {
  13. 1602 (液晶顯示)
    . s6 f$ \- p" @8 R) v+ K/ N

  14. % o5 m2 m7 `3 P5 n( ?& z1 w" Q* m
  15. 液晶顯示:  第一行 顯示 "方位角 傾角 自動A/手動M 模式"2 y6 p- l: K+ [0 c3 I
  16. 第二行 顯示 "目前狀態" 左/右/上/下 旋轉"
    " j% m3 R6 G' J

  17. & k& r: y3 @& P+ s: [3 w( I
  18. 支援指令: GS-232A (部份指令)
    ( M# i5 w, T& G
  19. C  //要求 水平角度0 b$ U! B, Z  z0 d5 B  p. `! c
  20. B //要求 傾角5 `# n2 s5 V. F+ b* ~0 B
  21. C2 //要求 水平 + 傾角, n* Y% f* L/ d7 H, p. D: F+ l
  22. M //指令 前往 Mxxx 水平角度xxx
    4 E! j7 _0 W( A7 F
  23. W //指令 前往 Wxxx yyy 水平角度xxx 傾角yyy
    " @8 O4 K& H$ o
  24. S //指令 All Stop: E# E( [( t: P! W% }* y2 a/ t/ W0 r
  25. R //指令 Clockwise Rotation
    ( A. M& a. |  B( ?& C' o! F1 D% z
  26. L //指令 Counter Clockwise Rotation
    + \8 l0 [: n+ s3 i/ k
  27. A //指令 CW/CCW Rotation Stop
    / n! T; y* P' y$ B
  28. U //指令 UP Direction Rotation
    ; x. t. ~- A8 C: J( b. D8 D, M( O
  29. D //指令 DOWN Direction Rotation' q5 b5 [2 y8 E) d/ `/ }
  30. E //指令 UP/DOWN Direction Rotation Stop7 k' F( v8 P5 c, t1 A1 ]# j

  31. " U/ l  D' ]" o8 }
  32. I/O定義:
    9 L' P/ A; A" ~) z, k2 \
  33. 定義  TRISx 1為輸入/ 0為輸出 / x 為未始用(1) (TRISA只有6個Bit)
    $ F3 }4 U+ D8 \: ]8 x
  34. TRISA x x 0 x 0 0 0 1 <--- Bit0:傾角電壓輸入 /Bit1:手[自]動(接地=手動) /Bit235:上下左
    + t, y* O/ _0 `  O! _" Q: X% L5 s
  35. TRISB 0 0 0 0 0 0 0 0 <--- LCD IO 輸出
    7 ?% ~& T8 F2 n* J' o
  36. TRISC 1 0 0 0 0 0 0 0 <--- Bit01: 停右 /Bit2:PWM輸出/Bit34:I2C總線/Bit6:RS-232TX輸出/Bit7:RS-232RX輸入$ Y& J  G& r* m. a4 r
  37. TRISD 0 0 0 0 0 0 0 0 <--- Bit01267:R.L.OUTPUT / Bit345:LCD command& @, W; T3 Y+ J0 z; X* Y

  38. - l+ Y, r! f3 L+ J
  39. 定義 PORTx 1為高電平/ 0為低電平 / x 為未始用 $ L& A9 u2 s7 ~' Y
  40.       (TRISA只有6個Bit)電壓輸入口設低電平/其他需要改變狀態(拉成低電平)的設成高電平/再其他亦可都設成高電平1 W7 y4 `# ^5 d
  41. PORTA x x 1 1 1 1 1 0 <--- Bit0:傾角電壓輸入 /Bit1:手[自]動(接地=手動) /Bit235:上下左輸入! M$ j. B* \& ~. k* `; y/ }
  42. PORTB 1 1 1 1 1 1 1 1 <--- LCD IO 輸出
    7 ?5 ^8 c  s, ]
  43. PORTC 1 0 0 0 0 0 0 0 <--- Bit01:停右輸入/Bit2:PWM輸出/Bit34:I2C總線/Bit6:RS-232TX輸出/Bit7:RS-232RX輸入  j" w- X3 C1 E/ o- O, G, J! n5 Z
  44. PORTD 1 1 1 1 1 1 1 1 <--- Bit01267:R.L.OUTPUT (高電平 = 1 = 不動作 )/ Bit345:LCD command  ^6 w8 b9 a3 b) E

  45. / k& y. m( \0 P6 b7 G) P( x0 J2 D
  46. 接線注意 :  控制雲台轉向的繼電器實際接線時,
    / [# y6 H' c4 B2 k
  47. 將110V電源其中一線接到 上(COM) 再將 上(NC)->下(COM) 以此類推 ->左-->右( E: V: [: p  p' v+ k$ u
  48. 這樣可以防止萬一繼電器同時動作時,110V的控制電源同時輸出(雖然程式有保護了,還是要有硬線防呆!)
    ! \5 P( e: @0 s# C' |
  49.                PS.控制線接在NO
    7 g9 D: X/ O. l* w) n- N9 V/ u
  50. 3 e# f9 r9 N6 ?: i( [
  51. 維護記錄:  2012-07-20
    + Q9 w' @  O$ G: j
  52. ***************************************************************************************************/
    # r! ~; c! B8 c" s- ~: J* Z
  53. #include <pic.h> //頭文件在HI-TECH安裝目錄下\HI-TECH Software\PICC\std\9.60\include$ ~  a$ a, z  w) M* D& Z# C( A5 D% a
  54. #include <stdio.h>/ J" ~9 Q4 t2 \6 v4 Z
  55. #include <string.h>
    ) D3 G- u( Q0 X/ A  E7 ?3 g

  56. ; O+ X- S" r! E! v; }( f5 @+ P
  57. #define uchar unsigned char
    $ r  `& S# c. h4 e  k
  58. #define uint  unsigned int
    . V1 i, @' e# Z
  59. #define GY_26_ADDR  0xE0 //定義電子指南針器件地址(出廠默認為0XE0)
    : @1 W* T! H) J# k2 w, {- r
  60. #define rs RD5           //LED 命令/數據選擇: ~8 H% S$ P- n8 B/ \
  61. #define rw RD4           //LED 讀寫口
    % @& o# [& ~* P8 @  ^1 V
  62. #define e  RD3           //LED 鎖存控制
      G0 y6 a/ J6 L
  63. #define Dataport PORTB   //LED 數據口定義
    9 `9 `- B$ i" ]3 X6 q4 o! Y

  64. & a9 K( V+ p* L' U8 M8 S' E* N
  65. void delay_20us(uint nus);
    & e1 k! [& f; {& |; h$ s- i
  66. void mcu_init(void);
    " s: P/ t2 G* ^
  67. void nms_delay(uint nms);  z' _: W  n5 s/ }
  68. uint  get_GY_26(uchar read_begin_address,uchar GY_26_cmd);
    5 J' o5 K, D3 ^) p
  69. uint  get_AD(void);
    & t: p8 i8 U$ u/ r
  70. void  conversion(uint i);
    2 X, P% {8 ?/ n, v9 D! v4 A# f
  71. void  cmdIU(uint i);
    % o, B5 J. n2 d  ?" d, f: N/ |
  72. " @( _7 b+ C: a/ l" \" V' p5 W) D
  73. //iic使用函數********************************//; m4 y+ N1 v% i1 r3 h/ J' x
  74. void   iic_Start(void){SEN=1;while(SEN);}    //啟動iic
    2 a, i- `/ ]) D4 _7 h+ h
  75. void   iic_Stop (void){PEN=1;while(PEN);}   //停止iic2 ^  T0 D" L+ l1 A
  76. void   iic_rest (void){RSEN=1;while(RSEN);}  //重啟iic
    # O  ?$ C% E4 J7 I
  77. void   iic_Write8Bit(uchar x){SSPIF=0;SSPBUF=x;while(!SSPIF);SSPIF=0;}//向iic總線寫8bit數據               
    ; R1 p: ?* m- s0 {* W  p* ]
  78. uchar  iic_read8Bit(void){RCEN=1;while(!BF);ACKEN=1;while(ACKEN);return SSPBUF;}//向iic總線讀8bit數據 : M+ R% ~, E! O
  79. //****LCD定位點*********012345678901234567***************//
      ^5 a! E" T) Q/ F, W$ j# ^/ i7 }
  80. bank2 uchar  dis1[18]={"---- BV4WD -----\0"}; //顯示兩行: m6 n% \& Z  G3 R. r6 e
  81. bank2 uchar  dis2[18]={"-- Waitting ! --\0"}; //開機預設的顯示畫面,等待雲臺離開死點後進入程式會刷新0 j# @% J) ]% J$ x  u  w% n
  82. bank2 unsigned int CMP_DATA;# b% W4 u8 ~2 z1 I% H1 R% @
  83. bank2 unsigned int result;0 o5 S, z6 P  c) Z" O) q. m
  84. 9 B; c% I2 E9 X6 Q* o4 D$ m
  85. bank3 uchar disAZ[14]={"+00000000000\0"}; //水平/ F% P7 }2 _' e+ j
  86. bank3 uchar disEL[14]={"+00000000000\0"}; //傾角# C6 |/ Q9 U6 X4 [
  87. bank3 uchar disAZEL[14]={"+0000+000000\0"};  //水平 + 傾角! Z9 j, d3 A0 M2 G- p/ T- E- L
  88. : K4 T' o% ?1 g4 W
  89. bank1 uint AZ; // 檢測到的目前 水平角度
    1 y7 N/ D4 Z( r: `
  90. bank1 uint EL; // 檢測到的目前 傾角. P4 F/ P! D9 ?- m5 |
  91. bank1 uint cmd_AZ; // 指令 至 水平角度0 O* u0 L- y" c1 h4 W# ?2 Z+ D" n! a
  92. bank1 uint cmd_EL; // 指令 至 傾角' G( r9 k# J( h1 h. h+ }
  93. //**************************************以下僅做旗標用***********//
    + R2 ^4 g% `; Q; O  X
  94. bank1 int rd_AZ; //要求 水平角度0 ]2 m$ x* b0 \! i
  95. bank1 int rd_EL; //要求 傾角' u2 }* X, i& W7 a* T( J  J7 J
  96. bank1 int rd_AZEL; //要求 水平 + 傾角
    & [  O- D& f3 u; u: Z6 r6 ?4 W
  97. bank1 int rd_M; //指令 前往 Mxxx 水平角度xxx, X- ~  X( d7 l/ h  e
  98. bank1 int rd_W; //指令 前往 Wxxx yyy 水平角度xxx 傾角yyy
    % O* A5 D9 Q! ?  \! {" \9 F# N
  99. bank1 int rd_S; //指令 All Stop
    / t. e9 }1 _+ k* d7 e3 I: `" o# m
  100. bank1 int rd_R; //指令 Clockwise Rotation1 ~- n$ c4 G3 Z8 _+ ]1 E
  101. bank1 int rd_L; //指令 Counter Clockwise Rotation
    # f9 n' k7 E0 F' O5 W: Y) Y
  102. bank1 int rd_A; //指令 CW/CCW Rotation Stop
    . v. F7 c2 y, i& T3 F) K
  103. bank1 int rd_U; //指令 UP Direction Rotation
    8 r5 s  q8 Z9 O# Z, C; R* S
  104. bank1 int rd_D; //指令 DOWN Direction Rotation/ C" N/ P: S  y
  105. bank1 int rd_E; //指令 UP/DOWN Direction Rotation Stop
    1 x( ^- n( [; q9 h. l) u
  106. //**************************************以上僅做旗標用***********//
    ! p! J* e  e; a

  107. , I$ z5 O. T% z; [8 S  v9 `
  108. //***********以下變數使用 BANK1 *****************************& j; s' y5 x! C6 K
  109. bank1 int RecTemp; //rs-232資料讀入暫存3 J8 z) ~6 z; F( r
  110. bank1 uchar RecArray[12]; //將 RS-232 命令 寫入EEPROM用字串介面
    & C8 L) y. a3 A

  111. 4 c9 T- u0 n5 Z, o4 S0 c! T5 b

  112. 5 a$ T; e! |) l/ C+ U! B0 F  U* V3 b
  113. //*********************************************  z% T; M- {" k4 N* i) i/ i
  114. //數據轉換,十六進制數據轉換成10進制 7 G4 V2 i+ w3 _; v# t  a8 Y- S
  115. //輸入十六進制範圍:0x0000-0x270f(0-9999)
    & L! k5 E1 ~% c* M3 K
  116. //結果分成個十百千位,以ascii存入顯示區2 ]# R7 ?4 f' q
  117. //**********************************************5 |7 @; D$ u% E' d( ~- L
  118. void conversion(unsigned int i)  9 h9 B' `4 n: w4 W
  119. {7 C) b& F6 z- o

  120.   Z" X- \: l) [- ]& [$ {. d
  121. unsigned int j;
    ) H4 ~7 M! f$ R6 Y( T  {
  122. j=i; //將j=i 使用 j 做PWM運算: F( `) D. c' F+ ~2 R; c
  123. AZ=i/10;9 N5 P; i- N! A1 N

  124. 7 U3 ?& l4 j! J, U! Z" q
  125. /* 不需羅盤0~360度 轉 PWM 0~5vdc 時, 本區關閉 節省資源5 Q1 A; e' q2 e8 P9 C& ?
  126. PR2 = 0b10111110; //經實測 PR2/T2CON/CCP1CON 使用固定數值$ n( P) _/ ~. }3 _, D6 g  V. S
  127. T2CON = 0b00000100; //CCPR1L從 0~190 大約可對應 0~5vDC輸出
    7 B, I0 h# R: @. P  n: D# L9 ?; v) {- M, b
  128. CCP1CON = 0b00111100; //j=0~3600 3600/19 =189(取整數)
    ( C  b; ^$ s$ [% ]9 ?9 t1 L
  129. CCPR1L =(j/19)+1; //189+1=190 ;+1之後表示 0度~2度會有 "1", z2 D& F' A" l/ S0 @. G: j2 j! E
  130. //所以精度大約為2度(後面定位時會可採用+/-2度及算定位完成)
    1 F. b, S$ c: \* \* m+ ]
  131. */
    % [. Y2 `2 S8 Z9 \
  132. - n1 |. O/ e8 _. M: f
  133. dis1[3]=i/1000+0x30; // i : 取自電子羅盤的角度
      l& w4 V9 U1 g; N' z3 l0 G
  134.     i=i%1000;     //取餘數運算, o* W* J' a' J
  135.     dis1[4]=i/100+0x30;
    / M+ `! H1 n- l% D' z# u8 b
  136.     i=i%100; //取餘數運算
    , `& Y* h/ {. L% R5 B" O- G
  137.     dis1[5]=i/10+0x30;
    ( y5 ?1 y3 i; v
  138.     i=i%10; //取餘數運算1 B" I/ I* C' m5 R
  139.     dis1[6]=0xDF; //(度)
    6 X5 O8 ]& E- N. b
  140. . p8 p  U, [4 }8 k% B7 v4 u/ @' k
  141. //*************************************************************4 B( ?; f9 |1 O3 {8 }) {- |& X* h* W
  142. //這是電壓顯示部份,不顯示 不需運算
    ( {- X5 |% W% i! }
  143. //*************************************************************
    $ X, V/ j, v( E/ ~' P. k7 ~# R
  144. /*顯示 羅盤0~360度 轉 PWM 0~5vdc 時,的理論電壓值& D8 r# x3 i% V
  145. j=(((j/19)+1)*100)/38; // j : 計算出來的理論電壓6 m1 ^3 d' F7 Z! ?# a2 X
  146. dis1[10]=j/100+0x30;
      Q7 e* c4 ]1 r6 [  ]; y; I
  147.     j=j%100;     //取餘數運算
    : `* Z8 P: Q2 ?6 M$ V  }- K' a
  148.     dis1[11]=0x2E; //.(小數點)
    $ V+ F% |- Q3 K. k4 h8 R
  149.     dis1[12]=j/10+0x30;! R1 \, G  m2 }" E/ E
  150.     j=j%10;      //取餘數運算% P4 \0 X7 ]+ ^8 u
  151.     dis1[13]=j+0x30;  L0 r9 h. N! _6 B
  152.     dis1[14]=0x30;$ l" m+ w! b; y, Y/ `
  153.     dis1[15]=0x56; // V
    # Y5 c( s8 n& ~/ }4 D

  154. % g" N4 l1 n1 Q, a  V
  155. //以下是 計算/顯示 至 小數位 但無意義
    , b5 Y' d% R6 m  A
  156. dis1[3]=i/1000+0x30; // i : 取自電子羅盤的角度
    ; |5 K1 p1 [, W& ~
  157.     i=i%1000;     //取餘數運算* B1 \) i- B3 {
  158.     dis1[4]=i/100+0x30;
    ; Y' r5 C/ @0 r' q
  159.     i=i%100; //取餘數運算' W8 e5 f4 Y2 W$ F+ K5 D, C2 X& L* r
  160.     dis1[5]=i/10+0x30;1 P) V- B: n! s! X6 s5 B5 J' W
  161.     i=i%10; //取餘數運算; L' C* }2 T" v8 Y( k$ y% {6 B
  162.     dis1[6]=0x2E; //.(小數點)6 R# _& w! h% T! E3 G. S9 K. T
  163.     dis1[7]=i+0x30;
    ! t, y! f0 B* c3 E5 ?! ?2 C
  164.     dis1[8]=0xDF; //(度)3 t) g7 C4 v8 ?) p1 H9 n$ Q+ O* S
  165. */9 w3 H- K0 z+ T/ H. Z" k

  166. : }3 i- R% D) m' J
  167. 2 f) M; Z, n4 w8 B

  168. * K) q! R0 {) A7 U0 w9 N- P
  169. //*****************************************: L5 F# _; r. F; F" H
  170. //將水平 度數值放入暫存區等候RS-232 調用 # B( {2 `2 S+ ^. R; C3 r2 K5 I" V
  171. //*****************************************- K3 E6 O4 {, b

  172. , `* D( k4 Q# O. m9 J' E+ {7 N
  173. disAZ[2]=dis1[3]; //水平角度 百位
    / U. q  z! x) [7 r7 n  f: S
  174. disAZ[3]=dis1[4]; //水平角度 十位( Y4 C+ a! N; x7 Z0 s  M1 _" S
  175. disAZ[4]=dis1[5]; //水平角度 個位
    3 p5 [$ b- b7 L# \+ o2 m# y

  176.   g. `$ c% f% H  G5 ^( k
  177. //*****************************************4 O& \" i" M3 }5 D
  178. //將水平 + 傾角 角度放入暫存區等候RS-232 調用 / Z( ^" ^4 N0 Q% ^8 B$ A
  179. //*****************************************/ T" f9 J) g' q# d
  180. ) n  f0 B2 \9 B+ o3 B
  181. disAZEL[2]=dis1[3]; //水平角度 百位
    " G8 M! J- f9 X8 u% _. _0 H5 Q
  182. disAZEL[3]=dis1[4]; //水平角度 十位9 z9 ~7 Z6 [# n6 T
  183. disAZEL[4]=dis1[5]; //水平角度 個位/ P% P! G  ^: P: z4 H/ q

  184. 9 {& f( f3 j$ J8 p' x
  185. }
    . D  a! H8 c9 M3 Q4 L
  186. / q; o: u& Z4 h
  187. //**************************************************************************************************! S$ Z( r+ M3 k+ d( F
  188. //數據轉換,AD轉換結果
    8 v% p3 M( ^$ m, P
  189. //輸入十六進制範圍:0x0000-0x03FF(0-1023)
    7 k# j, F0 p2 Q6 U, E( t) d
  190. //結果分成個十百千位,以ascii存入顯示區9 V* Y% N8 V3 F5 _: R, Y
  191. //**************************************************************************************************# C! W3 i4 ^- Z* a' q7 m
  192. void conversion2(unsigned int d)  5 k4 b' r3 [, m
  193. {  W, c; j8 B9 T2 u
  194.    int  ad1,ad2,ad3,ad4;        //定義6個AD轉換臨時變量 整數常數 int 佔有 16 個 位元7 m: G" k/ ~% A4 i5 U
  195.    //float temp,temp1; //定義4個計算臨時變量 浮點常數 float 佔有 32 個 位元
    4 x: v9 W' w. n
  196.    float temp,temp1,ed1,ed2; //定義4個計算臨時變量 浮點常數 float 佔有 32 個 位元0 s% {# r4 c8 Y* L  J$ o- x0 o) n
  197. temp=d*5.0/1023; //暫存AD轉換的結果 10位AD 2的10次方=1024
    ! M& e/ \- a' [8 W# L. u
  198. temp1=temp; //將數值暫存 temp 計算電壓 / temp1 計算角度2 [; x; {* O2 a* \8 k, \  x. q
  199. ad1=(int)temp; //計算輸入電壓; q/ Z: b. r# v( J4 R& H" f5 T
  200. ad2=((int)(temp*10)-ad1*10);
    / @) A4 L; I$ P* M: Z" @2 L
  201. ad3=((int)(temp*100)-ad1*100-ad2*10);
    2 q3 g( f% L, ~/ ]* h0 r$ ?; q
  202. ad4=((int)(temp*1000)-ad1*1000-ad2*100-ad3*10);$ C$ z% H7 u7 R4 H7 y
  203. //*************************************************************
      E4 L# u  M% Y# F% n
  204. //這是電壓顯示部份,不顯示 不需運算
    ( a# N4 S7 b  k) v1 r, _
  205. //*************************************************************
    , X! g. M& G" {7 Q
  206. //dis2[10]=(int)temp+0x30; //顯示 個位
    ! c- U) z3 _- M/ u" U
  207.     //dis2[11]=0x2E; //.(小數點)4 |8 X" ~- n! a0 s
  208. //dis2[12]=((int)(temp*10)-ad1*10)+0x30; //顯示 小數第一位  K% c0 y- n5 B; [; S; y* J' Z
  209. //dis2[13]=((int)(temp*100)-ad1*100-ad2*10)+0x30; //顯示 小數第二位; }+ }+ d. p1 D6 i7 e. u$ e8 A. b" P
  210. //dis2[14]=((int)(temp*1000)-ad1*1000-ad2*100-ad3*10)+0x30; //顯示 小數第三位
    1 m! Z. V% V' }  x+ ~
  211.     //dis2[15]=0x56; // V( c  o2 h1 v1 L7 P( g5 c
  212. //EEPROM_WRITE(0x08,0x01);% B( F; V. n8 h/ L  s7 y' ~9 F) z
  213. //EEPROM_WRITE(0x09,0x04);! }: J+ I% m7 D: f
  214. //********************************************************************************7 ]2 n* g4 G0 T2 [  \0 M
  215. //(傾角器-90~+90[共180])[0.5~4.5 VDC ] 為了要能偵測超過下限,下限建議至少定在高於0.8v
    % n( v$ [) t0 `2 A! U
  216. //4.5-0.5=4 4/2=2 (VDC)<--只取中間90度用 下限取1.5v/上限取1.5+2=3.5V/中點2.5v  c, T& J' @4 \2 U' e
  217. //********************************************************************************" [, w( ?) O, Z% [! k1 o- l/ s+ C
  218. ed1=1.5; //電壓下限 0度 # J* D/ {( B8 Y2 I9 {
  219. ed2=3.5; //電壓上限 90度
    , D( `7 T& B8 f' q" i
  220. //*************************************************************
    ; i' V. [! c/ v( U& \
  221. temp1=(temp1-ed1)*(90.0/(ed2-ed1)); //計算角度 0~90
    # d2 ^/ C$ i, Z  }! W: |! h
  222. EL=(int)temp1;
    8 B7 i9 o0 T3 S7 n/ e
  223. ad1=((int)(temp1/10));     //十# U- R/ y" @+ z" g
  224. ad2=((int)(temp1-ad1*10)); //個( J! e4 O9 t0 [1 x' t7 R
  225. ad3=((int)(temp1*100)-ad1*10-ad2); //小數
    / O3 E- R3 M* r1 F: X
  226. - |, e0 S# s" ]" }8 s
  227. dis1[11]=((int)(temp1/10))+0x30; //顯示 十位3 f. a2 B* U8 g  ^# ~' T; ]
  228. dis1[12]=((int)(temp1-ad1*10))+0x30; //顯示 個位 ) C2 g# }$ ~' [) b$ [4 o
  229.     dis1[13]=0xDF; //(度)
    6 b3 r3 A0 ^# [0 n
  230. : C% I, R0 {7 g6 f, Y* T8 ]9 g+ w
  231. //*************************************************************
    ' L2 P/ b% `& S, d) S9 \/ n
  232. //可計算/顯示 至 小數位 但無意義
    & p/ e. h% B( Q
  233. //*************************************************************
    8 I$ m; v$ G1 h3 n2 O1 z1 `$ U
  234.     //dis2[6]=0x2E; //.(小數點)
    0 J* E  N, u' A( ^& v) y
  235. //dis2[7]=((int)(temp1*100)-ad1*10-ad2)+0x30; //顯示 小數第一位4 F. Z3 b  M* Q& ^: X
  236. 0 ^: U  V' p0 k

  237. . P6 ^3 @! s& ?9 g
  238. //*****************************************
    # S: z, f' ~1 W* Q
  239. //將傾角 度數值放入暫存區等候RS-232 調用
    ! t  U* F0 w. K  l- F5 v0 N* @
  240. //*****************************************
    ; ?! O8 R' q6 C, ]/ y! ?& ?
  241. . L3 d" c; m1 C, p, b
  242. disEL[2]=0x30; //水平角度 百位6 A) S! H% W% X6 P
  243. disEL[3]=dis1[11]; //水平角度 十位
    4 m4 D- }+ x1 e
  244. disEL[4]=dis1[12]; //水平角度 個位/ e& ^! d+ r( Q2 ^" Q
  245. ' C: ^3 t: @: Q" i

  246. 2 W, T( W! ^3 ^0 Z3 g8 E/ s3 w
  247. //*****************************************
    1 z+ D7 j- L/ d2 }9 K) x
  248. //將 傾角 角度放入暫存區等候RS-232 調用   x) _% V! ]( W( s3 M: x
  249. //*****************************************  `- E1 m# }3 e  \7 q
  250. disAZEL[7]=0x30; //傾角角度 百位+ X$ U- k$ C0 Y) G
  251. disAZEL[8]=dis1[11]; //傾角角度 十位
    1 m/ ]. n. `# B1 U7 }: q; G+ b9 `
  252. disAZEL[9]=dis1[12]; //傾角角度 個位" G0 S$ y& w! [

  253. 7 a9 N8 J) h9 V- l7 x9 A
  254. ; L9 {9 {6 N! Q& r3 O6 Q
  255. if(temp<ed1) //當輸入電壓低於 電壓下限
    0 N$ ^4 v! w: a, J; r
  256. {
    7 Y2 @2 Z: q3 M7 O
  257. disEL[2]=0x30; //傾角角度 百位 設0
    ' b# q# j9 O: k
  258. disEL[3]=0x30; //傾角角度 十位 設0
    1 L% Z9 \( y! {& W3 ?
  259. disEL[4]=0x30; //傾角角度 個位 設0
    , b+ {$ V3 V$ X0 b* F! g7 O8 c

  260. 0 A( e' `, M; n; i& x
  261. disAZEL[7]=0x30; //水平+傾角的 傾角角度 百位 設0. ^& \3 K$ E& v
  262. disAZEL[8]=0x30; //水平+傾角的 傾角角度 十位 設0
    9 K) @' K9 K( x
  263. disAZEL[9]=0x30; //水平+傾角的 傾角角度 個位 設0
    : w& g; f8 K8 V

  264. - v- |9 ~+ j8 z  q' L
  265. dis1[11]='L';+ e" m, y9 L: S( C, ?
  266. dis1[12]='o';" k0 X8 a7 L- F! m; b$ A! B: P
  267. }
    # S) h# P4 c( `2 S: \
  268. 7 ~% }/ [$ M: {& \- C6 O' O& [
  269. if(temp>ed2) //當輸入電壓高於 電壓上限
    : _) z# |, y, E) @: }: ]
  270. {5 r4 q4 _8 _3 K4 O" P+ n3 R: Q0 M
  271. disEL[2]=0x30; //傾角角度 百位 設0
    " Y7 k- p" i  @7 i# V! ^' v8 _
  272. disEL[3]=0x39; //傾角角度 十位 設90 v# Q) `; K: ]# m& r+ k; W& F
  273. disEL[4]=0x30; //傾角角度 個位 設0
    ; u6 I$ Y/ M) z4 D8 n# ]

  274. ; u7 |% V2 [; s; U. C
  275. disAZEL[7]=0x30; //水平+傾角的 傾角角度 百位 設0
    9 Q! Y5 X$ X+ z, \, a/ T: [
  276. disAZEL[8]=0x39; //水平+傾角的 傾角角度 十位 設94 Z) O, a6 U% z: E; J/ }
  277. disAZEL[9]=0x30; //水平+傾角的 傾角角度 個位 設03 x# m; S# e+ M" ~0 B  o

  278.   e/ r7 f0 D; k) j1 Q
  279. dis1[11]='O';0 }  U+ r7 |9 o7 W5 o* o
  280. dis1[12]='v';
    ( l9 _: L4 V* G8 o
  281. }
    $ Z( t2 [1 c% z2 Z/ d

  282. , g2 }! E$ r8 l+ n$ a& q

  283. : F# y9 _6 K. {: Y. E. d

  284. 6 d& A1 x" A" |2 h1 i
  285. 9 Y0 T" I# b5 y% Y
  286. }
    ) u1 n* c5 g3 D3 U
  287. : ~: F: B" a' V- J- y7 F+ _
  288. //**************************************************************************************************
    * E) O) c1 m: w: `) t" u
  289. //數據轉換,ascii 轉換成 十六進制數據
    9 Q) }( B% p, H5 [
  290. //**************************************************************************************************
    ' q5 K1 Y' J, a3 z* R
  291. void con_WB(void)  
    0 E6 I4 o4 x* H' r' w+ V
  292. {0 @, M& @  ?& y' h6 H* N
  293. unsigned int k,p;
    $ }' d/ k9 X' ?2 \, k
  294. k=0;' E/ e2 d/ N% k0 Z$ E9 G
  295. p=0;
    ! Y; b+ r; n$ q4 m
  296. k=(RecArray[1]-0x30)*100;
    ! h" v6 C& ?/ [7 S
  297. k=k+(RecArray[2]-0x30)*10;
    " w) S0 A) [; c3 r) p/ I
  298. k=k+(RecArray[3]-0x30);
    , m8 V0 a) W8 e$ \) j' n4 P0 T& ?- }
  299. if(RecArray[0]=='M'|RecArray[0]=='W')0 ?2 z; d5 c8 S( ]
  300. {
    7 s* x7 R" V2 [0 {# n. W
  301. cmd_AZ=(int)k;
    ' U! ]) ~/ ^. v0 g" O) U
  302. }
    $ ]1 ~  z3 \8 @+ o* f$ z
  303. /*
    $ {. `8 g; ?1 C) T0 B/ b
  304. if(k>=0xFF) //寫入 EEPROM 需耗費時間較長 不需要時不寫入
    $ S/ m, A1 J4 i6 {9 }' O
  305. {
    7 p. L5 [2 m9 h! j5 M
  306. k=k-0xff; //大於 256
    % V" u* Q& ~- o9 q4 `- j$ \
  307. EEPROM_WRITE(0x00,0x01);         //寫入 水平數值 高位數 至EEPROM 位址0x00
    , y( ^) g! q8 h/ q
  308. EEPROM_WRITE(0x01,k);            //寫入 水平數值 低位數 至EEPROM 位址0x01
    " u6 R4 V- g+ R. D, m
  309. }
    % H" d0 l) R" D+ ?# o. g* h0 z( q
  310. else+ z" s& X" O# ]$ g7 Y' S, e5 G
  311. {7 i& Y; O+ K9 P+ w
  312. EEPROM_WRITE(0x00,0x00);         //寫入 水平數值 高位數 至EEPROM 位址0x00
    " P" D- t& m+ S2 v# t
  313. EEPROM_WRITE(0x01,k);            //寫入 水平數值 低位數 至EEPROM 位址0x01
    4 }6 {+ ^" M8 k# G) d+ r  I
  314. }6 u; n, Y) }7 y' ~& q& E6 @( I1 Q
  315. */
    1 [3 y: I# F& G; U/ X; v
  316. if(rd_W==1)
    8 e2 v* A; ~" l0 Q8 q
  317. {
    5 p# \2 t4 s. }) q
  318. p=(RecArray[5]-0x30)*100;
    1 l7 i: a; e' G" q8 e; a, Q  i
  319. p=p+(RecArray[6]-0x30)*10;
    + }0 Y3 L# T7 G: z* y; b
  320. p=p+(RecArray[7]-0x30);* b' z5 O2 D$ a0 g+ ~
  321. if(RecArray[0]=='W')
    8 h! P6 b8 W( E# e3 `  D
  322. {
    5 w  {+ _: I  W* C! ^) V
  323. cmd_EL=(int)p;
    + `* I/ R. Y# R0 t# F/ Z, d6 T
  324. }
    6 W4 J% e+ t6 W1 `: G  j
  325. /*8 O, H- {0 @3 y9 f
  326. if(p>=0xFF) //寫入 EEPROM 需耗費時間較長 不需要時不寫入
    . j* X! S; }2 @$ K$ N
  327. {$ P2 h0 H/ f& t4 g5 J! e  u
  328. p=p-0xff; //大於 256
    ( p0 d$ q* A5 @" q4 j( G
  329. EEPROM_WRITE(0x03,0x01);         //寫入 傾角數值 高位數 至EEPROM 位址0x03
    2 e( X% i- B2 Z4 M& h& F/ s! v
  330. EEPROM_WRITE(0x04,p);            //寫入 傾角數值 低位數 至EEPROM 位址0x04" X7 R# _2 i$ D( v  e* @
  331. }
    " |: p+ @" W& z* P2 g, T: _, e
  332. else
    % p: |$ o/ J6 e7 G  Z# v
  333. {  c* `. ]3 [7 M8 g* o5 o
  334. EEPROM_WRITE(0x03,0x00);         //寫入 傾角數值 高位數 至EEPROM 位址0x032 j. A2 y0 W. o3 N8 \( v
  335. EEPROM_WRITE(0x04,p);            //寫入 傾角數值 低位數 至EEPROM 位址0x049 J8 _! W% }# P8 u' L) C: f
  336. }( l0 N- k3 N7 C  J
  337. */
    2 n5 e# ~1 |" ~3 f3 M
  338. }& ]' |7 }: R, Q

  339. 2 W8 M0 \+ E3 ^5 g0 @7 |0 Z+ G$ P
  340. }8 Q0 |7 o0 L# F' w3 U
  341. ( o- Q& {2 J! c0 w& y) n. @
  342. ) L! L: z  a( {* O( Z3 m0 T
  343. //**************************************************************************************************
    & F$ H( K' Z: B) j
  344. //單片機初始化$ p5 U& m: t4 B+ R9 \# u
  345. //**************************************************************************************************
    : I& D" C2 D0 Z. E# p

  346. & ]- \' m$ p0 m3 m& Z: E
  347. void mcu_init(void)( [" e" A& |% s2 J# t% l7 A
  348. {' b+ R+ B# z2 `
  349. //TRISC=0x80;             //IIC通信引腳設為輸入
    , q+ b9 V! ~$ W& D2 K, [
  350. SSPSTAT = 0x80;         //IIC設置6 c) T6 k6 ~3 X/ y! `
  351. SSPCON  = 0x38;         //IIC設置9 b" }2 i  p( o0 Z* y: X! C0 V
  352. SSPCON2 = 0x00;         //IIC設置
    7 n* b) d0 x( [2 C
  353. SSPADD  = 50; //IIC設置                 : L4 d$ Y+ [7 E! E3 d7 k
  354. }
    ; A! c# e( c" C) B
  355. //**************************************************************************************************
    ; H$ x0 s+ a" m. G# f& }
  356. //延時大約20us- P8 e% d. a1 l7 X
  357. //**************************************************************************************************
    & H* n. f4 w# L/ [# u8 k9 ?5 i
  358. void delay_20us(uint nus)9 p4 V' c8 z( `! ~3 C
  359. {  uchar i;
    # e7 q" t) C! L, {) v
  360.    while(--nus){% o( K! S. Q  e$ z! r3 k6 {- _, e6 ^8 ^
  361.    for(i=2;i>0;i--);& Q* c, R* P6 T4 E5 s3 @1 ^
  362.    }        
    : Q6 |2 M% D! i& v5 t
  363. }. n; E2 n7 [$ E4 `6 z
  364. - ]. T5 Q6 ?7 ?! X
  365. //**************************************************************************************************7 f: B. ?  k) c  D% l9 ]6 }
  366. //延時大約1ms
    , a& b/ [" C( C6 g
  367. //**************************************************************************************************' E# c2 u3 k& ]" G' J4 e
  368. void nms_delay(uint nms)
    3 m. x3 P7 c& P- I
  369. {1 b6 L, A% a2 P+ }3 i
  370. while(nms--)
    % o2 m# }! Z' M2 U! {7 w
  371. delay_20us(50);
    + n* T/ C* }( N
  372. }3 r: Q4 d; w' L( @9 w( m

  373. 5 K  w7 N" g) h& i+ ?9 {  A
  374. //**************************************************************************************************
    - u1 w1 E9 W, R) E- W  r
  375. //延時  g  v. }' D$ _8 ^$ C) j( ]! y
  376. //**************************************************************************************************
    # I3 U' F* k, l
  377. void delay(uint time)* ^: f: w% Y1 }% b/ g9 U5 i
  378. {; z/ v+ P! ^( ~1 N
  379. uint i,j;5 ^5 z6 c# u8 D6 W' J6 ?
  380. for(i = 0;i < time; i++);
    * K* g& y$ b6 w8 q% m7 Z
  381. {
    5 m* l5 Q' {" S+ M# ]
  382.     for(j = 0;j <30; j++);
    & z7 I& o+ W8 b8 E3 m
  383.     }' @* f3 m- m( ~% }
  384. }
    + @1 i2 n5 C: Q
  385.   i; p- D) z. K! L$ U7 {' Z

  386. ' o* w# P, e( s5 Y
  387. //**************************************************************************************************
    1 P7 V# _7 c5 {" F
  388. //從IIC總線獲得電子指南針GY-26數據
    0 h0 r# c1 y4 s# t3 {2 f
  389. //從開始地址連續讀出兩個8bit的值,併合成16bit數據
    5 v, H6 I7 }; e7 r  z: S
  390. //**************************************************************************************************
    , y# S/ M& C* @7 m% Z5 u2 }* ]
  391. uint get_GY_26(uchar read_begin_address,uchar GY_26_cmd)0 d( H  V; W# e: ?) p$ v
  392. {
    * H, b, }+ C7 u
  393. unsigned int temp;) K3 V- }- t# S1 N
  394.     iic_Start();                        //iic啟動時序
    & D- |- H8 R: T" @" m4 I; G# ]! j
  395.     iic_Write8Bit(GY_26_ADDR);          //寫指南針器件地址
    9 t; S+ m" T& S9 O0 i
  396. iic_Write8Bit(0);                 //寫命令
    - t/ ]$ G& d" C4 P! `/ w
  397.     iic_Write8Bit(GY_26_cmd); //寫指南針命令
    # D$ \8 U  Q8 c3 R; m
  398.     iic_Stop(); //iic寫停止時序
    / J( A' ?. |# _5 Y- O
  399.     nms_delay(60);                    //延時,可執行其他程序 原始值:55) T+ U8 s1 t0 [; V
  400.     iic_Start();                        //iic啟動時序
      F7 Q3 \* C! {% ^2 O
  401. ACKDT = 0; //允許應答ACK5 K6 E  D0 n; j5 u
  402. //*******************************************************************************
    1 Q) }' l9 _  ?8 S$ s
  403. //需修正磁偏角時使用「台灣磁偏角目前試定為3.5度」
    ' c$ M" N6 L& h
  404. //第一次使用時最好修正,因為GY-26大部分修正偏角是6度(或10度)
    ) }# O  ~- B: @% @5 b! Q# j, a" {
  405. //*******************************************************************************$ E/ r# w/ ]$ k3 |6 c0 }/ D) R
  406. //iic_Write8Bit(0x03);  //發送設定磁偏角高8位命令。
      \& H- g, f6 k9 Q2 B
  407. //iic_Write8Bit(0x00);  //發送磁偏角高8位的數據。
    3 k, j' K/ z! }" Z! o5 O
  408. //iic_Write8Bit(0x03);  //發送設定磁偏角低8位命令
    + C  v; p( A1 @7 T8 z% l4 R& t- [- q9 x
  409. //iic_Write8Bit(0x23);  //發送磁偏角低8位的數據。此時磁偏角被設定為3.5度. H% l! S4 U* Z. @9 d. d; W' W
  410.   J3 V1 L& {  z# ?
  411.     iic_Write8Bit(GY_26_ADDR);          //寫指南針器件地址     
    ! k" s2 u+ N- N/ T
  412.     iic_Write8Bit(read_begin_address); //寫指南針內部數據地址 " y( n& y) C' }
  413.     iic_rest();                         //iic重啟時序
    4 W6 h: Q6 F* ?+ ]& A

  414. 9 n4 T$ I: R/ \4 w. ~' F4 q
  415.     iic_Write8Bit(GY_26_ADDR+1); //指南針器件地址+1=讀 4 s! M3 S0 x( i& p! r7 L4 N" _
  416.     temp=iic_read8Bit();                //讀出8位數據
    4 y; K# e: q' E6 ?4 @
  417.     temp<<=8;                           //保存數據1 M1 h* R" a8 Z4 l) V
  418.     ACKDT = 1;                          //允許應答NO_ACK( U3 b' W/ `+ ?* @' e8 N1 I
  419.     temp+=iic_read8Bit(); //讀出8位數據
    8 d8 I) S. z; ]( S  K
  420.     iic_Stop();                         //發送停止時序7 S3 d* r8 l+ p7 [* ]$ ?& [
  421. return temp;                        //返回本次測量數值: G7 v" p/ v3 C. V6 r# F2 K
  422. }
    : w& V8 f& Q( Z( a# ]& S
  423. $ x4 X: M9 n, ~
  424. //**************************************************************************************************
    ; c. f/ _# F6 R* r! N$ O
  425. //從AN0讀取轉換電壓的相對值8 k/ E( F. i' Y0 E
  426. //從ADRESH ADRESL 讀出兩個8bit的值,併合成16bit數據
    ( t3 r7 M# n; Y2 j3 D
  427. //**************************************************************************************************
    9 q1 |9 J1 B7 v
  428. uint get_AD()7 x7 J% d7 G4 f- i6 D# D
  429. { % v: X# p# a* b" f$ \- L
  430. unsigned int temp;
    2 y' ]' f; }% W) Y$ i+ k
  431.      result=0;                //轉換結果清0) A# y& J% @- M% i2 U) k5 [# h1 l
  432.         ADGO=0x01;                //開啟轉換過程6 z/ U, |+ h" w" O
  433. delay(50);                    //保證採樣延時
    * e. e( @; _& L! B7 W, U  U+ Y
  434.         //ADGO=0x01;                ////ADGO=1放在此採樣不行* |; P6 a8 q$ l' e( j. H
  435.        while(ADGO);             //等待轉換完成
    ! f7 c8 P& h) M4 x( X+ g4 q
  436.      temp=ADRESH;                //讀出8位數據
    , \+ R: K$ t9 V! Y3 R3 q
  437. temp<<=8;                           //保存數據* s& S1 U( V6 d, y* V
  438.     temp+=ADRESL; //讀出8位數據, e) s* {- P2 ~4 r! f: T) [4 p
  439. return temp;                        //返回本次測量數值
    , I) u- o/ i6 j6 `' `5 _, l9 s$ D! L
  440. }
    & s! W% C( D. v; |/ c

  441. ; \' L  V9 [2 @9 E6 y( H
  442. - J- `' v% I$ I) X$ F
  443. //**************************************************************************************************+ Y9 ?. k# L0 F6 L) w( A
  444. //IO初始化操作) s  @9 `0 P, @3 Y2 i5 {2 c
  445. //定義 TRISx 1為輸入/ 0為輸出 / x 為未始用(1) (TRISA只有6個Bit)
    ' e4 S; v/ m4 w3 Z* e
  446. // TRISA x x 0 x 0 0 0 1 <--- Bit0:傾角電壓輸入 /Bit1:手[自]動(接地=手動) /Bit235:上下左
    3 @: I) v5 r' z7 ]0 L! l8 U
  447. // TRISB 0 0 0 0 0 0 0 0 <--- LCD IO 輸出
    + W: }! k; z6 w% s
  448. // TRISC 1 0 0 0 0 0 0 0 <--- Bit01: 停右 /Bit2:PWM輸出/Bit34:I2C總線/Bit6:RS-232TX輸出/Bit7:RS-232RX輸入- U7 N* I, D$ o& c) M9 g
  449. // TRISD 0 0 0 0 0 0 0 0 <--- Bit01267:R.L.OUTPUT / Bit345:LCD command
    * g0 \* s) ?# m6 T* x" Z/ I
  450. //: ~" ]/ a* R! b, ]! b
  451. //定義 PORTx 1為高電平/ 0為低電平 / x 為未始用 
    , m% ~/ O% _/ U3 p
  452. //      (TRISA只有6個Bit)電壓輸入口設低電平/其他需要改變狀態(拉成低電平)的設成高電平/再其他亦可都設成高電平4 b- f! y$ U! N5 Z( Z: [+ t0 s3 w
  453. // PORTA x x 1 1 1 1 1 0 <--- Bit0:傾角電壓輸入 /Bit1:手[自]動(接地=手動) /Bit235:上下左輸入3 b& N" h: z; V( {1 s& U- }
  454. // PORTB 1 1 1 1 1 1 1 1 <--- LCD IO 輸出
    # r: i) j* a+ k9 W/ A4 Z
  455. // PORTC 1 0 0 0 0 0 0 0 <--- Bit01:停右輸入/Bit2:PWM輸出/Bit34:I2C總線/Bit6:RS-232TX輸出/Bit7:RS-232RX輸入1 v2 H8 r9 j* }) U) G5 F3 f
  456. // PORTD 1 1 1 1 1 1 1 1 <--- Bit01267:R.L.OUTPUT (高電平 = 1 = 不動作 )/ Bit345:LCD command
    7 ]& k3 b% L/ s
  457. //**************************************************************************************************2 U% Z2 p( S# ^3 V, N5 Y
  458. void IO_init(void)
    6 J; E" t/ g  ~1 c9 Z' h
  459. {7 V4 u' S. U2 G! m$ Z

  460. / n% E: D# K" r, J' H  B: q; l( E
  461. TRISA=0x01;       //RA0設置為輸入 00 0001   o, i2 Z  v2 E/ n; t, g
  462. PORTA=0x3e;       //設置RA0為低電平1 D0 j7 T& p2 a7 |
  463. , U% R  Y8 T8 @: c6 P  e2 S% W* {2 P6 g
  464. TRISC=0x80;       //RC7設置為輸入 1000 0000& }: B; G3 x# c% t3 D
  465. PORTC=0xff;       //初始化為高電平
    $ h. J* D, x) b6 H9 \* t2 V/ C
  466.    
    , B8 R7 D! [. q4 V$ u
  467. TRISB=0x00;       //RB設置為輸出 LCD IO
    8 W: A4 j5 \$ V; y$ K3 @! c
  468. PORTB=0xff;       //初始化為高 LCD IO 為高電平
    7 W) V  Y5 E0 K  e

  469. . k) ?7 Y# o/ Y8 v6 v
  470. TRISD=0x00;       //RD設置為輸出 LCD command
    4 m" v9 S0 o; m% E
  471. PORTD=0b11111111; //初始化 LCD command(Bit345) 為高電平 /R.L.OUTPUT為高電平* v7 I7 ^: |3 z& ~+ b$ n
  472. ( p/ l2 \& \! S9 d" g: u; L- r! W
  473.    ADCON1=0X8E;                //1000 1110  A/D 轉換用參數 需查表
    ; N& Z9 r/ Z) D
  474.    ADCON0=0X41;                //0100 0001
    1 i# k/ W: b* f4 a$ z7 C4 v
  475. 2 G. m8 Z2 Y8 p7 S* K

  476. 6 _& j; q# w0 ^1 u
  477. }
    2 ?9 D* d; i: G# x! b' X% y
  478. //**************************************************************************************************. M. C9 H) K/ a- q
  479. //雲臺初始化操作 (離開限位點)0 W$ B' H5 G( L' \  ~
  480. //向上轉3秒 向下轉2秒, x0 Z0 C/ [8 Q" h- _9 u" g
  481. //向左轉3秒 向右轉2秒
    0 `" h' t" I* N; V1 t; y
  482. //**************************************************************************************************1 t9 }4 B; D+ j
  483. + h- U0 @7 f. R- e* H' O# f* O
  484. void Init_wt(void)
    9 P7 X; I3 N: A+ z
  485. {
      {" p( o1 |) V' E' Y4 k
  486. /*
    ! h2 }; T0 x% V, a' ~1 F
  487. 4 d( X$ m& d5 x1 ^4 r" D3 ?1 J( o
  488. RD0=0x00;* x4 D2 l: }: `& y& ^
  489. RD1=0x00;8 F2 ^2 m  ^. I- s& w
  490. RD6=0x00;: h5 \5 w$ f) ]
  491. RD7=0x00;
    4 t" A7 \$ O! z
  492. nms_delay(1000);
    7 ]9 Y4 U, k' @5 \1 J2 c
  493. RD2=0x01; //RD2 失能(亮)
    # D& I, a7 H7 {* Y0 \9 s5 p
  494. nms_delay(1000); //可將訊號接至 雲臺旁 閃爍紅燈警示( }1 }) U/ {& _3 D# h. E2 B  J% ^
  495. RD2=0x00; //RD2 致能(確認完成開機,控制雲臺電源可輸出[實驗板LED亮->熄滅])
    # k. \3 K* Z" ^- _* R, ]6 w8 @
  496. nms_delay(1000); //等待 進入旋轉初始化
    2 [  d0 w" d7 ^3 n5 _* F

  497.   B8 F6 v! m, ?2 Y* B& F
  498. RD0=0x01; //指令 UP Direction Rotation5 l" ^- U& q4 Z# Z7 m+ }- e/ _" x
  499. RD6=0x01; //指令 Counter Clockwise Rotation
    6 o$ w1 w/ q& E7 n0 y
  500. nms_delay(3000);
    8 K* `  K$ V* w7 n2 ~# ?
  501. RD0=0x00; //指令 UP Direction Rotation2 b3 \6 n1 k  H! {
  502. RD6=0x00; //指令 Counter Clockwise Rotation8 V! W7 Q- Q' T2 {5 {2 Q0 x
  503. RD0=0x00; //指令 UP Direction Rotation
    : r: ]5 m) F# {! C. A8 R& z$ O
  504. nms_delay(500);
    7 T8 `4 o3 }) W1 \
  505. * ~/ d9 O7 i+ Q/ q
  506. RD1=0x01; //指令 DOWN Direction Rotation+ r: F9 k) G5 @6 B
  507. RD7=0x01; //指令 Clockwise Rotation4 O! i9 j; |+ _% j4 ]7 R
  508. nms_delay(3000);9 u0 n3 V- Y4 u  c, L( j5 m6 A
  509. RD1=0x00; //指令 DOWN Direction Rotation& ]) c, D! m  t$ F3 H9 t
  510. RD7=0x00; //指令 Clockwise Rotation
    8 @3 ?( m2 n8 e
  511. nms_delay(500);; o2 }) f3 r6 v
  512. */' r4 [+ C. E! z/ E% H9 U9 |
  513. nms_delay(1000); //等待
    $ I9 p2 c7 ]! w/ U7 r
  514. //*******************************************************************************5 R9 g. s+ _6 ~1 @, }+ l3 u0 d7 c
  515. //完成轉動後重新將LCD內容刷新
      O, p" H6 |5 l" V5 c5 c2 |
  516. //*******************************************************************************& t5 `4 o  C  ^3 G, c7 _
  517. dis1[0]='A';
    $ W# h: _( i3 w2 e. n1 k0 U/ }* @3 d
  518. dis1[1]='Z';! T0 U& d, ?3 M# ]' m2 F% f* [
  519. dis1[2]=':';/ U% {( R% b: G- x1 v
  520. dis1[3]='0';0 F9 ~" h. L' B0 U. [
  521. dis1[4]='0';8 j' {: f) p5 K) I, s
  522. dis1[5]='0';# g# Z; c3 T0 e3 ?- T
  523. dis1[6]=' ';
    4 T, l1 y4 R3 t, W
  524. dis1[7]=' ';
    % F* D3 e1 o1 i  a
  525. dis1[8]='E';, o) f) _# \$ N$ m* K
  526. dis1[9]='L';
    # z1 p+ |' B' m, j+ U4 J+ ]/ I
  527. dis1[10]=':';
    - K8 L  F* `4 W1 ]8 o6 g) C/ f% d6 [0 @9 D
  528. dis1[11]='0';
      _+ R3 p1 E" ~! a
  529. dis1[12]='0';, I  E& {# v2 t9 D4 _9 d7 a( a
  530. dis1[13]=' ';" P% }" I" n8 M" N9 G! i
  531. dis1[14]=' ';4 h7 |0 F0 [& L' i
  532. dis1[15]=' ';4 n4 o+ l! W( e" C* c9 G. r8 {5 J
  533. 0 A$ Z& T* J9 L+ f5 Z
  534. dis2[0]='-';9 s4 @2 f5 \' F" {- u/ H" q
  535. dis2[1]='-';
    3 ?# j8 y% Q6 V4 q0 f& N
  536. dis2[2]='-';
    1 j' G( U5 c6 I- z
  537. dis2[3]='-';
    6 x$ J" _: V6 e& Z" a0 d
  538. dis2[4]='-';
    7 s  _/ H! P/ N7 \& ?' y. \
  539. dis2[5]='-';
    ( y+ W+ \' Y: z3 E! S
  540. dis2[6]='-';
    - R& H0 [& D0 w; a% d* u( n! }' f
  541. dis2[7]='-';# Q6 y. K  P3 Z5 ~+ ?7 o. g
  542. dis2[8]='-';8 g8 r' y( D5 ~& k/ K. L9 i6 |  D2 l; d
  543. dis2[9]='-';
    ! e$ y# h+ {+ y5 U# H
  544. dis2[10]='-';
    * F3 v% S. o8 }" m& p) F
  545. dis2[11]='-';
    9 `0 Y0 h3 g- @  u9 C% e% K8 W
  546. dis2[12]='-';2 t- j% m; h5 u0 q; M4 i1 S) |
  547. dis2[13]='-';
    6 ]0 L- C: d; U
  548. dis2[14]='-';
    ' D- p% H# v! S1 h$ j4 U1 G) h
  549. dis2[15]='-';2 ?( E3 [* ^3 x- ?
  550. }: w9 r! _0 j4 m0 i- F6 w
  551. //**************************************************************************************************: [1 M% W- r& E. v
  552. //向LCD寫一命令3 l# i$ D! q+ M; U5 `6 _+ {6 U: A7 T
  553. //**************************************************************************************************
    / o1 \! K6 l9 p* x7 h" t+ v4 n' o; [
  554. wcode(uchar t)
    5 B$ a; Z2 N' u; \+ t! V; H
  555. {4 d# |% a+ q" k# y& m: z
  556.   rs=0;           // 寫的是命令
    6 a" S! r) Z8 n# _! f! W. _- J
  557.   rw=0;           // 寫狀態
    9 p5 v8 i4 }- j9 k4 r+ y9 {" _
  558.   e=1;            //使能& U9 p7 {/ J2 E! \% @
  559.   Dataport=t;     //寫入命令 + {# q- K: A$ |4 ]$ ]5 R( s% v
  560.   delay(45);      //等待寫入,如果時間太短,會導致液晶無法顯示
    + h# @0 V( c8 c/ }4 \9 C
  561.   e=0;            //數據的鎖定
    $ i' B; W- o7 f
  562. }2 v, q& m4 v! _: q* f$ P
  563. //**************************************************************************************************4 z3 Z2 v& S# R' @. [, ~* U  v
  564. //向LCD寫一數據- a! G4 t/ V6 I3 ], w8 A" W
  565. //**************************************************************************************************! g% w) W( E' @; H  ?0 L
  566. wdata(uchar t)
    : U/ x0 O/ }6 d+ X1 A
  567. {$ U9 v- c5 T; Z! R  o" m, ?
  568.   rs=1;          // 寫的是數據0 `8 w& z/ z" K1 D1 |
  569.   rw=0;          // 寫狀態3 T# g* E: w8 b0 P  L
  570.   e=1;           //使能$ f! o5 k9 S* a4 _( j9 A
  571.   Dataport=t;    //寫入數據& l' w, L4 D+ F2 u7 X7 L
  572.   delay(45);     //等待寫入,如果時間太短,會導致液晶無法顯示2 d  h# L7 r* ^! k1 ~5 s
  573.   e=0;           //數據的鎖定
    9 o% S$ I; [6 V$ y1 u
  574. }' X6 i' X4 x) {: y6 N/ l+ Y
  575. //**************************************************************************************************
    ) U, O6 f  l: U* s+ j6 E
  576. //LCD顯示第一行( P; R5 g8 ~# H! T& ~( a
  577. //**************************************************************************************************3 _0 b8 C  a* ~2 b
  578. xian1(void)9 ?) w- c' Y; m. T: r; }0 m+ c
  579. {' C8 k8 G0 F% \/ \$ E
  580.   uchar i;: d, ^9 F" P7 K+ O3 T
  581.   wcode(0x80);          //設置第一行顯示地址/ p# T' q: N! q
  582.   for(i=0;i<16;i++)     //循環16次,寫完1行
    ( g* g4 x" Z" \) e2 j0 o5 H8 z
  583.     {
    6 O) ?# r$ R7 W
  584.       wdata(dis1[i]);   //寫入該行數據3 w* _9 P/ p& G2 J
  585.     }
    " U" z* Q4 ^/ R) R# O1 t  k3 A: x5 |, v
  586. }
    ( z- G; O( v' ~  H
  587. //**************************************************************************************************
    8 ^1 b2 v* |! M) k% H
  588. //LCD顯示第二行
    7 g1 \3 G. w6 m! I) w
  589. //**************************************************************************************************3 U* D0 \" C4 x3 N: L
  590. xian2(void)2 h$ E( `1 |" B1 T# C7 \* G3 k5 u
  591. {
      ]$ m0 r$ e, P: ~2 r
  592.    uchar i;
    $ t. T" q! u- y" Q- c
  593.    wcode(0xc0);        //設置第二行顯示地址  Z1 T. e. B" D+ t* k
  594.    for(i=0;i<16;i++)   //循環16次,寫完1行
    " f7 K) c9 h# J. v0 Q: t+ Q* k
  595.     {
    - n" M6 W0 ?  H" z7 S# S
  596.       wdata(dis2[i]);  //寫入該行數據
    % t# m9 t" X: l  \2 \; ~
  597.     }
    * U' X" p* Q0 E% d5 s$ e) [: Q6 k
  598. }
    / a$ x3 o, i3 c6 `- B' X
  599. $ v. k9 L1 M! |) Y0 K1 t6 c; Y! Q
  600. //**************************************************************************************************3 J: Q. l! l: C* f" n' i# v
  601. //LCD 初始化# ^  T3 y7 I" z5 J9 m
  602. //**************************************************************************************************
      m6 w* b7 \* Q; ?
  603. InitLCD(void)
      v7 |7 @( X8 A  y  o9 [& O* h
  604.    {   
    % C* c2 c* E* ?5 G3 {$ f
  605.    wcode(0x01);   //清屏
    : [' p: F5 O' v6 n
  606.    wcode(0x06);   //輸入方式控制,增量光標不移位7 P& S6 S5 p0 U
  607.    wcode(0x0e);   //顯示開關控制, @5 |. j$ n0 m. z1 m
  608.    wcode(0x38);   //功能設定:設置16x2顯示,5x7顯示,8位數據接口      
      f2 N4 D. M$ a5 T
  609.    }    V& D5 f# A2 g
  610. //**************************************************************************************************
    % ?9 Y' z: n/ J8 C! T
  611. //初始化串口6 @* v4 m. L$ C9 Q$ I) ]
  612. //**************************************************************************************************+ T! u1 O6 G) M" A
  613. & o4 e6 V1 t* r/ E7 e
  614. void init_com( void ) , M  Y3 X9 j! C$ j0 y4 E
  615. {      
    4 z  y) [; c& i7 t' H5 N, W
  616.     TXSTA=0x24;//發送數據控制位配置00100100,異步方式、高波特率,波特率=Fosc/16*(SPBTG+1);
    # c$ w: O+ f) V
  617.                //TXSTA寄存器的D5(TXEN)=1,啟動UART的發送功能
    ; O& W4 C1 n; B8 ?0 c
  618. RCSTA=0x90;//接收數據控制位配置10010000,設置連續接收數據
    ( @: u% S3 M2 z
  619.                //RCSTA寄存器的D4(CREN)=1,啟動UART的接收功能) e  B" L9 ?; m/ M9 ^" F
  620. SPBRG=25;  //設置波特率9600,系統時鐘4MHZ,波特率=4000000/16/(25+1)=9615(Bps) 51; U' m% y7 S) y! w0 X+ V
  621. //設置波特率4800,系統時鐘4MHZ,波特率=4000000/16/(51+1)=4807(Bps)
    ; y: @2 C) R0 k( N7 D2 V! @- \
  622. RCIE=1;    //接收中斷使能& L0 i  S" ]: N* g% \9 K
  623. TXIE=0;    //發送中斷使/失能& n7 s( R; o1 v
  624. PEIE=1;    //INTCON的D6(PEIE)=1,外圍中斷開關打開9 n2 ]( U9 e7 n" w- U' p
  625. RCIF=0;
    / \3 s4 X8 K! L* V# J: |) X
  626. RCREG=0;, P: t/ l9 l8 g, l& v
  627. GIE=1;     //總中斷開啟
    5 J* `6 @; E2 Q$ J/ y
  628. }
    1 I1 |: n8 F( z# x7 B

  629. - ~9 k3 z- d* l" V5 X( C
  630. //**************************************************************************************************
    1 p# p; U$ _+ G. k
  631. //寫RS-232, |! Q' H6 a) f
  632. //**************************************************************************************************
    : S  b( ?% @8 l5 K* j$ E
  633. void  WriteByte(unsigned char byte) {# {! @0 N& ~$ y6 [3 l
  634. while(!TXIF);
    " R4 [0 q. d0 L  P2 }' e- \8 f
  635. {) p) E! g8 ?& H1 d
  636. TXREG = byte;+ z, z9 F* K( V" B
  637. }
    8 u6 r( u% P0 U2 `. w( V
  638. }
    0 @4 ^4 W% {1 H; f5 Q

  639. 2 x4 e" r9 S/ S
  640. //**************************************************************************************************. ^( x( W; [& J5 S
  641. //向RS-232寫一字串數據
    % |3 Y0 X8 A3 K% F; ^" Q
  642. //**************************************************************************************************$ \# c+ C1 e) D% S" R! e, U  N' ?
  643. void WriteStringConst(const unsigned char* str) : k) Q5 d% S4 @, L5 C4 \1 ]. ]
  644. {
      v5 _9 e. G! E  @
  645. int n,m;
    9 N7 R- M4 G% F' g3 ^

  646. , n$ t# M8 K8 ^9 w$ x/ d8 B: F
  647. for(n=0;n<=11;n++)! V1 D, r! b, M1 I8 W9 i
  648. {
      F! a" s, a$ H
  649. //TXREG = str[n];) }* I9 A3 v6 b" R: N3 F6 E$ V7 v6 W
  650. WriteByte(str[n]);- }' b9 N  k7 Z2 K
  651. }1 A% J2 u+ c# L! y1 ?
  652. ( U6 A: }: _. v
  653. }2 Q0 p, ?) P, ~1 ]% |# V3 G
  654. //**************************************************************************************************  f# g* }: Z- ]0 e  L9 y, M/ i
  655. //雲臺轉向控制 8 e2 \: N. C: l' q7 A, l$ `0 ~; }
  656. // 選用的雲臺 傾角 動作時會稍微干擾電子羅盤- ]) X- q# B( u: S2 B
  657. // 雖然已經將 羅盤 與 馬達 距離拉開,但在做 傾角 動作時,還是先 不旋轉 以免因為誤判角度而亂轉
    2 u6 ?) M9 K7 e! d% n$ x7 @- Q2 K' e3 [
  658. //**************************************************************************************************
    9 B. e- J% h* ~6 }. N1 K* m, o
  659. conTIO(void)
    ! o9 A; f% l7 {* z8 Z3 }7 s% N9 B: Z
  660. {/ o: D! `" F: W3 J
  661. " O% p1 `  G  ]
  662. RD0= !rd_U; //指令 UP Direction Rotation(反邏輯 單片機輸出"0"=低電平=繼電器動作)
    $ R6 {8 ?5 G( J0 s8 i# ^9 {
  663. RD1= !rd_D; //指令 DOWN Direction Rotation(反邏輯 單片機輸出"0"=低電平=繼電器動作)
    + s& H  \+ D1 Q9 G
  664. if(rd_U==0&&rd_D==0) //傾角動作優先,傾角動作完成之後再旋轉5 K; {6 v8 M+ l2 h, A% _
  665. {
    5 i9 S2 L+ F7 M  ]
  666. RD6= !rd_L; //指令 Counter Clockwise Rotation(反邏輯 單片機輸出"0"=低電平=繼電器動作)
    5 E) X1 ^: ?& V; e! @
  667. RD7= !rd_R; //指令 Clockwise Rotation(反邏輯 單片機輸出"0"=低電平=繼電器動作)
    6 L7 S! i$ i( M) ?' X) e
  668. }
    3 A8 U! h2 \' D7 z( ^
  669. }
    ; Q2 I$ d; P0 N1 k) L3 G8 j4 m
  670. //**************************************************************************************************8 w8 y9 P% c; `7 J+ y6 q
  671. //check 資料要求 COMMAND9 f" A" k$ t+ A8 e. ~3 r; d& ]
  672. //
      I4 y3 h- Q+ ~5 R& f; W9 Y; G
  673. //int rd_AZ; //要求 水平角度+ S2 I" K9 g$ B3 ^7 K- v
  674. //int rd_EL; //要求 傾角; u% F& }0 `9 E; ~8 K( q* u. J5 R! k
  675. //int rd_AZEL; //要求 水平 + 傾角
    8 F# p, t( z8 I8 w# @0 I
  676. //**************************************************************************************************
    ' o' O- X" `9 Y2 R: A  R% u9 T
  677. cmdCHK(void)  - y$ c% [: m- Z" \/ r) D
  678. {
    7 o5 `0 x! [' Y; }7 B
  679. if(rd_AZ==1)! l/ D2 S. K/ H0 K: L
  680. {
    1 H3 I0 F2 h; K
  681. WriteStringConst(disAZ);7 D- w- v8 s/ _4 y! E. E/ q
  682. rd_AZ=0;
    ) C' e/ Q+ V8 R# l( k
  683. }
    + A: b5 F8 {5 b4 _; v; S
  684. if(rd_EL==1)5 h8 ^  {9 M( G- |
  685. {; O  k& }" y- B
  686. WriteStringConst(disEL);
    ' E' J! \& b' K+ z& i- X- _
  687. rd_EL=0;
    1 W1 m7 e: O: I3 E& F7 a
  688. }
    ; o$ ?4 I4 y; k7 h, n
  689. if(rd_AZEL==1)
    - \6 M" Z: \& T$ ?9 x9 A6 e4 Z8 a
  690. {
    # w7 H3 T$ U7 f
  691. WriteStringConst(disAZEL);" d( q7 O% S  p' m
  692. rd_AZEL=0;
    / R8 W# n: c% d& G/ V: g0 d
  693. }
    0 C- |: L- d4 Y; n  d7 @
  694. . }& N4 ]% [/ G
  695. }
      ^8 S  R$ X  `0 ?9 J& J, L

  696. 4 U7 o' t9 g# u( t
  697. //**************************************************************************************************
    $ d, n& v4 X9 v" v: {& g
  698. //雲臺自動轉向 COMMAND
    - L, _5 }( O- J' u3 R2 i( j
  699. //
    4 [9 I" T3 N! k  f2 f
  700. //int rd_M; //自動指令 前往 Mxxx 水平角度xxx5 \: G( O3 Q4 u! M& t6 Q2 Z* ?
  701. //int rd_W; //自動指令 前往 Wxxx yyy 水平角度xxx 傾角yyy
    ! E# r' ?! q- P8 w+ j7 j
  702. //int rd_S; //指令 All Stop
    * e3 E6 a+ }  x$ `) |
  703. //int rd_R; //指令 Clockwise Rotation3 i- ]" E' h4 }5 ^
  704. //int rd_L; //指令 Counter Clockwise Rotation3 ^8 c6 E3 X4 `  I
  705. //int rd_A; //指令 CW/CCW Rotation Stop
    2 m6 u! g5 p, h# p& L6 a( x
  706. //int rd_U; //指令 UP Direction Rotation9 [; a' b3 S3 \8 b! Y2 w4 {
  707. //int rd_D; //指令 DOWN Direction Rotation
    4 }) H: Q% |2 n/ }' A! Y, F
  708. //int rd_E; //指令 UP/DOWN Direction Rotation Stop6 ^+ M: _% c. F1 Z: S
  709. //**************************************************************************************************) z: \1 k6 b. }: A: y/ E2 f
  710. void turn_cmd(void) 1 [! z0 Q7 n/ `7 a9 W. `
  711. {% X. w3 s- A. E! j' S, W; I- a5 N
  712. //if(cmd_AZ>AZ&&(cmd_AZ-AZ)>3 &&(cmd_AZ-AZ)<30)
    9 l& I1 q: D  x5 z7 g
  713. if(cmd_AZ>AZ&&(cmd_AZ-AZ)>3)
    0 W8 _4 c* C! T5 c
  714. {
    & V5 Y; a. Q% o( Y3 S3 L
  715. nms_delay(100); //防止繼電器高速跳動
    2 O  u& l' X( g
  716. rd_R=1;
    9 b8 }8 O0 p  y: Q; `
  717. rd_L=0;# G$ K  x% y# t' _
  718. }
    ! l" W1 i4 V1 b6 g& l
  719. //if(AZ>cmd_AZ&&(AZ-cmd_AZ)>3&&(AZ-cmd_AZ)<30)( s% U8 G& M1 t9 e* f/ A+ t8 p" u
  720. if(AZ>cmd_AZ&&(AZ-cmd_AZ)>3)9 E$ m6 {; Y; {3 M  T" a6 u" F7 b& z
  721. {
    " M. N  x6 S2 r. N0 C- u
  722. nms_delay(100); //防止繼電器高速跳動6 b# Z8 d* w3 j) h& p" @) E
  723. rd_R=0;' k. w) p  R* O) x
  724. rd_L=1;
    2 @$ p' J# i8 A4 K6 \  `3 e
  725. }. A5 C2 x/ K! ]6 i  {* A; L7 C
  726. / Q9 U, ]4 k% F0 p- W# F1 [+ G/ }
  727. //if(AZ >345 && cmd_AZ <15 )  // tracking cross left 過 360'
    # f; B/ B. N7 ^9 l+ j
  728. //{
    * z% M- q; [) v
  729. // rd_R=1;2 R+ h$ w2 L7 v; `, b* @. X
  730. //}' Z7 J2 J; K" X; x
  731. //if(AZ <15 && cmd_AZ >345 )  // tracking cross right 過 360'
    + X# C- k4 u4 C
  732. //{) X2 S$ Y9 A8 o6 `/ l3 B! i; M
  733. // rd_L=1;
    5 {+ N5 m- Z3 B* d
  734. //}
    ; i8 l* N8 @" ^$ v( y
  735. 0 O3 @8 X; s% ?0 J6 R$ V
  736. if(cmd_AZ>AZ&&(cmd_AZ-AZ)<3)
    1 V7 u6 ^0 A4 H% G; e9 V
  737. {
    % t" l( a/ F, }! i
  738. rd_R=0;% w; @8 \3 `. ]+ A6 ]  G' N" w3 i
  739. }1 g2 Y" c! i5 {& ~
  740. if(AZ>cmd_AZ&&(AZ-cmd_AZ)<3)3 {6 U# R8 v# i- p0 v, R6 X- [
  741. {
    % c* [- |6 {& u5 w" N/ ^1 Z
  742. rd_L=0;
    1 k' x  W" L7 O! i
  743. }
      n& L# f) i$ K  ~) i, }- R% N. f" R
  744. 2 w) ]& V  ]1 v3 f6 `5 E& N6 s1 I
  745. if(rd_R==0&&rd_L==0)
    9 p# W( O* r: q; S
  746. {0 _9 R1 I& t% @& b  s" [% c; q
  747. rd_M=0;
    3 k* K6 q$ C, k1 T" G: r' U9 J
  748. }& y% U  F3 t4 G' u8 m9 P) R. k
  749. if(rd_W==1)
    3 A9 _/ F( v4 i% m/ b& f' p2 J. F
  750. {
    " V! p5 t5 V& V* z  l' c6 r
  751. //if(cmd_EL>EL&&(cmd_EL-EL)>2&&(cmd_EL-EL)<20&&EL<90)/ x- w* h6 a4 B4 y( z- f
  752. if(cmd_EL>EL&&(cmd_EL-EL)>2&&EL<90)2 A6 @" g3 P9 m( r7 f# q* P  k4 W) ~
  753. {
    2 x8 b% c' @' A; R7 g7 }
  754. nms_delay(100); //防止繼電器高速跳動. d! @1 z; |5 `3 i( b! L* N8 t
  755. rd_U=1;
    ) p" P/ u/ W2 W/ ^
  756. rd_D=0;/ ]& u0 a8 k3 q+ E9 p- k
  757. }
    + L6 h- M' Q2 U5 @. r% W' p9 L) W
  758. //if(EL>cmd_EL&&(EL-cmd_EL)>2&&(EL-cmd_EL)>20&&EL>0)9 P+ `3 P# J  i2 J" h' ~3 i* x
  759. if(EL>cmd_EL&&(EL-cmd_EL)>2&&EL>0)
    6 Z! {  A0 A* X  l2 T. Z
  760. {
    ) x  Y& h  G% @0 A7 M
  761. nms_delay(100); //防止繼電器高速跳動
    5 |9 d% h$ E) n  _, F8 v9 ], a
  762. rd_D=1;- P6 p; h. W$ ?# t
  763. rd_U=0;
    : o7 o: {5 T& z, x7 z
  764. }
      S7 X# Z( X: w6 Z  z
  765. if(cmd_EL>EL&&(cmd_EL-EL)<2)
    ! J$ l& ^: H3 c: j
  766. {
    & d/ o: M0 F9 ]8 v9 d
  767. rd_U=0;1 j- E$ E  }; \: O* z$ ^
  768. }2 I$ e$ W( }. z
  769. if(EL>cmd_EL&&(EL-cmd_EL)<2)
    # E3 }. b+ }/ k  l8 e+ U: B
  770. {
    0 M6 [" J% N6 Z/ s
  771. rd_D=0;
    1 e2 Y+ \) z' h+ h, y: m
  772. }
      Q0 r4 B' ?- D' [
  773. if(EL==0&&cmd_EL==0)- y7 E1 f7 X8 i' v: M
  774. {
    + p. z: _& w' p8 {" ~
  775. rd_D=0;; P: g" w' Y$ ~- C/ s- d
  776. rd_U=0;( q! G- T! p; L5 q8 ?1 i
  777. }
    + r2 r$ ~' ]% U% ]! w
  778. if(rd_R==0&&rd_L==0&&rd_U==0&&rd_D==0)
    ) r# D% X, I9 R9 G0 x
  779. {
    2 W5 L3 x1 J. M$ N, \
  780. rd_W=0;8 ~0 F3 E( M! R  z
  781. }
    $ d* ]  J: f; C  b
  782. }
    * H$ j& l: B2 Y8 |+ p8 B% e3 H
  783. if(rd_A==1)9 ~, d+ m% O* z- T) x; A
  784. {
    2 G6 z( u) d0 m7 D: b
  785. rd_R=0;) |+ Z4 x9 i5 k0 \* e
  786. rd_L=0;: j+ @- \1 v6 t' C& `
  787. rd_A=0;7 e* @/ T" c, M7 l* L! h
  788. }5 a: ]  v+ S# b* n
  789. if(rd_E==1)* q# ~+ k" W, X) b) r8 U3 V; R3 [
  790. {
    " s; \+ L7 _9 n3 x& V9 C
  791. rd_D=0;1 S5 p# m" w" Y5 g
  792. rd_U=0;% `) `6 S8 v( ?* l
  793. rd_E=0;
    , ^# I& j  C7 n7 ~% Y
  794. }: y  `+ O+ h4 O  t1 b

  795. * Z" v* V6 T8 A3 q: i+ V3 `1 E
  796. }  k' g; _% Y% U+ h% I
  797. //**************************************************************************************************
    ' v% {$ M; X" |; X0 a
  798. //check 雲臺轉向 指示 及 過頭.回一點 控制
    ' u1 x) V9 j7 x& P8 d
  799. // : l9 p0 R+ x' E  V! \
  800. //int rd_M; //自動指令 前往 Mxxx 水平角度xxx1 F, [. W8 @* ~! w( G8 o6 Q* F% H
  801. //int rd_W; //自動指令 前往 Wxxx yyy 水平角度xxx 傾角yyy
    9 F$ n! s8 j$ C+ v2 I0 d" ?
  802. //int rd_S; //指令 All Stop- X3 O2 A- g- K! _* p# B9 x& ~# I
  803. //int rd_R; //指令 Clockwise Rotation
    8 I9 t# _8 I/ M$ Z6 \
  804. //int rd_L; //指令 Counter Clockwise Rotation
    , Y/ Q7 H0 U( M. g4 a  z9 z
  805. //int rd_A; //指令 CW/CCW Rotation Stop
    # b! o7 D/ ?2 B" I, y) V* s8 P
  806. //int rd_U; //指令 UP Direction Rotation9 M9 `0 d" b2 v/ P! N/ _
  807. //int rd_D; //指令 DOWN Direction Rotation
    / s0 A4 j& M' p, k
  808. //int rd_E; //指令 UP/DOWN Direction Rotation Stop6 B* N) G, N8 s
  809. //**************************************************************************************************8 E! k$ _6 C( y  ^7 y5 ^; }8 u
  810. void turn_dsp(void)
    5 e- H0 z0 F% U& t& X
  811. {2 _5 B9 D$ _% n* X6 B! z
  812. if(dis1[11]=='L'&&dis1[12]=='o'&&result>>0) //指令 傾角過低 low(回頭)(當 傾角 輸入=0V(將該腳位接地)  時 不做「過頭回一點」的控制)
    & I, g0 d0 S" P+ u" g
  813. {* H7 C0 q2 l) F! c! p
  814. RD1=!0x00;6 q" [$ }# U4 W
  815. RD0=!0x01;
    - o/ T  Z4 b% n) M  b1 I1 ]
  816. nms_delay(300);  U) I" j/ U1 I
  817. RD1=!0x00;
    0 H: I  S1 s/ o7 {$ F: \
  818. RD0=!0x00;& M- m2 t+ s5 I8 d- N7 [
  819. }. w6 x- V# o# u6 u! U
  820. if(dis1[11]=='O'&&dis1[12]=='v'&&result>>0) //指令 傾角過高 over(回頭)(當 傾角 輸入=0V(將該腳位接地)  時 不做「過頭回一點」的控制)
    $ G0 r  w% r" @; A6 `/ |( _5 g* J
  821. {
    $ l8 u& p. P1 R" z- b# |0 `
  822. RD0=!0x00;
    8 X1 r7 J4 h! c1 m# j2 _2 ]- C' x
  823. RD1=!0x01;
    + O/ f" A1 e! C4 {
  824. nms_delay(300);
    ( W. W, }* `; d) \/ ~/ [
  825. RD1=!0x00;2 I3 m. {3 S3 @' W0 h# I
  826. RD0=!0x00;
    1 y0 O4 t, H: w6 W7 `; R
  827. }, X7 x& K9 k+ J* e5 Y  M5 A" i% t& _4 W
  828. 8 R/ _  Y! A6 O; F5 F
  829. //******012345678901234567***************//8 l- ?7 o! a, y# g( i& A3 a0 T
  830. //dis2{"Turn! Right Down\0"};" U9 b6 A0 ]; b* _
  831. //    {"Turn! Left   UP \0"};7 e  x5 a! E- I. P
  832. //    {"------STOP------\0"};
    - q9 G1 N( f+ z4 d1 i
  833. //***********************************//2 L" |* H' ]7 E1 g: {# j0 V
  834. if(rd_U==1|rd_D==1|rd_L==1|rd_R==1)
    - C2 d7 b2 A8 K! J# `
  835. {
    5 }! d7 q2 q  g4 W- s. {4 s1 m
  836. dis2[0]='T';
    $ t; d- z/ u8 }( t: _
  837. dis2[1]='u';5 L5 m0 {  S6 r
  838. dis2[2]='r';
    7 \; J/ p: W, M, ]8 }7 M
  839. dis2[3]='n';
    . n& f" K8 K3 W5 |% |1 `6 H
  840. dis2[4]='!';) U" v# L+ w9 _9 ^9 o/ V6 b3 `% ?1 Q
  841. dis2[5]=0x20;
    , X* o- h/ N: Z
  842. dis2[6]=0x20;;2 }% C0 e- V2 d, k
  843. dis2[7]=0x20;;
    - V1 u: V' j1 g2 j" [+ v
  844. dis2[8]=0x20;;  m( _6 J+ _9 }1 {+ t
  845. dis2[9]=0x20;;0 P  d$ O, l) |( W* |* N& V# q
  846. dis2[10]=0x20;
      D+ P% x% v. P2 O# B) ~; [* Y
  847. dis2[11]=0x20;;
    8 A6 z" l4 u" G* v- p" G  r  L
  848. dis2[12]=0x20;;
    ) I" ]- I' u; z0 \+ ~
  849. dis2[13]=0x20;;
    / o7 J" w) b4 _; ~2 P# S
  850. dis2[14]=0x20;;
    1 u& i- B) j* E4 [4 k
  851. dis2[15]=0x20;;* y$ L& Q# q4 ]/ Z1 H
  852. }; j( b( D7 i( y5 }: f
  853. if(rd_U==1). }9 Q" z( X! z( x" a0 u- M
  854. {. ]$ l0 p5 V# d" v1 Y. p* Y
  855. dis2[12]=0x20;# g9 E$ l7 m1 `! @2 t! z( q7 C5 ^
  856. dis2[13]='U';; O4 V% W, B1 }9 @- x: H
  857. dis2[14]='P';' c1 b1 J* ^2 K) l% K7 O( R, E9 P$ W: d
  858. dis2[15]=0x20;! Z( v' p+ Y' F
  859. }. v/ o  i5 \$ k' {- _7 d1 j
  860. if(rd_D==1). Q* N4 B. J+ I7 s4 s% g9 X- Y+ o" D
  861. {
    5 f! X& N, x/ V- g/ o0 v( j) Y0 d5 p
  862. dis2[12]='D';) t! ^7 l, J; C3 |% u
  863. dis2[13]='o';
    ' d; `3 }* b# b% D- B
  864. dis2[14]='w';7 N: ~0 K/ k8 {1 X8 g$ m: T" ?4 f
  865. dis2[15]='n';: S0 K% w. @; d5 K
  866. }0 \9 z; |2 c. {3 p7 \
  867. if(rd_L==1)6 r: N. S# i5 K! E' o. w
  868. {
    ! M& D% j; t% U$ \
  869. dis2[6]='L';
    * b1 e0 o# z" _/ I
  870. dis2[7]='e';
    ( s% }( a* N9 X6 b% N2 c5 C
  871. dis2[8]='f';
    + }" \' o, D5 }! `; Y
  872. dis2[9]='t';
    . A2 w7 y2 `$ y8 Z- a2 W$ w
  873. dis2[10]=0x20;
    . d. d# b3 P. ~# s( @1 B% l
  874. }
    8 {8 t1 A+ u6 C. E
  875. if(rd_R==1)/ m' o  ~+ J" }7 z& R) t. o
  876. {
    - l7 x+ O6 V" u9 U: Y5 R/ n0 O
  877. dis2[6]='R';" j9 s1 C+ m( A: O
  878. dis2[7]='i';
    ; ~4 y- m! K9 N4 Z
  879. dis2[8]='g';: ]- ?& ?8 q8 w2 p% U. U' b
  880. dis2[9]='h';
    ! z/ }# ]# m. u
  881. dis2[10]='t';) M4 |0 h0 N- W1 n  D; C: w1 }. Q; s! w
  882. }
    & R9 l9 `8 h) \# G" B/ T
  883. if(rd_U==0&&rd_D==0)
    - F; U  H' \: M$ u4 Y3 ~4 \
  884. {* A$ r- B: U8 |0 G& G, ]" [) ?2 ~+ P
  885. dis2[12]=0x20;/ j" K" t/ v) x: [! h: ?5 v* B
  886. dis2[13]=0x20;
    . Z  I! e+ c1 ]+ J/ A; B
  887. dis2[14]=0x20;
    & K+ l5 C4 z* V- q2 V# h# \
  888. dis2[15]=0x20;3 R8 Z: n5 P; K9 v
  889. }. y: g0 Q+ L4 n0 c
  890. if(rd_L==0&&rd_R==0)
    + _4 F8 d+ ~  X
  891. {
    / l8 f( ?7 X! f' I  w) L. t% H
  892. dis2[6]=0x20;
    + n3 H' ^8 o/ e2 @) X2 C
  893. dis2[7]=0x20;
    * d6 v! z6 x" _
  894. dis2[8]=0x20;* F, q- E, k) g  L5 _
  895. dis2[9]=0x20;
      h, j2 N- Y9 o
  896. dis2[10]=0x20;
    / I2 U. H( y7 x/ @+ w" C1 G
  897. }
    1 |: [: s) g9 `
  898. if(rd_U==0&&rd_D==0&&rd_L==0&&rd_R==0); V8 `; Y) `: E1 F4 d( T  p( k4 c
  899. {0 I# ?0 j& k7 H$ b3 f
  900. dis2[0]='-';
    % y! ^* R  t- j' n5 q3 \6 s  U6 F) x
  901. dis2[1]='-';
      j- }: [% o0 g$ t
  902. dis2[2]='-';  s1 u( M4 }* f& {% t; `
  903. dis2[3]='-';
    4 U2 O1 q8 G$ Q) h0 F& y( v1 \
  904. dis2[4]='-';9 }  m3 \: e/ y! B) {3 Y
  905. dis2[5]='-';
    6 _0 T. F9 a# _) O+ t
  906. dis2[6]='-';
    , \8 P1 L. e0 Z  r
  907. dis2[7]='-';
    - j# M3 \* H9 F, X" ~
  908. dis2[8]='-';
    & |' h" a3 Q4 r! D( E! D
  909. dis2[9]='-';
    9 @( {8 a2 H4 r/ e, S
  910. dis2[10]='-';7 f: n& Y3 ^. j8 i/ O# Q  \
  911. dis2[11]='-';
    9 ]6 A% f" J6 S; j
  912. dis2[12]='-';
    % P0 N- `$ W. F2 [& `
  913. dis2[13]='-';
    * a6 {3 f3 c" g0 D2 I1 ?
  914. dis2[14]='-';
    " P+ n- O1 f, V$ j& M! w3 H
  915. dis2[15]='-';% Q/ ]3 h% _% p" K% P( z
  916. }
    & x- I5 ^6 F* C4 s. ]0 c
  917. 2 b0 @, U( @7 o
  918. }   
    0 j- ?, {0 A1 l2 M. K
  919. ! I% \* A: [2 q) ]) b4 B' M
  920. //*********************************************
    # t8 J2 r* T- p0 W( p' Y
  921. //雲臺 手動 轉向 COMMAND
    5 v6 O$ G4 ^$ X1 e* D
  922. // % g2 W; {" _- K$ p7 C! ~% O
  923. //int rd_S; //指令 All Stop+ Z. g# G9 ]# I/ z
  924. //int rd_R; //指令 Clockwise Rotation! e) s3 ]5 z- O
  925. //int rd_L; //指令 Counter Clockwise Rotation
    # y1 T* j- }7 ^0 z0 p: j
  926. //int rd_A; //指令 CW/CCW Rotation Stop
    - i; _$ S, X' y. E, e$ @
  927. //int rd_U; //指令 UP Direction Rotation+ G  ]) A/ F4 f" L6 P% S5 z
  928. //int rd_D; //指令 DOWN Direction Rotation7 O8 d8 o0 ]: n( R6 M4 S$ @
  929. //int rd_E; //指令 UP/DOWN Direction Rotation Stop
    9 S& h1 b8 P8 d3 n, g9 w' u7 G
  930. //**********************************************
    # E5 d1 c, p4 I' H" @- N( T
  931. void PB_cmd(void)
    ( {, c: e4 `, p* Z- }7 \- \) y2 W1 u
  932. {
    0 f! c5 y5 P* t: P
  933. rd_M=0;
    9 B# Y9 Y  O7 k" c! {, |
  934. rd_W=0;
    0 S' e0 m5 K/ s9 Q; s2 {& A
  935. rd_L=0;+ b5 ]  M. J- I* X9 A
  936. rd_R=0;
    7 f, a, O2 ]" U2 j  i
  937. rd_A=0;
    # \1 Y. q/ }3 d) B& R
  938. rd_U=0;- \2 f1 O; G4 t8 K9 j# ]
  939. rd_D=0;
    , h0 z+ i* P  p. |6 L, J- E, u
  940. rd_E=0;
    ( j! ^; F' J2 x) M
  941. rd_S=0; + W' T3 Z9 Q  Q$ [& g2 M2 _# b3 G
  942. if(RA2==0) //檢查按鍵 上
    % d. L$ r2 e( Q# A* b( G7 I" _& O
  943. {
    8 E1 B! ~" d: e7 C) s5 f
  944. nms_delay(5);
    ( E" t7 U; x7 ?/ R0 M! s# D- B' |6 q* q( r
  945. if(RA2==0)& I: ~8 |( y3 R5 \* p5 m  U6 x
  946. {6 P6 H& h6 q  a" a* K8 o. B
  947. rd_D=0; //互鎖5 d, @/ A8 j: I; m4 T1 U# ^7 u
  948. rd_U=1;
    & c/ i  A3 I5 E, V' v8 C
  949. }/ W8 r* u; u3 X0 O- b1 E3 }2 `
  950. }; k2 L( ]/ u/ `; D1 |) y
  951. else0 @3 {& R* x- g6 W8 o- `) e
  952. {
    & b8 R7 v7 a0 n. X% N) A. U( @
  953. rd_U=0;+ ~, C' _  k% O% H
  954. }; L0 l' i; _/ U: h" |( X( v
  955. , }1 E1 @3 j; P3 @, l
  956. if(RA3==0) //檢查按鍵 下  W# \1 j! b. q. V. L; C$ {# |
  957. {
    5 i8 D. k' ~. }1 B/ e
  958. nms_delay(5);# I; E2 C" R- ]8 ^3 d) S
  959. if(RA3==0)
    6 m% T) c! O; u8 E
  960. {) e; o5 m- X2 O+ a
  961. rd_U=0; //互鎖6 U1 c3 l* M1 T7 W0 v; Y% a. P" {
  962. rd_D=1;
    # n) T6 J3 p. s3 L4 ~0 i
  963. }
    * m: l* \7 w. B  s3 O- \
  964. }* J/ S- k/ N, [
  965. else& e" p% m6 D; A- l, i
  966. {! Q- r% b. Z" ~2 E
  967. rd_D=0;: O5 o% P- @+ A' S
  968. }3 E% K% N9 T4 ]5 J
  969. 9 f' G0 Z. k: w" ^1 i0 l+ _
  970. if(RC1==0) //檢查按鍵 左+ |& Y3 k3 b- ^( m2 ^
  971. { // (RA4 不可以用(無法改變數值+狀態不定) /改用 RC1)/ K' \6 x) c& }4 u7 d. D
  972. nms_delay(5);
    " j) d7 y6 W  s# X
  973. if(RC1==0)& y/ O% g+ c1 t) i7 A
  974. {
    ! U) ~) N& g/ i* g, q6 V( ^
  975. rd_R=0;
    7 O, i+ k; _/ Y0 p. }
  976. rd_L=1;
    - |6 w! I5 ]7 B  ^( d
  977. }
    ! l5 t6 @; ?# T
  978. }! r3 m+ u3 n. c! s; t  k& {$ i
  979. else
    ( w. ?/ g1 D# H$ i( j4 e% J8 e% S
  980. {1 ~% s" u0 A  e( x' g! v& e
  981. rd_L=0;* l- [2 t1 M; U" F8 q$ p8 K4 Y$ d
  982. }) ?* m$ t- |4 G
  983. 5 [6 T" G  B8 M/ }/ ?+ P5 q
  984. if(RA5==0) //檢查按鍵 右
    # ]3 |$ {: _6 o2 ]* K, O6 w3 G2 Z8 h
  985. {+ r$ a& r& e' H/ |
  986. nms_delay(5);
    ' w' T% t) d( T8 Z6 d- [
  987. if(RA5==0)! \1 i& v" Z. K6 G2 f
  988. {
    - s- o% T7 x# {; }  y+ o
  989. rd_L=0;: o- N8 Q, X* l$ G) R
  990. rd_R=1;
    2 ^: K7 `0 t9 z! F/ M
  991. }
    * V8 U5 P+ C% r8 N2 J. Q3 R8 v
  992. }  j. I) D$ w! e7 E! m5 E, r
  993. else
    + X- S8 G/ y* Z$ s
  994. {9 k- r3 u3 ]) g6 i
  995. rd_R=0;
    " H" \# J; E9 y9 H2 p
  996. }/ I6 X* M; i* k! q. k* q
  997. , [+ U& y2 x' h# q2 q
  998. if(RC0==0) //檢查按鍵 停
    , M, Q' F% c& Z/ }$ B& ]# S
  999. {) @$ U& \" r5 y" P; `/ `
  1000. nms_delay(5);$ q' }9 h% l# F. i1 N' R& ?  g
  1001. if(RC0==0)
    ; b, g; }. @0 X5 W* q6 d/ ]' p
  1002. {
    8 E' ?9 Q) d) [- S! t
  1003. rd_L=0;
    + y- s. {. D( U: g
  1004. rd_R=0;
    5 B, E3 o2 w* S- }+ V+ t
  1005. rd_U=0;
    - b. G( m$ j) x
  1006. rd_D=0;
    / V7 F$ b* S" B. I
  1007. rd_S=1;
    + S! H5 M# y" @- h7 x3 O0 F1 Z
  1008. }6 K1 x* Z2 i* j2 g
  1009. }0 ?3 z0 O+ i4 ^& Z; ~
  1010. else7 c$ E! X; [, s( |5 T/ V
  1011. {* \9 t4 g* }" F; v3 j
  1012. rd_S=0;1 ]2 x5 `2 U4 R5 r  q
  1013. }
    % ?9 Z* S& x- `: w+ L0 l1 V

  1014. - C  G  k6 |- H
  1015. }2 |% L% z9 G1 G) Z9 B: p

  1016. ' ?5 i. [$ h" k* C7 Y
  1017. //*********************************************: y2 x' f3 P, C- M$ a
  1018. //CHECK STOP COMMAND
    " H: i$ z  v. t9 L
  1019. //int rd_S; //指令 All Stop& |7 M+ {, K7 J1 D
  1020. //**********************************************8 `& [* Q. }' g% b3 _$ T2 b
  1021. void CHK_stop(void)   z% z" T. s2 X" f
  1022. {
    , y1 j& w: q2 C- R; A$ s/ S
  1023. if(RC0==0) //檢查按鍵 停
    . B: U' D4 L+ S# Q, H" g
  1024. {3 h3 o' x3 J( ]
  1025. nms_delay(5);6 h6 m- r/ V3 z$ T2 M
  1026. if(RC0==0)9 C( [7 p; K% Y$ O' N( Z. U# A
  1027. {9 n9 i4 R& q4 {- m0 k$ ^  L
  1028. rd_L=0;3 f/ S& J( w: p; J
  1029. rd_R=0;2 j1 `8 W8 R6 e0 u9 x
  1030. rd_U=0;
    9 O3 k  B; {' ~& ]6 W/ Y3 ?/ r
  1031. rd_D=0;! {0 E9 C8 \5 ?# K- m6 P
  1032. rd_S=1;
    4 v  Y1 v$ w; X) o
  1033. }
    9 m, ~( g# j! P. d
  1034. }2 c* a9 s; o1 _  v9 [
  1035. else
    9 T( v1 N6 A* ~. \5 I
  1036. {
    : T. q5 F. b' @2 g" O( i3 f
  1037. rd_S=0;
    ; ?1 E% s( Y, }; t1 e" ~
  1038. }
    ' T2 M* M# _$ M' {
  1039. , Z0 B: ]$ B. W" j: f7 Q
  1040. }+ c! d5 L; o0 J0 m) j
  1041.   o7 o! _4 Z' L; K4 n

  1042. + `) W9 `, _- T
  1043. //**************************************************************************************************% v, i) D8 U7 h0 k/ v( Y  w
  1044. //串口中斷函數! `# z+ {' s- [+ q
  1045. //接收要求或指令 並改變旗標 $ @' r0 }' q9 \( X1 Z
  1046. //int rd_AZ; //要求 水平角度
    " o) @9 e) G1 e1 ]9 B4 [! p+ @; m
  1047. //int rd_EL; //要求 傾角
    + T+ Q6 h+ K) Y; a
  1048. //int rd_AZEL; //要求 水平 + 傾角
    3 E6 F7 ^4 v$ y) P4 ^0 P1 ?* u% _
  1049. //
    4 y/ |: R$ A; [
  1050. //int rd_M; //指令 前往 Mxxx 水平角度xxx- H$ `  G# [" e& E. Y8 a
  1051. //int rd_W; //指令 前往 Wxxx yyy 水平角度xxx 傾角yyy
    0 F. d4 S, h2 M; Y/ P0 V0 v
  1052. //) }5 i. r5 ~# v- Q: p5 R0 ?% b/ X
  1053. //int rd_R; //指令 Clockwise Rotation7 Q$ R" E7 Y: z& A- ?
  1054. //int rd_L; //指令 Counter Clockwise Rotation
    1 B. i8 m# y+ w! D2 z7 W' Q( D
  1055. //int rd_A; //指令 CW/CCW Rotation Stop4 ~, ?4 L0 y7 D6 K5 u
  1056. //
    ! U( _* J( ?% v$ j
  1057. //int rd_U; //指令 UP Direction Rotation
    , T1 J, `$ {, ^& z+ ^) g, ]
  1058. //int rd_D; //指令 DOWN Direction Rotation
    ! ^' i% ~- ?% I' u% G2 a/ Q
  1059. //int rd_E; //指令 UP/DOWN Direction Rotation Stop
    2 p0 b) t" ~: D/ k7 t& @* c
  1060. //! M3 Q1 q7 ]7 y  L% G. e& k: O
  1061. //int rd_S; //指令 All Stop7 T) X; W" Z* W" q# ]  k
  1062. //**************************************************************************************************\/ B( s0 r4 @( _  S1 u6 @0 ?4 t
  1063. void interrupt usart(void)
    ) T0 A& M/ h9 O% w
  1064. {
    : V) R/ ^9 @* F; v: p. {
  1065. int i;4 k; I( ~' S5 W* B. j9 M  X
  1066. if(RCIF)( l0 }5 e& S' O5 d8 }; h/ n  g1 Q
  1067. {
    $ r0 C- H7 H; C' c: w- b3 B
  1068. RecArray[i] = RCREG;/ l3 m, o6 d8 X9 F6 S% X
  1069. i=i++;
    6 |- |) ^! s# }4 L
  1070. //if(RCREG==0x0D|RCREG==0x20)
    ( b8 ]- {; \% y1 M
  1071. if(RCREG==0x0D)$ Y- H9 B6 r: Y& W
  1072. {( j3 G- l$ j* y, S1 N" k" s: f
  1073. //if(RecArray[0]==0x43&&rd_M!=1&&rd_W!=1)  // 如果抓到開頭為 C 並且無自動指令 M W2 u, l" r8 A  N, b3 }/ ?9 E% H
  1074. if(RecArray[0]==0x43)  // 如果抓到開頭為 C 並且無自動指令 M W
    0 E8 R1 O) |. u! @; J+ }2 H& u
  1075. {1 j' T% c1 s" m
  1076. rd_AZ=1;* C' b7 m4 Q  K. d9 _
  1077. }: s+ L& T; G; n7 F, C/ e0 K4 Y
  1078. //if(RecArray[0]==0x42&&rd_M!=1&&rd_W!=1)  // 如果抓到開頭為 B 並且無自動指令 M W
    3 u% b9 v3 f9 b$ G8 V, g! ]
  1079. if(RecArray[0]==0x42)  // 如果抓到開頭為 B 並且無自動指令 M W
    1 t& j+ p# J1 [) d
  1080. {
    ! c$ Q# {8 C# s+ E; b6 X- c' ?
  1081. rd_EL=1;! G5 b1 V" D$ C2 ^$ g+ y6 A
  1082. }
    7 Q) T) k4 M7 l$ n) X2 `
  1083. //if(RecArray[0]==0x43 && RecArray[1]==0x32&&rd_M!=1&&rd_W!=1)  // 如果抓到開頭為 C2 並且無自動指令 M W) Z) [/ m8 k+ x7 X4 V# S
  1084. if(RecArray[0]==0x43 && RecArray[1]==0x32)  // 如果抓到開頭為 C2 並且無自動指令 M W
    0 h6 l/ r+ `0 c5 m' Y
  1085. {
    3 ]2 T( j( g* w8 f  V) `; _
  1086. rd_AZ=0;7 C0 V0 H' J' D3 R
  1087. rd_EL=0;4 J/ d; u1 x/ a: Z
  1088. rd_AZEL=1;, c6 \2 F6 B1 R, T0 ~4 ]7 B
  1089. }
    9 G) e9 _8 J& p( S; J: h& c2 z7 n- {
  1090. if(RecArray[0]==0x4D)   // 如果抓到開頭為 M 水平自動指令9 ~/ r& [9 b& X
  1091. {5 c0 x3 D$ Z8 l( o) ^) ?
  1092. rd_M=1;
    $ H. f! e' I: C
  1093. }
    . M7 W) j  s& Y
  1094. if(RecArray[0]==0x57)   // 如果抓到開頭為 W 水平+傾角自動指令6 ~" Y0 ?8 T  j' `
  1095. {+ J' R; p- b! c# S$ n8 @) y; r) S) n
  1096. rd_W=1;
    # X" ~# |( @- J$ V. ~5 M8 l
  1097. }6 {) C( J; Y5 M- Q
  1098. . [7 T. f9 o1 m. M6 a1 C) P
  1099. if(RecArray[0]==0x52)   // 如果抓到開頭為 R
    ! H) W) J+ d. {7 [) h
  1100. {* Y6 k6 u3 K5 v6 L& m  C3 [
  1101. rd_L=0;5 y. ?. ]( z% i/ Z" g* R
  1102. rd_R=1;
    ' |/ Z- a5 b7 L/ m+ q0 s
  1103. }; R% F7 S; F" ?4 k& R/ @
  1104. if(RecArray[0]==0x4C)   // 如果抓到開頭為 L9 t/ W9 q4 b7 K0 c7 ^
  1105. {
    " ]/ E* s5 y7 c! D# \2 U* }
  1106. rd_R=0;
    1 Q  a& {; B! `, ?& Q$ h
  1107. rd_L=1;
    / _/ d( C/ B9 B3 Q  Z
  1108. }
    + h# j! {$ e0 }: x9 e: e& @
  1109. if(RecArray[0]==0x41)   // 如果抓到開頭為 A: W1 `6 D) V' y5 z; }$ J
  1110. {
    5 `& F' Z! l) v/ @5 A/ }! I% e
  1111. rd_L=0;
    4 y, q! N4 i' R0 H
  1112. rd_R=0;# i' W7 f: V5 j$ i
  1113. rd_A=1;
    0 @, a" j. X; T! ]$ X3 a, Q9 _
  1114. }
    * F- I! P1 s# m4 w1 n2 w" y. @
  1115. if(RecArray[0]==0x55)   // 如果抓到開頭為 U
      y+ u- }  K# L* [
  1116. {8 V  k% [, I' @  N, }7 S! D! k: W
  1117. rd_D=0;
    + R2 g- [0 o- k4 I
  1118. rd_U=1;' y. i# b* ?8 s: d
  1119. }
    0 Z9 g3 I! S: h/ ^' ?
  1120. if(RecArray[0]==0x44)   // 如果抓到開頭為 D# y4 e3 [4 f  g6 @( S# K3 S
  1121. {
    5 F2 F5 R+ t% v0 y$ \
  1122. rd_U=0;% Q1 i5 V1 d; O  r$ P
  1123. rd_D=1;
    % ~: q( [' T  I. w) Q; a2 v
  1124. }" }! B4 J; d( ]- j4 Z
  1125. if(RecArray[0]==0x45)   // 如果抓到開頭為 E
    9 n7 F! z: d) i. F$ U; d3 ~
  1126. {
    9 u  ^) F7 R2 Y& T6 z
  1127. rd_U=0;
    % V, N: `( x" S# z9 ]. T
  1128. rd_D=0;0 L  N* f3 u1 ^
  1129. rd_E=1;7 h/ O7 [# B9 ^" K! F/ [. \
  1130. }
      W$ |( b) w/ D& T/ j( @- R
  1131. if(RecArray[0]==0x53)   // 如果抓到開頭為 S
    $ ]9 h5 V; X, f/ s0 ~- m' ?
  1132. {* W  ~& W( S2 ?& q
  1133. rd_M=0;# c2 I6 H- ?( s$ b  O/ A
  1134. rd_W=0;: r3 K( w2 Q1 @  g2 t4 t
  1135. rd_L=0;6 P1 Z" ?+ K2 B3 J2 o) h
  1136. rd_R=0;
    7 I+ q/ j( a- U( Z( u
  1137. rd_A=0;6 }. R1 w9 T6 F9 g+ R  O/ |
  1138. rd_U=0;+ e+ e7 z/ w! ]  u5 c
  1139. rd_D=0;
    ' g, |6 L5 v" W' S$ |7 P% {. s
  1140. rd_E=0;2 _- m, H# {3 b6 B. E+ D- ^  b) D
  1141. rd_S=1;
    + e0 c2 R  P0 I7 x+ _; |
  1142. }/ T0 ~. V1 k6 n5 N! o4 e4 `1 A
  1143. i=0;4 M, d3 ]  N" ?* t3 G6 q
  1144. }; S; I- S. C) V5 w
  1145. if(i>=11)% `- b5 P" z2 f; f  c+ _& N% O
  1146. {6 \8 H) C& I( g( g! z1 ^
  1147. i=0; //如果超過12(0~11)個字元就把i歸零(一直重複,將此次訊號收完,防止溢位)
    : v8 ]' T! B2 S6 p# @
  1148. }
    % c0 Z+ q+ Z% H; r# c; @
  1149. }7 w( m5 T' y, `, a) n/ b, W
  1150. }) H! Q- J' M: C$ b. G  z
  1151. $ v/ {+ f7 p" _

  1152. " A9 T- X& v/ c
  1153. //****************************************************************************************% S: G  A$ O! v0 A! y- G
  1154. //主函數
    + {" Q+ f" r$ ~$ A: H
  1155. //****************************************************************************************: D5 E! k# c( X, r% e# c' m. w
  1156. main()/ ~2 `0 e" I% t3 y
  1157. {  $ m6 F0 U* i0 E# _8 r
  1158. uchar cntl;
    ( E, k) r1 t- R1 i- H
  1159. . F. q5 T; E  C3 t4 f$ F, I3 o
  1160.    //__CONFIG(XT&WDTEN&LVPDIS);//配置,設置為晶振XT方式振蕩,看門狗,禁低電壓編程
      Q9 ~8 N" R* O# A2 I5 V4 N
  1161.    __CONFIG(XT&WDTDIS&LVPDIS);//配置,設置為晶振XT方式振蕩,禁看門狗,禁低電壓編程9 u5 S2 P% o/ m& u' N

  1162. # h1 z0 E$ w3 h3 a
  1163.    mcu_init(); //晶片初始化3 ~+ e' ^" n9 P3 N+ D5 \3 `2 d4 V
  1164.    IO_init(); //IO初始化% c/ Z7 |3 b3 ^" B- s9 i9 A( J
  1165.    init_com(); //初始化串口
    % P$ U8 u/ P9 E/ {
  1166.    InitLCD(); //初始化1602
    & N# t' A  q8 k7 y! I$ e8 Z- m
  1167.    xian1();                   //顯示 等待訊息. X5 f6 i, B, Q+ p( }6 t
  1168.    xian2();                   //顯示 等待訊息
    4 s% k/ |0 A5 j
  1169.    Init_wt(); //初始化雲臺(確保不會正好在 Over0 或是 Over360); H* |/ R$ m4 q9 D' R" i
  1170.    while(1) //進入while死循環( [# k; K  t8 X( m, j/ J# o
  1171.       {: c% A" d) ]+ Z. J) O* v

  1172. 8 B9 c+ j6 Z* i
  1173. result=get_AD(); //讀取傾角電壓
    / ?  b/ u  _0 b; {
  1174.      conversion2(result);         //數據轉換出個,十,百,千 位5 Y1 Q  K* t3 a- k
  1175. if(rd_U==0&&rd_D==0)% ]: m# p/ D5 z
  1176. {
    6 }' _- h' u8 K; ]! J
  1177.         CMP_DATA=get_GY_26(1,0x31);   //讀取角度
    0 g+ W' k3 j- E. P  h, x
  1178.      conversion(CMP_DATA);         //數據轉換出個,十,百,千 位
    0 D) F  |5 ]: I7 h8 h% o
  1179. }, Y2 ^1 T7 T% o7 D* d
  1180.         xian1();                   //顯示 第1行刷新
    4 E8 M: u3 v7 Z( J7 z
  1181.         xian2();                   //顯示 第2行刷新
    + X" ]. ~) S& O/ X) B& B4 j- L5 t2 Q
  1182. conTIO();
    " v' A. \7 P( b8 ^9 F% z
  1183. cmdCHK();2 _# h+ A' }; a2 ?/ r
  1184. if(RA1==1) //檢查模式 自動=1 手動=0
    7 G" h' o) ^1 k* `7 z- h2 N
  1185. {  S6 @0 `- ~9 ?) A& J4 V7 Q
  1186. dis1[15]='A';
    6 _' `+ r' t- o0 l* O2 z, S0 }
  1187. if(rd_M==1|rd_W==1)- I. o8 w6 T. ~; A  ^
  1188. {) c3 M% j" L  s: D  c2 a
  1189.       con_WB();          //轉換指令後之「文字」變成「數字」
    & f3 n3 r$ ~/ y  P7 [
  1190. turn_cmd(); //檢測是否要旋轉
    % \* Z2 l2 S6 h
  1191. //turn_dsp(); //旋轉狀態顯示
      I7 Q% d. \9 Q8 U4 U6 w+ }
  1192. }. \0 D" R, I8 g4 @- l  g! h" }$ S
  1193. CHK_stop(); //檢測是否STOP有按下
    5 K& j. e- r) a7 `
  1194. turn_dsp(); //旋轉狀態顯示
    , C* ], z. }# `* C0 K+ i' O- `9 s
  1195. }# ^) K% G5 O. }+ u2 R
  1196. if(RA1==0) //檢查模式 自動=1 手動=0
    4 x, e( _+ h  Y' B9 p
  1197. {5 _  X! |  p' R
  1198. dis1[15]='M';/ F- _: i  f1 l: P% O7 ~
  1199. rd_M=0;
    1 N7 P6 ~, d  e9 d
  1200. rd_W=0;
    * w  B! t5 d# Q$ m
  1201. PB_cmd(); //掃描按鍵狀態5 |! O6 P/ A1 @7 R9 A
  1202. turn_dsp(); //旋轉狀態顯示
    # _5 a/ E$ S) u6 y$ g/ X
  1203. }
    0 {5 z0 ~" h. \4 F- V

  1204. ) {. \! @) G. b; u+ [7 x
  1205.    }
    " L" n9 s, Y# J
  1206. }
    1 q  a' ~" {# [9 N3 `

  1207. 0 u4 S/ E4 }5 ^  u9 e, }8 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 |顯示全部樓層
眼前一片模糊
7 ?% W7 J6 C4 Z8 U* n但是還是感謝樓主分享
方位 : 338
台號 : 巴比Q ( B.B.Q )
回復

使用道具 舉報

1

主題

0

好友

150

積分

Hotel

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

發表於 2012-9-28 12:06:52 |顯示全部樓層
謝謝分享喔!! 讚啦# I. J9 p* r% F" L

% z$ a4 W! s6 `2 O# J2 Sde 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 t, m4 o0 ?, W5 E" }
感謝分享,很讚,我目前使用的是一位大陸OM BH4TDV開發的控制盒,接的是舊型Kenpro水平和仰角馬達。 ...

6 i. |6 n6 m! o  mBH4TDV開發的控制盒 是很優秀的產品
, T) I5 a$ Q/ r, b5 V. R我本來也是要跟他買的,這次自主開發這東西,其實從頭到尾的花費是高於跟BH4TDV購買控制盒的!, U' z0 E3 H  L! u
(當然是把研發設備都算了進去...單製作控制器是不用那麼貴的!)( _! p6 y* p1 o% q9 P, j$ d
/ L, |5 M4 R# u+ c1 X5 O
使用原有設備是最經濟的,但是我沒有仰角馬達...所以只能胡搞一通了!!!!- \1 |7 d7 V) e& {
; T, i) I* K) R+ ~

7 M7 u* s0 A& H" k( ]但是就是想自己試試看,真的不行至少還有都洗可以買來用!!!- [4 X; d9 Y( z7 A+ A6 H2 J
在這次的開發中,台北蕭醫師(BM2CAJ)給了關鍵的提示(上位機通訊方式)才能讓這東西生出來!!
403 笨牛「145.78/431.72」

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

使用道具 舉報

10

主題

6

好友

9萬

積分

分區版主

Rank: 55Rank: 55Rank: 55

發表於 2012-10-3 09:30:52 |顯示全部樓層
哈,能自行開發出來很讚呀!
; P8 O) s1 V$ b; J; S- |蕭醫師和您都很厲害呢! :D  / p% Q- N+ G7 w4 ?$ [1 y
BH4TDV 馬工,年輕有為,我的馬達是很舊的二手品,原本是沒有設計可來接電腦的,但在利用馬工的控制盒來改裝使用時,馬工在QQ上很熱心地協助最終我順利可以來利用電腦實行自動衛星追踨。
0 q/ a! p0 }: M- H
* V* Z1 I2 w/ [- ?我的下一個project是打算來弄個可portable的衛星追踨系統,市區V/U 干擾不少,我想portable 到遠離干擾的地方來作衛星通訊是個可嘗試的方式。
回復

使用道具 舉報

58

主題

11

好友

11萬

積分

分區版主

辛勤的下层劳动者

Rank: 55Rank: 55Rank: 55

發表於 2012-10-3 09:47:18 |顯示全部樓層
BX2AI 發表於 2012-10-3 09:30 6 d' \7 ]8 w- b% W2 E7 |- b' h  V# G" o
哈,能自行開發出來很讚呀!
5 k0 m3 t4 N/ e蕭醫師和您都很厲害呢! :D  
3 _/ n4 @# Z# zBH4TDV 馬工,年輕有為,我的馬達是很舊的二手品, ...
( T5 K& S: k+ y+ z
傳統的 旋轉/仰角 馬達,輸入到控制盒的訊號反而很單純,就是電壓訊號..
# a4 U6 p  O; [4 e, d如果要攜帶出門,馬工的產品加上能帶著走的雲臺是不錯的選擇!
$ k. `: q1 ]# g0 [/ l0 Y% e至於 馬工 有用步進電機做的攜帶式設備,我也有考慮過!
* M2 l7 @6 [3 x2 c# G# \3 y" f7 ?# c
但是步進電機(+機械架構)在我這邊不好取得(應該說我的領域不知道哪邊方便取得吧!),所以就暫時擱著了!9 D& R2 s1 @- x) D
其實構想都是人家的,我只是用自己能想到的方法山寨一下...- a  Y0 m' Z! t# d) }7 Y( v; k8 Z1 ~
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 |顯示全部樓層
非常讚!
, |/ b. v; _5 c0 Q8 s$ Y請問你的雲台是自製? 還是買的? 看來很勇!
8 B- T: y0 l: v! O# r- P, z0 M- C6 w# C6 q
我的雲台載重 10Kg 最近猶豫要不要改?
) K* b; Q6 Y1 O7 k
$ B: m* J4 o% g/ }4 ]) H73 de BM2CAJ
. U( l9 `/ `* Z0 A# Q; U
回復

使用道具 舉報

58

主題

11

好友

11萬

積分

分區版主

辛勤的下层劳动者

Rank: 55Rank: 55Rank: 55

發表於 2012-10-3 14:09:31 |顯示全部樓層
BM2CAJ 發表於 2012-10-3 11:51
4 E+ D0 |. P  x& E' @/ t非常讚!
  g2 W0 Q6 c. g$ K- ?請問你的雲台是自製? 還是買的? 看來很勇!
' h4 K$ F* _; \* q( @$ F
才說要感謝您呢!
+ s! f, T, @$ W9 q. I& D雲台我目前用的是跟朋友A的....... VICON V330APT 110VAC "閹割版"
" G  y# i4 b8 g# r因為裡面的 可變電阻回授部分都沒有 限位器也沒有回授(只有自保護)...# H# e  M* R! W
9 a* P8 V! c: X5 V, a* y) s1 z
完整版的說明書- \7 s9 O, }0 @  q: @& i! u: s
( f5 Z8 C  S! P  j  }' w4 P
看資料載重應該是16KG...& p- i% c( J& Z0 y& s$ ^% q

  a/ x' O% r7 l( V$ Y! m但是我有試過在室內,我人(約90KG)坐在上面腳離地...0 V# Z4 I- E+ ]2 _! ]
旋轉沒問題, 但是俯仰不行 會一直跑掉需要修正!
6 I" Q( c) S0 n9 L
5 ~9 @5 x9 c6 c. S' G# j73
403 笨牛「145.78/431.72」

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

使用道具 舉報

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

Archiver|手機版|CQ Taiwan

GMT+8, 2019-6-16 14:35 , Processed in 0.589467 second(s), 9 queries , Apc On.

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回頂部 回頂部