標(biāo)題: PC機(jī)VB與單片機(jī)串口通信源代碼(含上位機(jī)與下位機(jī)) [打印本頁(yè)]

作者: bhljh    時(shí)間: 2018-11-17 10:17
標(biāo)題: PC機(jī)VB與單片機(jī)串口通信源代碼(含上位機(jī)與下位機(jī))


單片機(jī)源程序如下:

  1. //采用異步方式傳送數(shù)據(jù),偶校驗(yàn),一位結(jié)束位,傳輸?shù)臄?shù)據(jù)傳輸速率為9600bit/s。每個(gè)數(shù)據(jù)幀包含10Byte信息,1Byte作為幀起始標(biāo)志,8Byte數(shù)據(jù),1Byte的校驗(yàn)和。
  2. //-----------------------函數(shù)聲明,變量定義--------------------------------------------------------
  3. #include <reg51.h>
  4. #define COUNT 10                   // 定義接收緩沖區(qū)大小
  5. unsigned char buffer[COUNT];              //定義接收緩沖區(qū)
  6. unsigned char point;                   //定義接收數(shù)據(jù)個(gè)數(shù)指示變量
  7. void UART_init();                    //串口初始化函數(shù)
  8. void COM_send(void);                //串口接收函數(shù)
  9. unsigned char CLU_checkdata(void);     //計(jì)算校驗(yàn)位函數(shù)
  10. //--------------------------------------------------------------------------------------------------
  11. // 函數(shù)名稱(chēng): UART_init()串口初始化函數(shù)
  12. // 函數(shù)功能: 在系統(tǒng)時(shí)鐘為11.059MHZ時(shí),設(shè)定串口波特率為9600bit/s
  13. //            串口接收中斷允許,發(fā)送中斷禁止
  14. //初始化串行口和波特率發(fā)生器
  15. //--------------------------------------------------------------------------------------------------
  16. void UART_init()
  17. {                    
  18. SCON =0x58;          //選擇串口工作方式,打開(kāi)接收允許
  19. TMOD =0x21;          //定時(shí)器1工作在方式2,定時(shí)器0工作在方式1
  20. TH1 =0xfd;           //實(shí)現(xiàn)波特率9600(系統(tǒng)時(shí)鐘11.0592MHZ)
  21. TR1 =1;              //啟動(dòng)定時(shí)器T1
  22. ET1 =0;
  23. ES=1;                //允許串行口中斷
  24. PS=1;                //設(shè)計(jì)串行口中斷優(yōu)先級(jí)
  25. EA =1;               //單片機(jī)中斷允許
  26. }
  27. //--------------------------------------------------------------------------------------------------
  28. // 函數(shù)名稱(chēng): com_interrup()串口接收中斷處理函數(shù)
  29. // 函數(shù)功能: 接收包括起始位'S'在內(nèi)的十位數(shù)據(jù)到數(shù)據(jù)緩沖區(qū)
  30. //--------------------------------------------------------------------------------------------------
  31. com_interrupt(void) interrupt 4 using 3
  32. {
  33.   unsigned char RECEIVR_buffer;
  34.   if(RI)                                     //處理接收中斷
  35.   {
  36. RI=0;                                //清除中斷標(biāo)志位
  37. RECEIVR_buffer=SBUF;                          //接收串口數(shù)據(jù)
  38. if(point==0)                                                 //如果還沒(méi)有接收到起始位
  39.         {
  40.          if(RECEIVR_buffer=='S')             //判斷是否起始標(biāo)志位
  41.            point++;                                          //是準(zhǔn)備接收下一位
  42.                 else
  43.                       point=0;                                          //不是,繼續(xù)等待起始位
  44.                }
  45. else if(point>0&&point<10)                                 //判斷是否接收夠十位數(shù)據(jù)
  46.              buffer[point++]=RECEIVR_buffer;             //不夠,把接收到的數(shù)據(jù)放入接收緩存區(qū)
  47. else point=0;                                         //緩沖區(qū)已滿(mǎn),清除緩存區(qū)內(nèi)數(shù)據(jù)重新接收
  48. }
  49. If(TI)                                   //處理發(fā)送中斷
  50. {
  51. TI=0;
  52. }
  53. }
  54. //--------------------------------------------------------------------------------------------------
  55. // 函數(shù)名稱(chēng): COM_send()串口發(fā)送函數(shù)
  56. // 函數(shù)功能: 把數(shù)據(jù)緩沖區(qū)的十位數(shù)據(jù)發(fā)送出去
  57. //--------------------------------------------------------------------------------------------------
  58. void COM_send(void)
  59. {
  60. for(point=0;point<=10,TI=1;point++)               //連續(xù)發(fā)送十位數(shù)據(jù)                                      
  61.   {
  62.    SBUF=buffer[point];                  //把緩存區(qū)的數(shù)據(jù)都發(fā)送到串口
  63.    TI=0;
  64.    }
  65. }
  66. //--------------------------------------------------------------------------------------------------
  67. // 函數(shù)名稱(chēng): CLU_checkdata()計(jì)算校驗(yàn)位函數(shù)
  68. // 輸入變量: 無(wú)
  69. // 輸出變量: checkdata,包括起始位在內(nèi)的前九位數(shù)據(jù)的校驗(yàn)和
  70. // 函數(shù)功能: 計(jì)算校驗(yàn)和
  71. //--------------------------------------------------------------------------------------------------
  72. unsigned char CLU_checkdata(void)
  73. {                                                                                 //計(jì)算校驗(yàn)位
  74. unsigned char checkdata=0;
  75. for(point=0;point<9,TI=1;point++)
  76.   {
  77.    checkdata=checkdata|buffer[point];
  78.    }
  79. return(checkdata);
  80. }
  81. //--------------------------------------------------------------------------------------------------
  82. // 函數(shù)名稱(chēng): 主函數(shù)
  83. // 函數(shù)功能: 調(diào)度各子函數(shù),完成通信過(guò)程
  84. //--------------------------------------------------------------------------------------------------
  85. void main(void)
  86. {
  87. unsigned char checkdata;
  88. do
  89. {
  90.   UART_init();                                                 //初始化串口
  91.   if(point==10)                                                 //判斷數(shù)據(jù)是否接收完成
  92.   checkdata=CLU_checkdata;                         //調(diào)用求校驗(yàn)和函數(shù)
  93.   if(checkdata==buffer[9])                              //判斷校驗(yàn)和是否正確
  94.   COM_send();                         //正確則調(diào)用發(fā)送程序
  95.   point=0;
  96.   }
  97.    while(1);
  98. }
