標題: STC8H單片機三個定時器做了三個倒計時顯示,為什么不能同時顯示? [打印本頁]

作者: hjx5548    時間: 2023-11-22 07:14
標題: STC8H單片機三個定時器做了三個倒計時顯示,為什么不能同時顯示?
STC8H三個定時器做了三個倒計時顯示,為什么不能同時顯示?主程序里單獨一個倒計時顯示正常。怎么才能讓三個倒計時同時顯示?
作者: chxelc    時間: 2023-11-22 10:50
用RTOS? 具體程序和電路貼出來大家?guī)湍惴治鲆幌隆?hr noshade size="2" width="100%" color="#808080"> 作者: hjx5548    時間: 2023-11-22 11:19
chxelc 發(fā)表于 2023-11-22 10:50
用RTOS? 具體程序和電路貼出來大家?guī)湍惴治鲆幌隆?/blockquote>

程序貼出來了,看看什么原因?
作者: hjx5548    時間: 2023-11-22 11:39
//99分倒計時
#include"stc8H.h"
#include "intrins.h"
#include "daojishi.h"
#include "GPIO_init.h"

#define  uint unsigned int
#define  uchar unsigned char
       
#define ET3         0x20
#define ET4         0x40
#define T3IF        0x02
#define T4IF        0x04

sbit jiare_ge = P0^2;            
sbit jiare_shi = P0^3;   

sbit lenque_ge = P1^0;            
sbit lenque_shi = P1^1;

sbit sajun_ge = P1^2;            
sbit sajun_shi = P1^3;


//sbit LIGHT_JDQ = P3^7;   

uchar count;
char sec,min;
bit flag,flag1,flag2,flag3;

uchar code table[]={      
        0x03,/*0*/
        0x9F,/*1*/
        0x25,/*2*/
        0x0D,/*3*/
        0x99,/*4*/
        0x49,/*5*/
        0x41,/*6*/
        0x1F,/*7*/
        0x01,/*8*/
        0x09,/*9*/};

//sbit a = P2^7;
//sbit b = P2^6;
//sbit c = P2^5;
//sbit d = P2^4;
//sbit e = P2^3;
//sbit f = P2^2;
//sbit g = P2^1;
//sbit h = P2^0;
//sbit LED_com = P3^1;
      
void T0_init()                                //5毫秒@11.0592MHz
{
        AUXR &= 0x7F;                        //定時器時鐘12T模式
        TMOD &= 0xF0;                        //設(shè)置定時器模式
        TL0 = 0x00;                                //設(shè)置定時初始值
        TH0 = 0xEE;                                //設(shè)置定時初始值
        TF0 = 0;                                //清除TF0標志
        TR0 = 1;                                //定時器0開始計時
        ET0 = 1;                                //使能定時器0中斷
        
}

void T1_init()                                //5毫秒@11.0592MHz
{
        AUXR &= 0xBF;                        //定時器時鐘12T模式
        TMOD &= 0x0F;                        //設(shè)置定時器模式
              TL1 = 0x00;                                //設(shè)置定時初始值
        TH1 = 0xEE;                                //設(shè)置定時初始值

              TF1 = 0;                                //清除TF0標志
        TR1 = 1;                                //定時器0開始計時
        ET1 = 1;                                //使能定時器0中斷
}

void T3_init()                                //5毫秒@11.0592MHz
{
          T4T3M &= 0xFD;                        //定時器時鐘12T模式
    T3L = 0x00;                                 //65536-11.0592M/12/1000
    T3H = 0xEE;

    IE2 = ET3;                                  //使能定時器中斷
    T4T3M |= 0x08;                        //定時器3開始計時
}

void T4_init()                                //5毫秒@11.0592MHz
{          
          T4T3M &= 0xDF;                        //定時器時鐘12T模式
    T4L = 0x00;                                 //65536-11.0592M/12/1000
    T4H = 0xEE;
       
    T4T3M = 0x80;                               //啟動定時器
    IE2 = ET4;                                  //使能定時器中斷
}

