找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STC8H单片机三个定时器做了三个倒计时显示,为什么不能同时显示?

[复制链接]
跳转到指定楼层
楼主
ID:72649 发表于 2023-11-22 07:14 来自手机 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STC8H三个定时器做了三个倒计时显示,为什么不能同时显示?主程序里单独一个倒计时显示正常。怎么才能让三个倒计时同时显示?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:712097 发表于 2023-11-22 10:50 | 只看该作者
用RTOS? 具体程序和电路贴出来大家帮你分析一下。
回复

使用道具 举报

板凳
ID:72649 发表于 2023-11-22 11:19 | 只看该作者
chxelc 发表于 2023-11-22 10:50
用RTOS? 具体程序和电路贴出来大家帮你分析一下。

程序贴出来了,看看什么原因?
回复

使用道具 举报

地板
ID:72649 发表于 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;                               //测试端口
}
回复

使用道具 举报

5#
ID:161164 发表于 2023-11-22 14:03 | 只看该作者

回复

使用道具 举报

6#
ID:72649 发表于 2023-11-22 16:08 | 只看该作者
回复

使用道具 举报

7#
ID:123289 发表于 2023-11-22 16:10 | 只看该作者
显示与定时器如何用无关,是你逻辑混乱。
如下:
显示程序这样写:
1、从变量X1中取出一个数字,显示于屏幕的某处,如第一行。
2、从变量X2中取出一个数字,显示于屏幕的某处,如第二行。
3、从变量X3中取出一个数字,显示于屏幕的某处,如第三行。
显示程序写好之后,再做这样的事:
将三个定器时的倒计时值分别放在:X1、X2、X3中就可以了。
回复

使用道具 举报

8#
ID:72649 发表于 2023-11-22 16:10 | 只看该作者
回复

使用道具 举报

9#
ID:72649 发表于 2023-11-22 16:31 来自手机 | 只看该作者
yzwzfyz 发表于 2023-11-22 16:10
显示与定时器如何用无关,是你逻辑混乱。
如下:
显示程序这样写:

还有个问题,最后两位数码管只能显示一位
回复

使用道具 举报

10#
ID:72649 发表于 2023-11-22 16:33 来自手机 | 只看该作者
lkc8210 发表于 2023-11-22 14:03

按照你这样修改了,但是最后两位数码管只能显示一位
回复

使用道具 举报

11#
ID:491577 发表于 2023-11-25 00:58 | 只看该作者
一个定时器就解决的事,都是5ms定时,用这么多定时器干嘛?如果超过5个倒计时楼主还能写吗?
回复

使用道具 举报

12#
ID:72649 发表于 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;                               //测试端口
}
回复

使用道具 举报

13#
ID:72649 发表于 2023-11-25 10:26 | 只看该作者
hhh402 发表于 2023-11-25 00:58
一个定时器就解决的事,都是5ms定时,用这么多定时器干嘛?如果超过5个倒计时楼主还能写吗?

用一个定时器三个倒计时显示,怎么修改?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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