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

標(biāo)題: 使用單片機(jī)判斷撥碼開關(guān)位數(shù)時(shí),返回結(jié)果異常 [打印本頁(yè)]

作者: ziqidong    時(shí)間: 2025-5-22 16:30
標(biāo)題: 使用單片機(jī)判斷撥碼開關(guān)位數(shù)時(shí),返回結(jié)果異常
硬件情況:
             單片機(jī)型號(hào)是STC8G2K64S4 ,LQFP48封裝
             P0 P2是接收端口(準(zhǔn)雙向置1),P1 P4是驅(qū)動(dòng)端口(準(zhǔn)雙向置0)

             撥碼開關(guān) 是多組獨(dú)立開關(guān)的集合體,有4組,6組,8組,9組等
工程原理:
             將撥碼開關(guān)引腳與單片機(jī)端口相連,閉合開關(guān)后,檢測(cè)接收端口0 的個(gè)數(shù),來判斷當(dāng)前開關(guān)的位數(shù)(檢測(cè)前已確保所有開關(guān)閉合)
             由于STC8G系列一組IO只有8個(gè)引腳,如果要測(cè)量的撥碼開關(guān)位數(shù)大于8,就必須啟用兩組IO來組合實(shí)現(xiàn)
             程序中,先將兩組IO的檢測(cè)結(jié)果(8位)組合為16位,然后再?gòu)母呶煌臀挥?jì)數(shù) “0”的個(gè)數(shù),即可得出撥碼開關(guān)的位數(shù)
源代碼:
              P1=0x00;P4=0x00;
             _nop_();_nop_();
      
             bits=detect_bit(con_bit(P0,P2));


             unsigned int con_bit (unsigned char vol_high,unsigned char vol_low){
                                return (vol_high<<8)|vol_low ;
                                }


              unsigned char detect_bit(unsigned int vol) {
                                  unsigned int mask = 0x8000;
                                  unsigned char cnt = 0;
                                  while (mask && !(vol & mask)) {       // 當(dāng)mask位為0時(shí)計(jì)數(shù)
                                   cnt++;
                                  mask >>= 1;
                                   }
                                return cnt;                          // 返回連續(xù)高位0的個(gè)數(shù)(0-16)
                                }
問題:
           經(jīng)實(shí)踐,當(dāng)撥碼開關(guān)位數(shù)<8時(shí),返回的bits 是0;當(dāng)撥碼開關(guān)位數(shù)>=8時(shí),返回的bits 是8 ,無法按照期望正確返回待測(cè)的撥碼開關(guān)位數(shù)
求助大伙,這是什么原因?qū)е碌模?/font>


作者: cyi8    時(shí)間: 2025-5-23 08:28
程序模擬運(yùn)行一下,單步運(yùn)行,設(shè)置位然后觀察變量變化.這是單片機(jī)程序最簡(jiǎn)單的檢查方法.而且你程序不長(zhǎng),很容易發(fā)現(xiàn)問題的.
作者: xianfajushi    時(shí)間: 2025-5-23 08:51
為什么一定要組合?如果是做表決器,一組單獨(dú)處理后相加即可.
作者: ziqidong    時(shí)間: 2025-5-23 11:17
cyi8 發(fā)表于 2025-5-23 08:28
程序模擬運(yùn)行一下,單步運(yùn)行,設(shè)置位然后觀察變量變化.這是單片機(jī)程序最簡(jiǎn)單的檢查方法.而且你程序不長(zhǎng),很容 ...

謝謝您的意見
作者: ziqidong    時(shí)間: 2025-5-23 11:21
xianfajushi 發(fā)表于 2025-5-23 08:51
為什么一定要組合?如果是做表決器,一組單獨(dú)處理后相加即可.

因?yàn)楹罄m(xù)程序也會(huì)使用到這個(gè)組合后的結(jié)果,如果分開的話,后面每個(gè)調(diào)用這個(gè)結(jié)果的語句及函數(shù)都需要進(jìn)行修改

不過,問題已經(jīng)找到了,8位的char 左移8位結(jié)果會(huì)全部丟失,需要強(qiáng)制類型轉(zhuǎn)換
再加上硬件端口排布的小問題

感謝您的回復(fù)
作者: WL0123    時(shí)間: 2025-5-23 13:14
#define PD P0<<8|P1


unsigned int con_bit()
{
        static unsigned int num=0;
        if(num!=PD)
        {
                num=PD;
                return num;
        }       
}
作者: xianfajushi    時(shí)間: 2025-5-23 15:06
ziqidong 發(fā)表于 2025-5-23 11:21
因?yàn)楹罄m(xù)程序也會(huì)使用到這個(gè)組合后的結(jié)果,如果分開的話,后面每個(gè)調(diào)用這個(gè)結(jié)果的語句及函數(shù)都需要進(jìn)行修 ...

如果用賦值十進(jìn)制讀取十進(jìn)制再轉(zhuǎn)二進(jìn)制計(jì)算0的個(gè)數(shù)或1的個(gè)數(shù)是很容易的,也容易理解,代碼也簡(jiǎn)潔易讀;
多組IO讀取一組處理一組,順理成章的;
況且,還可以只使用1組IO當(dāng)輸入,其他IO當(dāng)控制公共端,可以組成8組8輸入,64人表決器。
例如使用51單片機(jī)的P0端作為獨(dú)立按鍵輸入,按鍵公共端由另外IO控制,賦值P0=255,讀取也是十進(jìn)制的值,按鍵1按下時(shí)讀取到的值254即11111110,254轉(zhuǎn)二進(jìn)制,逢0計(jì)數(shù)即得1,假如按鍵2按下讀取到253轉(zhuǎn)二進(jìn)制也得1即11111101,按鍵1、2按下讀取到252轉(zhuǎn)二進(jìn)制即得2即11111100。




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