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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3710|回復: 14
打印 上一主題 下一主題
收起左側

關于單片機多IO口電平檢測方法

[復制鏈接]
跳轉到指定樓層
樓主
ID:398219 發表于 2022-6-24 15:32 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
用的STC91C514AD單片機,使用了28個IO口,用于低電平檢測。程序中定義sbit d1=P0^0; 直至d28=P3^3;共計28個IO。前端使用的繼電器導通控制低電平(GND)輸入,當低電平輸入至IO口后,不知道怎么來檢測判斷了。例10個IO口有低電平,在程序中怎么來同時或多條件方式來檢測呢,求大神指教檢測方法。
#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)
        {
                這里不知道怎么寫多條件來判斷了IO口狀態了
        }
}

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

使用道具 舉報

沙發
ID:398219 發表于 2022-6-24 15:57 | 只看該作者
搞定了,用這種方式來判斷IO口狀態。               
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))       
回復

使用道具 舉報

板凳
ID:887371 發表于 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. }
復制代碼


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

使用道具 舉報

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

你這么長一串, 總結下來就是:
if((P0 == 0x00)&&(P1==0x00)&&(P2==0x00)&&((P3&0x0F) == 0x00))
這么一句。
回復

使用道具 舉報

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

只是舉了個例子,實際應用中28個IO口只有中間內個在變化,所以要檢測每個IO的單獨變化
回復

使用道具 舉報

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

謝謝,這步其它我已經刪掉了。實際在每檢測正確的IO口電平后,輸出1次開和關的控制就行了。這側面程序是以前寫的,復制的時候一起就復制上來了。
回復

使用道具 舉報

7#
ID:8222 發表于 2022-6-24 22:09 | 只看該作者
一字一畫,二字二畫,三字三畫,百字百畫,萬字萬畫。
回復

使用道具 舉報

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

使用道具 舉報

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

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

使用道具 舉報

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

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

使用道具 舉報

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

前面這句是按你意思寫的,看我回復后面一句內容。
回復

使用道具 舉報

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

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

使用道具 舉報

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

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

使用道具 舉報

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

是的,4條總線都有不同的低電平輸入,所以要檢測4條總線的IO變化情況,來執行相應操作
回復

使用道具 舉報

15#
ID:161164 發表于 2022-6-28 10:39 | 只看該作者
herui2128 發表于 2022-6-28 09:20
是的,4條總線都有不同的低電平輸入,所以要檢測4條總線的IO變化情況,來執行相應操作

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

前端是單片機AD控制28個繼電器就是28bit數據
為甚么不用串口來傳送?
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产欧美性成人精品午夜 | 中文字幕在线观看第一页 | 一呦二呦三呦国产精品 | 亚洲视频 欧美视频 | 自拍 亚洲 欧美 老师 丝袜 | 欧美人成在线视频 | 日韩一区二区三区在线 | 九九热免费观看 | 亚洲午夜小视频 | av一二三区| 亚洲欧美日韩精品久久亚洲区 | 亚洲人在线观看视频 | 在线免费观看色 | 在线观看av网站永久 | 成人一区二区三区在线观看 | 国内自拍第一页 | 天天视频一区二区三区 | 久久一本| 黄页网址在线观看 | 极品销魂美女一区二区 | 99热精品在线观看 | 天天做日日做 | 在线中文av| 国产一区2区 | 欧美精品在线免费 | 男人的天堂久久 | 国产精品久久久久久久7电影 | 欧美日韩在线观看视频网站 | 久久香蕉精品视频 | 日韩av一二三区 | 精品91av| 久久99精品久久久97夜夜嗨 | 精品视频一区在线 | 国产精久久久久久久妇剪断 | 日韩区 | 日韩一区二区免费视频 | 91av视频在线播放 | 亚洲一区二区三区在线观看免费 | 国产精品视频免费看 | 91久久久久 | 色毛片|