找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3841|回复: 7
收起左侧

为啥我的51单片机程序会跳出while(1)不断复位?

[复制链接]
ID:328334 发表于 2019-6-16 20:12 | 显示全部楼层 |阅读模式
100黑币
现象如下
无标题.png

不断复位
顺序执行到一半就总是莫名其妙复位
单片机源代码如下
#include "reg52.h"  

typedef unsigned int u16;   
typedef unsigned char u8;

#define GPIO_KEY P1

sfr WDT_CONTR=0xe1;

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

sbit IN1=P1^5;
sbit IN2=P1^6;
sbit IN3=P1^7;
sbit IN4=P1^0;

u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                                        0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};


u8 KeyValue;                        
u8 kkj[4];
u16 k=0;
u16 pn=0;
u8 qw1,qw2,qw3,qw4;
u8 redata;

u8 rst[]="AT+RST\r\n";
u8 mod[]="AT+CWMODE=3\r\n";
u8 wico[]="AT+CWJAP=\"Nick\",\"qweasdzxc\"\r\n";
u8 sev[]="AT+CIPSTART=\"TCP\",\"192.168.43.31\",8080\r\n";
u8 mods[]="AT+CIPMODE=1\r\n";
u8 sen[]="AT+CIPSEND\r\n";
u8 idre[]="This is vehicle\r\n";                        
void UsartInit()
{
                SCON=0X50;               
                T2CON=0X34;            
                PCON=0X80;               
                RCAP2H=(65536-39)/256;               
    RCAP2L=(65536-39)%256;
    ES=1;                                
                EA=1;
                WDT_CONTR=0x01;
}

void delay(u16 i)
{
        while(i--);        
}


void Delay_xms(u16 x)
{
u16 i,j;
for(i=0;i<x;i++)
  for(j=0;j<112;j++);
}

void KeyDown(void)
{
        char a=0;
        GPIO_KEY=0x0f;
        if(GPIO_KEY!=0x0f)
        {
                delay(1000);
                if(GPIO_KEY!=0x0f)
                {        
                        //2aêÔáD
                        GPIO_KEY=0X0F;
                        switch(GPIO_KEY)
                        {
                                case(0X07):        KeyValue=0;break;
                                case(0X0b):        KeyValue=1;break;
                                case(0X0d): KeyValue=2;break;
                                case(0X0e):        KeyValue=3;break;
                        }
                        //2aêÔDD
                        GPIO_KEY=0XF0;
                        switch(GPIO_KEY)
                        {
                                case(0X70):        KeyValue=KeyValue;break;
                                case(0Xb0):        KeyValue=KeyValue+4;break;
                                case(0Xd0): KeyValue=KeyValue+8;break;
                                case(0Xe0):        KeyValue=KeyValue+12;break;
                        }
                                if(KeyValue==10)
                                {
                                  k=k;
                                  }
                                else
                                {
                                        kkj[k]=KeyValue;
                                        k=k+1;
                                        if(k==4)
                                        {
                                                k=0;
                                        }
                                }        
                        while((a<50)&&(GPIO_KEY!=0xf0))   
                        {
                                delay(1000);
                                a++;
                                
                        }
                }
        }
}


void send_byte(u8 by)
{
                SBUF = by;
    while(!TI);
    TI = 0;      
}

void send_string(u8 *p)
{
    while(*p!= '\0')
                        {
        send_byte(*p);
        p++;
    }
}

void MotorCW(void)
{
u8 i;
for(i=0;i<4;i++)
  {
   if(i==0)
         {
                IN1=1;
                IN2=0;
                IN3=0;
                IN4=0;
         }
         if(i==1)
         {
                IN1=0;
                IN2=1;
                IN3=0;
                IN4=0;
         }
         if(i==2)
         {
                IN1=0;
                IN2=0;
                IN3=1;
                IN4=0;
         }
         if(i==3)
         {
                IN1=0;
                IN2=0;
                IN3=0;
                IN4=1;
         }
                Delay_xms(4);
        }
        pn=pn+1;
}

