找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2107|回复: 5
收起左侧

51单片机串口通信程序问题

[复制链接]
ID:97350 发表于 2021-5-18 22:32 | 显示全部楼层 |阅读模式
1.串口通信时候发送“t”,电机停止,需要串口设置定时1ms连续发送才可以停止,不能单点击一下停止,而正转和反转单点都正常
2.加速和减速也需要设置定时1ms才可以实现。不知道为什么。代码如下


#include<reg52.h>
#define uint  unsigned int
#define uchar unsigned char
//------8拍-----
uchar code zz[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};                        //正转
uchar code fz[]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01};                        //反转

sbit K1=P2^0;        //停止
sbit K2=P2^1;        //正转
sbit K3=P2^2;        //反转
sbit K4=P2^3;        //加速
sbit K5=P2^5;        //减速

uchar state=0;        //状态变量

uint Time=60;         //延时时间,用于调速

unsigned char receiveData='0';

void UsartConfiguration();           //初始化串口

void delay(uint ms)                           //延时,用于调速
{
        uint t;
        while(ms--)
                for(t=0;t<120;t++);
}

void motor_zz()                  //正传函数
{
        uint j;
        for(j=0;j<8;j++)
        {
                if(P1==0xfb)
                        break;
                P1=zz[j];
                delay(Time);
        }
}

void motor_fz()                  //反转函数
{
        uint j;
        for(j=0;j<8;j++)
        {
                if(P1==0xfb)
                        break;
                P1=fz[j];
                delay(Time);
        }
}

void main()
{
        UsartConfiguration();
        while(1)
        {
                while(state==0)                        //状态0,停止
                {
                        if((K2==0)||(receiveData=='z'))           //按下K2或串口接收到'z',电机正转
                        {
                                state=1;
                                receiveData='0';
                                break;
                        }
                        if((K3==0)||(receiveData=='f'))           //按下K3或串口接收到'f',电机反转
                        {
                                state=2;
                                receiveData='0';
                                break;
                        }
                        P0=0xfb;
                        P1=0x03;
                }

               

                while(state==1)                        //状态1,正转
                {
                        if((K1==0)||(receiveData=='t'))           //按下K1或串口接收到'f',电机反转
                        {
                                state=0;
                                receiveData='0';
                                break;
                        }
                        if((K2==0)||(receiveData=='z'))                //按下K2或串口接收到'z',电机正转
                        {
                                state=1;
                                receiveData='0';
                                break;
                        }
                        if((K3==0)||(receiveData=='f'))                //按下K3或串口接收到'f',电机反转
                        {
                                state=2;
                                receiveData='0';
                                break;
                        }
                        if((K4==0)||(receiveData=='+'))                //按下K4或串口接收到'+',电机加速
                        {
                                Time=Time-5;
                                if(Time<20)
                                Time=20;
                                while(K4==0);
                        }
                        if((K5==0)||(receiveData=='-'))                //按下K5或串口接收到'-',电机减速
                        {
                                Time=Time+5;
                                if(Time>100)
                                Time=100;
                                while(K5==0);
                        }
                        motor_zz();                 //状态1,正转
                }

                while(state==2)                   //状态2,反转
                {
                        if((K1==0)||(receiveData=='t'))                 //按下K1或串口接收到'f',电机反转
                        {
                                state=0;
                                receiveData='0';
                                break;
                        }
                        if((K2==0)||(receiveData=='z'))                 //按下K2或串口接收到'z',电机正转
                        {
                                state=1;
                                receiveData='0';
                                break;
                        }
                        if((K3==0)||(receiveData=='f'))                  //按下K3或串口接收到'f',电机反转
                        {
                                state=2;
                                receiveData='0';
                                break;
                        }
                        if((K4==0)||(receiveData=='+'))                   //按下K4或串口接收到'+',电机加速
                        {
                                Time=Time-5;
                                if(Time<20)
                                Time=20;
                                while(K4==0);
                        }
                        if((K5==0)||(receiveData=='-'))                   //按下K5或串口接收到'-',电机减速
                        {
                                Time=Time+5;
                                if(Time>100)
                                Time=100;
                                while(K5==0);
                        }
                        motor_fz();                //状态2,反转
                }

        }
}

/************************************************************************
* 函数名         :UsartConfiguration()
* 函数功能                   :设置串口
* 输入           : 无
* 输出                  : 无
*************************************************************************/

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

void Usart() interrupt 4
{
        receiveData=SBUF;//出去接收到的数据
        RI = 0;//清除接收中断标志位
}








回复

使用道具 举报

ID:277550 发表于 2021-5-19 09:18 | 显示全部楼层
motor_zz();

motor_fz();

阻塞式运行,并且串口的缓冲,随时都被设置成'0',所以串口接收其实是失败的。
回复

使用道具 举报

ID:97350 发表于 2021-5-19 09:43 | 显示全部楼层
首先,感谢大佬指点,请问是不是我把缓冲不设置成0 ,就可以解决单点发送功能。
回复

使用道具 举报

ID:97350 发表于 2021-5-19 16:03 | 显示全部楼层
把缓冲注销掉,效果还是一样。各位看下还有其他建议吗?先谢谢了 
回复

使用道具 举报

ID:97350 发表于 2021-5-20 16:53 | 显示全部楼层
自己顶一下
回复

使用道具 举报

ID:97350 发表于 2021-5-27 15:21 | 显示全部楼层
【问题已经解决】
解决方法:原因是串口波特率没有选对,波特率是9600
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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