找回密码
 注册
关于网站域名变更的通知
查看: 904|回复: 12
打印 上一主题 下一主题

求教:AT89C52记脉冲个数(C语言)

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-3-25 09:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
求教:AT89C52记脉冲个数(C语言)
! j4 v5 e9 ?! N) ~$ W& p4 X3 B: q; c  d5 d# Z- J
) m1 _- \1 M: E0 n0 [7 s9 t5 c) G
P1.4采集信号,信号0,1,0,1,0,1,时P2.4输出1,下一个0,1,0,1,0,1时P2.4输出0,然后循环往复。2 |$ z& G+ m: h
我本来计P1.4的脉冲个数,将个数模除12以此来决定输出,不过脉冲计数会溢出,这个长时间工作就会不准确,不知道能不能将记P1.4的个数,然后这个个数以12循环,这样就应该可以实现我的功能。如果可以,这个程序该怎么写?, R7 `4 o  E* F  g: v# y1 j; Z

该用户从未签到

2#
发表于 2019-3-25 10:14 | 只看该作者
6分频,循环计数清0怎么会溢出?

点评

由于外部输入端口0和1持续时间都在十几二十秒左右,所以我现在想记外部输入端口下降沿个数,然后这个个数6循环,不过参考了网上的下降沿判断大多用计时器对于我的不适用,我想就端口的值判断,不过具体的不知道怎么  详情 回复 发表于 2019-3-25 10:24

该用户从未签到

3#
 楼主| 发表于 2019-3-25 10:24 | 只看该作者
gaoxings 发表于 2019-3-25 10:148 V1 s2 t7 V/ G0 ]) j4 f+ Y
6分频,循环计数清0怎么会溢出?

5 p3 i- u/ W7 x. e1 O由于外部输入端口0和1持续时间都在十几二十秒左右,所以我现在想记外部输入端口下降沿个数,然后这个个数6循环,不过参考了网上的下降沿判断大多用计时器对于我的不适用,我想就端口的值判断,不过具体的不知道怎么写,刚学单片机,不是很懂。
6 p! D2 k7 E/ W

点评

你就把输入信号当做按键或开关信号接I/O口,程序不断扫描此I/O口,对高或低电平计数,计满6次令输出端口置高或低电平并清0计数变量,如此循环。  详情 回复 发表于 2019-3-25 11:18

该用户从未签到

4#
发表于 2019-3-25 11:18 | 只看该作者
码农 发表于 2019-3-25 10:24# x! b: }8 Z+ G  ~' r2 X
由于外部输入端口0和1持续时间都在十几二十秒左右,所以我现在想记外部输入端口下降沿个数,然后这个个数 ...

% T& I! \, h" m  \. F! ?4 B) r$ c% l你就把输入信号当做按键或开关信号接I/O口,程序不断扫描此I/O口,对高或低电平计数,计满6次令输出端口置高或低电平并清0计数变量,如此循环。
' Q7 D3 O, D( B& B' I

点评

谢谢你的建议,下面是我编的程序,编译后不出错,不过有警告,位置是主函数里,调用子函数后,对于flag的判断哪里,显示方向控制.C(29): warning C276: constant in condition expression,然后就无法生成hex文件,  详情 回复 发表于 2019-3-25 11:28

该用户从未签到

5#
 楼主| 发表于 2019-3-25 11:28 | 只看该作者
gaoxings 发表于 2019-3-25 11:188 y" R: ^* {+ c& Y
你就把输入信号当做按键或开关信号接I/O口,程序不断扫描此I/O口,对高或低电平计数,计满6次令输出端口 ...
4 V( K, z5 s0 l) q. W$ C, W
谢谢你的建议,下面是我编的程序,编译后不出错,不过有警告,位置是主函数里,调用子函数后,对于flag的判断哪里,显示方向控制.C(29): warning C276: constant in condition expression,然后就无法生成hex文件,麻烦看一下,不好意思,谢谢了。* v  I' d! _% z
#include<reg52.h>
. S" ]3 _, b2 Asbit IN3=P1^4;
% ^9 h# Z; J2 h# Psbit OUT2=P2^4;
0 s5 j4 X* ^; t; Dbit old_bit;: m' T0 x2 {2 ~: l5 D+ O6 c
unsigned char flag;
8 e8 T7 n) L2 z, g4 @0 u8 Rvoid io_rest()
- L, G7 L# n) ?' t# e; |7 k8 S; u{
; K5 M1 U% C- @7 X  if(old_bit!=IN3)
7 R% |' n4 w% I& F: R" N0 B2 ]  {8 m8 B0 v" b- F  Y4 A% P
    old_bit=IN3;
* t; g) K  h+ U( C        if(IN3!=1)
, b! n: t- Z7 p4 |- z% q+ U        {
4 g/ ~9 B) i1 p& y% C1 M  F          flag=1;
" {! P. e% J& T% X" G6 Q        }
& m# s7 b& A; ~+ [" T        else
6 ]2 c0 ]/ y: x0 R/ h        {2 t7 s! Q+ D" d* F  r
           flag=2;
: g: J7 B5 Y: i" P# t% O        }. c( A  Q; X, x* x: i$ ]! f1 t
  }; i. O4 T& A* X, ^9 P0 C
}
; N( S: B. g( E* \/ avoid main()' C4 }. c% u, G, U+ W
{
& z3 W  ?0 A; Z7 U  old_bit=IN3;  L9 X5 K# Q' x! y
  while(1)
! Z, a, O, E7 L' n$ x  g  {
' M' C1 g1 x, ]( C0 E    int num=0;
8 e, d/ }# L0 p7 f7 y2 F         flag=0;
/ l! G! o" ]3 V4 @, z        io_rest();
% f% O1 w& Z( c        if(flag=1)# t  U3 d' g( L- f2 L8 q* y$ p
        num++;
# i( d5 ^5 j& ^        if(num==6)0 u1 C) K$ U6 X& H2 A; D' W$ S
        num=0;) f2 K# j- K8 g+ Z. e% ^( ^
        if(0<num<=3)
, D" r. ?- V% n2 \     OUT2=1;
! ?" j* g: p( n# B* I7 q1 S; F         else
5 a& Z. K  l5 E         OUT2=0;
$ y; @# h& R; _  ~6 b  }
9 G- j. R/ P( y/ S$ N% @; U; ~$ Y( a}$ Z; |, \# ?' n! M: {, N
5 Y1 Z# {0 _$ }3 J& a5 B* z7 m
( O& t! L/ Q9 I7 H  M& n
警告是由于少打了一个=,不过仿真并没有出现预期结果,输出端一直只会输出高电平,不知道程序哪里写错了?
' N/ C5 y) S5 k" g1 o, k6 q

该用户从未签到

6#
发表于 2019-3-25 13:22 | 只看该作者
/*已经实验验证通过*/9 D, o5 o0 {- m4 u6 C6 V$ p' I
#include<reg52.h>
- U, ^; i" Y7 T; q" A+ B- Q" d( Lsbit IN3=P1^4;% z. @- k8 ~4 ?0 w" R* p/ X2 q, m
sbit OUT2=P2^4;
$ M7 B6 o3 d  j: q  p! ^% }bit flag=0;                                                //自锁标志
, @6 G0 }$ _, I$ @unsigned char count=0,count1=0;//计数变量, d* A7 n& W9 q$ L: @! P7 _

# I( j& a$ i  O$ V; kvoid io_rest()
4 ?% y& h2 S+ j1 q{' W2 }5 o. [& `  D% E
        if(IN3==0)                                        //IN3低电平有效* s, T4 [/ `! ]& |* s# N
        {        3 W& l/ O( z' a
                count++;                                        //消抖、消扰$ h: ]7 o. [4 E, K; c9 k
                if(count>=250)                        //根据环境干扰强度10到250
7 s* ^$ I0 ]! ?- t7 p                {
$ U5 b% J3 |  c  |- N3 ]3 A8 B                        count=250;                        //防止溢出6 R: k; u8 F: j1 J
                        if(flag==0)                        //如果自锁标志为0! V, X5 o+ A6 r3 |4 S
                        {+ h- I; }2 k# E0 Z( T$ @9 J
                                flag=1;                        //自锁标志置1、不会在持续低电平期间重复计数
- b8 p, o. Z3 m% A* ?                                count1++;                //脉冲计数变量
+ m  z" O$ A2 k4 O3 q                                if(count1>=3)        //脉冲计数变量>=3
' d6 t4 ]5 ?5 C6 J" Y( {; C( O6 T% R                                {
2 Q( z0 g  Y  H% e! l' [! P                                        count1=0;        //脉冲计数变量清0- ^0 E8 C! c& d9 A8 P5 Q1 `
                                        OUT2=~OUT2;        //输出电平取反! s3 F0 K% P/ Q+ s- C3 V. e$ {
                                }
. D7 k0 Q7 I8 d8 h% t( r8 o                        }& ~  B1 F1 Q" z9 t# v+ L4 b: T
                }