復(fù)制代碼

所有資料51hei提供下載:

6.2 PC機(jī)與單片機(jī)串口通信.zip

4.62 KB, 下載次數(shù): 157, 下載積分: 黑幣 -5

6.1 PC機(jī)與PC機(jī)串口通信.zip

3.1 KB, 下載次數(shù): 43, 下載積分: 黑幣 -5

6.3 PC機(jī)與智能儀器串口通信.zip

4.39 KB, 下載次數(shù): 49, 下載積分: 黑幣 -5

6.4 PC機(jī)與PLC串口通信.zip

4.89 KB, 下載次數(shù): 42, 下載積分: 黑幣 -5

6.5 PC機(jī)與GSM短信模塊串口通信.zip

32.72 KB, 下載次數(shù): 40, 下載積分: 黑幣 -5


作者: maoni99999    時(shí)間: 2018-12-24 11:48
剛好在做串口通信很有用
作者: 沙諾1234    時(shí)間: 2019-3-28 10:59
感謝樓主,學(xué)習(xí)學(xué)習(xí)
作者: 獨(dú)非本性    時(shí)間: 2019-3-29 18:01
正在找類(lèi)似的程序,牛牛牛
作者: lyl_420819    時(shí)間: 2021-3-19 19:52
正在學(xué)習(xí)單片機(jī)與PC通訊,用于單片機(jī)數(shù)據(jù)采集傳輸至PC機(jī)顯示與處理。謝謝分享。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1