首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

求大神帮忙 诡异异常

2013-06-26 
求大神帮忙 诡异错误我用keil编程 在proteus上仿真 一个串口的小程序 有个按键接到外部中断0 代码如下:#in

求大神帮忙 诡异错误
我用keil编程 在proteus上仿真 一个串口的小程序 有个按键接到外部中断0 代码如下:
#include <reg51.h>

typedef unsigned char uchar;
typedef unsigned int  uint;

   //数据输入按键

bit start ;   //编码开始标志


/******INT0初始化函数******/
void init_int0()
{
   EX0 = 1;   //允许外部中断0
   IT0 = 1;   //INT0低电平触发
   EA = 1;    //允许总中断
}
void delay1ms()
{
   uchar i,j;
   for(i=0;i<24;i++)
      for(j=248; j>0; j--);
}


/******初始化串口******/
void init_serial()
{
   SCON = 0x50;   //SCON: serail mode 1, 8-bit UART, enable ucvr
   TMOD = (TMOD & 0x0f) | 0x20;
   PCON |= 0x80;
   TH1 = 0xFA;   //Baud:9600 fosc=11.0592MHz
   TL1 = TH1;

   IE |= 0x90;   //Enable Serial Interrupt
   TR1 = 1;    //timer 1 run
   
}

void send_char(uchar ch)   //向串口发送一个字符
{
   SBUF = ch;
   while(0 == TI);
   TI = 0;
}

void send_string(uchar *str)   
{
   while(*str){
      send_char(*str++);
   }
}

/******编码程序******/
void encode()

   send_char(49);
   send_char(49);
  
}
/******INT0中断服务程序******/
void int0_isr() interrupt 0

  EX0 = 0;delay1ms(); delay1ms(); delay1ms();
  send_char(48);send_string("hello");
  delay1ms();delay1ms(); delay1ms(); start = 1;
}
void main()
{
   init_serial();
   init_int0();   //初始化外部中断0
   while(1){
   if(1 == start){
      start = 0;
  
      EX0 = 1;
  
  }
   }
  
}
但是如果我在
if(1 == start){
      start = 0;
  
      EX0 = 1;
  
  }
中括号里加一句send_char(48);或者send_string("hello");按按键串口就只输出一次 再按没反应不输出了 而且send_string("hello");还会乱码 但是不加 程序运行完全正确
[解决办法]
delay1ms();
send_char(48);
send_string("hello");
这3个,如果你在main()中使用就不要在中断中使用,反之一样
只能在一个地方用
[解决办法]
51单片机的串口发送字符必须一个一个的发送,中间必须停顿,等待有了TX标志后,才能发送下一个字符,同时清除TX标志。所以你连续发送字符串会出错的。

热点排行