求高人指点:如何判断管脚50ms一直都是高(低)电平?
本帖最后由 OKKK 于 2012-12-26 23:47 编辑RT
while(!port_int0)
{
delay_ms(50);
while(!port_int0)
{
//
}
}
就不可以,求方法!!
另外:已经查看相关资料,51好像很难判断这个。因为外部中断只有下跳和低电平。求高手指点迷津!!!感激不尽。
补充:比如40ms高电平 2ms低电平 再8ms高电平 就可以通过上面的程序 用定时器和外部中断,定时器配置为50ms后中断,外部中断启动并清0定时器。等定时器自己进中断了就是满足50ms是X电平的条件,最小分辨率为外部中断的触发条件,如果用边沿触发就更准。 error_dan 发表于 2012-12-26 22:35 static/image/common/back.gif
用定时器和外部中断,定时器配置为50ms后中断,外部中断启动并清0定时器。等定时器自己进中断了就是满足50m ...
不是很清楚 :51只有下跳的int,怎么判断高电平? error_dan
能给个例不? 每1ms检测一次,连续50次为高电平则OK, 期间只要有一次或以上为低电平则视为失败,检测时间间隔根据应用系统调整,比如中断方式时可以改为每100us检测一次。。。
OKKK 发表于 2012-12-26 22:48 static/image/common/back.gif
error_dan
能给个例不?
反正是测试,加个反相器行不行? 下降沿中断,定时器计时不中断。
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)
OKKK 发表于 2012-12-26 22:48 static/image/common/back.gif
error_dan
能给个例不?
木有例程哦,都给你说了这么详细了,自己写一个吧。。。 Tliang 发表于 2012-12-27 08:43 static/image/common/back.gif
下降沿中断,定时器计时不中断。
IO中断,等待计时到或IO跳变。
判断计时是否溢出或未到时间IO即跳变、
Tliang
谢谢! 明天回公司试试 本帖最后由 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;
}
} 给两个变量:time_f,pin_f.
高电平pin_f为1,低电平pin_f为0。满足50毫秒循环时time_f为1,不满足时time_f为0.
从这两个变量状态可以满足楼主要求!
页:
[1]