求大神帮忙 诡异错误
我用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标志。所以你连续发送字符串会出错的。