求大神帮忙 诡异错误

penghaichao 2013-04-29 03:41:26
我用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");还会乱码 但是不加 程序运行完全正确
...全文
70 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
dceacho 2013-04-30
  • 打赏
  • 举报
回复
delay1ms(); send_char(48); send_string("hello"); 这3个,如果你在main()中使用就不要在中断中使用,反之一样 只能在一个地方用
bjtea 2013-04-30
  • 打赏
  • 举报
回复
51单片机的串口发送字符必须一个一个的发送,中间必须停顿,等待有了TX标志后,才能发送下一个字符,同时清除TX标志。所以你连续发送字符串会出错的。

27,382

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