请教单片机串口通信的问题

weidao1210 2010-11-22 09:36:21
程序要实现的是 接受计算机发送的数据 接收到1时蜂鸣器以400ms频率发声,为2时以200ms频率发声,为3 时以频率100ms频率发声,其他的情况关闭蜂鸣器。 我试了 接收不到数据啊 程序如下 请问各位高手这是何解啊?
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar bb,flag,dat;
uint z;
sbit bee=P2^3;
void init();
uchar recieve(void);
void delay(uint z);
void main()
{
init();
while(1)
{

if(flag==1)
{
bb=recieve();
if(bb==1) //接收到1 蜂鸣器以400ms频率发声
{
bee=~bee;
delay(200);
bee=~bee;
delay(200);
}
if(bb==2) //接收到2 蜂鸣器以200ms频率发声
{
bee=~bee;
delay(100);
bee=~bee;
delay(100);
}
if(bb==3) //接收到 3蜂鸣器以100ms频率发声
{
bee=~bee;
delay(50);
bee=~bee;
delay(50);
}
bee=1; //接收到其他的蜂鸣器关闭


}
}
}

void init() //初始化函数
{
TMOD=0X20;
EA=1;
ET1=1;
TH1=0XFD;
TL1=0XFD;
TR1=1;

SCON=0X50;
PCON=0X00;
REN=1;

}

uchar recieve() //接收函数
{
uchar dat;
while(RI==0);
RI=0;
flag=1;
dat=SBUF;
return dat;

}

void delay(uint z) //延迟函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
...全文
108 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
houyu123 2010-11-23
  • 打赏
  • 举报
回复
while(1)
{
bb=recieve();
if(flag==1)
{
...
}
}
这样才行,你原来的程序,根本没有去接受串口的数据。
iknowjeanzxf 2010-11-23
  • 打赏
  • 举报
回复
请在你的函数中

uchar recieve() //接收函数
{
uchar dat;
while(RI==0);
RI=0;
flag=1;
dat=SBUF;


//增加如下代码
bee=~bee;
delay(50);
bee=~bee;
delay(50);
//增加代码完毕

return dat;
}

测试你的recieve函数是否能够接收到串口的数据。
如果你的蜂鸣器响了,证明数据可以接收到,如果不响,另议。
weidao1210 2010-11-23
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 eyey1 的回复:]
计算机如果发字符"1"的话,你接受的是十进制的49.而不是1.
[/Quote]
对了我选择的是 十六进制发送的。
weidao1210 2010-11-23
  • 打赏
  • 举报
回复
啊 请问六楼的大侠,这是为什么?
手机写程序 2010-11-23
  • 打赏
  • 举报
回复
计算机如果发字符"1"的话,你接受的是十进制的49.而不是1.
weidao1210 2010-11-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 iknowjeanzxf 的回复:]
另请将void init() //初始化函数中
ET1=1;
TL1=0XFD;
PCON=0X00;
这3句话注销掉
[/Quote]
我试过了!去掉那几句后还是不行!
weidao1210 2010-11-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 iknowjeanzxf 的回复:]
请把晶振频率说下,以及你想使用的波特率。另,蜂鸣器是否可以单独响(不靠串口控制),就是你是否做过蜂鸣器的测试?
[/Quote]
使用的波特率是 9600bps 我刚才做了蜂鸣器的测试,不靠串口能够自己响!
weidao1210 2010-11-23
  • 打赏
  • 举报
回复
晶振是11.0592MHZ的!
jnwsh 2010-11-23
  • 打赏
  • 举报
回复
一口吃不成胖子,慢慢一个功能一个功能的调试。
iknowjeanzxf 2010-11-23
  • 打赏
  • 举报
回复
另请将void init() //初始化函数中
ET1=1;
TL1=0XFD;
PCON=0X00;
这3句话注销掉
iknowjeanzxf 2010-11-23
  • 打赏
  • 举报
回复
请把晶振频率说下,以及你想使用的波特率。另,蜂鸣器是否可以单独响(不靠串口控制),就是你是否做过蜂鸣器的测试?
weidao1210 2010-11-23
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 iknowjeanzxf 的回复:]
你说的,程序刚烧进去蜂鸣器会响一下

这个不太理解。

是烧写完以后,上电,然后蜂鸣器会响一下。

还是烧写完以后,上电,你通过计算机发一个数据,然后蜂鸣器会响一下。

就是说,蜂鸣器响这一声,是由上电引起的,还是由数据引起的??
[/Quote]
刚烧进去的时候响了一下,复位后再也没响了。是由上电引起的!之后发数据就不响了,复位后仍然一声不响。
好消息 ,那问题我解决了,在死循环里面 赋给bb的值有问题,我选择发送字符然后在if(bb==1) 中的1两端加上‘’就ok了! 这位大侠 太感谢你啦!
iknowjeanzxf 2010-11-23
  • 打赏
  • 举报
回复

uchar recieve() //接收函数
{
uchar dat;
while(RI==0);
RI=0;
flag=1;
dat=SBUF;
return dat;
}


这个函数中应该先接收数据,再清0,如下
uchar recieve() //接收函数
{
uchar dat;
while(RI==0);
dat=SBUF;//先读数据
flag=1;
RI=0;//再清标志位
return dat;
}



iknowjeanzxf 2010-11-23
  • 打赏
  • 举报
回复
你说的,程序刚烧进去蜂鸣器会响一下

这个不太理解。

是烧写完以后,上电,然后蜂鸣器会响一下。

还是烧写完以后,上电,你通过计算机发一个数据,然后蜂鸣器会响一下。

就是说,蜂鸣器响这一声,是由上电引起的,还是由数据引起的??
weidao1210 2010-11-23
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 iknowjeanzxf 的回复:]
请在你的函数中

uchar recieve() //接收函数
{
uchar dat;
while(RI==0);
RI=0;
flag=1;
dat=SBUF;


//增加如下代码
bee=~bee;
delay(50);
bee=~bee;
delay(50);
//增加代码完毕

return dat;
}

测试你的recieve函数是否能够接……
[/Quote]
增加以后 我又把接收函数移到了上面,这样子 程序刚烧进去蜂鸣器会响一下,以后又是怎么发数据也不鸣叫了!

27,375

社区成员

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

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