久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

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

作者: hjx5548    時間: 2023-11-22 07:14
標題: STC8H單片機三個定時器做了三個倒計時顯示,為什么不能同時顯示?
STC8H三個定時器做了三個倒計時顯示,為什么不能同時顯示?主程序里單獨一個倒計時顯示正常。怎么才能讓三個倒計時同時顯示?
作者: chxelc    時間: 2023-11-22 10:50
用RTOS? 具體程序和電路貼出來大家幫你分析一下。
作者: hjx5548    時間: 2023-11-22 11:19
chxelc 發表于 2023-11-22 10:50
用RTOS? 具體程序和電路貼出來大家幫你分析一下。

程序貼出來了,看看什么原因?
作者: 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;                        //設置定時器模式
        TL0 = 0x00;                                //設置定時初始值
        TH0 = 0xEE;                                //設置定時初始值
        TF0 = 0;                                //清除TF0標志
        TR0 = 1;                                //定時器0開始計時
        ET0 = 1;                                //使能定時器0中斷
        
}

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

              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;                                //設置定時初始值
        TH0 = 0xEE;                                //設置定時初始值
        flag=1;
}

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

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

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


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

還是顯示一組
作者: yzwzfyz    時間: 2023-11-22 16:10
顯示與定時器如何用無關,是你邏輯混亂。
如下:
顯示程序這樣寫:
1、從變量X1中取出一個數字,顯示于屏幕的某處,如第一行。
2、從變量X2中取出一個數字,顯示于屏幕的某處,如第二行。
3、從變量X3中取出一個數字,顯示于屏幕的某處,如第三行。
顯示程序寫好之后,再做這樣的事:
將三個定器時的倒計時值分別放在:X1、X2、X3中就可以了。
作者: hjx5548    時間: 2023-11-22 16:10
lkc8210 發表于 2023-11-22 14:03

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

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

按照你這樣修改了,但是最后兩位數碼管只能顯示一位
作者: 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;                        //設置定時器模式
        TL0 = 0x00;                                //設置定時初始值
        TH0 = 0xEE;                                //設置定時初始值
        TF0 = 0;                                //清除TF0標志
        TR0 = 1;                                //定時器0開始計時
        ET0 = 1;                                //使能定時器0中斷
        
}

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

              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;                                //設置定時初始值
        TH0 = 0xEE;                                //設置定時初始值
        flag=1;
}

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

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

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

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




歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 欧美福利在线 | 日本在线免费观看 | 国产精品理论片 | 精品久久免费视频 | 日韩av高清在线观看 | 精品视频99 | 毛片网站在线观看 | 国产一区二区三区视频在线 | 五月婷婷在线播放 | 免费黄色一级 | 日韩女优在线 | 黄色一级视频网站 | 天天操天天操 | 免费国产黄色 | 美日韩丰满少妇在线观看 | 国产日韩精品在线 | 欧美激情小视频 | 91看片淫黄大片 | 婷婷综合色 | 国产精品二区一区二区aⅴ污介绍 | 久久免费看片 | 三级黄色片 | 电家庭影院午夜 | 欧美精品乱码99久久蜜桃 | 国产中文字幕在线 | 黄色成人免费视频 | 日韩av资源 | 精品亚洲一区二区三区四区五区 | 日韩欧美国产一区二区三区 | 老司机午夜免费精品视频 | 午夜h| 免费av网站在线观看 | 亚洲偷| 高清一区二区 | 五月天黄色网址 | 玖玖视频在线 | 四虎网站在线观看 | 精品国产毛片 | 久久精品视频网站 | 青青草免费观看 | 在线一区二区三区 |