搜索
bottom↓
回复: 11

求高人指点:如何判断管脚50ms一直都是高(低)电平?

[复制链接]

出0入0汤圆

发表于 2012-12-26 22:20:08 | 显示全部楼层 |阅读模式
本帖最后由 OKKK 于 2012-12-26 23:47 编辑

RT
        while(!port_int0)
             {
        delay_ms(50);
         while(!port_int0)
        {
        //
        }
                       
             }   
就不可以,求方法!!   
另外:已经查看相关资料,51好像很难判断这个。因为外部中断只有下跳和低电平。求高手指点迷津!!!感激不尽。                                       


阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2012-12-26 22:25:26 | 显示全部楼层
补充:比如40ms高电平 2ms低电平 再8ms高电平 就可以通过上面的程序

出0入0汤圆

发表于 2012-12-26 22:35:59 | 显示全部楼层
用定时器和外部中断,定时器配置为50ms后中断,外部中断启动并清0定时器。等定时器自己进中断了就是满足50ms是X电平的条件,最小分辨率为外部中断的触发条件,如果用边沿触发就更准。

出0入0汤圆

 楼主| 发表于 2012-12-26 22:43:18 | 显示全部楼层
error_dan 发表于 2012-12-26 22:35
用定时器和外部中断,定时器配置为50ms后中断,外部中断启动并清0定时器。等定时器自己进中断了就是满足50m ...

不是很清楚 :51只有下跳的int,怎么判断高电平?

出0入0汤圆

 楼主| 发表于 2012-12-26 22:48:04 | 显示全部楼层
error_dan
能给个例不?

出0入0汤圆

发表于 2012-12-27 07:14:47 来自手机 | 显示全部楼层
每1ms检测一次,连续50次为高电平则OK, 期间只要有一次或以上为低电平则视为失败,检测时间间隔根据应用系统调整,比如中断方式时可以改为每100us检测一次。。。

出0入0汤圆

发表于 2012-12-27 08:15:36 | 显示全部楼层
OKKK 发表于 2012-12-26 22:48
error_dan
能给个例不?

反正是测试,加个反相器行不行?

出0入0汤圆

发表于 2012-12-27 08:43:38 | 显示全部楼层
下降沿中断,定时器计时不中断。
IO中断,等待计时到或IO跳变。
判断计时是否溢出或未到时间IO即跳变、

TH0 = 0X3C;
TL0 = 0XB0;
TR0  = 1;
TF0 = 0
while((!TF0) && (!P3_2));
TR0 = 0;
if(TF0 && P3_2)              //定时溢出且IO已经变高
else if(TF0)                     //时间到IO未变高
else                               //IO变高,时间未到。
可以将TH0和TL0的值读出判断在一定范围内的IO变高为有效。
if(((TH0 << 8) | TL0 > 60000) && P3_2)

出0入0汤圆

发表于 2012-12-27 19:40:18 | 显示全部楼层
OKKK 发表于 2012-12-26 22:48
error_dan
能给个例不?

木有例程哦,都给你说了这么详细了,自己写一个吧。。。

出0入0汤圆

 楼主| 发表于 2012-12-27 22:58:35 | 显示全部楼层
Tliang 发表于 2012-12-27 08:43
下降沿中断,定时器计时不中断。
IO中断,等待计时到或IO跳变。
判断计时是否溢出或未到时间IO即跳变、

Tliang
谢谢! 明天回公司试试

出0入0汤圆

发表于 2012-12-28 09:17:39 | 显示全部楼层
本帖最后由 lmt50211 于 2012-12-28 09:24 编辑

给一个简单的程序,你参考一下。没有试过,不知道程序有没有错误,大概思路应该没错,现在是在中断中检测,当然也可以在主循环中检测。


sbit input=P1^1;//输入引脚
sbit output=P1^2;//输出引脚
bit bit_1ms;//1ms标志
unsigned char highcnt;//高电平记数


void main()
{
     init();//初始化
    while(1)
    {
         if(bit_1ms)//1ms执行一次其它任务
      {
             bit_1ms=0;
          }
   }
}


void t1ms(void) interrput 1 using 0//1ms中断一次
{
     bit_1ms=1;
    if(input)//在中断中检测,具有很很好的实时
    {
          if(++highcnt>=50)  //检测高电平1ms*50=50ms
         {
               highcnt=0;
                output=!output;//输出提示
      }  
    }
   else//出现低电平则清高电平记数
  {
         highcnt=0;
   }
}

出0入0汤圆

发表于 2012-12-28 09:33:52 | 显示全部楼层
给两个变量:time_f,pin_f.
高电平pin_f为1,低电平pin_f为0。满足50毫秒循环时time_f为1,不满足时time_f为0.
从这两个变量状态可以满足楼主要求!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-6 16:19

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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