AT89C52记脉冲个数(C语言)

2019-07-15 11:13发布

P1.4采集信号,信号0,1,0,1,0,1,时P2.4输出1,下一个0,1,0,1,0,1时P2.4输出0,然后循环往复。
我本来计P1.4的脉冲个数,将个数模除12以此来决定输出,不过脉冲计数会溢出,这个长时间工作就会不准确,不知道能不能将记P1.4的个数,然后这个个数以12循环,这样就应该可以实现我的功能。如果可以,这个程序该怎么写?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
16条回答
wulinwl
1楼-- · 2019-07-16 12:25
本帖最后由 wulinwl 于 2017-4-23 17:01 编辑
zxn1314520 发表于 2017-4-23 15:51
非常感谢你的帮助,我刚刚试着操作并看了一下代码,那输入信号为时钟信号来说,250这个数字的选取确定了判断输入端口的最大频率,由于我外部0,1都持续十几二十几秒所以不会影响我的使用,但外部信号如果变化比较快这个就不适用了,请问我这样理解对不对,真的很谢谢你。 ...

这样理解是可以的,250这个数字是以主循环速度设定的,对于12T单片机也就是大约2ms,大于一般干扰持续时间,如果用1T单片机,这个数字还要扩大10倍,如果主循环任务多就要减小这个数字,如果输入是TTL信号,这一部分代码可以不要。总之由具体需求确定,不是一成不变的。
zxn1314520
2楼-- · 2019-07-16 13:20
 精彩回答 2  元偷偷看……
zxn1314520
3楼-- · 2019-07-16 17:19
zxn1314520 发表于 2017-4-23 17:36
刚刚调试发现一个问题就是如果一开始就输入的低电平的话,0,1,0,1输出信号就会变,这之后的会变为正常的6循环

把初始sum+=-1就行了,不好意思啊。
zxn1314520
4楼-- · 2019-07-16 17:43
zxn1314520 发表于 2017-4-23 18:04
把初始sum+=-1就行了,不好意思啊。

错了,是count1=-1
wulinwl
5楼-- · 2019-07-16 22:17
zxn1314520 发表于 2017-4-23 18:06
错了,是count1=-1

这样改一下就可以解决初始计数问题
void io_rest()
{
        if(IN3==0)       
        {       
                count++;       
                if(count>=250)       
                {
                        count=250;
                        if(flag==0)               
                        {
                                flag=1;       
                                count1++;               
                                if(count1>=4)       
                                {
                                        count1=1;       
                                        OUT2=~OUT2;       
                                }
                        }
                }
        }
        else                                               
        {
                flag=0;                               
                count=0;                               
        }
}
zxn1314520
6楼-- · 2019-07-17 03:28
wulinwl 发表于 2017-4-23 18:28
这样改一下就可以解决初始计数问题
void io_rest()
{

谢谢,不好意思麻烦你了,我现在在这个基础上再加一个功能,就是p2.3端口输出,p2.3一直输出脉冲,当p1.4口为低电平时,延时20s,然后继续输出脉冲,单个的我会写,就是一直输出脉冲,判断p1.4的值,如果为0,延时程序使用,不过在两个叠加后发现往往只能实现一个功能
这是单个p2.3端口程序
#include<reg52.h>
sbit IN3=P1^4;
sbit OUT1=P2^3;
void delay_ms(unsigned int ms)
{
  unsigned int a,b;
  for(a=ms;a>0;a--)
  for(b=124;b>0;b--);
}

void delayms(void)
{
        unsigned char a,b;
    for(b=71;b>0;b--)
     for(a=2;a>0;a--);
}

void io_mc()
{
   while(1)
    {
           OUT1=1;
           delayms();
           OUT1=0;
           delayms();
           if(IN3==0)
   delay_ms(20000);
         }
}
void main()
{
   
  
     io_mc();
   
}
这是我尝试两个共同作用的程序
void main
{
  while(1)       
          {
           OUT1=1;
           delayms();
           OUT1=0;
           delayms();
           if(IN3==0)
       {
                 count++;                                       
           if(count>=250)                        
                {
                        count=250;                       
                        if(flag==0)                        
                        {
                                flag=1;                        
                                count1++;               
                                if(count1>=3)      
                                {
                                        count1=0;        
                                        OUT2=~OUT2;        
                                }
                        }
                }
                  delay_ms(20000);
        }
        else                                                      
        {
                flag=0;                                       
                count=0;                                       
        }
             
         }
          
    }
}

一周热门 更多>