void jiare_display()
{
        static bit i=0;
        static uchar temp=0;
        P2=0xff;
        i=~i;
        if(++temp>=200)temp=0;
        if(i==1)
        {
                jiare_ge  = 0;
                jiare_shi = 1;
                P2=table[min/10];
        }
        else
        {
                jiare_ge  = 1;
                jiare_shi = 0;
                if(temp<100)
                        P2=table[min%10]&0xfe;//閃秒
                else P2=table[min%10];
        }
        
}

void lenque_display()
{
        static bit i=0;
        static uchar temp=0;
        P2=0xff;
        i=~i;
        if(++temp>=200)temp=0;
        if(i==1)
        {
                lenque_ge  = 0;
                lenque_shi = 1;
                P2=table[min/10];
        }
        else
        {
                lenque_ge  = 1;
                lenque_shi = 0;
                if(temp<100)
                P2=table[min%10]&0xfe;//閃秒
                else P2=table[min%10];
        }
        
}

void sajun_display()
{
        static bit i=0;
        static uchar temp=0;
        P2=0xff;
        i=~i;
        if(++temp>=200)temp=0;
        if(i==1)
        {
                sajun_ge  = 0;
                sajun_shi = 1;
                P2=table[min/10];
        }
        else
        {
                sajun_ge  = 1;
                sajun_shi = 0;
                if(temp<100)
                P2=table[min%10]&0xfe;//閃秒
                else P2=table[min%10];
        }
        
}

void jiare_daojishi()

{
        T0_init();

        while(1)
        {
                if(flag)
                {
                        flag=0;
                        if(++count >= 200)
                        {
                                count = 0;
                                sec--;
                                if(sec < 0)
                                {
                                        sec = 59;
                                        min--;
                                        if(min < 0)
                                                min=99;
                                }
                        }
                        jiare_display();
                }
        }
}

void lenque_daojishi()
{
        T1_init() ;
       
        while(1)
        {
                if(flag1)
                {
                        flag1=0;
                        if(++count >= 200)
                        {
                                count = 0;
                                sec--;
                                if(sec < 0)
                                {
                                        sec = 59;
                                        min--;
                                        if(min < 0)
                                                min=99;
                                }
                        }
                        lenque_display();
                }
        }
}

void sajun_daojishi()
{
        T3_init();
   
        while(1)
        {
                if(flag2)
                {
                        flag2=0;
                        if(++count >= 200)
                        {
                                count = 0;
                                sec--;
                                if(sec < 0)
                                {
                                        sec = 59;
                                        min--;
                                        if(min < 0)
                                                min=99;
                                }
                        }
                        sajun_display();
                }
        }
}

        void daojishi()
        {
                GPIO_init();
    EA = 1;
               
                T4_init();

               
                        while (1)
                        {
                                jiare_daojishi();               
                                lenque_daojishi();       
                                sajun_daojishi();
                        }
        }

       
void TM0_Isr() interrupt 1 //5毫秒定時器0
{
        TL0 = 0x00;                                //設(shè)置定時初始值
        TH0 = 0xEE;                                //設(shè)置定時初始值
        flag=1;
}

void TM1_Isr() interrupt 3 //5毫秒定時器1
{
        TL1 = 0x00;                                //設(shè)置定時初始值
        TH1 = 0xEE;                                //設(shè)置定時初始值
        flag1=1;
}

void TM3_Isr() interrupt 19 //5毫秒定時器3
{
        TL1 = 0x00;                                //設(shè)置定時初始值
        TH1 = 0xEE;                                //設(shè)置定時初始值
        flag2=1;
}

void TM4_Isr() interrupt 20                    //定時器4  
{
        TL1 = 0x00;                                //設(shè)置定時初始值5ms
        TH1 = 0xEE;                                //設(shè)置定時初始值
        flag3=1;                               //測試端口
}
作者: lkc8210    時間: 2023-11-22 14:03


作者: hjx5548    時間: 2023-11-22 16:08
lkc8210 發(fā)表于 2023-11-22 14:03

