找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机定时问题一处难点不解,求大神帮助

[复制链接]
跳转到指定楼层
楼主
ID:157387 发表于 2016-12-24 18:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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;}           
}
}   
}                                                                                                                                                           
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:7485 发表于 2016-12-24 19:24 | 只看该作者
“但实际运行数码管跑得飞快,必须加一个b的五次循环才能基本实现数码管一秒一变,为什么?”
你说的是指仿真的还是硬件实际跑的?
回复

使用道具 举报

板凳
ID:156744 发表于 2016-12-24 19:28 | 只看该作者
可能是晶振不同
回复

使用道具 举报

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

我用开发版实跑的
回复

使用道具 举报

5#
ID:157387 发表于 2016-12-24 19:39 | 只看该作者

晶振是12MHZ的  应该不会出现这情况啊。。  
回复

使用道具 举报

6#
ID:157401 发表于 2016-12-24 19:54 | 只看该作者
12M的晶振51还是不是1/12的分频
回复

使用道具 举报

7#
ID:157403 发表于 2016-12-24 19:59 | 只看该作者
看起来有点复杂
回复

使用道具 举报

8#
ID:157387 发表于 2016-12-24 20:39 | 只看该作者
yfgww 发表于 2016-12-24 19:54
12M的晶振51还是不是1/12的分频

十二分频这个不会变吧
回复

使用道具 举报

9#
ID:157387 发表于 2016-12-24 20:41 | 只看该作者
有没有人给分析一下可能的原因
单片机stc90c51 6rd+
回复

使用道具 举报

10#
ID:157430 发表于 2016-12-24 22:23 | 只看该作者
晶振不同
回复

使用道具 举报

11#
ID:7485 发表于 2016-12-25 09:37 | 只看该作者
什么单片机芯片?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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