向各位请教一个51串口通信的问题
本帖最后由 Rayne_Hwang 于 2014-7-3 15:26 编辑【型号】:STC89C51RC
【编译环境】:Keil uv4
【问题】:主程序就一个任务,不停地向串口发送字符a。主要是为了测试串口中断有没有问题。结果现在如果在主程序开中断,每次复位之后输出2个a就死机了。关闭ES之后一切正常.
麻烦各位帮我看看串口中断有没有问题。
void UART_Init()
{
TMOD = 0x20; //定时器T1为8位自动重载模式, 用于产生波特率
SCON = 0x50; //串口工作方式1,允许接收。相当于这三句:SM0=0; SM1=1; REN=1;
TH1 = 0xfd;
TL1 =0xfd; //设定T1初值
PCON = 0x00; //波特率不倍增
EA = 1; //使能总中断
ES = 1; //使能串口中断
TR1 = 1; //启动定时器T1
}
void UART_PutByte(UINT8 c)
{
SBUF = c;
while(!TI); // 等待数据发送结束(TI==1代表发送结束)
TI = 0; // 清除发送结束标志
}
void UART_ISR(void) interrupt 4
{
if(RI) //对于接收中断
{
RI = 0; //清中断
RxData = SBUF; //将本次数据存入RxData
if(RxPtr<RX_BUF_LEN) RxBuf = SBUF; //将本次数据追加存入RxBuf[]
}
else //对于发送中断,不作处理
{
TI = 0;
}
}
//变量定义:
static xdata volatile unsigned char RxData = 0;
static xdata volatile unsigned char RxBuf = {0};
Static xdata volatile unsigned char RxPtr = 0;
//主程序
void main()
{
UART_Init();
while(1)
{
UART_PutByte('a');
}
} 从没见过这样写法,很新奇。你到底是查询发送啊还是中断发送啊,怎么都清TI了,不冲突吗 本帖最后由 qlb1234 于 2014-7-3 15:42 编辑
关闭ES之后一切正常
那是不是說明中斷有某箇地方在搗亂?
else //对于发送中断,不作处理
{
TI = 0;
}
不是說不作處理嗎?怎麼會有代碼?
void UART_PutByte(UINT8 c)
{
SBUF = c;
while(!TI); // 等待数据发送结束(TI==1代表发送结束)
TI = 0; // 清除发送结束标志
}
1. 發送中,TI == 0。
2. 發送完,產生中斷,並且TI = 1。
3. 中斷中,TI = 0。
4. while(!TI),卡住了吧? takashiki 发表于 2014-7-3 15:31
从没见过这样写法,很新奇。你到底是查询发送啊还是中断发送啊,怎么都清TI了,不冲突吗 ...
是想查询发送来着 qlb1234 发表于 2014-7-3 15:41
那是不是說明中斷有某箇地方在搗亂?
好的,我改改试试。刚刚学完微机原理,虽说卷面成绩不错,一到做东西脑子还是有点昏啊 采用中断的话,一般只要把值传送给SBUF就好了 ,其他的去掉
页:
[1]