5006|6

8

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

调试了几个小时,还是找不出哪里错了。大家帮忙看一下 [复制链接]

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

 

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar temp=0;
sbit beep=P3^6;//蜂鸣器引脚,低电平有效
//初始化
void init()
{
TMOD=0X20;
SCON=0X50;
TR1=1;
TH1=TL1=0XFD;
ES=1;
EA=1;
}
 //一毫秒延时
void delay(uint i)
{
 uchar j;
   while(i--)
  {
   for(j=0;j<115;j++);
  }
}
//发送回PC
void send(uchar dat)
{
 SBUF=dat;
 while(!TI);   //等待发送完成
 TI=0;    //把发送标志位置零
}
//蜂鸣器
void beep0(uchar z)
 {
   while(1)
   {
   beep=0;
   delay(z);
   beep=1;
   delay(z);
   }
 }
 //判断从PC向单片机发送的数值
 void p()
 {
 if(temp==1)
   beep0(200);
 else if(temp==2)
   beep0(100);
 else if(temp==3)
   beep0(50);
 else if(temp==4)
   beep=1;
 }

 //主函数
void main()
{
  init(); //初始化
  while(1)
  {
  p();
  }
 }

 //串口接收中断函数
void ser() interrupt 4
{
 if(RI==1)
 {
 RI=0;
 temp=SBUF;
 send (temp);
   }
}

 

 

出现的情况是:只能发送一次,而第二次、第三次、第四次无效。

例如发送数字1,后发送四蜂鸣器还在响,关不掉。

此帖出自51单片机论坛

最新回复

恩,判断z的时候z应该是全局变量才行,或者就像楼上的,直接用单片机串行口收到的。赞一个楼主....  详情 回复 发表于 2011-7-21 11:02
点赞 关注
 

回复
举报

79

帖子

0

TA的资源

一粒金砂(高级)

沙发
 

else if(temp==4)
   beep=1;

设成beep=0

[ 本帖最后由 lalahu 于 2011-6-20 12:15 编辑 ]
此帖出自51单片机论坛
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(高级)

板凳
 

不对, void beep0(uchar z)

{

 while(1) { beep=0;

delay(z);

 beep=1; delay(z);

}

 }

应该是在这个死循环中跳不出来了。

回不到上一个循环中了。

这是主要的错误吧。

 

 

delay(z);把z设成全局变量,在中断里修改它。

 

[ 本帖最后由 lalahu 于 2011-6-20 12:16 编辑 ]
此帖出自51单片机论坛
 
 
 

回复

17

帖子

0

TA的资源

一粒金砂(中级)

4
 
同意楼上说的
此帖出自51单片机论坛
 
 
 

回复

1万

帖子

16

TA的资源

版主

5
 

呵呵,道理很简单

你第一次发1时,进了了

//蜂鸣器
void beep0(uchar z)
{
   while(1)
   {
   beep=0;
   delay(z);
   beep=1;
   delay(z);
   }
}
它是个死循环,就是说你的串口虽然好用是因为中断没受影响

应这样改

//蜂鸣器
void beep0(uchar z)
{
    while(1)
   {
   if(temp==0x01)
   z=200;
else if(temp==0x02)
   z=100;
else if(temp==0x03)
   z=50;
else if(temp==0x04)
z=0;  
beep=1;
   
   
   beep=0;
   delay(z);
   beep=1;
   delay(z);
   }
}


呵呵,实验我都做了,楼主只管考过用就行
此帖出自51单片机论坛
 
个人签名http://shop34182318.taobao.com/
https://shop436095304.taobao.com/?spm=a230r.7195193.1997079397.37.69fe60dfT705yr
 
 

回复

1万

帖子

16

TA的资源

版主

6
 

总体说这程序,短小精悍

楼主还是比较有才,赞一个哈
此帖出自51单片机论坛
 
个人签名http://shop34182318.taobao.com/
https://shop436095304.taobao.com/?spm=a230r.7195193.1997079397.37.69fe60dfT705yr
 
 

回复

37

帖子

0

TA的资源

一粒金砂(中级)

7
 
恩,判断z的时候z应该是全局变量才行,或者就像楼上的,直接用单片机串行口收到的。赞一个楼主....
此帖出自51单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表