历史上的今天
返回首页

历史上的今天

今天是:2025年08月20日(星期三)

正在发生

2021年08月20日 | 51单片机-代码对比

2021-08-20 来源:eefocus

1.延时函数退出舞台

有了上一讲的理论讲解,代码的实现就比较简单了,实验现象就是高6位的6盏灯不停流水,我们用K4按键控制LED2的亮灭,并且途中并没有影响到6盏流水灯的运行。


我们知道以前流水灯是需要延时才能看得到流水现象的,那么现在再用延时函数的话,按键就没有意义了。比如流水灯的跳变需要间隔50ms才看得出是一个灯一个灯的亮,如果在死循环里使用“delay_ms(50);”,那么不支持连按代码里的times要加1都需要过了50ms才行,这样显然行不通,我们只能从流水灯的代码去思考了。


其实一次死循环里不一定就要求灯实现跳变,可以等到过了很多次死循环再去执行灯的跳变的,所以我们在死循环里让变量x每次加1,死循环了3000次之后再执行灯的跳变,这样不就能实现间隔50ms左右灯才跳变了吗,同时又不影响按键代码的times,也就是一次死循环所花费的时间被大大缩短了,扫描按键IO端口的机会更多了。那么延时函数在我们写一些高效率的代码的时候就很少去使用了,毕竟这样不仅影响执行效率,还会使某些功能模块失去作用。

 

2.流水灯代码新书写模式

#include  

sbit ADDR2 = P1^2;

sbit ADDR1 = P1^1;

sbit ADDR0 = P1^0;

sbit ENLED = P1^4;

sbit ADDR3 = P1^3;

  

sbit LED2  = P0^0;

sbit KEY4  = P2^7;

 

void main()

