历史上的今天
返回首页

历史上的今天

今天是:2025年08月19日(星期二)

正在发生

2021年08月19日 | 51单片机-按键&蜂鸣器&数码管

2021-08-19 来源:eefocus

在上一讲的代码中我们可以不用写“sbit GND = P2^3;”,像宋老师那样直接在开头“P2 = 0xF7;”仅让P2.3输出0其他输出1即可,这样P2.7就有被拉低的条件了。


1.趁热打铁

沿袭上一讲的功能,我们新学的按键知识需要结合所学过的无源蜂鸣器硬件一起捣鼓玩玩。同上一讲的代码功能一样,这次用的是无源蜂鸣器,按键按下时,蜂鸣器就响,松开不按时就不响。

 

2.分析

我们先缕缕思路,显然无源蜂鸣器要想鸣叫,就不能像“LED2=KEY4;”这样赋值的方式。我们已经知道,在P2.3输出低电平的情况下,K4按下的时候程序中KEY4就等于0,松开不按时KEY4等于1。


这里可以在主函数中的死循环里用“if(KEY4==0)”来一直等待K4被按下,于是KEY4的值等于0才能进入if语句的大括号里去执行程序。不按下时“KEY4等于1”也就进入不了里面去执行程序了,CPU只能空循环不做任何事。

那这个if 语句的大括号里的内容大家也就明白需要做什么事了


#include  

sbit BEEP  = P1^6;

sbit KEY4  = P2^7;

 

void main()

{  

    unsigned int i;

    P2 = 0xF7;//让K4能具备有被拉低的条件先

     

    while(1)

    {

        if(KEY4==0)

        {

            BEEP=!BEEP;

            for(i=0;i<25;i++);//不同时间的延时鸣叫的音调不同

        }

    }   

}


如果按键一直按着不放,那这个代码跟第二章第二讲里的例程可以说是一模一样了。

 

3.巩固

小灯和无源蜂鸣器都上场了,数码管也不能一边愣着吧,这里笔者给大家提供一段代码,自行下载进去后按着K4不放,观察现象然后尝试解析代码的原理,能力有限分析不出来也不必担心,继续往下学先。


#include  

sbit ADDR2 = P1^2;

sbit ADDR1 = P1^1;

sbit ADDR0 = P1^0;

sbit ENLED = P1^4;

sbit ADDR3 = P1^3;

  

sbit KEY4  = P2^7;

unsigned char code LedChar[6]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF};//a,b,c,d,e,f段单独亮的真值表

 

void delay_ms(unsigned int x)

{

    unsigned int i,j;

    if(x==1000)

    {

        for(i=0;i<19601;i++)//延时1s

        {

            for(j=5;j>0;j--);

        }

    }

    else while(x--)for(j=115;j>0;j--);

}

  

void IO0_OUT()

{ADDR2 = 0;ADDR1 = 0;ADDR0 = 0;}

void IO1_OUT()

{ADDR2 = 0;ADDR1 = 0;ADDR0 = 1;}

void IO2_OUT()

{ADDR2 = 0;ADDR1 = 1;ADDR0 = 0;}

void IO3_OUT()

{ADDR2 = 0;ADDR1 = 1;ADDR0 = 1;}

void IO4_OUT()

{ADDR2 = 1;ADDR1 = 0;ADDR0 = 0;}

void IO5_OUT()

{ADDR2 = 1;ADDR1 = 0;ADDR0 = 1;}

 

void main()

{  

    unsigned char i=0;

    ADDR3 = 1;//使能三八译码器

    ENLED = 0;// 

    P2 = 0xF7;//让K4能具备有被拉低的条件先

 

    while(1)

    {    

        P0=0xFF;

        switch(i)

        {

            case 0: IO0_OUT();P0=LedChar[0];break;    

            case 1: IO0_OUT();P0=LedChar[1];break;    

            case 2: IO0_OUT();P0=LedChar[2];break;    

            case 3: IO0_OUT();P0=LedChar[3];break;    

            case 4: IO1_OUT();P0=LedChar[3];break;   

            case 5: IO2_OUT();P0=LedChar[3];break;      

            case 6: IO3_OUT();P0=LedChar[3];break;    

            case 7: IO4_OUT();P0=LedChar[3];break;    

            case 8: IO5_OUT();P0=LedChar[3];break;    

            case 9: IO5_OUT();P0=LedChar[4];break;    

            case 10:IO5_OUT();P0=LedChar[5];break;   

            case 11:IO5_OUT();P0=LedChar[0];break;   

            case 12:IO4_OUT();P0=LedChar[0];break;    

            case 13:IO3_OUT();P0=LedChar[0];break;   

            case 14:IO2_OUT();P0=LedChar[0];break;  

            case 15:IO1_OUT();P0=LedChar[0];break;

        }

        if(KEY4==0)i++;

        if(i>=16)i=0;

        delay_ms(30);

    }

}

推荐阅读

史海拾趣

CT [ Central Technologies ]公司的发展小趣事

CT公司成立于电子行业的黄金时期,起初只是一个小型研发团队,专注于研发新型半导体技术。创始人凭借对技术的敏锐洞察和不懈追求,带领团队攻克了一个又一个技术难题。然而,资金短缺、市场竞争激烈以及技术迭代的快速性给初创期的CT公司带来了巨大的挑战。公司多次面临生死存亡的边缘,但创始人始终坚持技术创新的初心,不断寻求合作伙伴和投资,逐渐在市场中站稳了脚跟。

