标题: 51单片机定时问题一处难点不解,求大神帮助 [打印本页]

作者: ililililiiiilll    时间: 2016-12-24 18:05
标题: 51单片机定时问题一处难点不解,求大神帮助
本帖最后由 ililililiiiilll 于 2016-12-24 18:12 编辑

TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
    count++;
if (count==20)
    {
    count=0;
    b++;
        if(b==5)
        {b=0;



以上是中断服务子程序的一部分。
程序是两位数码管显示每秒倒计时,并根据其他按键给出灯位显示的一个关于微波炉的简单仿真。上面的程序为了给微波炉定时而用。按理说上面的程序每次中断为50ms,count计数20次就可以实现一秒了。但实际运行数码管跑得飞快,必须加一个b的五次循环才能基本实现数码管一秒一变,为什么?



附所有程序:

#include <reg52.h>
sbit KEY1=P3^0;   
sbit KEY2=P3^1;   
sbit KEY3=P3^2;
sbit KEY4=P3^3;
sbit KEY5=P3^6;
sbit led1=P1^4;0
sbit led2=P1^5;
sbit led3=P1^6;
sbit w1=P3^4;
sbit w2=P3^5;
int k;code unsigned char table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};                         //共阳数码管
0-9unsigned char StrTab[2];  
unsigned char a1=0,a2=0;  
unsigned char flag1,flag2,b;
void Delay(unsigned int del)
{        unsigned int i,j;        for(i=0; i<del; i++)        for(j=0; j<400; j++)           ;}
void Displaypro(unsigned char a1,unsigned char a2){                for(k=0;k<2;k++){switch(k){     
   case(0):  w2=1;w1=0; P2=table[a1];Delay(1);break;      
  case(1): w2=0; w1=1; P2=table[a2];                       
Delay(1);   break;                        }      
             }            
   }
main()//主函数
{    TMOD=0x10;//定时器0 10ms in 12M crystal 用于计时     
   TH0=(65536-50000)/256;      
TL0=(65536-50000)%256;      
  ET0=1;      
TR0=0;    //定时器1用于动态扫描        
TH1=0xF8;      
TL1=0xf0;   
    ET1=1;      
  TR1=1;  
  EA =1;   
flag1=1;      
  flag2=0; Displaypro(a1,a2);while(1)//主循环  {          if(flag1==0)  led1=0;  else  led1=1;  if(flag1==1)  led2=0;  else  led2=1;  if(flag1==2)  led3=0;  else  led3=1;/////////////////////////////////////////////////////////////////
if(!KEY1) //按键1去抖以及动作  
  
//选择档位    {    Delay(1);    if(!KEY1)           { while(!KEY1);                     flag1++;                if(flag1==3)                flag1=0;           }        }          if(!KEY2) //按键2去抖以及动作    {    Delay(1);    if(!KEY2)           { while(!KEY2);                      a1++;                 if(a1==10)                 {a1=0;  a2++;  }   //  正常时间 小时 加1     
    Displaypro(a1,a2);           }        }/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
if(!KEY3) //按键3去抖以及动作    {    Delay(1);    if(!KEY3)           { while(!KEY3);           a1--;           if(a1==-1)           {a1=9;  a2--;}            Displaypro(a1,a2);          }        }/////////////////////////////////////////////////////////////////  
if(!KEY4) //按键4去抖以及动作    {    Delay(1);    if(!KEY4)           { while(!KEY4);            { TR0=1;            Displaypro(a1,a2);        }           }           } }   }////////////////////////////////////////////////////////////////
********************************//*      定时中断1                *//********************************/
void time1_isr(void) interrupt 3 using 0//定时器1用来动态扫描{       TH1=0xF8;//重入初值        TL1=0xf0;   Displaypro(a1,a2);}//////////////////////////////////////////////////////////////////
/********************************//*      定时中断0                *//********************************/
void tim(void) interrupt 1        
using 1{static unsigned char count=0;//定义内部静态变量         
TH0=(65536-50000)/256;   
   TL0=(65536-50000)%256;
count++;
if (count==20)  
{    count=0;   
    b++;     
   if(b==5)      
  {b=0;    a1--;   
     if(a1==-1)      
     {           a1=9;         
if(a2>0)      
  a2--;         }
if(a1==0&&a2==0)
{  TR0=0;
flag1=4;}           
}
}   
}                                                                                                                                                           

作者: ahshmj    时间: 2016-12-24 19:24
“但实际运行数码管跑得飞快,必须加一个b的五次循环才能基本实现数码管一秒一变,为什么?”
你说的是指仿真的还是硬件实际跑的?
作者: ligang123    时间: 2016-12-24 19:28
可能是晶振不同

作者: ililililiiiilll    时间: 2016-12-24 19:38
ahshmj 发表于 2016-12-24 19:24
“但实际运行数码管跑得飞快,必须加一个b的五次循环才能基本实现数码管一秒一变,为什么?”
你说的是指 ...

我用开发版实跑的
作者: ililililiiiilll    时间: 2016-12-24 19:39
ligang123 发表于 2016-12-24 19:28
可能是晶振不同

晶振是12MHZ的  应该不会出现这情况啊。。  
作者: yfgww    时间: 2016-12-24 19:54
12M的晶振51还是不是1/12的分频
作者: jewel    时间: 2016-12-24 19:59
看起来有点复杂
作者: ililililiiiilll    时间: 2016-12-24 20:39
yfgww 发表于 2016-12-24 19:54
12M的晶振51还是不是1/12的分频

十二分频这个不会变吧
作者: ililililiiiilll    时间: 2016-12-24 20:41
有没有人给分析一下可能的原因
单片机stc90c51 6rd+
作者: jjkpower    时间: 2016-12-24 22:23
晶振不同
作者: ahshmj    时间: 2016-12-25 09:37
什么单片机芯片?




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1