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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3968|回復: 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口狀態了
        }
}

回復

使用道具 舉報

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))
這么一句。
回復

使用道具 舉報

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的單獨變化
回復

使用道具 舉報

ID:398219 發表于 2022-6-24 16:54 | 顯示全部樓層
datouyuan 發表于 2022-6-24 16:15
keyscan()你寫得太啰嗦了,幫你簡化了。
一般keyscan()是掃描按鍵(key是輸入),你卻是輸出一串脈沖(ke ...

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

使用道具 舉報

ID:8222 發表于 2022-6-24 22:09 | 顯示全部樓層
一字一畫,二字二畫,三字三畫,百字百畫,萬字萬畫。
回復

使用道具 舉報

ID:8222 發表于 2022-6-24 22:12 | 顯示全部樓層
象這種單鍵開關,直接讀出Pn口就行了。
回復

使用道具 舉報

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;
回復

使用道具 舉報

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)) 看了樓主的回復好像他想要的是這個。
回復

使用道具 舉報

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

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

使用道具 舉報

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

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

使用道具 舉報

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組已經有條件判斷了呀
回復

使用道具 舉報

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

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

使用道具 舉報

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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产传媒在线观看 | 亚洲综合无码一区二区 | 成人免费小视频 | 日韩欧美精品 | 精品无码久久久久久久动漫 | 污视频免费在线观看 | 成人在线国产 | 久久九精品 | 亚洲国产欧美在线 | 欧美激情精品久久久久久变态 | 中文字幕在线精品 | 久久91精品国产一区二区 | 一区二区免费高清视频 | h视频在线免费 | 国产免费视频 | 亚洲成人av一区二区 | 在线一区二区三区 | 国产一区高清 | 久久久久久影院 | 欧美精品一区二区三区四区五区 | 久久99深爱久久99精品 | 久久久国产一区二区三区四区小说 | 日韩成人 | 久久久精品网 | 手机av在线 | 最新国产福利在线 | 欧美一级片在线看 | 毛片在线看片 | 国产中文一区二区三区 | 久久国内精品 | 三级黄色网址 | 成人免费在线视频 | 国产免费福利小视频 | 在线看91| 国产精品美女一区二区 | 色婷婷久久 | 精品一区二区三区中文字幕 | 国产精品毛片一区二区在线看 | 国产女人与拘做受视频 | 久草网址 | 99久久免费精品国产免费高清 |