找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2487|回复: 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 单片机教程网

快速回复 返回顶部 返回列表