找回密码
 立即注册

QQ登录

只需一步,快速开始

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

关于几个不理解的单片机红外光通信程序片段

[复制链接]
跳转到指定楼层
楼主
ID:609300 发表于 2019-9-18 20:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人是单片机新手,最近做一个红外光通信的小项目,在网上查阅了相关资料,但其中有几段看不太懂,向各位大牛们求教。
程序中的注释不是我加到,是资料中已经加号的

程序片段一
void khz(uchar aa)          //是发射38KHZ的程序
{
        for(a=aa;a>0;a--)   //这个for语句可以得到准确的26.3波特率
                {
                        out=1;
                        i=7;                               //低了17us
                        while(i>0)i--;                //   38kHZ  
                        out=0;
                                                       //高了9us      17+9=26us   比26.3快一点点
                }
}

这个程序完全看不懂啊,怎么就能产生38Khz的信号呢?


程序片段二
unsigned char KeyScan(void)     //键盘扫描函数,使用行列逐级扫描法
{
unsigned char Val;
KeyPort=0xf0;        //P1口高四位置高,低四位置低
if(KeyPort!=0xf0)    //表示有按键按下
   {
    DelayMs(10);      //延时去抖
        if(KeyPort!=0xf0)     //表示真的有按键按下
          {           
            KeyPort=0xfe;   //检测第一行
                if(KeyPort!=0xfe)
                          {
                          Val=KeyPort&0xf0;
                        Val+=0x0e;
                            while(KeyPort!=0xfe);
                          DelayMs(10);   //去抖
                          while(KeyPort!=0xfe);
                       return Val;
                }
        KeyPort=0xfd;   //检测第二行
                if(KeyPort!=0xfd)
                          {
                          Val=KeyPort&0xf0;
                        Val+=0x0d;
                            while(KeyPort!=0xfd);
                          DelayMs(10);   //去抖
                          while(KeyPort!=0xfd);
                       return Val;
                }
            KeyPort=0xfb;    //检测第三行
                if(KeyPort!=0xfb)
                          {
                          Val=KeyPort&0xf0;
                        Val+=0x0b;
                            while(KeyPort!=0xfb);
                          DelayMs(10);   //去抖
                          while(KeyPort!=0xfb);
                       return Val;
                }
            KeyPort=0xf7;    //检测第四行
                if(KeyPort!=0xf7)
                          {
                          Val=KeyPort&0xf0;
                        Val+=0x07;
                            while(KeyPort!=0xf7);
                          DelayMs(10);    //去抖
                          while(KeyPort!=0xf7);
                       return Val;
                }
     }
   }
  return 0xff;
}

我知道这是一个键盘扫描函数,但我自学时看的是郭天祥书上的矩阵按键扫描实例程序,按照郭书上的思路来看,这段键盘扫描函数逻辑好混乱啊,看不懂干啥,请大牛们详细说明其工作逻辑流程吧


程序片段三
void delayms1(uchar aa)//延时程序
{
        for(a=aa;a>0;a--)
        {
                 _nop_();     
                 _nop_();
                 _nop_();
                 _nop_();
                 _nop_();
                 _nop_();
                 _nop_();
                 _nop_();
        }
}
我知道这是一个延时程序,_nop_()表示延时一个机器周期,这儿有八个_nop_();那就是延时了吧个机器周期,假如晶振用的12M的,这个函数就延时了12*8=96微秒但程序中却给出了如下参考时间,与我设想的不同,那请问这么一个函数真实情况下延时是多少呢?
           //delayms(45);//0.642ms
                //delayms(35);//0.502ms
                //delayms(115);//1.623ms
                //delayms(72);//1.02ms
                //delayms(84);//1.188ms

                //delayms(31);//0.446ms
序片段四
void sieasdf() interrupt 0
{
        EX0=0;
        for(a=5;a>0;a--)
        {
                delayms(35);//延时0.5ms 判断5次  5*0.5=2.5ms
                if(in) fleg=0;
        }
        if(fleg)
        {
                delayms(72);//延时1ms  判断是不是高电平了
                if(in)
                {
                        delayms(115);//延时让它超过2ms; 2.5+1+1.623=5.123ms  开始读数据
                        for(a=8;a>0;a--)
                        {
                                while(!in);
                                delayms(86);//延时1.188ms 判断IO高低,从而得0或1
                                num=num>>1;
                                if(in)
                                        {
                                                num=num|0x80;
                                                delayms(31);//延时0.6ms 因为上面延时1.2ms+0.6 刚好跳过1.5ms
                                        }
                        }        
               
                }
        }
        fleg=1;
        EX0=1;
}
这段应该是通过外部中断,来进行相关解码的功能吧,但为什么连外部中断0的标志位IE0都没有看见,而且这儿函数整体的一个逻辑流程不理解(因为大部分语句单独拎出来看的懂,但组合在一起不知道在干啥)



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

使用道具 举报

沙发
ID:609300 发表于 2019-9-18 20:25 | 只看该作者
我承认自己水平真的很菜,请各位大佬轻喷
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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