找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3781|回复: 4
打印 上一主题 下一主题
收起左侧

[求助]高手们帮我看看程序哪里出了问题,时间不准

[复制链接]
跳转到指定楼层
楼主
ID:40110 发表于 2012-5-12 13:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

///利用动态扫描和定时器1在数码管上显示出从765432开始以1/10秒的速度往下递减直至765398并保持显示此数
//,与此同时利用定时器0以500MS速度进行流水灯从上至下移动,当数码管上数减到停止时
//,实验板上流水灯也停止然后全部开始闪烁,3秒后(用T0定时)流水灯全部关闭
//、数码管上显示出“HELLO”。到此保持住。

 //以上的是题目

#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code TAB[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};///数码管显示的数字
uchar code TA[]={0xfe,0xfd,0xfb,0xf7};///选择第几个数码管亮
uchar code TAB1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};///流水灯
uchar code TAB2[]={0x76,0x79,0x3f,0x38};///显示HELO
uchar i;
uint j,n,k,m,f;
int a,b,c,d,x;
void delay();
void xiajieduan();
void helo();
void main()
{
  i=0;j=0;k=0;n=0;
  TMOD=0x22;
  TL0=0X47;//定时0.2毫秒
  TH0=0x47;
  TR0=1;                 
  ET0=1;
  TL1=0X47;//定时0.2毫秒
  TH1=0x47;
  TR1=1;                 
  ET1=1;
  EA=1;
  a=2;b=3;c=4;d=5;
 while(1)
 {

  if(d==5&&c==3&&b==9&&a==8)//当达到指定数字时
   {
    TR1=0;k=0;
    xiajieduan();
   }
       P2=0XFF;
       if(j==0)P0=TAB[a];
       if(j==1)P0=TAB;
       if(j==2)P0=TAB[c];
       if(j==3)P0=TAB[d];
       P2=TA[j];//数码管显示
       j++;
       if(j>=4)j=0;

   if(k>=2500)//流水灯
   {
     k=0;f++;
     if(f==8)f=0;
     P1=TAB1[f];
   }
   
 }
}
void jishi0() interrupt 1
{

  k++;
  if(k==15000){P1=0XFF;helo();}
}
void jishi1() interrupt 3
{
  n++;
  if(n==1000){n=0;a--;}//计时器向下递减的转化
  if(a==-1){b--;a=9;}
  if(b==-1){c--;b=9;}
  if(c==-1){d--;c=9;}
  if(d==-1){a=9;b=9;c=9;d=9;}

}
void delay()
{  for(x=0;x<5000;x++)

    {
       P2=0XFF;
       if(j==0)P0=TAB[a];
       if(j==1)P0=TAB;
       if(j==2)P0=TAB[c];
       if(j==3)P0=TAB[d];
       P2=TA[j];//数码管显示
       j++;
       if(j>=4)j=0;
   }
}
void xiajieduan()
{
  while(1)
  {
   P1=0X00;
  delay();
   P1=0xff;
  delay();
  }
}

void helo()
{
  while(1)
 {
  
    P2=0XFF;
      
      if(j==0)P0=TAB2[3];
      if(j==1)P0=TAB2[2];
      if(j==2)P0=TAB2[1];
      if(j==3)P0=TAB2[0];
      P2=TA[j];//数码管显示
      j++;
      if(j>=4)j=0;
 }
}

///利用动态扫描和定时器1在数码管上显示出从765432开始以1/10秒的速度往下递减直至765398并保持显示此数
//,与此同时利用定时器0以500MS速度进行流水灯从上至下移动,当数码管上数减到停止时
//,实验板上流水灯也停止然后全部开始闪烁,3秒后(用T0定时)流水灯全部关闭
//、数码管上显示出“HELLO”。到此保持住。

 

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:40110 发表于 2012-5-12 13:26 | 只看该作者

晶振用的是11.0592M

回复

使用道具 举报

板凳
ID:7485 发表于 2012-5-12 21:50 | 只看该作者
定时器初装值不对。这样有50多毫秒了。应该是:TH0=(65536-200)/256;TL0=(65536-200) MOD 256;   括号里的减数就是你需要的微秒数。这是12M晶振的值。11.0592的你自己换算一下。
回复

使用道具 举报

地板
ID:40110 发表于 2012-5-12 23:42 | 只看该作者

不是啊,我用方式2的8位重装计时,初值用软件计算的,应该不会错吧

不过非常感谢你的回复!

回复

使用道具 举报

5#
ID:7485 发表于 2012-5-14 19:41 | 只看该作者

手工计算了一下,0x47是对的。但是有小数,被舍去了。10进制的71.68,,取71(0x47)。不会因此不准吧?

 

你现在是怎么“不准”?

[此贴子已经被作者于2012-5-14 19:53:54编辑过]
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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