找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4913|回复: 4
收起左侧

PC机VB与单片机串口通信源代码(含上位机与下位机)

  [复制链接]
ID:428050 发表于 2018-11-17 10:17 | 显示全部楼层 |阅读模式
0.png

单片机源程序如下:

  1. //采用异步方式传送数据,偶校验,一位结束位,传输的数据传输速率为9600bit/s。每个数据帧包含10Byte信息,1Byte作为帧起始标志,8Byte数据,1Byte的校验和。
  2. //-----------------------函数声明,变量定义--------------------------------------------------------
  3. #include <reg51.h>
  4. #define COUNT 10                   // 定义接收缓冲区大小
  5. unsigned char buffer[COUNT];              //定义接收缓冲区
  6. unsigned char point;                   //定义接收数据个数指示变量
  7. void UART_init();                    //串口初始化函数
  8. void COM_send(void);                //串口接收函数
  9. unsigned char CLU_checkdata(void);     //计算校验位函数
  10. //--------------------------------------------------------------------------------------------------
  11. // 函数名称: UART_init()串口初始化函数
  12. // 函数功能: 在系统时钟为11.059MHZ时,设定串口波特率为9600bit/s
  13. //            串口接收中断允许,发送中断禁止
  14. //初始化串行口和波特率发生器
  15. //--------------------------------------------------------------------------------------------------
  16. void UART_init()
  17. {                    
  18. SCON =0x58;          //选择串口工作方式,打开接收允许
  19. TMOD =0x21;          //定时器1工作在方式2,定时器0工作在方式1
  20. TH1 =0xfd;           //实现波特率9600(系统时钟11.0592MHZ)
  21. TR1 =1;              //启动定时器T1
  22. ET1 =0;
  23. ES=1;                //允许串行口中断
  24. PS=1;                //设计串行口中断优先级
  25. EA =1;               //单片机中断允许
  26. }
  27. //--------------------------------------------------------------------------------------------------
  28. // 函数名称: com_interrup()串口接收中断处理函数
  29. // 函数功能: 接收包括起始位'S'在内的十位数据到数据缓冲区
  30. //--------------------------------------------------------------------------------------------------
  31. com_interrupt(void) interrupt 4 using 3
  32. {
  33.   unsigned char RECEIVR_buffer;
  34.   if(RI)                                     //处理接收中断
  35.   {
  36. RI=0;                                //清除中断标志位
  37. RECEIVR_buffer=SBUF;                          //接收串口数据
  38. if(point==0)                                                 //如果还没有接收到起始位
  39.         {
  40.          if(RECEIVR_buffer=='S')             //判断是否起始标志位
  41.            point++;                                          //是准备接收下一位
  42.                 else
  43.                       point=0;                                          //不是,继续等待起始位
  44.                }
  45. else if(point>0&&point<10)                                 //判断是否接收够十位数据
  46.              buffer[point++]=RECEIVR_buffer;             //不够,把接收到的数据放入接收缓存区
  47. else point=0;                                         //缓冲区已满,清除缓存区内数据重新接收
  48. }
  49. If(TI)                                   //处理发送中断
  50. {
  51. TI=0;
  52. }
  53. }
  54. //--------------------------------------------------------------------------------------------------
  55. // 函数名称: COM_send()串口发送函数
  56. // 函数功能: 把数据缓冲区的十位数据发送出去
  57. //--------------------------------------------------------------------------------------------------
  58. void COM_send(void)
  59. {
  60. for(point=0;point<=10,TI=1;point++)               //连续发送十位数据                                      
  61.   {
  62.    SBUF=buffer[point];                  //把缓存区的数据都发送到串口
  63.    TI=0;
  64.    }
  65. }
  66. //--------------------------------------------------------------------------------------------------
  67. // 函数名称: CLU_checkdata()计算校验位函数
  68. // 输入变量: 无
  69. // 输出变量: checkdata,包括起始位在内的前九位数据的校验和
  70. // 函数功能: 计算校验和
  71. //--------------------------------------------------------------------------------------------------
  72. unsigned char CLU_checkdata(void)
  73. {                                                                                 //计算校验位
  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. // 函数名称: 主函数
  83. // 函数功能: 调度各子函数,完成通信过程
  84. //--------------------------------------------------------------------------------------------------
  85. void main(void)
  86. {
  87. unsigned char checkdata;
  88. do
  89. {
  90.   UART_init();                                                 //初始化串口
  91.   if(point==10)                                                 //判断数据是否接收完成
  92.   checkdata=CLU_checkdata;                         //调用求校验和函数
  93.   if(checkdata==buffer[9])                              //判断校验和是否正确
  94.   COM_send();                         //正确则调用发送程序
  95.   point=0;
  96.   }
  97.    while(1);
  98. }
复制代码

所有资料51hei提供下载:

6.2 PC机与单片机串口通信.zip

4.62 KB, 下载次数: 156, 下载积分: 黑币 -5

6.1 PC机与PC机串口通信.zip

3.1 KB, 下载次数: 42, 下载积分: 黑币 -5

6.3 PC机与智能仪器串口通信.zip

4.39 KB, 下载次数: 48, 下载积分: 黑币 -5

6.4 PC机与PLC串口通信.zip

4.89 KB, 下载次数: 41, 下载积分: 黑币 -5

6.5 PC机与GSM短信模块串口通信.zip

32.72 KB, 下载次数: 39, 下载积分: 黑币 -5

评分

参与人数 2黑币 +60 收起 理由
pv598 + 10 共享资料的黑币奖励!
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:407305 发表于 2018-12-24 11:48 | 显示全部楼层
刚好在做串口通信很有用
回复

使用道具 举报

ID:421636 发表于 2019-3-28 10:59 | 显示全部楼层
感谢楼主,学习学习
回复

使用道具 举报

ID:454825 发表于 2019-3-29 18:01 | 显示全部楼层
正在找类似的程序,牛牛牛
回复

使用道具 举报

ID:64765 发表于 2021-3-19 19:52 | 显示全部楼层
正在学习单片机与PC通讯,用于单片机数据采集传输至PC机显示与处理。谢谢分享。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表