标题:
请教各位,现在一直搞不清楚单片机串口代码是哪里的问题?
[打印本页]
作者:
89C52RC单片机
时间:
2023-3-20 21:03
标题:
请教各位,现在一直搞不清楚单片机串口代码是哪里的问题?
代码如下所示,只要定时器一打开(TR1=1),串口助手里面就不停的显示00 00 00.。。,发送和接收都没反应,实在找不出哪里的问题,请各位大神帮看一下
#include <REGX52.H>
void URET_TX(unsigned char key)
{
SBUF=key; //写入数据进SBUF缓存器
if(TI==1) //检测标志位,是否是1,,表示数据传出完成
{
if(RI==1) //检测是否接收完成,如果是1,标示数据被完整接收
P2=SBUF; //读取发送过来的SBUF数据
RI=0; //重置数据传输完成标志位
TI=0; } //重置数据接收完成标志位
}
void URET_Tu(void)
{
PCON |= 0x80; //使能波特率倍速位SMOD
SCON = 0x50; //8位数据,可变波特率
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xF4; //设定定时初值
TH1 = 0xF4; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器用于产生波特率
ES=1; //开启串口通信
}
void main(void)
{
URET_Tu();
URET_TX(SBUF);
}
上面代码 只要TR1=1, URET_TX()函数中就算只有SBUF=key一个语句,也全是00 00 00...不停的出
作者:
xuyaqi
时间:
2023-3-21 07:37
在 main 最后应加 while(1);
作者:
yzwzfyz
时间:
2023-3-21 13:27
老师有没有讲过,当MAIN函数执行到最后一句之后,CPU将如何运行呢?
作者:
89C52RC单片机
时间:
2023-3-21 20:11
用过while(1)也是不行的 我另一个帖子 有朋友帮解决了 但是那个逻辑问题我还是很理解
作者:
89C52RC单片机
时间:
2023-3-21 20:14
yzwzfyz 发表于 2023-3-21 13:27
老师有没有讲过,当MAIN函数执行到最后一句之后,CPU将如何运行呢?
void URET_TX()
{
if(RI==1) //查询接收中断请求标志位为1(已收到)
{
RI=0; //接收中断请求标志位清0
num=SBUF; //获取接收寄存器数据
SBUF=num; //发送数据
while(!TI); //等待发送中断请求标志位为1(已发送)
TI=0; //发送中断请求标志位清0
}
...................................................................................................分隔线
函数上面这样写就可以收发 ,但是换个顺序就不行,比如下面
void URET_TX()
{
SBUF=num; //发送数据
while(!TI); //等待发送中断请求标志位为1(已发送)
TI=0; //发送中断请求标志位清0
if(RI==1) //查询接收中断请求标志位为1(已收到)
{
RI=0; //接收中断请求标志位清0
num=SBUF; //获取接收寄存器数据
}
}
我把它改成这样就又全部是00 000 00
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1