欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 關于幾個不理解的單片機紅外光通信程序片段 [打印本頁]

作者: 折花校尉    時間: 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都沒有看見,而且這兒函數整體的一個邏輯流程不理解(因為大部分語句單獨拎出來看的懂,但組合在一起不知道在干啥)




作者: 折花校尉    時間: 2019-9-18 20:25
我承認自己水平真的很菜,請各位大佬輕噴




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1