找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2522|回复: 8
打印 上一主题 下一主题
收起左侧

想让c51单片机串口实现加1计数

[复制链接]
跳转到指定楼层
楼主
ID:744346 发表于 2020-5-25 14:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include "reg52.h"                         //此文件中定义了单片机的一些特殊功能寄存器

  2. typedef unsigned int u16;          //对数据类型进行声明定义
  3. typedef unsigned char u8;

  4. void UsartInit()
  5. {
  6.         SCON=0X50;                        //设置为工作方式1
  7.         TMOD=0X20;                        //设置计数器工作方式2
  8.         PCON=0X80;                        //波特率加倍
  9.         TH1=0XF3;                                //计数器初始值设置,注意波特率是4800的
  10.         TL1=0XF3;
  11.         ES=1;                                                //打开接收中断
  12.         EA=1;                                                //打开总中断
  13.         TR1=1;                                        //打开计数器
  14. }

  15. void main()
  16. {       
  17.         UsartInit();  //        串口初始化
  18.         while(1);               
  19. }

  20. void Usart() interrupt 4
  21. {
  22.         u8 receiveData;

  23.         receiveData=SBUF;//出去接收到的数据
  24.         if(RI)
  25.         {
  26.         RI=0;
  27.         SBUF=receiveData+1;//将接收到的数据放入到发送寄存器
  28.         }
  29.         if(TI)
  30.         {
  31.         TI=0;
  32.         }                                                 //清除发送完成标志位
  33. }
复制代码
我的代码是这样的我想让subf实现每一次返回后都能加1,就是我第一次发送的是1,可以返回值是2,可以在不改变串口通信助手的情况下把第二次发送的改成2么?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:94031 发表于 2020-5-25 15:19 | 只看该作者
你的这个要求,需要改变串口通信助手软件,否则实现不了。
回复

使用道具 举报

板凳
ID:213173 发表于 2020-5-25 15:53 | 只看该作者
串口组手的发送和接收是分开的,没有按接收到的数据再发送的选项。
你这样写不能保证发送完毕TI被清0。
    if(TI)
    {
           TI=0;
    }
要这样写才对
void Usart() interrupt 4
{
        u8 receiveData;
        RI=0;
        receiveData=SBUF;//保存接收到的数据
        SBUF=receiveData+1;//将接收到的数据+1返回上位机
        while(!TI);//等待发送完成
        TI=0;//清除发送完成标志位
}
回复

使用道具 举报

地板
ID:298663 发表于 2020-5-25 16:40 | 只看该作者
你的代码有问题,最终可能会导致这样的情况,你无论发送什么数字都串口都没有反馈数据过来,或者你发送任何数字反馈都是1.  帮你代码改动下, 你仿真看看
#include "reg52.h"                         //此文件中定义了单片机的一些特殊功能寄存器

typedef unsigned int u16;          //对数据类型进行声明定义
typedef unsigned char u8;



void UsartInit()
{
        SCON=0X50;                        //设置为工作方式1
        TMOD=0X20;                        //设置计数器工作方式2
        PCON=0X80;                        //波特率加倍
        TH1=0XF3;                                //计数器初始值设置,注意波特率是4800的
        TL1=0XF3;
        ES=1;                                                //打开接收中断
        EA=1;                                                //打开总中断
        TR1=1;                                        //打开计数器
}

void main()
{        
        UsartInit();  //        串口初始化
        while(1);               
}

void Usart() interrupt 4
{
        
        u8 receiveData;
     
        if(RI)
        {
        RI=0;
        SBUF=receiveData+1;//将接收到的数据放入到发送寄存器
        }
        if(TI)
        {
        TI=0; //清除发送完成标志
         receiveData=SBUF;  //只要有发送,就把发送缓存区的数据赋值给接收数据
         RI=1; //这里添加用意:当你发送数据的时候,必须设置接收标志位,才可以触发接收中断
        }                                                
}
回复

使用道具 举报

5#
ID:744346 发表于 2020-5-26 09:39 | 只看该作者
xuyaqi 发表于 2020-5-25 15:19
你的这个要求,需要改变串口通信助手软件,否则实现不了。

主要是我们师傅要我们实现通过串口通信按下计数这个要求
回复

使用道具 举报

6#
ID:744346 发表于 2020-5-26 09:42 | 只看该作者
wulin 发表于 2020-5-25 15:53
串口组手的发送和接收是分开的,没有按接收到的数据再发送的选项。
你这样写不能保证发送完毕TI被清0。
  ...

感谢您的帮助
回复

使用道具 举报

7#
ID:456196 发表于 2020-5-26 10:22 | 只看该作者
应该不行吧,可以用labview啥的,自己做个简单的串口通信上位机
回复

使用道具 举报

8#
ID:319023 发表于 2020-5-26 10:31 | 只看该作者
应该是有一个计数的变量,有串口接收数据就计数加1吧
回复

使用道具 举报

9#
ID:94031 发表于 2020-5-26 11:36 | 只看该作者
树先生37 发表于 2020-5-26 09:39
主要是我们师傅要我们实现通过串口通信按下计数这个要求

可以用两个单片机完成师傅要。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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