打印
[51单片机]

从业将近十年!手把手教你单片机程序框架(连载)

[复制链接]
楼主: jianhong_wu
手机看帖
扫描二维码
随时随地手机跟帖
861
cabot168| | 2019-9-5 23:12 | 只看该作者 回帖奖励 |倒序浏览
LZ,第六节我有不懂地方,请解释下,谢谢!
  if(key_sr1==1)//IO是高电平,说明按键没有被按下,这时要及时清零一些标志位
  {
     ucKeyLock1=0; //按键自锁标志清零
         uiKeyTimeCnt1=0;//按键去抖动延时计数器清零,此行非常巧妙,是我实战中摸索出来的。      
  }
  else if(ucKeyLock1==0)//有按键按下,且是第一次被按下   这里为什么不是(key_sr1==0)我试了改我这样也可以。这句看不明白
  {
     ++uiKeyTimeCnt1;  //延时计数器
     if(uiKeyTimeCnt1>const_key_time1)
     {
        uiKeyTimeCnt1=0;
        ucKeyLock1=1;  //自锁按键置位,避免一直触发
        ucKeySec=1;    //触发1号键
     }
  }

使用特权

评论回复
862
李不走寻常路| | 2019-9-6 08:22 | 只看该作者
cabot168 发表于 2019-9-5 23:12
LZ,第六节我有不懂地方,请解释下,谢谢!
  if(key_sr1==1)//IO是高电平,说明按键没有被按下,这时要及 ...

else if(ucKeyLock1==0)//有按键按下,且是第一次被按下。能跳转到此句执行隐含之中的条件已经是key_sr1==0,另一个附加条件是ucKeyLock1==0。刚开始看此程序的人确实有些不理解,我当初也是这样。

使用特权

评论回复
评论
李不走寻常路 2019-9-20 08:51 回复TA
@cabot168 :是的 
cabot168 2019-9-19 17:27 回复TA
@李不走寻常路 :谢谢 
李不走寻常路 2019-9-7 08:22 回复TA
@cabot168 :是的 
cabot168 2019-9-6 08:47 回复TA
谢谢您的指点,我说下我现在理解的思路您看对不对。if(key_sr1==1)这句如果不成立那就说明key_sr1=0了,所以执行到else if这条就是按键有按下才会到这条是吧 
863
cabot168| | 2019-9-6 09:12 | 只看该作者
LZ,第六节我有不懂地方,请解释下,谢谢!
  if(key_sr1==1)//IO是高电平,说明按键没有被按下,这时要及时清零一些标志位
  {
     ucKeyLock1=0; //按键自锁标志清零
         uiKeyTimeCnt1=0;//按键去抖动延时计数器清零,此行非常巧妙,是我实战中摸索出来的。这条语句也有疑问,按键按下瞬间会出现抖动,抖动过程就是高低电平一直在切换,(IO识别低电平不是完全为0V才为低电平)按键按下那抖动过程IO识别为高,那uikeyTimeCnt1又被清0?
  }

使用特权

评论回复
864
李不走寻常路| | 2019-9-20 08:50 | 只看该作者
cabot168 发表于 2019-9-6 09:12
LZ,第六节我有不懂地方,请解释下,谢谢!
  if(key_sr1==1)//IO是高电平,说明按键没有被按下,这时要及 ...

是的,抖动过程中,如果按键引脚电平识别为高,则uikeyTimeCnt1被清理。总之记住一条!按键引脚电平连续保持为低到达一定时间后(例如uikeyTimeCnt1>=20,连续保持低电平20MS),才认为按键被可靠按下。

使用特权

