找回密码
 立即注册

QQ登录

只需一步,快速开始

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

求改进一下单片机程序,使我可以只通过一个按键达到开关蜂鸣器的效果

[复制链接]
跳转到指定楼层
楼主
ID:474631 发表于 2019-2-5 22:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面的单片机代码只能按住k1时开松开就关 不能达到按一次改变一次状态的效果 求大神解释一下为什么 多谢了


#include "reg51.h"
typedef unsigned char u8;
typedef unsigned int u16;
sbit k1=P2^1;
sbit beep=P1^5;
void delay(u16 i)
{
        while(i--);
}
void jiao()
{
        beep=~beep;
        delay(2000);
}
u8 key()
{
        if(k1==0)
        {
                delay(1000);
                if(k1==0)
                {
                        delay(1000);
        return 1;
                }
                while(k1==0);
        }
        else
                return 0;
}
void main()
{
        while(1)
        {
                if(key()==1)
                jiao();
                else
                beep=1;
                        
        }

}


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

使用道具 举报

沙发
ID:94031 发表于 2019-2-6 08:51 | 只看该作者
应该设一个标志,记录按下并弹上的次数,蜂鸣器根据按下并弹上的次数执行响与不响。你现在是按下响,放开不响。
回复

使用道具 举报

板凳
ID:164602 发表于 2019-2-6 09:18 | 只看该作者
你的程序就是这样的功能——按着响,松手停。而且不一直按着,只快速地按一下都是不会响的——全靠while(1)才响的。
你的思路,使得程序不好改了,换个新的吧
#include<reg51.h>
sbit k3=P3^2;
sbit Beep =  P1^5 ;
void Delay(unsigned int i);
void Delay10ms(unsigned int c);
void main(void)
{
        unsigned int i,n,f;
        while(1)
        {       
                if(k3==0)
                {
                        Delay10ms(1);
                        if(k3==0)
                        {
                            if(f==0)
                            {n=0;
                        while(n<1000)
                        {
                        Beep= 1;
                        Delay(100);
                        Beep= 0;
                        Delay(100);
                    n++;
                        }
                                    f=1;
                             }
                                 else
                 {n=0;
                         while(n<750)
                         {
                         Beep= 1;
                         Delay(150);
                         Beep= 0;
                         Delay(150);
                         n++;
                         }
                                     f=0;
                             }
                            while((i<50)&&(k3==0))
                            {
                                    Delay10ms(1);
                                    i++;
                            }
                            i=0;
                        }
                }
        }               
}
void Delay10ms(unsigned int c)
{
    unsigned char a,b;
    for(c;c>0;c--)
        for(b=38;b>0;b--)
            for(a=130;a>0;a--);
}
void Delay(unsigned int i)
{
    for(i; i > 0; i--);
}
程序功能:按奇数次按键一个音,按偶数次响另一个音。
回复

使用道具 举报

地板
ID:474631 发表于 2019-2-6 12:50 来自手机 | 只看该作者
HC6800-ES-V2.0 发表于 2019-2-6 09:18
你的程序就是这样的功能——按着响,松手停。而且不一直按着,只快速地按一下都是不会响的——全靠while(1) ...

感谢 不过那个f的作用是啥...看不懂诶
回复

使用道具 举报

5#
ID:7485 发表于 2019-2-6 18:43 | 只看该作者
设置一个标志位,按键每按一次,标志位取反一次。然后根据标志位来判断是否驱动蜂鸣器。

按键的检测和普通的按键检测相同。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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