打印
[51单片机]

上位机发送代码后,单片机不执行。请大家帮忙看看

[复制链接]
1626|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wazg2019|  楼主 | 2019-8-3 15:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
        //例子
#include "reg51.h"
#include "intrins.h"

#define u8 unsigned int
#define u16 unsigned char


#define FOSC 11059200L          //系统频率
#define BAUD 2400            //串口波特率 2400
#define RATE 9600            //串口波特率 9600


unsigned char SenData,Flag=0;


sfr AUXR  = 0x8e;               //辅助寄存器
sfr T2H   = 0xd6;               //定时器2高8位
sfr T2L   = 0xd7;               //定时器2低8位

sbit k1=P1^0;
sbit k2=P1^1;
sbit k3=P1^2;
sbit k4=P1^3;

sbit LED1=P1^4;
sbit LED2=P1^5;

bit flag1=0,flag2=0;
unsigned char a=0,b,dat0,dat1,dat7,dat8,tab[2]={0,0},i=0,j;
unsigned char number=0;  //定义一个数组

void Delay3ms();

//void baudrate();

void main()
{
       
    SCON = 0x50;                  //8位可变波特率
//    SCON = 0xda;                //9位可变波特率,校验位初始为1                 ///两个都注释掉为什么就接收不到了??
//    SCON = 0xd2;                //9位可变波特率,校验位初始为0                 ///两个都注释掉为什么就接受不到了??
//          TMOD|= 0x20;                //定时器工作方式2                    
        PCON|= 0x00;                                                         

    T2L = (65536 - (FOSC/4/BAUD));   //设置波特率重装值
    T2H = (65536 - (FOSC/4/BAUD))>>8;
    AUXR = 0x14;                //T2为1T模式, 并启动定时器2
    AUXR |= 0x01;               //选择定时器2为串口1的波特率发生器
    ES = 1;                     //使能串口1中断
    EA = 1;

          Flag=0;        
    while(1)
        {
                        LED1=LED2=0;
                  if (Flag==1)//接收到一帧数据
          {
                    EA=0;
                        i=0;
                        if((tab[1]==0xFC)&&(tab[0]!=0))        //判断接收数据的第一个值。
                           {
                                         
                                                         dat0=tab[0];                                           //把接收的第一个数付给一个变量进行判断,tab[0]的0表示的是一个数组中的第一个值,也可对第一个数直接进行判断
                                                        dat1=tab[1];                              //串口115200发送的一个变量
                                         
                                        }
                                                        else
                                                                {
                                                                         ES=1;                    //记得开串口中断,
                                                                         Flag=0;
                                                                         tab[0]=0;
                                                                         tab[1]=0;
                                                                }

                                                        if(dat1==0xFC)
                                                                {                                                                                       
                                                                        Delay3ms();
                                                                        k1=k2=k3=k4=1;
                                                                        }
                                                                }       
               
                                                        EA=1;                                                                                                                                                                                                                                                                                                                                                                                                                          
                                                        Flag=0;                       

                                                                       
                                        if(k1==0)
                                        {
                                                Delay3ms();
                                                if(k1==0)
                                                {
                                                        SBUF=0x14;
                                                        while(TI==0);
                                                        TI=0;
                                                       
                                                        SBUF=1;
                                                        while(TI==0);
                                                        TI=0;
                                                }
                                        }                                       
                                       
                                        if(k2==0)
                                        {
                                                Delay3ms();
                                                if(k2==0)
                                                {
                                                        SBUF=0x14;
                                                        while(TI==0);
                                                        TI=0;
                                                       
                                                        SBUF=3;
                                                        while(TI==0);
                                                        TI=0;                                                       
                                                }                                       
                                        }
                                       
                                        if(k3==0)
                                        {
                                                LED1=1;
                                                Delay3ms();
                                                if(k3==0)
                                                {
                                                        SBUF=0x14;
                                                        while(TI==0);
                                                        TI=0;
                                                       
                                                        SBUF=2;
                                                        while(TI==0);
                                                        TI=0;                                                       
                                                }                                       
                                        }                                       
                                }
                        }                                                                                                               
                                                                                               
                       
void Delay3ms(void)   //误差 0us
{
    unsigned char a,b;
    for(b=111;b>0;b--)
        for(a=12;a>0;a--);
}
                                                                       
/*----------------------------
UART 中断服务程序
-----------------------------*/
void Uart() interrupt 4 using 1
{
//unsigned char ReData;
if(RI)        //RI接受中断标志
{
                RI = 0;                    //清除RI接受中断标志
//                dat1=SBUF;
                if(Flag!=1)
                        {         
                                        tab[i] = SBUF;  //SUBF接受/发送缓冲器
                                        i++;
                                        if(i>=2)
                                        {       
                                                i=0;
                                                Flag=1;        
                                        }
                  }
   }
}

使用特权

评论回复

相关帖子

