找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4783|回复: 31
打印 上一主题 下一主题
收起左侧

求解答 我写的这个流水灯+蜂鸣器的程序 为什么植入单片机后蜂鸣器不响

  [复制链接]
跳转到指定楼层
楼主
ID:371529 发表于 2018-7-16 11:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面是我写的程序:
  #include"reg52.h"
#include"intrins.h"
typedef unsigned char u8;
typedef unsigned int u16;
      sbit beep=P1^5;
  #define led P2  
  void delay(u16 i)
  {
  while(i--);
  }
void main()
{
   u8 i=0;
   led=0xfe;
   delay(50000);
   while(1)
   {
   for(i=0;i<7;i++)
   {
   led=_crol_(led,1);
   delay(50000);
   }
    for(i=0;i<7;i++)
   {
   led=_cror_(led,1);
   delay(50000);
   }
   }  
  
   while(1)
   {
   beep=~beep;
   delay(1000);
   }
}
为什么51单片机中蜂鸣器没有反应,偶尔会有很小的声音,很微弱。

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:142320 发表于 2018-7-16 12:02 | 只看该作者
因为WHILE是个死循环,你不可能执行到第二个WHILE(1)了,你好好理解WHILE(1)的执行,再来问

评分

参与人数 1黑币 +5 收起 理由
NPC-1024 + 5 赞一个!

查看全部评分

回复

使用道具 举报

板凳
ID:142320 发表于 2018-7-16 12:03 | 只看该作者
你的程序WHILE(1)理解了再来问,你目前的程序第二个WHILE(1)到死执行不到,所以你单步执行就知道,或者说设置断看到能不能到BEEF
回复

使用道具 举报

地板
ID:371425 发表于 2018-7-16 12:34 | 只看该作者
你的第一个while看到了吗,程序一直在这个while里出不来,所以无法实现蜂鸣器响,试试把蜂鸣器那段代码放到第一个while里
回复

使用道具 举报

5#
ID:371529 发表于 2018-7-16 13:17 | 只看该作者
stephen_pro 发表于 2018-7-16 12:34
你的第一个while看到了吗,程序一直在这个while里出不来,所以无法实现蜂鸣器响,试试把蜂鸣器那段代码放到 ...

好的,万分感谢!
回复

使用道具 举报

6#
ID:371529 发表于 2018-7-16 13:18 | 只看该作者
gujp312365 发表于 2018-7-16 12:02
因为WHILE是个死循环,你不可能执行到第二个WHILE(1)了,你好好理解WHILE(1)的执行,再来问

是的,我对C语言掌握还不够,谢谢啦!
回复

使用道具 举报

7#
ID:371529 发表于 2018-7-16 13:30 | 只看该作者
还是不行,我把第二个while(1)放到第一个里面了,流水灯都无法呈现了。求问各位改怎样修改?
回复

使用道具 举报

8#
ID:372402 发表于 2018-7-16 14:05 | 只看该作者
学习了,楼上说得对,while这个语句好像有点问题,我也试试。
回复

使用道具 举报

9#
ID:372615 发表于 2018-7-16 15:45 | 只看该作者
只能用一个while循环,除非你有办法跳出来
回复

使用道具 举报

10#
ID:313760 发表于 2018-7-16 16:16 | 只看该作者
因为while是个死循环,不能有两个while
回复

使用道具 举报

11#
ID:371425 发表于 2018-7-16 16:59 | 只看该作者
#include<reg52.h>  
这是一个类似的程序,不过和你的接口不一样,你对照着看看吧
#include <intrins.h>
#define uint unsigned int   
#define uchar unsigned char  
sbit beep=P2^3;
void delay(uint z)  


{                                                uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);       
}
void main()                  {
        uchar a,i;
        while(1)               {
                a=0xfe;                     for(i=0;i<8;i++)                  {
                        P1=a;                              beep=0;                            delay(50);                         beep=1;                             delay(50);                          a=_crol_(a,1);                 }
                a=0x7f;
                for(i=0;i<8;i++)                 {
                        P1=a;                               beep=0;                             delay(50);                         beep=1;                             delay(50);                           a=_cror_(a,1);                 }               
        }
}

评分

参与人数 2黑币 +64 收起 理由
哈哈我哈哈 + 4 很给力!
admin + 60 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

12#
ID:323350 发表于 2018-7-16 17:29 | 只看该作者
哈哈我哈哈 发表于 2018-7-16 13:30
还是不行,我把第二个while(1)放到第一个里面了,流水灯都无法呈现了。求问各位改怎样修改?

