打印

大家帮看看。这个表表程序 误差怎么这么大呢??

[复制链接]
1789|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wangzk|  楼主 | 2010-6-25 14:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 wangzk 于 2010-6-25 16:38 编辑

大家帮看看。这个表表程序 误差怎么这么大呢??我用的是液晶显示!

测量了一下。快了10s!



/*------------------主程序--------------------*/
void main ()
{
      uchar  second,i,j,m,n,t;  
   uint   t02s;
      TMOD=0x01;;
      TH0=0x3c;
      TL0=0xb0;//////定时50ms///感谢

ayb_ice

一直以来对偶这个菜鸟的帮助!谢谢 !

     t02s=0;
      SP=0x5f;
      req=0;
      busy=1;
      while(1)
    {
      TR0=1;
       if(TF0==1)
      {
         t02s++;
         if(t02s==2) /////实现0.1s定时
         {
          t02s=0;
          i++;
          if(i==9)////错误在这儿
           {
      i =0;
   j++;
   if (j==9)//这儿也是

   {
    j=0;
    m++;
    if (m==9)///这儿也是
    {
     m=0;
     n++;
     if (n==9)///也是
     {
      n=0;
      t++;
      if (t==9)
      {
        t=0;
      }
     }
    }
   }
        }
        disp_eng(taba,taba[j],taba[m],taba[n],taba[t]);///显示语句
          }            
       TF0=0;
       TH0=0x3c;
       TL0=0xb0;
      }                           
  }
}

相关帖子

沙发
ayb_ice| | 2010-6-25 14:58 | 只看该作者
在判断TF0==1后,要尽快给定时器赋初值
if(TF0==1) {
    TH0  = 0x3c;
    TL0 |= 0xb0; // 注意这里是|=操作
    TF0  = 0;
....

使用特权

评论回复
板凳
wangzk|  楼主 | 2010-6-25 15:33 | 只看该作者
回楼上 :

按您的方法试了试,问题依旧  

误差10s  也太大了吧?

使用特权

评论回复
地板
chenczy| | 2010-6-25 15:39 | 只看该作者
改初值,即TH0和TL0

使用特权

评论回复
5
ayb_ice| | 2010-6-25 15:44 | 只看该作者
在判断TF0==1后,要尽快给定时器赋初值
if(TF0==1) {
    TH0  = 0x3c;
    TL0 |= 0xb0; // 注意这里是|=操作
    TF0  = 0;
....
ayb_ice 发表于 2010-6-25 14:58


知道了
修改一下
    while(!TF0);
    TH0  = 0x3c;
    TL0 |= 0xb0; // 注意这里是|=操作
    TF0  = 0;
....

使用特权

评论回复
6
wangzk|  楼主 | 2010-6-25 15:53 | 只看该作者
|=操作?没见过

使用特权

评论回复
7
wangzk|  楼主 | 2010-6-25 16:13 | 只看该作者
本帖最后由 wangzk 于 2010-6-25 16:17 编辑

粗心

使用特权

评论回复
8
zjswuyunbo| | 2010-6-26 10:02 | 只看该作者
用中断…

使用特权

评论回复
9
一棵小草| | 2010-6-26 11:50 | 只看该作者
:L:L:L看到LZ的第一个新帖时,那是在人才任聘上,那时感觉LZ挺牛的,还没毕业就有这水平,还抱怨待遇不好呢。。。

现在看到LZ的一个个问题。。。MS越来越简单了。。。

怪不得hot大叔会说你戏弄匠人,呵呵

使用特权

评论回复
10
wangzk|  楼主 | 2010-6-26 12:07 | 只看该作者

感谢小草的良言!!这个程序的问题我找出来了,呵呵

本帖最后由 wangzk 于 2010-6-26 14:00 编辑

ls小草大哥批评的对啊!:) 先前我是有些浮躁,水平还菜。不瞒您说,以前连c都没好好学过!
所以现在也不抱怨工资的问题了,只想努力把项目做出来!没人指导,自己摸索所以
做得挺辛苦!除了这个,我还有其他工作要做。发货呀,生产呀,什么的。连车间的工人叫我帮忙我就得马上过去。原来是有些不平衡,现在再苦再累,也都无所谓了。
真的希望自己能把这个玩意儿做出来。就算我辞职,也要在辞职以前做出来。
做出来以后再来二姨做个总结贴!呵呵:D
谢谢小草大哥良言!更要感谢您在以前我帖子里给我的指导!
工作了一段时间,也学了一些东西,起码比刚开始能沉下心!
在这儿,向二姨家给过我帮助的友友说声谢谢! 9# 一棵小草

使用特权

评论回复
11
wangzk|  楼主 | 2010-6-26 14:12 | 只看该作者

修改后的秒表程序 用中断法实现的 这个应该精确了

本帖最后由 wangzk 于 2010-6-26 14:44 编辑

修改后的秒表程序 用中断法实现的 这个应该精确了

原来的是用查询法 ,也改过来了:)   欢迎大家查错!