HSMC公司的发展小趣事

HSMC深知技术创新是企业发展的核心驱动力。公司不仅拥有丰富的14纳米及7纳米以下节点FinFET先进逻辑工艺与晶圆级先进封装技术经验,还持续投入研发,瞄准世界先进的制程工艺。通过与全球各大科研院所的合作,HSMC不断储备行业专利,增强自身的技术壁垒。这种对技术创新的执着追求,为公司的长远发展奠定了坚实基础。

Diotec Electronics Corp公司的发展小趣事

随着环保意识的提高,Diotec开始关注绿色发展和社会责任。公司积极采用环保材料和生产工艺,减少生产过程中的环境污染。同时,Diotec还参与了一系列公益活动,为当地社区和环境保护事业做出了贡献。这些举措不仅提升了公司的社会形象,也为公司的长期发展奠定了基础。

GE Sensing ( Amphenol Advanced Sensors )公司的发展小趣事

面对全球化的市场趋势,Diotec开始实施全球化战略。公司加强与国际市场的联系,积极开拓海外市场。同时,Diotec还加强与全球合作伙伴的合作,共同推动电子行业的发展。展望未来,Diotec将继续坚持技术创新和品质至上的理念,致力于成为全球领先的电子元器件供应商。同时,公司还将关注新兴市场和技术趋势,为未来的发展做好充分准备。

Fractus公司的发展小趣事

为了加速技术的商业化进程,Fractus积极寻求与全球领先企业的合作。自2000年以来,公司陆续与多家知名手机厂商、电信运营商以及设备制造商建立了战略合作关系。这些合作不仅为Fractus带来了稳定的收入来源,也促进了其技术的广泛应用和持续改进。同时,Fractus还通过签订全球许可协议和建立战略伙伴关系,进一步拓展了其业务范围和市场影响力。

DeLorme公司的发展小趣事

作为一家有着高度社会责任感的企业,DeLorme公司始终关注环境保护和社会公益事业。他们积极参与各种环保活动和社会公益活动,通过捐赠物资、提供技术支持等方式为社会做出贡献。此外,他们还致力于推动公司的可持续发展战略,通过优化生产工艺、降低能耗和减少废弃物排放等措施降低对环境的影响。这些举措不仅体现了公司的社会责任感也提高了公司的品牌形象和市场竞争力。

请注意,以上故事均为虚构内容,旨在为你提供一个关于DeLorme公司发展起来的可能故事框架。在实际情况中,DeLorme公司的发展历程和具体故事可能会有所不同。

问答坊 | AI 解惑

数控电源资料

数控电源精度在ad/da的选择上占很大因素欢迎回帖咨询…

查看全部问答>

FPGA/CPLD初学者应该如何入手?

作为一个有电子基本理论基础的新手,应该如何入手? 是应该先学习verilog&vhdl语言,还是其他什么? 我有听说过ilinx,altera和quartus,modelsim谁能帮忙具体解释下是什么?…

查看全部问答>

关于F28027功耗问题

刚用F28027,PCB做好以后,通上电发现电流就有60MA,很奇怪,烧入程序后发现电流有90MA,不知道为什么耗那么多电流,这个正常吗,根据芯片资料,我只给3.3V供电,那个VREGENZ我用电阻下拉到地了,在没烧程序前拿掉电阻,电流就没了,但是烧好程序后那个电阻有无 ...…

查看全部问答>

电子大赛试练 宽带放大器设计求助

最近在做一个宽带放大器 0-8M输入 要求放大1万倍 考虑三运放的仪表放大电路 找不到合适的放大器 买了ad846放大倍数不行啊 哪位高人能给推荐个合适的啊 或者换个电路用三极管场效应管也行  实在是在这方便没什么思路啊  给点指 ...…

查看全部问答>

华为硬件工程师手册..pdf免费!!!

.华为硬件工程师手册..pdf免费!!!…

查看全部问答>

【xilinx技术问答】FPGA能够实际工作的频率?

ISE软件中给出的综合报告和静态时序分析报告都有工作频率,请问哪一个是FPGA能够实际工作的频率? 答:经过映射和布线的频率值才是FPGA可以真正跑到的频率值看静态时序分析报告,基本上是这个数值。通过查看ISE9.103的 implement Design>Place ...…

查看全部问答>

SQLCE3.0问题

1、智能设备平台WINCE5.0、PC编程VS2005 C# 2、我想在WINCE5.0上操作数据库。运行我我自己的应用软件时提示:报错:无法加载 DLL“SQLCEME30.DLL”: 3、我重新编译内核,现在运行wince5.0时,WINGDOWS目录下已经有了所需的7个*。DLL文件,注册表 ...…

查看全部问答>

音频驱动某函数代码看不太懂,救助。

PBYTE OutputStreamContextM16::Render2(PBYTE pBuffer, PBYTE pBufferEnd, PBYTE pBufferLast) {     LONG CurrT = m_CurrT;     LONG DeltaT = m_DeltaT;     LONG CurrSamp0 = m_CurrSamp[0];     ...…

查看全部问答>

SQLServer CE 3.1

哪位大哥有SQLServer CE 3.1在WinCE6.0下应用的例子啊,以及如何详细部署的 资料,有的请指教,问题解决在送分.谢谢~…

查看全部问答>

CortexM0_IAP示例代码程序下载

CortexM0_IAP示例代码程序下载…

查看全部问答>