void del(u16 n)
{
        unsigned int i=0;
  for(i=0;i<n;i++)
        {
                #pragma asm
                DEL3:MOV R0,#100
                DEL2:MOV R1,#100
                DEL1:MOV R2,#25
          DEL0:NOP
               NOP
               DJNZ R2,DEL0
               DJNZ R1,DEL1
               DJNZ R0,DEL2
                #pragma endasm
        }
}
/**************************************************************************************************************************************************************/
void main()
{        
        UsartInit();
        del(1);
        send_string(rst);
        del(1);
        send_string(mod);
        del(1);
        send_string(wico);
        del(10);
        send_string(sev);
        del(10);
        send_string(mods);
        del(5);
        send_string(sen);
        del(3);
        send_string(idre);
        del(1);
        while(1)
        {        
                KeyDown();
                if(KeyValue==11)
                {
                kkj[0]=0;
                kkj[1]=0;
                kkj[2]=0;
                kkj[3]=0;
                        k=0;
                }
                if(KeyValue==10)
                {
                kkj[0]=kkj[0]+48;
                kkj[1]=kkj[1]+48;
                kkj[2]=kkj[2]+48;
                kkj[3]=kkj[3]+48;
                send_string(kkj);
                kkj[0]=0;
                kkj[1]=0;
                kkj[2]=0;
                kkj[3]=0;
                k=0;
                KeyValue=0;
                }
                qw1=kkj[0];
                qw2=kkj[1];
                qw3=kkj[2];
                qw4=kkj[3];
                LSA=1;LSB=1;LSC=0;
                P0=smgduan[qw1];
                delay(100);
                P0=0x00;
                LSA=0;LSB=1;LSC=0;
                P0=smgduan[qw2];
                delay(100);        
                P0=0x00;
                LSA=1;LSB=0;LSC=0;
                P0=smgduan[qw3];
                delay(100);      
                P0=0x00;
                LSA=0;LSB=0;LSC=0;
                P0=smgduan[qw4];
                delay(100);      
                P0=0x00;
                if(redata=='B')
                        {
                                        MotorCW();   
                                        if(pn==256)
                                        {
                                        Delay_xms(1000);
                                        pn=0;
                                        redata='A';
                                        }
                        }
        }               
}

void Usart() interrupt 4
{
         if(RI!=0)
         {
                 redata=SBUF;
                 RI=0;
         }
}

回复

使用道具 举报

ID:564242 发表于 2019-6-17 10:03 | 显示全部楼层
1.看门狗定时器是否关闭
2.复位电路设计是否合理
回复

使用道具 举报

ID:564333 发表于 2019-6-17 10:49 来自手机 | 显示全部楼层
qinimo2002 发表于 2019-6-17 10:03
1.看门狗定时器是否关闭
2.复位电路设计是否合理

看看程序是否写错
回复

使用道具 举报

ID:160500 发表于 2019-6-17 11:13 | 显示全部楼层
1、没有说明单片机型号和完整电路图,一切靠猜
2、没有看到有喂狗代码,或者喂狗时间超时
回复

使用道具 举报

ID:546325 发表于 2019-6-17 12:06 | 显示全部楼层
还是要具体点把问题描述清楚,复位不止软件问题,还有可能硬件问题
回复

使用道具 举报

ID:552614 发表于 2019-6-17 16:15 | 显示全部楼层
你的复位电路是不是一直连高电平了?
回复

使用道具 举报

ID:542954 发表于 2019-8-11 20:42 | 显示全部楼层
sfr WDT_CONTR=0xe1;
我看到了你定义了一个看门狗寄存器,这个寄存器的值为11100001
第7位为看门狗溢出位,溢出置1,需要软件清0,
第5位为看门狗使能位,置1启动看门狗
第4位为看门狗清零位,置1清0看门狗,看门狗重新计数后硬件自动清0该位,
第3位为看门狗模式位,置1时为在空闲模式也计数,
后面三位是看门狗定时器分频值。
意思是你启动了看门狗,但是我并没有在你后面的程序中看到喂狗的程序,看门狗计数器清零之后会自动触发复位中断,你需要在你的while(2)里面反复喂狗才可以
回复

使用道具 举报

ID:599517 发表于 2019-8-12 22:25 | 显示全部楼层
没复位啊,没跳出循环,一直在while (1) 里面运行你的AT指令啊,你的功能思维好像需要改变一下!不要一直这样发送AT啊,那边回复是需要时间的,给个延时或者判断接收到的数据啊!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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