找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1781|回復: 12
打印 上一主題 下一主題
收起左側(cè)

STC8H單片機三個定時器做了三個倒計時顯示,為什么不能同時顯示?

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:72649 發(fā)表于 2023-11-22 07:14 來自觸屏版 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
STC8H三個定時器做了三個倒計時顯示,為什么不能同時顯示?主程序里單獨一個倒計時顯示正常。怎么才能讓三個倒計時同時顯示?
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:712097 發(fā)表于 2023-11-22 10:50 | 只看該作者
用RTOS? 具體程序和電路貼出來大家?guī)湍惴治鲆幌隆?/td>
回復

使用道具 舉報

板凳
ID:72649 發(fā)表于 2023-11-22 11:19 | 只看該作者
chxelc 發(fā)表于 2023-11-22 10:50
用RTOS? 具體程序和電路貼出來大家?guī)湍惴治鲆幌隆?/blockquote>

程序貼出來了,看看什么原因?
回復

使用道具 舉報

地板
ID:72649 發(fā)表于 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;                               //測試端口
}
回復

使用道具 舉報

5#
ID:161164 發(fā)表于 2023-11-22 14:03 | 只看該作者

回復

使用道具 舉報

6#
ID:72649 發(fā)表于 2023-11-22 16:08 | 只看該作者
回復

使用道具 舉報

7#
ID:123289 發(fā)表于 2023-11-22 16:10 | 只看該作者
顯示與定時器如何用無關(guān),是你邏輯混亂。
如下:
顯示程序這樣寫:
1、從變量X1中取出一個數(shù)字,顯示于屏幕的某處,如第一行。
2、從變量X2中取出一個數(shù)字,顯示于屏幕的某處,如第二行。
3、從變量X3中取出一個數(shù)字,顯示于屏幕的某處,如第三行。
顯示程序?qū)懞弥,再做這樣的事:
將三個定器時的倒計時值分別放在:X1、X2、X3中就可以了。
回復

使用道具 舉報

8#
ID:72649 發(fā)表于 2023-11-22 16:10 | 只看該作者
回復

使用道具 舉報

9#
ID:72649 發(fā)表于 2023-11-22 16:31 來自觸屏版 | 只看該作者
yzwzfyz 發(fā)表于 2023-11-22 16:10
顯示與定時器如何用無關(guān),是你邏輯混亂。
如下:
顯示程序這樣寫:

還有個問題,最后兩位數(shù)碼管只能顯示一位
回復

使用道具 舉報

10#
ID:72649 發(fā)表于 2023-11-22 16:33 來自觸屏版 | 只看該作者
lkc8210 發(fā)表于 2023-11-22 14:03

按照你這樣修改了,但是最后兩位數(shù)碼管只能顯示一位
回復

使用道具 舉報

11#
ID:491577 發(fā)表于 2023-11-25 00:58 | 只看該作者
一個定時器就解決的事,都是5ms定時,用這么多定時器干嘛?如果超過5個倒計時樓主還能寫嗎?
回復

使用道具 舉報

12#
ID:72649 發(fā)表于 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;                               //測試端口
}
回復

使用道具 舉報

13#
ID:72649 發(fā)表于 2023-11-25 10:26 | 只看該作者
hhh402 發(fā)表于 2023-11-25 00:58
一個定時器就解決的事,都是5ms定時,用這么多定時器干嘛?如果超過5個倒計時樓主還能寫嗎?

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

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表