找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机串口通信问题,求解答

[复制链接]
跳转到指定楼层
楼主
5黑币
串口设置通信,输入数字为什么灯就是不亮,是程序哪里有问题还是串口助手设置错了  串口中断中能使用while(TI==0)  替代while(!TI)   还有人说不能在串口中断中使用while循环     我快被弄疯了
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar i;
sbit led0=P2^0;
sbit led1=P2^1;
sbit led2=P2^2;
sbit led3=P2^3;
sbit led4=P2^4;
sbit led5=P2^5;
sbit led6=P2^6;
sbit led7=P2^7;
void uart_init() //串口初始化函数
{
        TMOD=0x20;         //设置计数器工作方式2
        TH1=0xF3;         //计数器初始值设置,注意波特率是4800
        TL1=0xF3;
        PCON=0x80;         //波特率加倍
        TR1=1;                 //打开计数器
        SCON=0x50;         //设置为工作方式1
        ES=1;                 //打开接收中断
        EA=1;                 //打开总中断
}
void uart() interrupt 4
{
        uchar receiveData;
        i=SBUF;                  
                switch(i)
        {
                case '0':led0=0;break;
                case '1':led1=0;break;
                case '2':led2=0;break;
                case '3':led3=0;break;
                case '4':led4=0;break;
                case '5':led5=0;break;
                case '6':led6=0;break;
                case '7':led7=0;break;
                default:P2=0XFF;break;
        }
        receiveData=SBUF;        //出去接收到的数据
        RI=0;                            //清除接收中断标志位
        SBUF=receiveData;   //将接收到的数据放入到发送寄存器
        while(!TI);                    //等待发送数据完成
        TI=0;                            //清除发送完成标志位
}
int main()
{
          uart_init();        //串口初始化
          while(1);
                  return 0;
}


串口.png (91.55 KB, 下载次数: 26)

串口.png

最佳答案

查看完整内容

从程序看没有严重问题。分支判断使用了字符数字0~7 case '0':led0=0;break;,串口助手要用文本模式发送数字0~7,接收端才能正确解析信息,如果用HEX模式发送数字就要去掉分支语句中的单引号。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:213173 发表于 2020-2-20 20:07 | 只看该作者
从程序看没有严重问题。分支判断使用了字符数字0~7 case '0':led0=0;break;,串口助手要用文本模式发送数字0~7,接收端才能正确解析信息,如果用HEX模式发送数字就要去掉分支语句中的单引号。
回复

使用道具 举报

板凳
ID:94031 发表于 2020-2-20 22:07 | 只看该作者
根据串口助手截图看来你的串口通信问题不大,灯不亮要用万用表查led相关电路是否没接对,或者不通。
回复

使用道具 举报

地板
ID:687423 发表于 2020-2-21 09:22 | 只看该作者
楼主的程序没有问题,我在开发板上试了一下,我的led可以亮,应该是楼主的led出了问题。
回复

使用道具 举报

5#
ID:696029 发表于 2020-2-21 12:24 | 只看该作者
case '0':led0=0;break;
                case '1':led1=0;break;
                case '2':led2=0;break;
                case '3':led3=0;break;
                case '4':led4=0;break;
                case '5':led5=0;break;
                case '6':led6=0;break;
                case '7':led7=0;break;
                default:P2=0XFF;break;
这个地方是不是要改成led0=~led0;每次取一下反
回复

使用道具 举报

6#
ID:685842 发表于 2020-2-21 14:13 | 只看该作者
wulin 发表于 2020-2-21 06:07
从程序看没有严重问题。分支判断使用了字符数字0~7 case '0':led0=0;break;,串口助手要用文本模式发送数字 ...

请教一下大佬  现在能接受和发送但是一直是乱码  这个哪里错了吗
晶振是12MHZ   
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar  temp=85;
sbit  LED1=P2^0;
void   Delay1ms(unsigned int  T)
{
        unsigned  int  x;
        for(;T>0;T--)
        {
                for(x=110;x>0;x--);       
        }
}
void uart_init() //串口初始化函数
{
        TMOD=0x20;         //设置计数器工作方式2
        TH1=0xF3;         //计数器初始值设置,注意波特率是4800
        TL1=0xf3;
        PCON=0x80;         //波特率加倍
        TR1=1;                 //打开计数器
        SCON=0x50;         //设置为工作方式1
        ES=1;                 //打开接收中断
        EA=1;                 //打开总中断
}
void  SentData(uchar temp)
{
        SBUF=temp;

        while(TI==0);
        if(TI==1)
        {
                LED1=~LED1;       
        }
        TI=0;
}
int main()
{
        uart_init();
        while(1)
        {
                SentData(temp);
                Delay1ms(250);
                Delay1ms(250);       
        }
        return 0;
}   C:\Users\Administrator\Desktop\串口发送问题.png
回复

使用道具 举报

7#
ID:685842 发表于 2020-2-21 14:31 | 只看该作者
。。jj 发表于 2020-2-21 09:22
楼主的程序没有问题,我在开发板上试了一下,我的led可以亮,应该是楼主的led出了问题。

灯可以亮  好像接受出现了问题    发送1的时候灯led6,led7都亮了   但返回的数据一直乱码
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar i;
sbit led0=P2^0;
sbit led1=P2^1;
sbit led2=P2^2;
sbit led3=P2^3;
sbit led4=P2^4;
sbit led5=P2^5;
sbit led6=P2^6;
sbit led7=P2^7;
void uart_init() //串口初始化函数
{
        TMOD=0x20;         //设置计数器工作方式2
        TH1=0xF3;         //计数器初始值设置,注意波特率是4800
        TL1=0xF3;
        PCON=0x80;         //波特率加倍
        TR1=1;                 //打开计数器
        SCON=0x50;         //设置为工作方式1
        ES=1;                 //打开接收中断
        EA=1;                 //打开总中断
}
void  uart() interrupt 4
{
        uchar receiveData;
        i=SBUF;
                  
                switch(i)
        {
                case '0':led0=0;break;
                case '1':led1=0;break;
                case '2':led2=0;break;
                case '3':led3=0;break;
                case '4':led4=0;break;
                case '5':led5=0;break;
//                case '6':led6=0;break;
//                case '7':led7=0;break;
                default:P2=0XFF;break;
        }
        receiveData=SBUF;        //出去接收到的数据
                if(RI==1)
                {
                        led6=0;
                }
        RI=0;                            //清除接收中断标志位
        SBUF=receiveData;   //将接收到的数据放入到发送寄存器
        while(!TI);                    //等待发送数据完成
                if(TI==1)
                {
                        led7=0;
                }
        TI=0;                            //清除发送完成标志位
}
int main()
{
          uart_init();        //串口初始化
          while(1);
          return 0;
}
回复

使用道具 举报

8#
ID:685842 发表于 2020-2-21 15:14 | 只看该作者
。。jj 发表于 2020-2-21 09:22
楼主的程序没有问题,我在开发板上试了一下,我的led可以亮,应该是楼主的led出了问题。

问题找出来了   买板子的时候商家说晶振是12MHZ的   但板子晶振是11.0592  波特率一直不对
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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