還是顯示一組
作者: yzwzfyz    時間: 2023-11-22 16:10
顯示與定時器如何用無關(guān),是你邏輯混亂。
如下:
顯示程序這樣寫:
1、從變量X1中取出一個數(shù)字,顯示于屏幕的某處,如第一行。
2、從變量X2中取出一個數(shù)字,顯示于屏幕的某處,如第二行。
3、從變量X3中取出一個數(shù)字,顯示于屏幕的某處,如第三行。
顯示程序?qū)懞弥螅僮鲞@樣的事:
將三個定器時的倒計時值分別放在:X1、X2、X3中就可以了。
作者: hjx5548    時間: 2023-11-22 16:10
lkc8210 發(fā)表于 2023-11-22 14:03

可以了,謝謝
作者: hjx5548    時間: 2023-11-22 16:31
yzwzfyz 發(fā)表于 2023-11-22 16:10
顯示與定時器如何用無關(guān),是你邏輯混亂。
如下:
顯示程序這樣寫:

還有個問題,最后兩位數(shù)碼管只能顯示一位
作者: hjx5548    時間: 2023-11-22 16:33
lkc8210 發(fā)表于 2023-11-22 14:03

按照你這樣修改了,但是最后兩位數(shù)碼管只能顯示一位
作者: hhh402    時間: 2023-11-25 00:58
一個定時器就解決的事,都是5ms定時,用這么多定時器干嘛?如果超過5個倒計時樓主還能寫嗎?
作者: hjx5548    時間: 2023-11-25 09:25
//99分倒計時
#include"stc8H.h"
#include "intrins.h"
#include "daojishi.h"
#include "GPIO_init.h"

#define  uint unsigned int
#define  uchar unsigned char
      
#define ET3         0x20
#define ET4         0x40
#define T3IF        0x02
#define T4IF        0x04

sbit jiare_ge = P0^2;            
sbit jiare_shi = P0^3;   

sbit lenque_ge = P1^0;            
sbit lenque_shi = P1^1;

sbit sajun_ge = P1^2;            
sbit sajun_shi = P1^3;


//sbit LIGHT_JDQ = P3^7;   

uchar count;
char sec,min;
bit flag,flag1,flag2,flag3;

uchar code table[]={      
        0x03,/*0*/
        0x9F,/*1*/
        0x25,/*2*/
        0x0D,/*3*/
        0x99,/*4*/
        0x49,/*5*/
        0x41,/*6*/
        0x1F,/*7*/
        0x01,/*8*/
        0x09,/*9*/};

//sbit a = P2^7;
//sbit b = P2^6;
//sbit c = P2^5;
//sbit d = P2^4;
//sbit e = P2^3;
//sbit f = P2^2;
//sbit g = P2^1;
//sbit h = P2^0;
//sbit LED_com = P3^1;
      
void T0_init()                                //5毫秒@11.0592MHz
{
        AUXR &= 0x7F;                        //定時器時鐘12T模式
        TMOD &= 0xF0;                        //設(shè)置定時器模式
        TL0 = 0x00;                                //設(shè)置定時初始值
        TH0 = 0xEE;                                //設(shè)置定時初始值
        TF0 = 0;                                //清除TF0標志
        TR0 = 1;                                //定時器0開始計時
        ET0 = 1;                                //使能定時器0中斷
        
}

void T1_init()                                //5毫秒@11.0592MHz
{
        AUXR &= 0xBF;                        //定時器時鐘12T模式
        TMOD &= 0x0F;                        //設(shè)置定時器模式
              TL1 = 0x00;                                //設(shè)置定時初始值
        TH1 = 0xEE;                                //設(shè)置定時初始值

              TF1 = 0;                                //清除TF0標志
        TR1 = 1;                                //定時器0開始計時
        ET1 = 1;                                //使能定時器0中斷
}

void T3_init()                                //5毫秒@11.0592MHz
{
          T4T3M &= 0xFD;                        //定時器時鐘12T模式
    T3L = 0x00;                                 //65536-11.0592M/12/1000
    T3H = 0xEE;

    IE2 = ET3;                                  //使能定時器中斷
    T4T3M |= 0x08;                        //定時器3開始計時
}

void T4_init()                                //5毫秒@11.0592MHz
{         
          T4T3M &= 0xDF;                        //定時器時鐘12T模式
    T4L = 0x00;                                 //65536-11.0592M/12/1000
    T4H = 0xEE;
      
    T4T3M = 0x80;                               //啟動定時器
    IE2 = ET4;                                  //使能定時器中斷
}

void jiare_display()
{
        static bit i=0;
        static uchar temp=0;
        P2=0xff;
        i=~i;
        if(++temp>=200)temp=0;
        if(i==1)
        {
                jiare_ge  = 0;
                jiare_shi = 1;
                P2=table[min/10];
        }
        else
        {
                jiare_ge  = 1;
                jiare_shi = 0;
                if(temp<100)
                        P2=table[min%10]&0xfe;//閃秒
                else P2=table[min%10];
        }
        
}

void lenque_display()
{
        static bit i=0;
        static uchar temp=0;
        P2=0xff;
        i=~i;
        if(++temp>=200)temp=0;
        if(i==1)
        {
                lenque_ge  = 0;
                lenque_shi = 1;
                P2=table[min/10];
        }
        else
        {
                lenque_ge  = 1;
                lenque_shi = 0;
                if(temp<100)
                P2=table[min%10]&0xfe;//閃秒
                else P2=table[min%10];
        }
        
}

void sajun_display()
{
        static bit i=0;
        static uchar temp=0;
        P2=0xff;
        i=~i;
        if(++temp>=200)temp=0;
        if(i==1)
        {
                sajun_ge  = 0;
                sajun_shi = 1;
                P2=table[min/10];
        }
        else
        {
                sajun_ge  = 1;
                sajun_shi = 0;
                if(temp<100)
                P2=table[min%10]&0xfe;//閃秒
                else P2=table[min%10];
        }
        
}

void jiare_daojishi()
{
                if(flag)
                {
                        flag=0;
                        if(++count >= 200)
                                        {
                                        count = 0;
                                        sec--;
                                        if( sec < 0)
                                                {
                                                        sec = 59;
                                                        min--;
                                                        if(min)
                                                        min=99;
                                                }
                                        }
                        jiare_display( );
                                 
                }
}

void lenque_daojishi()
{
                if(flag)
                {
                        flag=0;
                        if(++count >= 200)
                                        {
                                        count = 0;
                                        sec--;
                                        if( sec < 0)
                                                {
                                                        sec = 59;
                                                        min--;
                                                        if(min)
                                                        min=99;
                                                }
                                        }
        lenque_display();
       }
}

void sajun_daojishi()
{
                if(flag)
                {
                        flag=0;
                        if(++count >= 200)
                                        {
                                        count = 0;
                                        sec--;
                                        if( sec < 0)
                                                {
                                                        sec = 59;
                                                        min--;
                                                        if(min)
                                                        min=99;
                                                }
                                        }
      sajun_display();
      }
}

void daojishi()
{
     GPIO_init();
     EA = 1;
     T0_init();
                 T1_init();
     T3_init();         
     T4_init();
                        while (1)
                        {
                                jiare_daojishi();               
                                lenque_daojishi();      
                                sajun_daojishi();
                        }
}

      
void TM0_Isr() interrupt 1 //5毫秒定時器0
{
        TL0 = 0x00;                                //設(shè)置定時初始值
        TH0 = 0xEE;                                //設(shè)置定時初始值
        flag=1;
}

void TM1_Isr() interrupt 3 //5毫秒定時器1
{
        TL1 = 0x00;                                //設(shè)置定時初始值
        TH1 = 0xEE;                                //設(shè)置定時初始值
        flag1=1;
}

void TM3_Isr() interrupt 19 //5毫秒定時器3
{
        TL1 = 0x00;                                //設(shè)置定時初始值
        TH1 = 0xEE;                                //設(shè)置定時初始值
        flag2=1;
}

void TM4_Isr() interrupt 20                    //定時器4  
{
        TL1 = 0x00;                                //設(shè)置定時初始值5ms
        TH1 = 0xEE;                                //設(shè)置定時初始值
        flag3=1;                               //測試端口
}
作者: hjx5548    時間: 2023-11-25 10:26
hhh402 發(fā)表于 2023-11-25 00:58
一個定時器就解決的事,都是5ms定時,用這么多定時器干嘛?如果超過5個倒計時樓主還能寫嗎?

用一個定時器三個倒計時顯示,怎么修改?




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1