打印

51单片机-计数器问题请教

[复制链接]
3831|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 Guillaume_Meng 于 2012-7-12 17:22 编辑

我设计的意图是:我用杜邦线(接低电平)去碰P3^4口(T0口)20下,P0口的四个LED会点亮,然后延时,LED熄灭,这样循环往复.
但结果是: 我只用杜邦线去碰P3^4口(T0口)1下,P0口的四个LED会点亮,然后延时,LED熄灭,这样循环往复.
下面有图片和原代码!
请问,为什么我碰一下灯就亮了,不是255-235=20下吗?求解!谢谢!

#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
void delay(uint z);
void main()
{
TMOD=0x06; //设置计数器0为工作方式2
        TH0=0xeb;//0xeb=235
     TL0=0xeb;//0xeb=235
   while(1)
    {
     TR0=1;//打开计数器0
  if(TF0==1)//当到255时,TF0置1
        {
             TR0=0;//关闭计数器0
          P1=0xaa;//点亮LED,10101010
          delay(1000);//延时
             P1=0xff;//关闭LED
          TF0=0;//把TF0置0,可以跳出if循环
         }
     }
}
void delay(uint z)   //延时子程序
{
uint x,y;
for(x=z;x>0;x--)
  for(y=110;y>0;y--);
}

R1046725.JPG (179.63 KB )

R1046725.JPG

相关帖子

沙发
coody| | 2012-7-12 17:33 | 只看该作者
计数器速度快,几碰一下,实际几十个以上的计数就有了

使用特权

评论回复
板凳
schspa| | 2012-7-12 19:04 | 只看该作者
本帖最后由 schspa 于 2012-7-12 19:19 编辑

lz可以用外部中断的,将触发方式改为跳变触发方式。。用定时、计数器的还没想起来要怎么实现。

使用特权

评论回复
地板
cjseng| | 2012-7-12 22:46 | 只看该作者
又见杜邦线,杜邦线很好用么?我觉得很多人被开发板配的杜邦线害了,实际的产品中你用个杜邦线试试?
我就见过有人开发的产品中(不是开发板之类的,而是正宗的工控产品),居然用杜邦线来连接。
有一点忠告:做试验呢,首先要确保连接可靠,能焊接的焊接,能用标准接线端子的用接线端子。我这里有个家伙,每次做试验时,我在边上看着都胆战心惊。他把电源线直接剥开铜丝,在接插件的针上绕一下,地线也如此处理,几根信号线也是铜丝绕一下,然后用手捏住。常常手不够用,还要叫别人帮忙拿个表笔什么的。整块线路板也不考虑固定,有可能是靠连接线吊着,也可能是直接放在金属台面上,可想而知,这样的试验会是什么结果。

珍惜生命,远离杜邦线!

使用特权

评论回复
5
lyjian| | 2012-7-13 08:28 | 只看该作者
lz可以用外部中断的,将触发方式改为跳变触发方式。。用定时、计数器的还没想起来要怎么实现。
schspa 发表于 2012-7-12 19:04

同样没用
同样存在抖动问题

使用特权

评论回复
6
lyjian| | 2012-7-13 08:33 | 只看该作者
采用定时扫描杜邦线输入的方式做

使用特权

评论回复
7
forgot| | 2012-7-13 08:42 | 只看该作者
这个好像是郭天祥的那个板子

使用特权

评论回复
8
fjzzclc| | 2012-7-13 08:46 | 只看该作者
应是抖动问题

使用特权

评论回复
9
joyme| | 2012-7-13 09:32 | 只看该作者
不明白LZ怎么理解的?
Timer计数跟你碰不碰P3.4有关系吗? 如果你设置Timer是计数器,它就是自由运行的,即使你不碰P3.4,程序照样循环点亮、延时、熄灭。

使用特权

评论回复
10
lyjian| | 2012-7-13 10:44 | 只看该作者
楼上
有有关系,因为P3.4是计数器的输入
设置Timer0是计数器,它计数的是P3.4的输入

使用特权

评论回复
11
wukunshan| | 2012-7-13 11:06 | 只看该作者
楼主的这个计数器程序犯了一个错误---没有中断函数!TF0位是T0计数溢出时硬件自动置1,进入中断后硬件自动清零,这里你用软件清零是行不通的。
再写个T0的中断函数就可以了。