. T8 ^2 ^, q6 E' e; k. t        }- d6 R# s- ~- X# U
        else                                                        //IN3高电平1 T& U& F8 h# M1 I9 Q! w
        {$ I" W- x2 R  `( z4 q. S+ O
                flag=0;                                        //自锁标志清0
, s& w" ~! T% @, p' ?: k                count=0;                                        //消抖、消扰计数变量清0  [" F# p. Z$ b$ L; I/ [3 [- M
        }
2 H  m$ R0 z7 v( C% F, J0 |2 F}
9 R% K, ?2 E; tvoid main()
) F0 r7 O/ b5 T( `& ?$ M+ X+ w3 ]1 p{
( ~4 x1 B$ \7 u- w3 ?6 b0 A# Z* S        while(1)3 u' x. B- w- O, c+ @
        {/ X: S3 p0 u% @5 Z9 r
                io_rest();
1 o. N* x* M' V- o) _  J+ s& G# i        }7 A; R" f0 G2 A) y/ W
}

该用户从未签到

7#
 楼主| 发表于 2019-3-25 13:40 | 只看该作者
我刚刚试着操作并看了一下代码,那输入信号为时钟信号来说,250这个数字的选取确定了判断输入端口的最大频率,由于我外部0,1都持续十几二十几秒所以不会影响我的使用,但外部信号如果变化比较快这个就不适用了,请问我这样理解对不对?

点评

这样理解是可以的,250这个数字是以主循环速度设定的,对于12T单片机也就是大约2ms,大于一般干扰持续时间,如果用1T单片机,这个数字还要扩大10倍,如果主循环任务多就要减小这个数字,如果输入是TTL信号,这一部分  详情 回复 发表于 2019-3-25 14:07

该用户从未签到

8#
发表于 2019-3-25 14:07 | 只看该作者
码农 发表于 2019-3-25 13:40
' _* U- Y& O" S) ~. l* |我刚刚试着操作并看了一下代码,那输入信号为时钟信号来说,250这个数字的选取确定了判断输入端口的最大频 ...
' N+ R' z1 l8 i, ^
这样理解是可以的,250这个数字是以主循环速度设定的,对于12T单片机也就是大约2ms,大于一般干扰持续时间,如果用1T单片机,这个数字还要扩大10倍,如果主循环任务多就要减小这个数字,如果输入是TTL信号,这一部分代码可以不要。总之由具体需求确定,不是一成不变的。4 }( t$ ~6 x2 A  [. f' m0 ]+ J

点评

刚刚调试发现一个问题就是如果一开始就输入的低电平的话,0,1,0,1输出信号就会变,这之后的会变为正常的6循环  详情 回复 发表于 2019-3-25 14:17

该用户从未签到

9#
 楼主| 发表于 2019-3-25 14:17 | 只看该作者
gaoxings 发表于 2019-3-25 14:07
! D. s8 q8 \$ [& R' z. G这样理解是可以的,250这个数字是以主循环速度设定的,对于12T单片机也就是大约2ms,大于一般干扰持续时 ...

/ k$ S" t; Q. r: ~刚刚调试发现一个问题就是如果一开始就输入的低电平的话,0,1,0,1输出信号就会变,这之后的会变为正常的6循环
$ [3 C1 s: F  d* K" P- ?

点评

这样改一下就可以解决初始计数问题 void io_rest() { if(IN3==0) { count++; if(count>=250) {  详情 回复 发表于 2019-3-25 14:34

该用户从未签到

10#
发表于 2019-3-25 14:34 | 只看该作者
码农 发表于 2019-3-25 14:17
9 W% T- i+ j8 B; |3 W刚刚调试发现一个问题就是如果一开始就输入的低电平的话,0,1,0,1输出信号就会变,这之后的会变为正常 ...
, C$ ^9 o3 S) u- f
这样改一下就可以解决初始计数问题
; r) i1 L9 K0 P7 n# q" K6 m( Z4 Yvoid io_rest()( a) Y! @7 m; h
{
6 z/ R8 r* S" G9 `7 i/ R        if(IN3==0)        ' ^0 v6 {' w7 d9 D" `1 U
        {        
1 l8 H. k* Y/ R7 S5 g" z$ h                count++;        
- z8 e( I' r( L+ [$ t9 [                if(count>=250)        
; u& B% j' `- [7 ]( U! z                {
( F  }$ H3 h9 B! i+ R                        count=250;
3 X; W% I; `* D" D1 k; Z                        if(flag==0)               
! Y4 B; d+ V2 i( `8 T                        {
2 ~$ n# s- \% Q6 z! A' z  z                                flag=1;        ) Y4 g: y) x& K3 E
                                count1++;                $ H2 l4 g: o- ]+ e7 x2 E
                                if(count1>=4)        
5 M( c' F9 b5 X; A5 ~                                {
) a. a& p( X6 C6 [, [* g                                        count1=1;        
9 t- m3 E7 P8 J& C, k% J                                        OUT2=~OUT2;        
6 a8 d  f- m- ~' O% \0 M$ G4 E( x                                }9 [( x. `- l9 F$ ]
                        }
# `, W3 {% W' w: ?+ q6 q& J                }4 ]9 w# {6 W  I- x. m. V
        }5 W* Z& M2 m7 [- c4 B4 m
        else                                                : u' ?3 r0 N8 x  L" E% j' o+ J  ]
        {5 L: K" G" ^8 v/ ~/ ]7 T4 U" ^; T
                flag=0;                                
6 E/ q9 @% ]9 u/ P  q                count=0;                                , Z0 }! L9 Z, Q( G4 {& k' `
        }3 b9 g. }" W' F/ z  J8 X$ D* [
}
3 ~4 S3 O* W) H7 A9 u4 F) Y+ v

点评

谢谢大神,太感谢了  详情 回复 发表于 2019-3-25 14:40

该用户从未签到

11#
 楼主| 发表于 2019-3-25 14:40 | 只看该作者
gaoxings 发表于 2019-3-25 14:343 T* @0 [' k) E- V4 |- _; a/ F
这样改一下就可以解决初始计数问题
' v- q2 x$ _/ svoid io_rest()7 M4 v; @" r" j
{

- \. b) k  T" d1 N0 T谢谢大神,太感谢了
3 t8 h# d2 O8 h! ?6 f0 D

该用户从未签到

12#
发表于 2019-3-25 15:20 | 只看该作者
好帖子啊

“来自电巢APP”

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-8-17 11:28 , Processed in 0.140625 second(s), 33 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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