No.34906 作者:newcomer 邮件:chen@yahoo.com.cn ID:12823 登陆:2次 文章数:9篇 最后登陆IP:211.101.210.165 最后登陆:2003/7/12 16:09:29 注册:2003/6/6 9:25:40 财富:131 发帖时间:2003/6/18 18:59:34 发贴者IP:211.101.210.165 标题:newcomer:w77e58编程怪现象!![求助]:中断时复位?? 摘要:No.34906w77e58编程怪现象!![求助]:中断时复位?? //主程序就是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); ......
>>返回讨论的主题
|