久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3801|回復(fù): 14
打印 上一主題 下一主題
收起左側(cè)

關(guān)于單片機(jī)多IO口電平檢測(cè)方法

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:398219 發(fā)表于 2022-6-24 15:32 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
用的STC91C514AD單片機(jī),使用了28個(gè)IO口,用于低電平檢測(cè)。程序中定義sbit d1=P0^0; 直至d28=P3^3;共計(jì)28個(gè)IO。前端使用的繼電器導(dǎo)通控制低電平(GND)輸入,當(dāng)?shù)碗娖捷斎胫罥O口后,不知道怎么來(lái)檢測(cè)判斷了。例10個(gè)IO口有低電平,在程序中怎么來(lái)同時(shí)或多條件方式來(lái)檢測(cè)呢,求大神指教檢測(cè)方法。
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
//LED燈序列
sbit d1=P0^0;  sbit d2=P0^1;  sbit d3=P0^2;  sbit d4=P0^3;  sbit d5=P0^4;  sbit d6=P0^5;  sbit d7=P0^6;  sbit d8=P0^7;
sbit d9=P1^0;  sbit d10=P1^1; sbit d11=P1^2; sbit d12=P1^3; sbit d13=P1^4; sbit d14=P1^5; sbit d15=P1^6; sbit d16=P1^7;
sbit d17=P2^0; sbit d18=P2^1; sbit d19=P2^2; sbit d20=P2^3; sbit d21=P2^4; sbit d22=P2^5; sbit d23=P2^6; sbit d24=P2^7;
sbit d25=P3^0; sbit d26=P3^1; sbit d27=P3^2; sbit d28=P3^3;
//按鍵輸出控制
sbit key = P3^4;
//等待
uchar flag=0;
//合格燈
sbit led1=P3^5;
//NG燈
sbit led2=P3^6;

uchar count;

void delayms(uint xms)
{
         uint i,j;
                for(i=xms;i>0;i--)
                        for(j=110;j>0;j--);               
}

void keyscan()
{
        uchar i;
        switch(count)
        {
                case 1: key=0; delayms(100); key=1; break;//
                case 2:                                       
                        for(i=0;i<2;i++)
                        {
                                key=0; delayms(100); key=1;delayms(100);
                        }
                                break;
                case 3:                                   //
                        for(i=0;i<3;i++)
                        {
                                key=0; delayms(100); key=1;delayms(100);
                        }
                        break;
                case 4:                                   //
                        for(i=0;i<4;i++)
                        {
                                key=0; delayms(100); key=1;delayms(100);
                        }
                        break;
                case 5:                                   //
                        for(i=0;i<5;i++)
                        {
                                key=0; delayms(100); key=1;delayms(100);
                        }
                        break;
                case 6:
                        for(i=0;i<6;i++)                                                                                                //制冷
                        {
                                key=0; delayms(100); key=1;delayms(100);
                        }
                        break;
                case 7:
                        for(i=0;i<7;i++)                                                                                                //制冷
                        {
                                key=0; delayms(100); key=1;delayms(100);
                        }
                        break;
                case 8:
                        for(i=0;i<8;i++)                                                                                                //制冷
                        {
                                key=0; delayms(100); key=1;delayms(100);
                        }
                        break;
                case 9:
                        for(i=0;i<9;i++)                                                                                                //制冷
                        {
                                key=0; delayms(100); key=1;delayms(100);
                        }
                        break;
                case 10:
                        for(i=0;i<10;i++)                                                                                                //制熱
                        {
                                key=0; delayms(100); key=1;delayms(100);
                        }
                        break;
                case 11:
                        for(i=0;i<11;i++)                                                                                                //制熱
                        {
                                key=0; delayms(100); key=1;delayms(100);
                        }
                        break;
        }
        flag=1;
}
        
