基于AT89C52和串口通信助手的串口通信

发布者:PositiveVibes最新更新时间:2018-07-15 来源: eefocus关键字:AT89C52  串口通信助手  串口通信 手机看文章 扫描二维码
随时随地手机看文章

我们要实现的功能是在程序运行的时候通过单片机的串口向串口调试助手发送一个字符串诸如“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引脚置0

    for(i = 0 ; i < 8 ; i++)                                //for循环,从高位到低位,依次传送数据

    {

        SHCP = 0;                                             //P2.7引脚置0

        if( (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);                                          //延时1ms

    wx0 = 1;                                              //取消位选


      ser_inout(table[show[1]]);                            //将第二位数据送入数码管  

    wx1 = 0;                                                //选中第二个数码管,低电平有效

    delay_ms(1);                                          //延时1ms

    wx1 = 1;                                              //取消位选


      ser_inout(table[show[2]]);                            //将第三位数据送入数码管

    wx2 = 0;                                                //选中第三个数码管,低电平有效 

      delay_ms(1);                                          //延时1ms

    wx2 = 1;                                              //取消位选


    ser_inout(table[show[3]]);                            //将第四位数据送入数码管

    wx3 = 0;                                                //选中第四个数码管,低电平有效 

      delay_ms(1);                                          //延时1ms

    wx3 = 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方式2

    TH1=0XFD;                                               //设置波特率为9600

    TL1=0XFD;                                               //同上

    SCON=0X50;                                              //将串行口控制寄存器设置为串行口工作方式1并允许中断接收数据

    PCON&=0XEF;                                             //波特率不倍增

    TR1=1;                                                  //启动定时器1

    IE=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  串口通信助手  串口通信 引用地址:基于AT89C52和串口通信助手的串口通信

上一篇:PC机串口调试助手与单片机通信字符问题
下一篇:(C51学习五)单片机与PC通过串口通信

推荐阅读最新更新时间:2024-03-16 16:08

基于arm11处理器S3C6410内核的linux下串口通信实现
/*例程目的:通过向内核加载独立按键模块,串口通信模块,编写应用程序,使得当按键按下时,arm可以通过串口对外发送数据。已达到arm与其他设备间的串口通信的目的*/ 一、基础知识 1.串口基本知识:串口:计算机上一种非常通用设备通信协议。串口通信:串口按位发送和接收字节。 2.设备驱动:linux下总共有三种设备方式:字符设备,块设备,网络设备。这里串口和键盘都是字符设备。这些设备都在/dev 目录下 。可通过ls -l 来查看设备类型。【crw-rw---- 1 root dialout 4, 64 7月 4 02:53 ttyS0】最前面的c表示他是(char)字符设备。 二、程序编写 1.编写驱动程序:
[单片机]
PC串口通信的测温系统的单片机实现方案
  温度是工业控制中主要的被控参数之一,温度的检测及控制传统方法多以热电阻和热电偶等为温度传感元件,而这种模拟温度传感器输出为模拟信号,必须经过A/D 转换环节获得数字信号后才能与单片机等微处理器接口,使得硬件电路结构比较复杂、抗干扰性差、布线麻烦以及成本高等缺点。   针对上述问题,该设计提出了基于Dallas 半导体公司的数字式温度传感器DS18B20 和ATMEL 公司AT89S52 单片机构成的温度测量系统,并可通过串口连接在PC 系统上进行实时显示,该系统安装简易,可靠性高,适用于恶劣环境的现场温度测量。   1 系统构成   测温系统由微控制器、温度采集、串口通信、LCD 显示和上位机显示等几部分组成,如图1 所
[单片机]
PC<font color='red'>串口通信</font>的测温系统的单片机实现方案
STM32基础9--串口通信(UART)
UART传输方式 UART(Universal Asynchronous Receiver Transmitter),异步串口没有时钟信号,也没有硬件控制流信号。只有Tx(串行输出信号)与Rx(串行输入信号)。 在STM32F407中,串口数据传输有两种方式:阻塞与非阻塞。 1)阻塞:轮询的方式,就是发送缓冲器的数据,直到数据传输完成或者超时后,函数才返回; 2)非阻塞:启动发送缓冲区数据后,立即返回,传输完成后可以触发中断。 注:在51单片机中的UART通方式类似,也是通常使用阻塞发送数据, 而非阻塞通常用来接收数据。 PC端与STM32进行串口通讯 在当前的PC(个人电脑),基本上已将不支持串口了。因此需
[单片机]
STM32基础9--<font color='red'>串口通信</font>(UART)
ARM7与FPGA相结合的应用
  ARM7与FPGA相结合在工业控制和故障检测中的应用   工业控制中往往需要完成多通道故障检测及多通道命令控制(这种多任务设置非常普遍),单独的CPU芯片由于其外部控制接口数量有限而难以直接完成多路检控任务,故利用ARM芯片与FPGA相结合来扩展检控通道是一个非常好的选择。这里介绍用Atmel公司ARM7处理器(AT91FR40162)和ALTERA公司的低成本FPGA芯片(cyclone2)结合使用完成多通道检控任务的一种实现方法。    各部分功能简介   图1为此系统的结构连接框图。如图所示,ARM芯片与FPGA芯片之间通过数据总线、地址总线及读写控制线相连,而与终端PC则通过串口通信;FPGA与目标设备通过命令控