//OCM4x8B参考程序
#include <reg52.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#define data_ora   P2            
#define uchar      unsigned char
#define uint       unsigned int
sbit req =P0^1;  //请求信号,H有效
sbit busy=P0^0;  //H:已收到数据并在处理中,L:空闲可接收数据
bit   flag;
uint t02s, i=0,j=0,m=0,n=0,t=0;
void send (uchar dat);
uchar code taba[]={0x30,0x31,0x32,0x33,0x34,
                   0x35,0x36,0x37,0x38,0x39};
/*---------------延时子程序----------------*/
void delay1 (uint ms)
{
  uint i,j;
  for(i=0;i<ms;i++)
  for(j=0;j<1000;j++)
  ;
}
/*------------写命令或数据到LCD--------------*/
void wr_zb (uchar comm,uchar addr_x,uchar addr_y)
{
  send(comm);
  send(addr_x);
  send(addr_y);
}
void send (uchar dat)               //写命令或数据
{
  while(busy==1)
    ;
  data_ora=dat;
  req=1;
  while(busy==0)
    ;
  req=0;
}
/*--------------显示字符------------------*/
void disp_eng (uchar  fng,uchar gmg,uchar dng,uchar cng,uchar ang)
{
      wr_zb(0xf9,9,0);
      send(fng);
   wr_zb(0xf9,7,0);
   send(gmg);   
   wr_zb(0xf9,6,0);
   send(dng);
   wr_zb(0xf9,5,0);
   send (cng);
   wr_zb(0xf9,4,0);
   send(ang);
}
/*------------------主程序--------------------*/
void main ()
{
  TMOD=0x01;
  TH0=0x3c;
  TL0=0xb0;
  ET0=1;
  TR0=1;
  EA=1;
  SP=0x5f;
  req=0;
  busy=1;
  disp_eng(taba,taba[j],taba[m],taba[n],taba[t]);
  while(1) ;
}
void t0(void) interrupt 1 using 0
{
  
  TH0=0x3c;
  TL0=0xb0;
  t02s++;
  if(t02s==2)
  {     
   t02s=0;
   flag=~flag;
  }
  if(flag==1)
  {
    i++;
   if(i==10)
            {
        i =0;
        j++;
     if (j==10)
        {
          j=0;              
       m++;
       if (m==10)
       {   
      m=0;
      n++;
      if(n==10)
      {
       n=0;
       t++;
       if (t==9)
       {
         TR0=0;///////计时到9000.0s
       }
      }
       }
        }
         }
     disp_eng(taba,taba[j],taba[m],taba[n],taba[t]);
          }            
      }

使用特权

评论回复
12
xlsbz| | 2010-6-26 18:43 | 只看该作者
修改后的秒表程序 用中断法实现的 这个应该精确了

原来的是用查询法 ,也改过来了:)   欢迎大家查错!


//OCM4x8B参考程序
#include
#include
#include
#include
#define data_ora   P2            
#define  ...

wangzk 发表于 2010-6-26 14:12




j建议1 :不要用using
第二:uint t02s, i=0,j=0,m=0,n=0,t=0; 不要这样弄一起
第三:    }
      }
       }
        }
         }


连续用苦括号 不好

使用特权

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

本版积分规则

个人签名:[url=http://huiqianxi.taobao.com]http://huiqianxi.

91

主题

680

帖子

0

粉丝