你把你改完的发上来看一下,不然不知道你是怎么改的
回复

使用道具 举报

13#
ID:371529 发表于 2018-7-16 18:50 | 只看该作者
15797939041 发表于 2018-7-16 16:16
因为while是个死循环,不能有两个while

跳不出来啊现在
回复

使用道具 举报

14#
ID:372748 发表于 2018-7-16 19:01 | 只看该作者
第一个循环 跳不出来
回复

使用道具 举报

15#
ID:372748 发表于 2018-7-16 19:02 | 只看该作者
第一个循环跳不出来
回复

使用道具 举报

16#
ID:359577 发表于 2018-7-16 19:15 | 只看该作者
参考楼上建议,,
回复

使用道具 举报

17#
ID:366562 发表于 2018-7-16 22:06 | 只看该作者
你的第一个while把程序包含完了
也就是程序一直在你的第一个while中
蜂鸣器不叫的原因是程序根本没执行到蜂鸣器的步骤

评分

参与人数 1黑币 +60 收起 理由
admin + 60 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

18#
ID:372896 发表于 2018-7-16 22:18 | 只看该作者
这里不需要while(1)
while(1)
   {
   for(i=0;i<7;i++)
   {
   led=_crol_(led,1);
   delay(50000);
   }

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

19#
ID:372904 发表于 2018-7-16 22:29 | 只看该作者
程序不能退出第一个 while(1)。
回复

使用道具 举报

20#
ID:372905 发表于 2018-7-16 22:29 | 只看该作者
看看板子有没有虚焊
回复

使用道具 举报

21#
ID:366532 发表于 2018-7-18 17:46 | 只看该作者
楼主的第一个while(1)是一个死循环,程序跑不到蜂鸣器那里,一般的51程序只有一个while(1)保证程序在一直执行,如果有其他的循环一定要加上退出条件
回复

使用道具 举报

22#
ID:371529 发表于 2018-7-18 18:18 | 只看该作者
51515151黑 发表于 2018-7-18 17:46
楼主的第一个while(1)是一个死循环,程序跑不到蜂鸣器那里,一般的51程序只有一个while(1)保证程序在一 ...

那退出条件怎么弄啊
回复

使用道具 举报

23#
ID:374321 发表于 2018-7-18 18:53 | 只看该作者
死在第一个while循环里了
回复

使用道具 举报

24#
ID:374341 发表于 2018-7-18 19:35 | 只看该作者
WHILE死循环用的不对,还有LED的亮灭控制没有必要两个for语句
回复

使用道具 举报

25#
ID:374367 发表于 2018-7-18 20:11 | 只看该作者
把while换if试试
回复

使用道具 举报

26#
ID:374365 发表于 2018-7-18 20:12 | 只看该作者
你把你改完的发上来看一下,不然不知道你是怎么改的
回复

使用道具 举报

27#
ID:374387 发表于 2018-7-18 20:50 | 只看该作者
while死循环了。跳不出来。
回复

使用道具 举报

28#
ID:374396 发表于 2018-7-18 21:06 | 只看该作者
while嵌套结构容易出错,程序运行不了
回复

使用道具 举报

29#
ID:370779 发表于 2018-7-18 21:54 | 只看该作者
只执行第一个while(1)如要蜂鸣器响可把蜂鸣器那句话加到第一个while 把第二个while去掉
回复

使用道具 举报

30#
ID:304658 发表于 2018-7-18 22:10 | 只看该作者
第一个while(1)死循环了
回复

使用道具 举报

31#
ID:374451 发表于 2018-7-18 22:46 | 只看该作者
while(1)是死循环,进一个就不会进另一个,没这么用的
回复

使用道具 举报

32#
ID:374464 发表于 2018-7-18 23:32 | 只看该作者
#include"reg52.h" #include"intrins.h" typedef unsigned char u8; typedef unsigned int u16;       sbit beep=P1^5;   #define led P2     void delay(u16 i)   {   while(i--);   } void main() {    u8 i=0;    led=0xfe;    delay(50000);    while(1)    {    for(i=0;i<7;i++)    {    led=_crol_(led,1);    delay(50000);    }  beep=~beep;    delay(1000);     for(i=0;i<7;i++)    {    led=_cror_(led,1);    delay(50000);    }     }         }

评分

参与人数 1黑币 +5 收起 理由
哈哈我哈哈 + 5 赞一个!

查看全部评分

回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表