[嵌入式]
单片机RS485串口通信
RS-485是半双工的通信方式,发送和接收共用同一物理信道。在任意时刻只允许一台单机处于发送状态。因此要求应答的单机必须在侦听到总线上呼叫信号已经发送完毕,并且没有其它单机发出应答信号的情况下,才能应答。半双工通信对主机和从机的发送和接收时序有严格的要求。如果在时序上配合不好,就会发生总线冲突,使整个系统的通信瘫痪,无法正常工作。要使总线上的设备在时序上严格配合。在复位时,使主从机都处于接收状态。 MAX3082的发送和接收转换是由芯片的 RE/和DE端控制的。RE/=1,DE=1时,MAX3082处于发送状态;RE/=0,DE=0时,MAX3082处于接收状态。一般使用单片机的一个IO口连接RE/和DE端。在上电复位时,由于硬件电
[单片机]
51单片机与GPS串口通信
最近在考研调剂没有学校要, 找工作又找不到, 快崩溃了。 刚想找点乐子,忘掉烦恼。开了一下自己的工具箱,发现以前买了一块二手的车载GPS,因为一直没有资料就放在那没有用。 仔细看了一下GPS发现芯片的LOGO和型号还是看得出来的,这是一块用了索尼CXD2931R作为接收GPS信号的芯片,本来想到网上看看有没有现成的作品,可是很遗憾没能找到(可能已经别淘汰了),没办法只能到ALLDATASHEET上下了这份芯片的手册, 看了下手册,发现sony的这款GPS芯片很高档呀:集成32位处理器、DSP、RAM和ROM的容量也很大(怪不得GPS价格这么贵)。 原来GPS使用串口来给主机发送信息的,这块GPS的通信速
[单片机]
采用AT89C52单片机的多用户密码锁方案设计
   安全防盗已成为社会问题。而锁自古以来就是把守门户的铁将军,人们对它要求甚高,既要安全可靠地防盗,又要使用方便,这也是制锁者长期以来研制的主题。   文中设计的电子 密码锁和市面销售的AB锁有类似之处,但主要区别在于设计的这个密码锁由主人决定客人进入的密码,不需要通过换锁来防止用过该锁的人再次进入,而且只有主人才有对密码的修改权。   1 方案设计思想   文中的多用户密码锁设有一个管理员用户,管理员对密码有修改权。另设有两个来宾用户,可以根据管理员提供的密码开锁,自己则不可以任意修改密码。更换住户时,只需要管理员更换密码即可,这样就避免了换锁带来的麻烦,节约了成本。   密码锁的设计采用通用板制作,所以涉及
[单片机]
采用<font color='red'>AT89C52</font>单片机的多用户密码锁方案设计
用欧姆龙PLC与上位机通信实现振动磨的变频控制
1.引 言 当今,在自动化的工业生产中,变频控制往往与计算机远程控制相联系在一起,从而实现电机的远程变频控制。可编程序控制器系统不仅可作为单一的机电控制设备,而且作为通用的自动控制设备,也被大量地用于过程工业的自动控制。欧姆龙最新推出的可编程控制器SYSMAC CP1H,具有“高度扩张性”的端子台型一体化 。与以往产品CPM2A 40 点输入输出型为相同尺寸,但处理速度可达到约10倍的性能。本课题通过控制机(即为PLC)设定比例运行参数,然后控制机通过D/A转换模件发出控制变频调速器的指令,使变频调速器带动振动磨电机按输入的速度和时间运转。基于OMRON PLC的链接通信(有通信协议),我们采用功能强大的Visual C++
[工业控制]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved