求助51定时器问题

2019-07-15 15:16发布

现在学到定时器了,变了一个程序:三种数据顺序循环显示,定时器控制。问题是程序可以编译,但是显示有问题,好像是各类数据叠加,显示程序调试都没有问题,不知问题出在哪了,求帮助,给看看哪里不对。万分感谢。
FUNN.h:
sfr P0M0=0x93;
sfr P0M1=0x94;
sfr P1M0=0x91;
sfr P1M1=0x92;
sfr P2M0=0x95;
sfr P2M1=0x96;
sfr P3M0=0xb1;
sfr P3M1=0xb2;

#define fosc 11059200L
#define T0_50ms  (65536-50000*(fosc/12000000L))

sbit en1=P2^0;
sbit en2=P2^1;
sbit en3=P2^2;
sbit en4=P2^3;

unsigned char count_in_T0;
unsigned char display_num;


const unsigned char seg7[10]={0x3f,0x06,0x5b,0x4f,0x66,
                              0x6d,0x7d,0x07,0x7f,0x6f};

const unsigned char seg7a[10]={0xb0,0x9b,0xcf,0xe6,0xed,
                               0xf9,0x87,0xff,0xef,0xbf};

const unsigned char bat[3]={0x7c,0xdc,0x78};

void ms_delay(unsigned int t)
{
    unsigned int i;
    for(t;t>0;t--)
          for(i=110;i>0;i--)
          ;
}

void display_Ligh()
{
   P0=seg7[9];
   en1=0;
   ms_delay(1);
   en1=1;

   P0=seg7[8];
   en2=0;
   ms_delay(1);
   en2=1;

   P0=seg7[7];
   en3=0;
   ms_delay(1);
   en3=1;

   P0=seg7[6];
   en4=0;
   ms_delay(1);
   en4=1;
}

void display_k()
{
    P0=seg7a[7];
        en1=0;
        ms_delay(1);
        en1=1;

        P0=seg7[8];
        en2=0;
        ms_delay(1);
        en2=1;
}

void display_bat()
{
    P0=bat[0];
        en1=0;
        ms_delay(1);
        en1=1;

        P0=bat[1];
        en2=0;
        ms_delay(1);
        en2=1;

        P0=bat[2];
        en3=0;
        en4=0;
        ms_delay(1);
        en3=1;
        en4=1;

}

void init_timer()
{
    TMOD=0x09;
        TH0=T0_50ms>>8;
        TL0=T0_50ms;

        ET0=1;
}



main:
#include<reg51.h>
#include<FUNN.h>

void Timer0_interrupt() interrupt 1
{
   TH0=T0_50ms>>8;
   TL0=T0_50ms;

   if((++count_in_T0)==20)
     {
             count_in_T0=0;
                 display_num++;
                 if(display_num=9)
                 {
                      display_num=0;
                 }
         }
}

main()
{
     P0M0=0xff;
         P0M1=0xff;
         P1M1=0x0f;
         P1M0=0x00;

         count_in_T0=0;
         display_num=0;

         en1=1;
         en2=1;
         en3=1;
         en4=1;

         EA=1;

         init_timer();

         while(1)
         {
              if(0<display_num<3)
                 {
                     display_ligh();
                 }
                 else if(3<display_num<=6)
                 {
                     display_k();
                 }
                 else
                           {
                     display_bat();
                            }
         }
}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
风之魅影
1楼-- · 2019-07-15 19:34
 精彩回答 2  元偷偷看……
l2cl1314
2楼-- · 2019-07-15 19:58
if(0<display_num<3)这个可以通过吗?
风之魅影
3楼-- · 2019-07-15 21:02
l2cl1314 发表于 2015-12-29 09:27
if(0

您好,先谢谢您的回复,我原先写的是if(display<=3),结果没反应,所以我才改的这个,试一试,KEIL4编译没问题。还有我在main函数里少写了一条TR0=1,反正是运行不起来,麻烦您给看看,到底是哪里出了问题了,万分感谢

一周热门 更多>