伊莉討論區

標題: VB 經由RS232傳送到8951 [打印本頁]

作者: miechelle    時間: 2011-6-23 05:23 PM     標題: VB 經由RS232傳送到8951

本帖最後由 arthurliuliu 於 2011-6-23 07:15 PM 編輯

各位大大你好,我想請問一下,要如何傳輸資料到8951,我目前已可傳兩個ASCII碼的值

而我現在流程如下
1.由VB6作一程式發送資料
2.再經由USB轉RS232之後輸出
3.由8951接收,然後再輸出到LED

目前確定硬體上應該是沒有錯的,所以我在想是不是程式上出了問題我把程式貼上來

這是VB的
  1. Dim t, s As String

  2. Private Sub Command1_Click()
  3. Call Text1_Change
  4. End Sub
  5. Private Sub Command2_Click()
  6. Call Text2_Change
  7. End Sub
  8. Private Sub Form_Load()
  9. ' 通訊參數: 9600bps, 無校驗, 8bit資料, 1bit停止碼
  10. MSComm1.Settings = "9600,N,8,1" '設定通訊埠位元
  11. End Sub
  12. Private Sub OptCOM1_Click()
  13. If OptCOM1.Value Then MSComm1.CommPort = 1
  14. End Sub
  15. Private Sub OptCOM2_Click()
  16. If OptCOM2.Value Then MSComm1.CommPort = 2
  17. End Sub
  18. Private Sub OptCOM3_Click()
  19. If OptCOM3.Value Then MSComm1.CommPort = 3
  20. End Sub
  21. Private Sub OptCOM4_Click()
  22. If OptCOM4.Value Then MSComm1.CommPort = 4
  23. End Sub

  24. '==========================================================
  25. '2進位轉換成16進位的副程式
  26. '把8個2進位字串分成2組,轉換成2個16進位碼
  27. '==========================================================
  28. Public Function bin_hex(bin$)
  29. Dim tmp As Integer '宣告tmp為數值
  30. Dim tmp2 As Integer '宣告i為數值
  31. Dim hex As String '宣告hex為字串
  32. Dim hex2bit As String '宣告hex2bit為字串
  33. tmp = Int(bin$ / 16)
  34. tmp2 = bin$ - tmp * 16
  35. Select Case tmp '取得的10進位碼轉換成16進位碼
  36. Case 0 To 9: hex = CStr(tmp) '如果是0-9數值,則是轉換成0-9的字串
  37. Case 10: hex = "A" '如果是10,則轉換成"A"字串
  38. Case 11: hex = "B" '如果是11,則轉換成"B"字串
  39. Case 12: hex = "C" '如果是12,則轉換成"C"字串
  40. Case 13: hex = "D" '如果是13,則轉換成"D"字串
  41. Case 14: hex = "E" '如果是14,則轉換成"E"字串
  42. Case 15: hex = "F" '如果是15,則轉換成"F"字串
  43. End Select

  44. hex2bit = hex2bit + hex
  45. Select Case tmp2 '取得的10進位碼轉換成16進位碼
  46. Case 0 To 9: hex = CStr(tmp2) '如果是0-9數值,則是轉換成0-9的字串
  47. Case 10: hex = "A" '如果是10,則轉換成"A"字串
  48. Case 11: hex = "B" '如果是11,則轉換成"B"字串
  49. Case 12: hex = "C" '如果是12,則轉換成"C"字串
  50. Case 13: hex = "D" '如果是13,則轉換成"D"字串
  51. Case 14: hex = "E" '如果是14,則轉換成"E"字串
  52. Case 15: hex = "F" '如果是15,則轉換成"F"字串
  53. End Select

  54. hex2bit = hex2bit + hex
  55. bin_hex = hex2bit '傳回2進位轉換成16進位的值
  56. End Function
  57. Private Sub Text1_Change()
  58. t = bin_hex(Val(Text1))
  59. Label1.Caption = "T..."
  60. MSComm1.PortOpen = True '開啟通訊埠
  61. MSComm1.Output = "9" + t 'Chr$(&H30) 設定單晶片判別碼及輸出資料MSComm1.PortOpen = False
  62. End Sub


  63. MSComm1.Output = "9" + t    "<----輸出9的ASCII碼和tmp的ASCII  而 tmp2卻無法出來
  64. 若改成
  65. MSComm1.Output = t+"9"       "<----輸出tmp的ASCII碼和tmp2的ASCII  而9卻無法出來

  66. 以下是我8951的程式

  67. #include <AT89X51.h>
  68. void UART(void)
  69. {
  70. SCON=0x50;
  71. TMOD=0x20;
  72. TH1=253;
  73. TL1=253;
  74. TR1=1;
  75. PCON = 0x00;
  76.     IE=0x90;
  77. }
  78. void delay(void) {
  79.     long int j = 0;
  80. for (j = 0; j < 40000; j++);
  81. }
  82. main()
  83. {
  84. int tmp = 0x00;
  85.     char i = 0;
  86. P1=0x00;
  87. UART();
  88. while(1)
  89. {
  90.   while(RI==0);
  91.   RI=0;
  92.   P1=SBUF;
  93. delay();
  94. P1=0x00;
  95. delay();
  96.     }
  97. }
複製代碼


以上就是我的程式和步驟,我想請各位大大幫一下,這兩個程式卡了很久了,如果有甚麼建議或者是範例,不知可不可以貼上來討論一下
作者: kev72806    時間: 2011-10-10 12:01 PM

bps建議改成1200
51那裏的TH1和TL1也要改成250(如果你石英晶體是12MHz)
SCON也要改成0x70
我都是用1200傳都沒問題喔

重點是...
你51那裏沒有串列接收副程式(interrupt 1)
寫一個串列中斷副程式吧~沒有的話怎模也接不到東西的
作者: miechelle    時間: 2011-10-10 01:56 PM

我的問題己經解決了 ,不過還是要謝謝你喔。^^

之前不行是因為我忘了寫中斷的副程式= =,唉~~~

總之謝謝囉




歡迎光臨 伊莉討論區 (http://a13.mobile.wahas.com/) Powered by Discuz!