有关单片机串口通信的问题~还请大侠们~帮忙啊~!

题目:
1.由上位机发送1给单片机时,蜂鸣器以400ms频率发声,发2时以200ms频率发声,发3时以100ms频率发声,发4时关闲蜂鸣器。

我的程序如下:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar flag,a;
sbit d=P0^0;
void init()
{

TMOD=0x20;//设置定时器1为工作方式2
TH1=0xfd;
TL1=0xfd;
TR1=1;//开定时器1
REN=1;//开串口通信
SM0=0;//设置串口通信方式1
SM1=1;
EA=1;//开总中断
ES=1;//开串口中断
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}

void main()
{
init();
while(1)
{

if(flag==1)
{
ES=0;
flag=0;
SBUF=a;//赋给发送缓冲器
while(!TI)
{
if(a=='1')
{
while(!ES)
{
d=0;
delay(400);
d=1;
delay(400);
if(TI==0)
{
TI=1;
ES=1;
}
}
}
else if(a=='2')
{
while(!ES)
{
d=0;
delay(200);
d=1;
delay(200);
if(TI==1)
{
TI=0;
ES=1;
}
}
}
else if(a=='3')
{
while(!ES)
{
d=0;
delay(100);
d=1;
delay(100);
if(TI==1)
{
TI=0;
ES=1;
}
}
}
else if(a=='4')
{
d=1;
if(TI==1)
{
TI=0;
ES=1;
}
}
TI=0;
ES=1;
}
}
}
/* {
if(RI==1)//RI=1表示收到数据
{
RI=0;
P1=SBUF;
}
}*/
}

void ser() interrupt 4
{
RI=0;
// P1=SBUF;
a=SBUF;//中间变量
flag=1;
}
我在做这个实验的时候~发现~只能一次控制蜂鸣器的响灭~~即必须复位之后才能再次发送~!不知是什么原因~
由于本人实在是没有财富值~还是请大侠们帮个忙啊~!
我学的是郭天祥的51单片机!

将你的改为如下程式:

#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar flag, a;
sbit d = P0^0;
void init()
{
TMOD = 0x20; //设置定时器1为工作方式2
TH1 = 0xfd;
TL1 = 0xfd;
TR1 = 1; //开定时器1
REN = 1; //开串口通信.
SM0 = 0; //设置串口通信方式1
SM1 = 1;
EA = 1; //开总中断.
ES = 1; //开串口中断.
}
void delay(uint z)
{
uint x, y;
for(x = z; x > 0; x--) for(y = 110; y > 0; y--);
}

void main()
{
init();
a = '4';
while(1) {
if(a == '1') {
d = 0; delay(400);
d = 1; delay(400);
}
else if(a == '2') {
d = 0; delay(200);
d = 1; delay(200);
}
else if(a == '3') {
d = 0; delay(100);
d = 1; delay(100);
}
else if(a == '4') {
d = 1;
}
}
}

void ser() interrupt 4
{
if (TI == 1) {
TI = 0;
}
else if (RI == 1) {
RI = 0;
P1 = SBUF;
a = SBUF; //中间变量.
flag = 1;
}
}

此程式记过测试OK,
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-01-28
试试下列程序。

#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar flag, a;
sbit d = P0^0;
void init()
{
TMOD = 0x20; //设置定时器1为工作方式2
TH1 = 0xfd;
TL1 = 0xfd;
TR1 = 1; //开定时器1
REN = 1; //开串口通信.
SM0 = 0; //设置串口通信方式1
SM1 = 1;
EA = 1; //开总中断.
ES = 1; //开串口中断.
}
void delay(uint z)
{
uint x, y;
for(x = z; x > 0; x--) for(y = 110; y > 0; y--);
}

void main()
{
init();
a = '4';
while(1) {
if(a == '1') {
d = 0; delay(400);
d = 1; delay(400);
}
else if(a == '2') {
d = 0; delay(200);
d = 1; delay(200);
}
else if(a == '3') {
d = 0; delay(100);
d = 1; delay(100);
}
else if(a == '4') {
d = 1;
}
}
}

void ser() interrupt 4
{
if (TI == 1) {
TI = 0;
}
else if (RI == 1) {
RI = 0;
P1 = SBUF;
a = SBUF; //中间变量.
flag = 1;
}
}
第2个回答  2019-12-07

学的是郭天祥的51单片机!

郭天祥,自己的基本概念不清,就来误导别人!!!

你要求‘‘蜂鸣器以400ms频率发声’’,这不是瞎扯吗?

大家都知道,频率的单位是 Hz,哪能是 ms ?

郭天祥,你来发一个400ms频率的声音,让大家听听!!!


第3个回答  2010-01-27
if(TI==0)
{
TI=1;
ES=1;
}
}
这个地方有问题,你前面的循环判断是 while(!TI)
你发送了1之后,TI被你置1,将不再进入循环了。后面根本不执行。改成
if(TI==1)
{
TI=0;
ES=1;
然后再看看呢?
第4个回答  2018-08-02
解决办法就是用中断方式接受,且开辟一个接收缓冲区来存储串口数据。本回答被网友采纳
相似回答