{  

    unsigned char key_up=1;//定义记录按键状态值的变量,初始值为1避免程序一开始就进入了“if(key_up==0)”

    unsigned char i=0; 

    unsigned int times=0;  //用来记录进入过按键判断语句的次数 

    unsigned int x;        //作为记录死循环的次数以达到间隔切换灯的跳变

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

    ENLED = 0;// 

   

    ADDR2 = 1;//**************************

    ADDR1 = 1;//让三八译码器的IO6输出低电平

    ADDR0 = 0;//**************************

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

   

    while(1)

    {     

        if(key_up==0)

        {      

            times++;  

            if(times>=1000&&KEY4==1)

            {

                times=0;

                LED2=!LED2;                   

            }                       

        }

        key_up=KEY4;

     

        //以下是流水灯任务部分

        x++;

        if(x>=3000)//程序的运行已经过去50ms左右了

        {

            x=0;

            P0=~(0x04<            i++;

            if(i>=6)i=0; 

        } 

    }

}


还是不明白“P0=~(0x04<

然后当i等于1时“~(0x04<

我们这个例程代码是对比了用“while(KEY4==0);”的时候是多么的不足,这样吧,我们把上面例程的这部分代码

if(key_up==0)

{      

    times++;  

    if(times>=1000&&KEY4==1)

    {

        times=0;

        LED2=!LED2;                   

    }                       

}

key_up=KEY4;


改为以前初步学习的代码如下

if(KEY4==0)

{

    delay_ms(10);//等待抖动过去

    if(KEY4==0) //二次判断

    {

        LED2=!LED2;

        while(KEY4==0);

    }

}


延时函数大家再自己找以前的代码去添加,实验现象就是按键动作影响了流水灯的流速,如果按着不放直接导致停止流水。

推荐阅读

史海拾趣

BVLED公司的发展小趣事

随着市场的不断变化和竞争的加剧,BVLED公司意识到只有不断创新才能在行业中立足。于是,公司加大了对研发的投入,引进了一批高素质的研发人才,并与多家高校和研究机构建立了合作关系。通过不断的实验和改进,公司成功推出了一系列具有创新性的LED产品,如智能调光LED灯、高显色指数LED灯等,这些产品在市场上获得了广泛的认可。

CTS [CTS Corporation]公司的发展小趣事

为了满足全球市场的需求,CTS开始实施全球化扩张战略。公司在北美、亚洲和欧洲等地设立了生产设施,以便更好地服务全球客户。同时,CTS还积极与各地的合作伙伴建立紧密的合作关系,共同推动电子元器件和传感器市场的发展。

Digital Equipment Corp公司的发展小趣事

2001年,惠普公司与康柏公司宣布合并,DEC作为康柏的一部分也随之并入惠普。这次合并进一步扩大了DEC的业务范围和市场影响力。在合并后,DEC的计算机产品和技术被整合到惠普的产品线中,同时DEC的品牌也逐渐淡出市场。然而,DEC在计算机行业中的贡献和影响力仍然被广泛认可,其技术遗产和创新精神在惠普及其他科技公司中得到了传承和发展。

Global Power Technology Co., Ltd公司的发展小趣事
检查温控器设置是否合理,必要时更换温控器;检查电源电压是否稳定,如不稳定需联系电力公司解决;减少冰箱内物品的摆放量,确保风道畅通。
BLT Circuit Services公司的发展小趣事

品质一直是BLT Circuit Services公司的核心竞争力。公司注重品质管理,建立了严格的质量控制体系,从原材料采购到生产过程中的每一个环节都进行严格把关。正是这种对品质的执着追求,使得BLT Circuit Services的产品在行业内赢得了良好的口碑,为公司赢得了大量的忠实客户。

DCCOM [ DC COMPONENTS ]公司的发展小趣事

DCCOM公司自创立之初,就注重技术创新和研发投入。在成立初期,公司研发团队成功开发出一种具有高性能和低功耗特点的电子元件,这一创新技术迅速赢得了市场的认可。随着技术的不断迭代和升级,DCCOM逐渐在电子元件市场上占据了一席之地。

问答坊 | AI 解惑

调节阀

在化工生产中,调节阀是直接接触工艺介质的控制机构,本文以工程实际为背景,讨论了调节阀选型的原则,并介绍了在聚甲醛装置中应用调节阀的情况。 工艺简介 云南云天化股份有限公司的聚甲醛装置系国内第一套同类型装置,工艺包从波兰ZAT引进, ...…

查看全部问答>

模拟/混合器件新貌

模拟/混合器件在数字技术大行其道的今天,不但没有褪色,反而是焕发了更大的活力。现在,就让我们看看它们在几个热点领域的表现吧。  液晶显示背光驱动   LCD显示器以其零辐射、对图像的精确还原和显示的稳定性等特点,已成为显示器的主流。不 ...…

查看全部问答>

RockBox on mini2440

My Mini2440 board just arrived. I did copy the file rockbox.mini2440 (the Rockbox firmware which I did build before) to .rockbox folder on SD Card. After inserted the SD Card and turned power on, and waited a few seconds, I had ...…

查看全部问答>

红外线遥控如何该无线遥控

请教大家一个小问题,我有一个红外线遥控MP3 音箱,红外线遥控遇到什么障碍就不听使唤、遥控距离有限,就想把遥控改成无线的,可对无线不怎么董,想请大家帮帮忙。 我在网上找到带PT2272-M4编码器的遥控收发套件,这个能改吗? …

查看全部问答>

FPGA应该从哪起步?希望各位大侠不吝赐教,谢谢

                刚刚开始学习电子设计,明年将参加电子设计大赛,想学一下FPGA,不知从何起步,希望能得到各位大侠的指教,不胜感激!…

查看全部问答>

wince 下用evc来写串口通信。

哪位大虾能发给我个串口通信的实例呀??最好用EVC写的。。感激涕零。\\ 我的邮箱6094189ye@163.com 我看到书上有CSerial 这个类,但STANDARDSDK下面没有这个类呀。。。???…

查看全部问答>

关于楚狂人的驱动开发教程问题,请高手指教

小弟正在学习楚狂人写的window文件系统过滤开发教程,在学习第三章分发例程,fast io 时碰到以下问题: _inline wd_void wd_fio_disp_set_query_standard( wd_drv *driver, wd_fio_query_standard_func func) {     driver->Fa ...…

查看全部问答>

LED实现白光的方法

目前,LED实现白光的方法主要有三种: 1、通过LED红绿蓝的三基色多芯片组和发光合成白光。   优点:效率高、色温可控、显色性较好。   缺点:三基色光衰不同导致色温不稳定、控制电路较复杂、成本较高。 2、蓝光LED芯片激发**荧光粉,由LED ...…

查看全部问答>

hshg,在》

用MSP430F1121东西呢,有些JATG口和端口复用怎么解决的啊 可以随便用吗,讲讲这方面的经验啊,谢谢 其实MSP430F13X和MSP430F14X也不贵也,有没用这写系列的 我现在正为选哪一款郁闷呢,用MSP430F1232画了原理图,用以前的WORKBENCH,发觉没有此系 ...…

查看全部问答>

51单片机两个定时器同时使用 问题

本帖最后由 paulhyde 于 2014-9-15 09:15 编辑 void T0_time()interrupt 1        //返回值 {   TH0=(65536-10000)/256; TL0=(65536-10000)%256; shuchu574(); write_com(0x0c) ...…

查看全部问答>