沙发
Cjy_JDxy| | 2019-8-3 18:17 | 只看该作者
你这程序什么功能啊?怎么不执行啦

使用特权

评论回复
板凳
wazg2019|  楼主 | 2019-8-5 07:27 | 只看该作者
Cjy_JDxy 发表于 2019-8-3 18:17
你这程序什么功能啊?怎么不执行啦

是上位机发来一条指令,我单片机收到后,所有IO口恢复初始状态,然后我按下按钮发送代码。

使用特权

评论回复
地板
wazg2019|  楼主 | 2019-8-5 07:28 | 只看该作者
Cjy_JDxy 发表于 2019-8-3 18:17
你这程序什么功能啊?怎么不执行啦

现在是单片机收到后,他不执行。

使用特权

评论回复
5
tianxj01| | 2019-8-5 08:47 | 只看该作者
程序写的有点乱,就不仔细看了,不过,看你又是可变波特率又是上位机什么的,给个建议,做单片机的最好一步一步来,先给个固定波特率,然后不用上位机,只用串口助手+USB-TTL模块和单片机进行通信测试,比如鹦鹉学舌什么的,都通过了,则实现执行功能就很简单,当这些都完成了,则才进一步到上位机程序控制,再到可变波特率等功能的进一步实现,这样一步一步来,你就不用这么茫然的来发帖求助,而且你串口程序的能力也可以进一步提高。

使用特权

评论回复
6
wazg2019|  楼主 | 2019-8-5 08:56 | 只看该作者
tianxj01 发表于 2019-8-5 08:47
程序写的有点乱,就不仔细看了,不过,看你又是可变波特率又是上位机什么的,给个建议,做单片机的最好一步 ...

好吧,谢谢

使用特权

评论回复
7
mcuzone| | 2019-8-5 10:16 | 只看该作者
先把单独的MCU发送给PC调好,确保硬件OK。别把RXD和TXD接反了,别把TTL,RS232电平搞混了

使用特权

评论回复
8
wazg2019|  楼主 | 2019-8-5 10:44 | 只看该作者
mcuzone 发表于 2019-8-5 10:16
先把单独的MCU发送给PC调好,确保硬件OK。别把RXD和TXD接反了,别把TTL,RS232电平搞混了 ...

我现在串口通讯没问题,单片机也能接收到PC给的信号,就是在我按下按键发送数据的时候,PC给一个信号过来,我的单片机就要恢复到初始状态。现在的问题是,我的单片机按键按下的时候发送代码,但是接收到PC信号了,单片机没有恢复到初始状态,还在发送数据。

使用特权

评论回复
9
叶春勇| | 2019-8-5 10:54 | 只看该作者
你这个通讯协议是什么格式的?

使用特权

评论回复
10
wazg2019|  楼主 | 2019-8-5 15:27 | 只看该作者
叶春勇 发表于 2019-8-5 10:54
你这个通讯协议是什么格式的?

2400波特率,然后发送28 FC,这是十六进制数

使用特权

评论回复
11
eddy2019| | 2019-8-5 15:38 | 只看该作者
是不是你硬件那边出问题了

使用特权

评论回复
12
叶春勇| | 2019-8-5 16:16 | 只看该作者
wazg2019 发表于 2019-8-5 15:27
2400波特率,然后发送28 FC,这是十六进制数

自编协议,一般定义个包头,包围。协议解析好弄些。
例如(28FE)  用ascii码传送  '(' '2' '8' 'F' 'E' ')'。包头括号,包尾括号。不符合就丢弃。

使用特权

评论回复
13
hahaheiyou| | 2019-8-5 22:16 | 只看该作者
确定一下是不是真的收到数据吧。

使用特权

评论回复
14
wazg2019|  楼主 | 2019-8-6 09:05 | 只看该作者
hahaheiyou 发表于 2019-8-5 22:16
确定一下是不是真的收到数据吧。

确定是收到了

使用特权

评论回复
15
songchenping| | 2019-8-6 11:16 | 只看该作者
这代码写得,比我的还乱。

使用特权

评论回复
16
广东大掌柜| | 2019-8-6 13:46 | 只看该作者
顶起,学习一下

使用特权

评论回复
17
hahaheiyou| | 2019-8-6 18:56 | 只看该作者

你的逻辑有问题,注意图中的if条件,当你第一次接收到数据之后满足条件,之后都不会接收新的数据了,你的if条件永远都满足条件。

使用特权

评论回复
18
XLazyDog| | 2019-8-14 10:05 | 只看该作者

推荐一款安卓手机上用的 串口调试工具SPU,亲测支持几乎所有型号的USB转串口模块,甚至Arduino。文本和Hex码两种模式,支持定时重发,可定义快捷按钮,设置波特率等。如果调试AT指令的话,还可以自动添加0A 0D的换行符。感兴趣可以在手机应用市场搜索安装试试

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

8

帖子

0

粉丝