打印

关于c语言的问题(方波检测)

[复制链接]
4739|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
YJA|  楼主 | 2008-8-6 15:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
要用c语言检测输入方波的每一个跳变

     -------      -------       ------
                                       
-----       ------       ------
     1      2     3      4     5

如图的方波,输入到i/o口,要求能检测出方波的每一个跳变,如图要能得到5个计数。
用汇编挺好实现的,用c语言我想了很多方法,好像都不怎么好,大家有没有简单的方法啊



相关帖子

沙发
xwj| | 2008-8-6 15:44 | 只看该作者

一样的啊,汇编怎么实现C也就怎么实现啦

先说说你的汇编实现方法看

使用特权

评论回复
板凳
YJA|  楼主 | 2008-8-6 16:02 | 只看该作者

回复

汇编里面我就等啊

t_inti=t_signal; 先记录初始状态
while(t_signal!=t_inti)
   {
       count++;
       t_inti=t_signal;   

   }

这样好吗?好像会漏掉跳变!

使用特权

评论回复
地板
ayb_ice| | 2008-8-6 16:23 | 只看该作者

很多ic都可以邊沿觸發中斷

查詢只適合頻率不高的場合.

使用特权

评论回复
5
YJA|  楼主 | 2008-8-6 16:40 | 只看该作者

不需要用中断了

频率不高,一个0.5mS左右跳变一次。

使用特权

评论回复
6
martial| | 2008-8-6 17:12 | 只看该作者

不用中断的话:如果有的函数执行超过0.5ms就会漏掉吧

使用特权

评论回复
7
mohanwei| | 2008-8-6 19:16 | 只看该作者

汇编都写出来了,C怎么会写不出呢……

使用特权

评论回复
8
5880527| | 2008-8-6 19:23 | 只看该作者

2K的信号随便都能扫到它,主循环不行就开个定时器

使用特权

评论回复
9
太阳之母| | 2008-8-6 20:48 | 只看该作者

嘿嘿

结合硬件,用外部中断。
给这个信号接个反向器,反向之前的信号接INT0,反向之后的信号接INT1。外部中断0和1都用边沿触发方式,只要中断响应函数的执行时间比高(低)电平的持续时间短一些,保证一个边沿也不会丢失的。
用普通IO接这个信号,理论上说,不能保证一个边沿也不丢。

使用特权

评论回复
10
janying| | 2008-8-6 20:55 | 只看该作者

不用中断

不用就可以

使用特权

评论回复
11
太阳之母| | 2008-8-6 21:05 | 只看该作者

嘿嘿

也许很可能99.9999%可以,
但是如果不允许出现0.0001%的差错,就不可以了。

使用特权

评论回复
12
computer00| | 2008-8-6 22:15 | 只看该作者

死等的办法用C语言也很简单了……

while(1)
{
 OldValue=INPUT;
 while(OldValue==INPUT);
 Count++;
}

使用特权

评论回复
13
YJA|  楼主 | 2008-8-7 08:43 | 只看该作者

感谢

感谢大家的帮助,我在计数的同时还要向串口发送出去,应该不会是这里漏掉了吧

使用特权

评论回复
14
emailli| | 2008-8-7 09:20 | 只看该作者

LZ程序架构有严重问题

和汇编,C语言无关。

请先到LS各位大侠的博客上仔细看看 关于 前后台系统的程序该如何设计以后,修改程序架构。

对于死等,是肯定不行的。

使用特权

评论回复
15
computer00| | 2008-8-7 10:09 | 只看该作者

一边死等一边发也是可以的,只要你的串口数据能在一个计

while(1)
{
OldValue=INPUT;
while(OldValue==INPUT);
Count++;
SBUF=Count;
}


如果每次都发,串口忙不过来的话,可以几次才发,例如每8次发一个:

while(1)
{
OldValue=INPUT;
while(OldValue==INPUT);
Count++;
if((Count&0x07)==0)
{
 SBUF=Count;
}
}

或者串口忙就不发,等下才发……
if(TI==1)
{
 SBUF=Count;
 TI=0;
}

但是死等的方式并终归不好....如果你的程序就实现这么点功能,那也倒无所谓了…………

使用特权

评论回复
16
5880527| | 2008-8-7 10:12 | 只看该作者

2K,所以常用的9600不可能实时发送出去了

使用特权

评论回复
17
gyt| | 2008-8-7 12:02 | 只看该作者

这样做肯定要漏了

使用特权

评论回复
18
YJA|  楼主 | 2008-8-7 12:06 | 只看该作者

我写的是检测程序

主要先用来检测一个周期脉冲数的,还不是拿来直接用的,正式程序当然不能死等

使用特权

评论回复
19
dream2010| | 2008-8-7 14:23 | 只看该作者

小失误

函数执行超过0.5ms就会漏掉

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

YJA

5

主题

14

帖子

0

粉丝