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

[复制链接]
4636|19
 楼主| Guillaume_Meng 发表于 2012-7-12 17:21 | 显示全部楼层 |阅读模式
本帖最后由 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--);
}

本帖子中包含更多资源

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

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

珍惜生命,远离杜邦线!
lyjian 发表于 2012-7-13 08:28 | 显示全部楼层
lz可以用外部中断的,将触发方式改为跳变触发方式。。用定时、计数器的还没想起来要怎么实现。
schspa 发表于 2012-7-12 19:04

同样没用
同样存在抖动问题
lyjian 发表于 2012-7-13 08:33 | 显示全部楼层
采用定时扫描杜邦线输入的方式做
forgot 发表于 2012-7-13 08:42 | 显示全部楼层
这个好像是郭天祥的那个板子
fjzzclc 发表于 2012-7-13 08:46 | 显示全部楼层
应是抖动问题
joyme 发表于 2012-7-13 09:32 | 显示全部楼层
不明白LZ怎么理解的?
Timer计数跟你碰不碰P3.4有关系吗? 如果你设置Timer是计数器,它就是自由运行的,即使你不碰P3.4,程序照样循环点亮、延时、熄灭。
lyjian 发表于 2012-7-13 10:44 | 显示全部楼层
楼上
有有关系,因为P3.4是计数器的输入
设置Timer0是计数器,它计数的是P3.4的输入
wukunshan 发表于 2012-7-13 11:06 | 显示全部楼层
楼主的这个计数器程序犯了一个错误---没有中断函数!TF0位是T0计数溢出时硬件自动置1,进入中断后硬件自动清零,这里你用软件清零是行不通的。
再写个T0的中断函数就可以了。
joyme 发表于 2012-7-13 11:24 | 显示全部楼层
嗯,应该是硬件抖动,可以通过示波器验证一下
lyjian 发表于 2012-7-13 12:29 | 显示全部楼层
楼主的这个计数器程序犯了一个错误---没有中断函数!TF0位是T0计数溢出时硬件自动置1,进入中断后硬件自动清零,这里你用软件清零是行不通的。
再写个T0的中断函数就可以了。 ...
wukunshan 发表于 2012-7-13 11:06

楼主本来就不用中断
楼主用的是查询
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--);
}

我亲手试过了, 可以实现了
jinyuewei 发表于 2012-7-13 17:43 | 显示全部楼层
14#的程序 如何跳出while(1)循环?
jinyuewei 发表于 2012-7-13 17:46 | 显示全部楼层
14# fjzzclc 您的程序不是死机了么?
望断云山 发表于 2012-7-13 20:57 | 显示全部楼层
如果是手拿端子去触碰,百分之百有抖动问题,看似一下,其实有数下到数十下不等。程序我没看,因为我看见c就头疼。
一路向南 发表于 2012-7-13 22:29 | 显示全部楼层
学习了
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时 只闪一次
 楼主| 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

粉丝
快速回复 在线客服 返回列表 返回顶部