使用特权

评论回复
12
joyme| | 2012-7-13 11:24 | 只看该作者
嗯,应该是硬件抖动,可以通过示波器验证一下

使用特权

评论回复
13
lyjian| | 2012-7-13 12:29 | 只看该作者
楼主的这个计数器程序犯了一个错误---没有中断函数!TF0位是T0计数溢出时硬件自动置1,进入中断后硬件自动清零,这里你用软件清零是行不通的。
再写个T0的中断函数就可以了。 ...
wukunshan 发表于 2012-7-13 11:06

楼主本来就不用中断
楼主用的是查询

使用特权

评论回复
14
fjzzclc| | 2012-7-13 14:33 | 只看该作者
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
void delay(uint z);
void main()
{
TMOD=0x06; //设置计数器0为工作方式2
        TH0=0xeb;//0xeb=235
     TL0=0xeb;//0xeb=235
         TR0=1;//打开计数器0
         TF0=0;
         P1=0xff;
   while(1)
    {
   
  if(TF0==1)//当到255时,TF0置1
        {
             TR0=0;//关闭计数器0
                         //P1=~P1;
                while(1)
          {
                   P1=0xaa;//点亮LED,10101010
                 
          delay(1000);//延时
             P1=0xff;//关闭LED
                delay(1000);//延时
                   }
          TF0=0;//把TF0置0,可以跳出if循环

         }
     }
}
void delay(uint z)   //延时子程序
{
uint x,y;
for(x=z;x>0;x--)
  for(y=110;y>0;y--);
}

我亲手试过了, 可以实现了

使用特权

评论回复
15
jinyuewei| | 2012-7-13 17:43 | 只看该作者
14#的程序 如何跳出while(1)循环?

使用特权

评论回复
16
jinyuewei| | 2012-7-13 17:46 | 只看该作者
14# fjzzclc 您的程序不是死机了么?

使用特权

评论回复
17
望断云山| | 2012-7-13 20:57 | 只看该作者
如果是手拿端子去触碰,百分之百有抖动问题,看似一下,其实有数下到数十下不等。程序我没看,因为我看见c就头疼。

使用特权

评论回复
18
一路向南| | 2012-7-13 22:29 | 只看该作者
学习了

使用特权

评论回复
19
fjzzclc| | 2012-7-14 15:11 | 只看该作者
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
void delay(uint z);
void main()
{
uint m;
TMOD=0x06; //设置计数器0为工作方式2
        TH0=0xeb;//0xeb=235
     TL0=0xfeb;//0xeb=235
         TR0=1;//打开计数器0
         TF0=0;
         P1=0xff;
   while(1)
    {
      if(TF0==1)//当到255时,TF0置1
        {
             TR0=0;//关闭计数器0
                         //P1=~P1;
             for(m=0;m<2;m++)
          {
                   P1=0xaa;//点亮LED,10101010
                 
          delay(1000);//延时
             P1=0xff;//关闭LED
                          delay(1000);//延时
                   }
          TF0=0;//把TF0置0,可以跳出if循环
         TH0=0xeb;//0xeb=235
     TL0=0xeb;//0xeb=235
                  TR0=1;
         }
     }
}
void delay(uint z)   //延时子程序
{
uint x,y;
for(x=z;x>0;x--)
  for(y=110;y>0;y--);
}
再改了, 前面可能我理解错了   把M<1时 只闪一次

使用特权

评论回复
20
Guillaume_Meng|  楼主 | 2012-7-19 09:30 | 只看该作者
#include
#define uint unsigned int
#define uchar unsigned char
void delay(uint z);
void main()
{
uint m;
TMOD=0x06; //设置计数器0为工作方式2
        TH0=0xeb;//0xeb=235
     TL0=0xfeb;//0xeb=235
         T ...
fjzzclc 发表于 2012-7-14 15:11

fjzzclc,你好!首先非常感谢你和各位的回复,有了你们的回复,才使论坛更精彩!
我刚才把你改的程序下载到板上试了一下,结果还是不行,我碰一下P3^4口LED灯就亮了,但按理来说是20下!

使用特权

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

本版积分规则

27

主题

265

帖子

0

粉丝