评论回复
865
李不走寻常路| | 2019-9-20 08:55 | 只看该作者
leejack 发表于 2018-11-26 15:46
if(key_sr1==1)//IO是高电平,说明按键没有被按下,这时要及时清零一些标志位
  {
     ucKeyLock1=0;  ...

if(key_sr1==1)
else if(ucKeyLock1==0)
以上两条都不满足的时候,就会执行else if(uiKeyTimeCnt1<const_time_1s) ,你要充分理解if  else语句的执行原理就好理解了。总之!if 的条件不成立  就会执行else 后的语句。

使用特权

评论回复
866
cabot168| | 2019-9-21 22:27 | 只看该作者
第十三节按键长按加速执行里面,
else if(uiKeyTimeCnt1<const_time_1s) //按住累加到1秒
  {
     uiKeyTimeCnt1++;
  }
这句看不懂,哪位大神帮解释下

使用特权

评论回复
867
李不走寻常路| | 2019-9-23 08:33 | 只看该作者
cabot168 发表于 2019-9-21 22:27
第十三节按键长按加速执行里面,
else if(uiKeyTimeCnt1

哪里看不懂了? 需要清晰地指出来

使用特权

评论回复
868
li123ds| | 2019-9-26 12:04 | 只看该作者

//红外反射开关,接收头HS0038B,发射管用pnp三极管驱动
//第一次上电,灯亮1秒后熄灭,
//手挡一次开,再挡一次关,如此循环
//实验板测试手挡一次开,再挡一次关 开关正常;
//但是有一个问题,如果手一直挡在前面,LED会不停的亮--灭        -- 亮--灭
//请大神们看下,怎样才能做到手挡在前面不移开,保持一种状态
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint  unsigned int

sbit ir=P2^4;    //红外发射
sbit ir_in=P3^2; //红外接收
sbit led=P1^1;        //

uint cont,cont1;
bit flag_key;         //按键按下标志
bit key_lock=0;


void delay(uint z)           //ms
{
        uint x,y;
        for(x=z; x>0; x--)
                for(y=114; y>0; y--);
}


void fa_38k()          //38k 载波                         //接收头前面有滤光片,发射管要用黑色热缩套管套起来
{                                  //不是很准,没有逻辑分析仪,搞不准,现在的反射距离在60厘米左右(发射管串100欧电阻)
        ir=0;                  
        _nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();
        
        ir=1;
        _nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();
        _nop_();//_nop_();
}

void main()
{
        TMOD |= 0X01;                          //T0定时器,模式1, 16位计数
        TH0 = (65536-1000)/256;  //1ms初值 @12MHz晶振
        TL0 = (65536-1000)%256;
        

        ET0=1;
        TR0=1;
        led=0;
        delay(500);
        led=1;
        while(1)
        {
                if(flag==0 )
                {
                        fa_38k();  //发38K
                }
                else ir=1;           //停止发射
           
               




        if(ir_in==0)          //手挡住
        {
                flag_key=1;
                cont1++;
                key_lock=1;       
        }
        else flag_key=0; //手移开
       
        if(flag_key==1 && cont1==100)
        {         
                 ir=1;
                 cont1=0;
                 led = !led;
                 delay(1000);

        }

       
        if(ir_in==1) cont1=0;        //这句抗干扰很好,遥控器对着按,都没反应                       



        }
}

void timer0() interrupt 1
{
        TH0 = (65536-1000)/256;  //重装1ms初值
        TL0 = (65536-1000)%256;
                cont++;
        if(cont==100)  
        {        
                cont=0;
                flag=!flag;         //发100ms 38K,停100ms

        }

}

使用特权

评论回复
869
dianzi1987| | 2019-9-26 15:26 | 只看该作者
这帖子实在太棒了,虽然这么多年头了,对于我这个初学者有很大帮助,感谢

使用特权

评论回复
870
GSerendipity| | 2019-10-14 16:02 | 只看该作者
这个后面还有更新吗

使用特权

评论回复
871
chnycdj| | 2019-10-26 14:13 | 只看该作者
不错不错,学习了!

使用特权

评论回复
872
116956018| | 2020-6-18 22:22 | 只看该作者
看了鸿哥的收益良多,能把自己学的分享出来可见鸿哥是心胸宽广之人,希望鸿哥身体健康

使用特权

评论回复
873
yanwu5| | 2020-10-9 14:02 | 只看该作者
  要是有讲解视频就好了;

使用特权

评论回复
874
wfw69| | 2020-11-27 13:48 | 只看该作者
现在回头看看,还是入门的好教材!

使用特权

评论回复
875
开溜123| | 2021-4-5 12:28 | 只看该作者
谢谢鸿哥

使用特权

评论回复
876
kqgdlz123| | 2021-6-2 15:32 | 只看该作者
鸿个,写的太好了

使用特权

评论回复
877
kqgdlz123| | 2021-6-23 10:55 | 只看该作者
jianhong_wu 发表于 2015-11-28 01:39
第九十节:针对行程开关感应器,分享一种既能及时响应,又能抗干扰处理的识别思路。         我今天在做数 ...

看完了,感谢鸿哥,真是感概良多啊,在看到鸿哥的资料前,我蹉跎了进10年,这么好的教材,卖视频的做不错,学校做不出,偏偏鸿哥免费提供,大恩不言谢,好人会有好报。

使用特权

评论回复
878
sdpylee| | 2022-2-14 15:37 | 只看该作者
讲的太好了
谢谢

使用特权

评论回复
879
xianglin| | 2022-2-14 19:44 | 只看该作者
#技术资源# Dianzan.

使用特权

评论回复
880
nwjjdwx| | 2022-4-23 17:48 | 只看该作者
谢谢分享

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则