导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→w77e58编程怪现象!![求助]:中断时复位??[newcomer]

 *第13614篇: w77e58编程怪现象!![求助]:中断时复位??

  
楼 主:newcomer 2003年6月18日18:59
 w77e58编程怪现象!![求助]:中断时复位??
//主程序就是w77e58的串口1中断程序,编译成功(未写完的项目程序)
//KEIC51 EVAL V1.24编辑,
//现象:在运行到w77e58串口1中断时程序自动复位,且中断程序好象未正常完成,无中断则不会复位(硬件调试)?
//用串口调试器调试,则程序一旦进入中断则将永远循环下去。
//改为串口0中断keil 用ds80c320软仿真,运行正常。
//??????????
#include  <stdio.h>              
#include  <REG51.h>  
#define XON  0x11
#define XOFF 0x13  
#define dwlen 100
#define XON  0x11
#define XOFF 0x13
#define LENGTH 100
sfr PMR   = 0xc4;
char i,j;
sbit EWDI  = 0xec; //允许看门狗中断
sbit EX5   = 0xeb; //ex5-ex2;外部中断允许
sbit EX4   = 0xea; 
sbit EX3   = 0xe9; 
sbit EX2   = 0xe8; 

/* EIP  */
sbit PWDI  = 0xfc; //pwdi=1 看门狗中断优先
sbit PX5   = 0xfb;  //px5-px2=1 外部中断优先
sbit PX4   = 0xfa; 
sbit PX3   = 0xf9; 
sbit PX2   = 0xf8; 
sbit INT2  = 0x94;//外中断2,上跳变触发
sbit INT3  = 0x95;//外中断3,下跳变触发
sbit INT4  = 0x96;//外中断4,上跳变触发
sbit INT5  = 0x97;//外中断5,下跳变触发
sbit ES1   = 0xae ;
sfr SCON1=0x0c0;
sfr SBUF1=0x0c1; 
sbit RI1=SCON1^0;
sbit TI1=SCON1^1;
sbit REN1=SCON1^4;  
sbit DMEO=0X0C4^0;  
sbit IE5=0X91^7;
char xdata dw[dwlen]={'X','X','X','X','X','X','X','X','X'};     //attention : '\0x0d'!=0x0d
xdata char string[LENGTH]_at_ 0x0116; 
char  *flag; 
xdata char Ephone[]="13161528267"; 
xdata char Fphone[]="13161528267";                                                           //\r!='\r'    0x0d='\r'
char mode;
int len;
static int c=0;
char response;
char smssend;
char string1[5];
//长延时 12MHZ  about
void Delay100Ms(void)
{
 unsigned char i = 5;
 unsigned int j;
 while(i--)
 {
  j=1815;
  while(j--);
 };
}
void atd()
{;}
void ath(void)
{ printf("ATA\r");}  
char getkey () 
 {
  char c;
  while (!RI1);
  c = SBUF1;
  RI1 = 0;
  return (c);
}
char putchar( char c){         //2003/6/17C
if (c == '\n') 
 {
     if (RI1)               //RI`RI1
     {
      if (SBUF1 == XOFF) 
       {
        do 
         {
          RI1 = 0;
          while (!RI1);
         }
        while (SBUF1!= XON);
        RI1 = 0; 
       }
     }
    while (!TI1);
    TI1 = 0;
    SBUF1 = 0x0d;                       // output CR 
 }
  if (RI1)  
  {
    if (SBUF1 == XOFF) 
     {
      do  
       {
        RI1 = 0;
        while (!RI1);
       }
      while (SBUF1!= XON);
      RI1 = 0; 
    }
  }
  while (!TI1);
  TI1 = 0;            
  return (SBUF1= c);  

char MyGetChar1(void) { /* was char */
 char c;
 while (!RI1);     //set point for debug  serial1 used
 c = SBUF1;
 RI1 = 0;
      // putchar1(c);                                                    
 return (c);
}
/*******************get char    <cr>   twice control length***********/
void  getline2(char * s)            //for gsm use
 {int i=0,j=2;
 char c;
  do
    { c=MyGetChar1();
      s[i]=c;
     if(s[i]==0x0d)
       {j--;
       } 
        i++;  
    }
 while(j!=0);    //  <cr>   twice receive 
                              // for coming PHONE : RING  <CR>    <LF>   TWICE  
                             // for coming sms   : +CMT:""....  <CR>    <LF>  DATA  <CR>    <LF>  

char chargestate()
{char state=0;
   if(INT4==1) //ON CHARGE
    {;
     state='Y';
    }
   else
    {;                              
     state='N';
    }     
return state ;
}  
 int FEPS(char *s)
     {int i=0;
     do
     { if((s[i]=='p')||(s[i]=='s')||(s[i]=='f')||(s[i]=='e'))
         {return i;}
        else
        i++;
      }
      while(i  <100);
      return 0;   
     }
void delay()
{         unsigned int us,usn,MS;
MS=127;
  while(MS!=0)
   { usn = 127;
    while(usn!=0)
     {
      us=80;
      while (us!=0){us--;};
      usn--;
    }
    MS--;  }
}
     
/*******************************/                          
void main()
{             
       //  char i,response[20];              
        PMR = 0x41; 
         TMOD=0X20;
 SCON1=0X50;
        SCON=0X50;
 TCON=0X60;
 TH1=0X0FD;
 TL1=0X0FD;
 PCON=0X00;
        IP=0X00;//PRI INTERRUPT
        TR1=1; 
for(i=0;i  <LENGTH;i++)
{string[i]='w';}
TI1=1;
Delay100Ms();
      printf("at&f\r");
     delay();
     TI1=1;
    printf("at+ipr=0\r");                       
     delay();
        printf("at+cnmi=0,2,0,0\r");                       
     delay();
         printf("at+waip=1\r");                      
     delay();
  printf("at+crmp=3,6,0,2\r");                       
     delay();
   printf("at+crmp=0,0,0,0\r");
TI1=0;
RI1=0;
TI1=0;
RI1=0;
ES1=1;
EA=1;
while(1);
}
void coming() interrupt 7 using 0              //interrupt n interruptting from 8n+3 address 
{ TI1=1;                                              //serial1 0x3b  n=7 { TI=1;
  RI1=0;  
  if((SBUF1=='R')||(SBUF1=='+'))     
  {string[0]=SBUF1;                              
  } 
  else if(((SBUF1=='I')&&(string[0]=='R'))||((SBUF1=='C')&&(string[0]=='+')))
       {string[1]=SBUF1;
            if(string[1]=='I')    //COMING RING
               {   printf("at+crmp=0,11,0,2\n");
                   delay();
                   printf("at+crmp=0,0,0,0\n");
                   delay();
                   printf("ath\n");
                   printf("atd13161528267;\r");
                   for(i=0;i  <LENGTH;i++)
                     {string[i]='w';}
                  TI1=0;
               }
                else 
                   {    i=2;
                        j=2;
                       do
                          {
                           string[i]=getkey();
                           if(string[i++]==0x0d)
                           j--;
                           }
                           while(j!=0);
                         //  printf(string);
                           i=FEPS(string);
                           if(string[i]=='p')
                              {
                               TI1=1;
                               printf("at+crmp=0,13,0,9\n");
                                delay();
                                printf("at+crmp=0,0,0,0\n");
                                  delay();
                                printf("at+cmgs=13161528267\n");
                               ES=1;  //serial0 interrupt enable
                               for(i=0;i  <LENGTH;i++)
                                  {string[i]='w';}
                               TI1=0;
                              }
                             else if(string[i]=='s')
                                    {
                                      j=chargestate();
                                      TI1=1;
                                      printf("at+crmp=3,15,0,7\n"); //CHARGE STATE
                                        delay();
                                          printf("at+crmp=0,0,0,0\n");
                                       delay();
                                       printf("at+cmgs=");
                                      printf(Ephone);
                                      putchar(0x0d);
                                      delay();
                                      putchar(j);
                                      putchar(0x1a);
                                      for(i=0;i  <100;i++)
                                        {string[i]='w';}
                                      TI1=0;
                                      RI1=0;
                                    }
                                     else if(string[i]=='f')
                                           {
                                            flag++;
                                            TI1=1;
                                            printf("at+crmp=3,10,0,1\n"); //change num E
                                            delay();
                                            printf("at+crmp=0,0,0,0\n");
                                            delay();
                                            printf("AT+CPBW=1,");
                                            i++;
                                             while((string[i]  <0x3a)&&(string[i]>  0x2f))
                                              {
                                               putchar(string[i++]);
                                               }
                                               
                                             printf(",,");
                                             putchar(0x0d);
                                             for(i=0;i  <LENGTH;i++)
                                                     {string[i]='w';
                                                      }
                                             TI1=0;
                                             RI1=0;
                                            }
                                               else if(string[i]=='e')
                                                      {
                                                      flag++;
                                                      TI1=1;
                                                      printf("at+crmp=3,6,0,1\n"); //change num E
                                                      printf("AT+CPBW=2,");
                                                        i++;
                                                        while((string[i]  <0x3a)&&(string[i]>  0x2f))
                                                              {
                                                            putchar(string[i++]);
                                                                }
                                               
                                                    printf(",,");
                                                      putchar(0x0d);
                                                      for(i=0;i  <LENGTH;i++)
                                                         {string[i]='w';
                                                          }
                                                        TI1=0;
                                                        RI1=0;
                                                      }
                                                     else
                                                      {for(i=0;i  <LENGTH;i++)
                                                        {string[i]='w';
                                                        }
                                                        TI1=0;
                                                        RI1=0;
                                                       goto out;
                                                       } 
   
                                   }
                  

                       }
     
                         else {TI1=1;
                               #ifdef debug
                               printf("wrong out\n");
                                 #endif
                               TI1=0;
                               RI1=0;
                               goto out;
                               } 
out : 
TI1=1;
#ifdef debug
printf("during serial1 \n");
#endif
RI1=0;
TI1=0;
RI1=0;
TI1=0;
EA=1;
}

  
2楼:newcomer 2003年6月18日19:11
 我就去了

>>>>>>对该主题发表你的看法

本主题贴数2,分页: [第1页]


[上一篇主题]:[求助]avrstudio 的watch窗口中的变量显示值不发生变化,高手指教

[下一篇主题]:三星S3C44B0、S3C4510、S3C2510、S3C2410均有现货!