我们要实现的功能是在程序运行的时候通过单片机的串口向串口调试助手发送一个字符串诸如“hello world”,串口通信助手接收到字符串之后显示并由用户反馈回去一个长度为4的字符串并显示到数码管上

来看一下效果

首先是串口通信电路的配置和借助VSPD、串口通信助手对相关串口的设置

  • 通过VSPD创建两个可以相互通信的虚拟串口,如COM1和COM2。点击添加端口按钮后,可以看到左边栏中的虚拟端口处看到你新创建的两个虚拟端口。
  • 打开串口调试助手V2.2,对其进行配置,将串口改为COM2端口,波特率设为9600,校验位选择NONE,数据位为8位,停止位为1位
  • 电路图中的配置:首先将晶振改为11.0592MHZ,再将AT89C52芯片中的晶振也改为11.0592MHZ。再配置串口,将物理端口设置为COM1,物理波特率设置为9600,物理数据位数设为8位,物理奇偶校验位设置为NONE,下面的虚拟波特率、虚拟数据位数和虚拟奇偶校验位与上面相同。
  • 接下来上电路图

    用VSPD创建两个虚拟端口

    可以通过设备管理器来查看串口是否创建成功

    AT89C52的相关配置

    对COMPIM的相关配置

    一些端口的设置

    硬件配置的差不多了,接下来我们看看如何在Keil里编写代码实现,这里仅摘录一些比较重要的代码片段,感兴趣的可以[下载代码](http://download.csdn.net/detail/lrwwll/9720330)

    /*数码管显示函数,利用74HC595实现串行输入并行输出*/
    void ser_inout(uchar datas)
    {uchar i;                                                //循环控制变量 STCP = 0;                                                 //P2.6引脚置0for(i = 0 ; i < 8 ; i++)                                //for循环,从高位到低位,依次传送数据{ SHCP = 0;                                             //P2.7引脚置0if( (datas & 0x80) == 0)                              //如果最高位数据等于0{ DS = 0;                                             //传递数据0给P2.5引脚}else{ DS = 1;                                             //如果最高位数据不等于0,传递数据1给P2.5引脚}datas <<= 1;                                          //将传输的8位数据左移一位 SHCP = 1;                                             //P2.7引脚置1,产生上升沿,将P2.5引脚上的数据传入74HC595} STCP = 1;                                               //P2.6置1,产生上升沿,送八位数据
    }
    /*动态显示函数,数码管动态显示数据*/
    void Display()
    { uint i = 0;                                            //i是循环控制变量 while( i!=900 )                                        //while循环,循环90次,让数码管动态显示数据约1.5S{ser_inout(table[show[0]]);                            //将最高位数据送入数码管wx0 = 0;                                              //选中第一个数码管,低电平有效  delay_ms(1);                                          //延时1mswx0 = 1;                                              //取消位选ser_inout(table[show[1]]);                            //将第二位数据送入数码管  wx1 = 0;                                                //选中第二个数码管,低电平有效delay_ms(1);                                          //延时1mswx1 = 1;                                              //取消位选ser_inout(table[show[2]]);                            //将第三位数据送入数码管wx2 = 0;                                                //选中第三个数码管,低电平有效 delay_ms(1);                                          //延时1mswx2 = 1;                                              //取消位选ser_inout(table[show[3]]);                            //将第四位数据送入数码管wx3 = 0;                                                //选中第四个数码管,低电平有效 delay_ms(1);                                          //延时1mswx3 = 1;                                              //取消位选  i++;                                                  //i加1}
    }
    
    /*输出函数,通过数码管显示相应数据*/
    void printf(uchar dat[])                                    //dat存储要显示的数据
    {uint i = 0;                                            //循环控制变量for(i = 4;i > 0;i--)                                    //循环4次,将要显示的数据存储在show数组中{show[4-i]=dat[4-i];}Display();                                              //调用动态显示函数,让数码管动态显示数据
    }
    /*串口通信相关初始化*/
    void init()
    {TMOD=0X20;                                              //设置定时器1方式2TH1=0XFD;                                               //设置波特率为9600TL1=0XFD;                                               //同上SCON=0X50;                                              //将串行口控制寄存器设置为串行口工作方式1并允许中断接收数据PCON&=0XEF;                                             //波特率不倍增TR1=1;                                                  //启动定时器1IE=0X0;                                                 //禁止任何中断
    }
    /*单片机串口发送一个字符*/
    void send(uchar txd)
    {SBUF=txd;while(!TI);TI=0;
    }/*单片机串口发送一个字符串*/
    void send_buf(uchar dat[])
    {uint i=0;while(dat[i]!='\0'){send(dat[i]);i++;}
    }

    一些解释

  • SCON=0x50:
    SCON是串行口控制寄存器,0x50为16进制,转换成二进制是01010000,对应下附表各位,即将串行口控制寄存器设置为串行口工作方式1并允许中断接收数据.
    附:scon寄存器结构表
    SCON SM0 SM1 SM2 REN TB8 RB8 TI RI
    位地址 9FH 9EH 8DH 9CH 9BH 9AH 99H 98H
  • TMOD=0x20: TMOD是定时/计数器方式控制寄存器,所以TMOD=0x20是将定时/计数器1设置为工作方式2.
  • TH1=0xE8,TL1=0xE8:
    给定时/计数器1装初值,即确定定时时长,具体时间与晶振有关.
  • TI=1,TR=1:
    由上附表可得,TI和RI是SCON寄存器的最低两位.TI:发送中断标志位 ,RI:接收中断标志位. TI=1表示帧发送结束,RI=1表示帧接收完成.

基于AT89C52和串口通信助手的串口通信相关推荐

  1. 开源串口调试助手java_(串口通信编程) 开源串口调试助手Common (Com Monitor)

    我写的串口调试助手程序以及源代码. 警告:请勿将本软件源代码用于任何商业用途. 其实吧, 我写的这个串口软件绝对比网上流传的一些串口调试软件好用很多, 对于软件,我本身并没有作 太多推广, 一些功能我 ...

  2. 单片机串口android串口调试助手,单片机串口及串口调试助手的使用

    要求:pc机向单片机发送321,单片机向电脑发送get321!,pc机向单片机发送123,单片机向pc机发送当前的秒数(自打开到接收到的时间值) #include #include "Con ...

  3. C#开发串口小助手(可更改波特率、串口号,可实现数据以及字符的收发)

    0. 前言 前置项目为:VS 2019中利用C#语言在.Net Framework 4.5框架上开发简易串口发送数据软件 本项目的全部代码已经放置至码云:https://gitee.com/jiawe ...

  4. QT的串口通信助手C++代码开源

    QT的串口通信助手C++代码开源 Qt是一种基于C++的跨平台图形用户界面应用程序开发框架 本次使用QT的版本是5.6 需要在pro文件里面添加 QT += serialport 添加库文件 布局界面 ...

  5. Qt实现串口通信(C++实现串口通信小助手)---串口收发及串口数据解码、串口通信模拟器。

    Qt实现串口通信示例 前言:以下串口通信示例,参考了现有网上前辈们的资源,最后结合部分个人的思想,所以下述博客会将实现的原理及代码的案例进行公开. 这里我们先上效果图: 一.串口通信简介 串口通信是上 ...

  6. 最简单DIY基于ESP32CAM的物联网相机系统④(用调试串口助手实现串口图传)

    第一篇:最简单DIY基于ESP32CAM的物联网相机系统①(用网页实现拍照图传) 第二篇:最简单DIY基于ESP32CAM的物联网相机系统②(在JAVAWEB服务器实现图片查看器) 第三篇:最简单DI ...

  7. STM32串口通信、串口调试助手

    STM32系列博客:  STM32学习之旅① 开发环境搭建 STM32学习之旅② 固件库的使用及工程模板的建立 STM32学习之旅③ 从点灯到代码移植 STM32学习之旅④ USART串口和上位机通信 ...

  8. 一款基于Qt的跨平台开源串口调试助手EasySerial

    文章目录 1. 简述 2. 开发步骤 2.1 界面布置 2.2 串口搜索与打开 2.3 ASCII/HEX接收 2.4 接收数据保存 2.5 ASCII/HEX发送 2.6 周期发送 2.7 读取文件 ...

  9. C#做的串口通信助手可发可收简单(免费开源)

    C#做的串口通信助手可发可收简单(免费开源) 最近在做物联网相关的项目,要用到串口,所以今天做一个C#的串口上位机,供大家参考,程序如果有不对希望大家指正,谢谢! 首先看一下效果 现在开始制作我们的串 ...

最新文章

  1. html 点击空白关闭浮层,js中点击空白区域时文本框与隐藏层的显示与影藏问题...
  2. python时间序列分析航空旅人_时间序列分析-ARIMA模型(python)
  3. 如何去掉字符串最后的逗号?(亲测)
  4. 改性沥青弹性恢复计算_阿里云计算的发展现状是什么,主要的产品有哪些?
  5. 《犯罪心理学》读书笔记(part4)--犯罪心理的形成与内在因素的影响(上)
  6. Go学习笔记—标准库Context
  7. Jest + React Testing Library 单测总结
  8. H.264算法的优化策略
  9. php中下载csv文件怎么打开,php对csv文件的读取,写入,输出下载操作详解
  10. 宝石光是什么石头_沙漠戈壁的漂亮“石头”让人见了流口水
  11. airflow时区问题
  12. yum repolist命令
  13. java如何获取scanner_java – 使用Scanner获取用户输入
  14. Windows下sqlmap安装方法
  15. appium工作原理
  16. C语言初阶——手把手教零基础/新手入门(万字心得笔记)
  17. c51单片机期末复习个人总结1基础知识
  18. Java ORC图片识别
  19. 还不到4折:赶紧来抢券啊!!!
  20. java 实现繁简字体转换(笨方法)

热门文章

  1. 一个基于JQuery的日历时间控件
  2. tensorflow2.0实现IMDB文本数据集学习词嵌入
  3. Python 3学习笔记(16):PyOpenGL之绘制螺纹
  4. 奥多比CS3设计套装简体中文光碟版算号器
  5. 华为ICT大赛辅导——双AC主备双链路备份
  6. 6.基于vue封装的上传文件等功能
  7. 面试时的自我介绍技巧
  8. 计算机自我介绍面试范文,it面试自我介绍范文
  9. vmware虚拟机mac连接iphone调试safari浏览器
  10. 软件工程期末复习(一小时通过考试,全是重点)