void main()
{
        while(1)
        {
                這里不知道怎么寫多條件來(lái)判斷了IO口狀態(tài)了
        }
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:398219 發(fā)表于 2022-6-24 15:57 | 只看該作者
搞定了,用這種方式來(lái)判斷IO口狀態(tài)。               
if((d1==0)&&(d2==0)&&(d3==0)&&(d4==0)&&(d5==0)&&(d6==0)&&(d7==0)&&(d8==0)
                        &&(d9==0)&&(d10==0)&&(d11==0)&&(d12==0)&&(d13==0)&&(d14==0)&&(d15==0)&&(d16==0)
                        &&(d17==0)&&(d18==0)&&(d19==0)&&(d20==0)&&(d21==0)&&(d22==0)&&(d23==0)&&(d24==0)
                        &&(d25==0)&&(d26==0)&&(d27==0)&&(d28==0))       
回復(fù)

使用道具 舉報(bào)

板凳
ID:887371 發(fā)表于 2022-6-24 16:15 | 只看該作者
  1. void keyscan()
  2. {
  3.         uchar i;
  4.         if (count && (count <= 11))
  5.         {
  6.                 for (i = 0; i < count; i++)
  7.                 {
  8.                         key = 0;
  9.                         delayms(100);
  10.                         key = 1;
  11.                         delayms(100);
  12.                 }
  13.         }
  14.         flag=1;
  15. }
復(fù)制代碼


keyscan()你寫得太啰嗦了,幫你簡(jiǎn)化了。
一般keyscan()是掃描按鍵(key是輸入),你卻是輸出一串脈沖(key是輸出),驚奇。
你應(yīng)該先把自己的需求整理好,說(shuō)不定這步做好后,自己就能解決問(wèn)題了。
回復(fù)

使用道具 舉報(bào)

地板
ID:624769 發(fā)表于 2022-6-24 16:39 | 只看該作者
herui2128 發(fā)表于 2022-6-24 15:57
搞定了,用這種方式來(lái)判斷IO口狀態(tài)。               
if((d1==0)&&(d2==0)&&(d3==0)&&(d4==0)&&(d5==0)&&(d6==0)&&(d7== ...

你這么長(zhǎng)一串, 總結(jié)下來(lái)就是:
if((P0 == 0x00)&&(P1==0x00)&&(P2==0x00)&&((P3&0x0F) == 0x00))
這么一句。
回復(fù)

使用道具 舉報(bào)

5#
ID:398219 發(fā)表于 2022-6-24 16:52 | 只看該作者
188610329 發(fā)表于 2022-6-24 16:39
你這么長(zhǎng)一串, 總結(jié)下來(lái)就是:
if((P0 == 0x00)&&(P1==0x00)&&(P2==0x00)&&((P3&0x0F) == 0x00))
這么一 ...

只是舉了個(gè)例子,實(shí)際應(yīng)用中28個(gè)IO口只有中間內(nèi)個(gè)在變化,所以要檢測(cè)每個(gè)IO的單獨(dú)變化
回復(fù)

使用道具 舉報(bào)

6#
ID:398219 發(fā)表于 2022-6-24 16:54 | 只看該作者
datouyuan 發(fā)表于 2022-6-24 16:15
keyscan()你寫得太啰嗦了,幫你簡(jiǎn)化了。
一般keyscan()是掃描按鍵(key是輸入),你卻是輸出一串脈沖(ke ...

謝謝,這步其它我已經(jīng)刪掉了。實(shí)際在每檢測(cè)正確的IO口電平后,輸出1次開和關(guān)的控制就行了。這側(cè)面程序是以前寫的,復(fù)制的時(shí)候一起就復(fù)制上來(lái)了。
回復(fù)

使用道具 舉報(bào)

7#
ID:8222 發(fā)表于 2022-6-24 22:09 | 只看該作者
一字一畫,二字二畫,三字三畫,百字百畫,萬(wàn)字萬(wàn)畫。
回復(fù)

使用道具 舉報(bào)

8#
ID:8222 發(fā)表于 2022-6-24 22:12 | 只看該作者
象這種單鍵開關(guān),直接讀出Pn口就行了。
回復(fù)

使用道具 舉報(bào)

9#
ID:8222 發(fā)表于 2022-6-24 22:28 | 只看該作者
188610329 發(fā)表于 2022-6-24 16:39
你這么長(zhǎng)一串, 總結(jié)下來(lái)就是:
if((P0 == 0x00)&&(P1==0x00)&&(P2==0x00)&&((P3&0x0F) == 0x00))
這么一 ...

你這個(gè)是判斷所有按鍵都按下的情況,其實(shí)樓主的意思是如何判斷某幾位(或多位)的情況。if((P0 != 0xFF)&&(P1!=0xFF)&&(P2!=0xFF)&&(P3!=0xFF)),更簡(jiǎn)單的是,if(P0!=0xFF)temp0=P0;if(P1!=0xFF)temp1=P1;
回復(fù)

使用道具 舉報(bào)

10#
ID:624769 發(fā)表于 2022-6-24 22:53 | 只看該作者
溫xyz 發(fā)表于 2022-6-24 22:28
你這個(gè)是判斷所有按鍵都按下的情況,其實(shí)樓主的意思是如何判斷某幾位(或多位)的情況。if((P0 != 0xFF)& ...

是: 樓主的判斷,是所有按鍵都按下的情況,我只是替他翻譯過(guò)來(lái),讓他看看是否符合他的最初目的而已。
而你這句就比較微妙了~~
if((P0 != 0xFF)&&(P1!=0xFF)&&(P2!=0xFF)&&(P3!=0xFF))
表示,4條總線都要有 任意鍵按下,即最少要按下4個(gè)鍵,這個(gè)四個(gè)鍵還必須在不同總線。描述起來(lái)還挺拗口,貌似,開密碼箱才會(huì)用這種驗(yàn)證吧?
假定,判斷任意鍵按下,則應(yīng)當(dāng)這么寫:if((P0 != 0xFF)||(P1!=0xFF)||(P2!=0xFF)||(P3!=0xFF)) 看了樓主的回復(fù)好像他想要的是這個(gè)。
回復(fù)

使用道具 舉報(bào)

11#
ID:8222 發(fā)表于 2022-6-25 04:09 | 只看該作者
188610329 發(fā)表于 2022-6-24 22:53
是: 樓主的判斷,是所有按鍵都按下的情況,我只是替他翻譯過(guò)來(lái),讓他看看是否符合他的最初目的而已。
...

前面這句是按你意思寫的,看我回復(fù)后面一句內(nèi)容。
回復(fù)

使用道具 舉報(bào)

12#
ID:398219 發(fā)表于 2022-6-27 19:32 | 只看該作者
188610329 發(fā)表于 2022-6-24 22:53
是: 樓主的判斷,是所有按鍵都按下的情況,我只是替他翻譯過(guò)來(lái),讓他看看是否符合他的最初目的而已。
...

謝謝,雖然用的KEYSCAN,但是本意不是按鍵掃描的意思。前端用的單片機(jī)AD采用光敏分壓,用的繼電器輸出低電平過(guò)來(lái),由于用了28個(gè)IO口接收前端繼電器繼電平輸入過(guò)來(lái),所以在后面需要進(jìn)行判斷。這部分感覺非常難,目前還在調(diào)試程序中,用的是前面的方式,單個(gè)來(lái)判斷。明天試試對(duì)IO口來(lái)判斷條件。謝謝指導(dǎo)。
回復(fù)

使用道具 舉報(bào)

13#
ID:398219 發(fā)表于 2022-6-27 20:00 | 只看該作者
188610329 發(fā)表于 2022-6-24 16:39
你這么長(zhǎng)一串, 總結(jié)下來(lái)就是:
if((P0 == 0x00)&&(P1==0x00)&&(P2==0x00)&&((P3&0x0F) == 0x00))
這么一 ...

為什么最后還要加一句==0X00呀,前三3組已經(jīng)有條件判斷了呀
回復(fù)

使用道具 舉報(bào)

14#
ID:398219 發(fā)表于 2022-6-28 09:20 | 只看該作者
188610329 發(fā)表于 2022-6-24 22:53
是: 樓主的判斷,是所有按鍵都按下的情況,我只是替他翻譯過(guò)來(lái),讓他看看是否符合他的最初目的而已。
...

是的,4條總線都有不同的低電平輸入,所以要檢測(cè)4條總線的IO變化情況,來(lái)執(zhí)行相應(yīng)操作
回復(fù)

使用道具 舉報(bào)

15#
ID:161164 發(fā)表于 2022-6-28 10:39 | 只看該作者
herui2128 發(fā)表于 2022-6-28 09:20
是的,4條總線都有不同的低電平輸入,所以要檢測(cè)4條總線的IO變化情況,來(lái)執(zhí)行相應(yīng)操作

既然不同IO的信號(hào)有不同的操作
那為甚么還要if((d1==0)&&(d2==0)&&(d3==0)&&...
一起檢測(cè)?
直接
if(d1==0)
{
//操作1
}
if(d2==0)
{
//操作2
}
...
不就好了嗎?

前端是單片機(jī)AD控制28個(gè)繼電器就是28bit數(shù)據(jù)
為甚么不用串口來(lái)傳送?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 99re视频 | 国产又色又爽又黄又免费 | 精品久久精品 | 久久久久国产精品一区二区 | 91视频一区 | 欧美日韩高清在线观看 | av色站| 天天天天操| 久久久免费在线观看 | 中文字幕成人av | 一区二区在线 | 成人免费视频久久 | 久久精品一区 | 日韩男人天堂 | 综合久 | 欧美在线视频一区二区 | 狼色网 | 一区二区三区视频在线观看 | 欧美日韩一区在线播放 | 综合第一页 | 国产一区不卡 | 久久久久久久久久久久91 | 成人精品毛片国产亚洲av十九禁 | 亚洲一区中文 | 成人精品视频在线观看 | 国精产品一区二区三区 | 欧美区在线 | 欧美一区二区三区视频 | 精品免费国产视频 | 中文欧美日韩 | 精品91久久 | 亚洲性视频网站 | 99re6在线视频精品免费 | 国产h视频 | www亚洲免费国内精品 | 免费黄篇 | 99精品99 | 精品伦精品一区二区三区视频 | www.国产| 国产精品久久午夜夜伦鲁鲁 | 亚洲精品一区二区三区中文字幕 |