找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5026|回復(fù): 7
打印 上一主題 下一主題
收起左側(cè)

為啥我的51單片機(jī)程序會(huì)跳出while(1)不斷復(fù)位?

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
100黑幣
現(xiàn)象如下


不斷復(fù)位
順序執(zhí)行到一半就總是莫名其妙復(fù)位
單片機(jī)源代碼如下
#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;
         }
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:564242 發(fā)表于 2019-6-17 10:03 | 只看該作者
1.看門狗定時(shí)器是否關(guān)閉
2.復(fù)位電路設(shè)計(jì)是否合理
回復(fù)

使用道具 舉報(bào)

板凳
ID:564333 發(fā)表于 2019-6-17 10:49 來自手機(jī) | 只看該作者
qinimo2002 發(fā)表于 2019-6-17 10:03
1.看門狗定時(shí)器是否關(guān)閉
2.復(fù)位電路設(shè)計(jì)是否合理

看看程序是否寫錯(cuò)
回復(fù)

使用道具 舉報(bào)

地板
ID:160500 發(fā)表于 2019-6-17 11:13 | 只看該作者
1、沒有說明單片機(jī)型號(hào)和完整電路圖,一切靠猜
2、沒有看到有喂狗代碼,或者喂狗時(shí)間超時(shí)
回復(fù)

使用道具 舉報(bào)

5#
ID:546325 發(fā)表于 2019-6-17 12:06 | 只看該作者
還是要具體點(diǎn)把問題描述清楚,復(fù)位不止軟件問題,還有可能硬件問題
回復(fù)

使用道具 舉報(bào)

6#
ID:552614 發(fā)表于 2019-6-17 16:15 | 只看該作者
你的復(fù)位電路是不是一直連高電平了?
回復(fù)

使用道具 舉報(bào)

7#
ID:542954 發(fā)表于 2019-8-11 20:42 | 只看該作者
sfr WDT_CONTR=0xe1;
我看到了你定義了一個(gè)看門狗寄存器,這個(gè)寄存器的值為11100001
第7位為看門狗溢出位,溢出置1,需要軟件清0,
第5位為看門狗使能位,置1啟動(dòng)看門狗
第4位為看門狗清零位,置1清0看門狗,看門狗重新計(jì)數(shù)后硬件自動(dòng)清0該位,
第3位為看門狗模式位,置1時(shí)為在空閑模式也計(jì)數(shù),
后面三位是看門狗定時(shí)器分頻值。
意思是你啟動(dòng)了看門狗,但是我并沒有在你后面的程序中看到喂狗的程序,看門狗計(jì)數(shù)器清零之后會(huì)自動(dòng)觸發(fā)復(fù)位中斷,你需要在你的while(2)里面反復(fù)喂狗才可以
回復(fù)

使用道具 舉報(bào)

8#
ID:599517 發(fā)表于 2019-8-12 22:25 | 只看該作者
沒復(fù)位啊,沒跳出循環(huán),一直在while (1) 里面運(yùn)行你的AT指令啊,你的功能思維好像需要改變一下!不要一直這樣發(fā)送AT啊,那邊回復(fù)是需要時(shí)間的,給個(gè)延時(shí)或者判斷接收到的數(shù)據(jù)。
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表