找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1796|回复: 8
收起左侧

单片机串口通信出了点问题 求大神看一下

[复制链接]
ID:474631 发表于 2019-2-12 19:19 | 显示全部楼层 |阅读模式
就是输入1的时候蜂鸣器响 2的时候led流水灯 但是什么反应都没有 串口通信可以实现 但是不能时间额外的功能
#include "reg51.h"
#define led P0
typedef unsigned char u8;
typedef unsigned int u16;
sbit beep=P1^5;
u8 Data;
void delay(u16 i)
{
        while(i--);
}

void Communicate()
{
        TMOD=0x20;
        TH1=0xf3;TL1=0xf3;
        TR1=1;PCON=0x80;
  SCON=0x50;ES=1;EA=1;
}
void main()
{ u8 i;
        Communicate();
        while(1)
        {
         if(Data==1)
         {
                 beep=~beep;
                 delay(1000);
         }
         if(Data==2)
         {
                 led=0x80;
                 for(i=0;i<7;i++)
                 {
                         led=(led>>1);
                         delay(20000);
                 }
                 for(i=0;i<7;i++)
                 {
                         led=(led<<1);
                         delay(20000);
                 }
         }
        }
}
void tx() interrupt 4
{

        Data=SBUF;
        RI=0;
        SBUF=Data;
        while(TI==0);
        TI=0;
        
}

QQ浏览器截图20190212191846.png
回复

使用道具 举报

ID:432823 发表于 2019-2-13 07:24 | 显示全部楼层

        RI=0;
        Data=SBUF;
        
        while(TI==0);
        TI=0;

评分

参与人数 1黑币 +20 收起 理由
yousunny + 20 赞一个!

查看全部评分

回复

使用道具 举报

ID:158375 发表于 2019-2-13 08:14 | 显示全部楼层
这个未必是单片机串口通信出了问题。
void tx() interrupt 4
{
        Data=SBUF;
        RI=0;
        SBUF=Data;
        while(TI==0);
        TI=0;
}
中断接收了数据,然后发送出去;什么时候按照你的想法处理这个数据呢?
这个中断处理也不是很好。
回复

使用道具 举报

ID:94031 发表于 2019-2-13 08:44 | 显示全部楼层
查查波特率有无问题。
回复

使用道具 举报

ID:164602 发表于 2019-2-13 09:23 | 显示全部楼层
你的程序什么问题也没有(已经用板子试验通过了),是你在使用串口调试软件时范了错误。
从你的程序上看:判断是1、2——注意!注意!注意——重要的事儿说三遍,你判断的数字1、2,不是字符1、2
而从你截图中看到的,是发送字符1、2,当然没反应了。呵呵呵
要勾选HEX发送嘛!

评分

参与人数 2黑币 +40 收起 理由
yousunny + 30 很给力!
日本人孙笑川 + 10 很给力!

查看全部评分

回复

使用道具 举报

ID:393699 发表于 2019-2-13 09:45 | 显示全部楼层
试着用字符串比较函数strcmp替代if判断?
回复

使用道具 举报

ID:476086 发表于 2019-2-13 09:50 | 显示全部楼层
1.串口接收到数据,然后根据数据内容进行蜂鸣器或者LED显示处理后,是否需要将Data变量进行清零?
2.我们这种前后台系统,在做延时的时候,不能直接调用DELAY这种函数的,这样系统会死在这里很长时间的。如果此时有新的串口指令过来的话,你的MCU是无法进行处理的。
回复

使用道具 举报

ID:476086 发表于 2019-2-13 09:54 | 显示全部楼层
笨笨兔 发表于 2019-2-13 08:14
这个未必是单片机串口通信出了问题。
void tx() interrupt 4
{

其实是将数据保存在了Data这个变量了,我估计楼主重新发出去的操作是看看有没有正确接收,调试用的吧。
回复

使用道具 举报

ID:476375 发表于 2019-2-14 11:11 | 显示全部楼层
SBUF =  Data; while(TI == 0); TI = 0;这些放到main()里面的while(1)最下面试试;中断函数里面不能while(TI == 0);堵塞
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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