找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1742|回复: 23
收起左侧

99分钟倒计时为什么显示00?附单片机程序

[复制链接]
ID:72649 发表于 2023-9-21 04:36 | 显示全部楼层 |阅读模式
//99分倒计时
#include"stc8.h"
#include"intrins.h"

#define  uint unsigned int
#define  uchar unsigned char        
uchar A1,A2,count,second,min;

sbit ge = P1^1;            
sbit shi = P1^0;   

sbit LIGHT_JDQ = P3^7;   

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 IO_init();        
void delay(uchar i);
void T0_init();
void display(uchar sh_c,uchar g_c);        
        
void IO_init()
{
    P0M0 = 0x00;
    P0M1 = 0x00;
    P1M0 = 0x00;
    P1M1 = 0x00;
    P2M0 = 0x00;
    P2M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
    P4M0 = 0x00;
    P4M1 = 0x00;
    P5M0 = 0x00;
    P5M1 = 0x00;
}

void delay(uchar n)
{
        uchar j,k;
  for(j=n;j>0;j--)
    for(k=125;k>0;k--);
}

void T0_init()
{
                AUXR |= 0x80;                        //定时器时钟1T模式
                TMOD &= 0xF0;                        //设置定时器模式
                TL0 = 0xD7;                                //设置定时初始值50us
                TH0 = 0xFD;                                //设置定时初始值
    TR0 = 1;                                    //启动定时器
    ET0 = 1;                                    //使能定时器中断
    EA = 1;
}

void display(uchar sh_c,uchar g_c)
{
   P2=0;
   P2=table[sh_c];
   ge = 0;
         shi = 1;
   delay(5);
        
   P2=0;
   P2=table[g_c];   
   shi = 0;
         ge = 1;
   delay(5);
}

void main()
  {
                 IO_init();
                 T0_init();
               
     while(1)
       {
                                         if(count = 0)
                      count = 20;
        
                second--;
                if(second = 0)
                      second = 60;
                                        min--;
                                        if(min = 0)
                                        min=99;
                                       
         A1=min/10;
         A2=min%10;
                                 display(A1,A2);
                         }
    }
        
void TM0_Isr() interrupt 1
{
                  TL0 = 0xD7;                                //设置定时初始值50us
            TH0 = 0xFD;                                //设置定时初始值
            count--;
}        

回复

使用道具 举报

ID:584814 发表于 2023-9-21 09:12 | 显示全部楼层
每次进中断都会进行初始化
回复

使用道具 举报

ID:466505 发表于 2023-9-21 09:23 | 显示全部楼层
if(count = 0)  后面还有一个  if(second = 0)
回复

使用道具 举报

ID:1064915 发表于 2023-9-21 09:57 | 显示全部楼层
设置定时初始值50us
count = 20;
50us×20=1000us=1ms

TL0 = 0x00;                                //设置定时初始值5ms
TH0 = 0x28;                                //设置定时初始值
回复

使用道具 举报

ID:213173 发表于 2023-9-21 11:35 | 显示全部楼层
问题比较多,给你改了。
  1. //99分倒计时
  2. #include"stc8.h"
  3. #include "intrins.h"

  4. #define  uint unsigned int
  5. #define  uchar unsigned char      

  6. sbit ge = P1^1;            
  7. sbit shi = P1^0;   
  8. sbit LIGHT_JDQ = P3^7;   

  9. uchar count;
  10. char sec,min;
  11. bit flag;

  12. uchar code table[]={      
  13.         0x03,/*0*/
  14.         0x9F,/*1*/
  15.         0x25,/*2*/
  16.         0x0D,/*3*/
  17.         0x99,/*4*/
  18.         0x49,/*5*/
  19.         0x41,/*6*/
  20.         0x1F,/*7*/
  21.         0x01,/*8*/
  22.         0x09,/*9*/};

  23. //sbit a = P2^7;
  24. //sbit b = P2^6;
  25. //sbit c = P2^5;
  26. //sbit d = P2^4;
  27. //sbit e = P2^3;
  28. //sbit f = P2^2;
  29. //sbit g = P2^1;
  30. //sbit h = P2^0;
  31. //sbit LED_com = P3^1;
  32.       
  33. void IO_init();      
  34. //void delay(uchar i);
  35. void T0_init();
  36. void display();      
  37.       
  38. void IO_init()
  39. {
  40.         P0M0 = 0x00;
  41.         P0M1 = 0x00;
  42.         P1M0 = 0x00;
  43.         P1M1 = 0x00;
  44.         P2M0 = 0x00;
  45.         P2M1 = 0x00;
  46.         P3M0 = 0x00;
  47.         P3M1 = 0x00;
  48.         P4M0 = 0x00;
  49.         P4M1 = 0x00;
  50.         P5M0 = 0x00;
  51.         P5M1 = 0x00;
  52. }
  53. /*
  54. void delay(uchar n)
  55. {
  56.         uchar j,k;
  57.         for(j=n;j>0;j--)
  58.                 for(k=125;k>0;k--);
  59. }*/


  60. void T0_init()                                //5毫秒@11.0592MHz
  61. {
  62.         AUXR &= 0x7F;                        //定时器时钟12T模式
  63.         TMOD &= 0xF0;                        //设置定时器模式
  64.         TMOD |= 0x01;                        //设置定时器模式
  65.         TL0 = 0x00;                                //设置定时初始值
  66.         TH0 = 0xEE;                                //设置定时初始值
  67.         TF0 = 0;                                //清除TF0标志
  68.         TR0 = 1;                                //定时器0开始计时
  69.         ET0 = 1;                                //使能定时器0中断
  70.         EA = 1;
  71. }

  72. void display()
  73. {
  74.         static bit i=0;
  75.         static uchar temp=0;
  76.         P2=0xff;
  77.         i=~i;
  78.         if(++temp>=200)temp=0;
  79.         if(i==1)
  80.         {
  81.                 ge  = 0;
  82.                 shi = 1;
  83.                 P2=table[min/10];
  84.         }
  85.         else
  86.         {
  87.                 ge  = 1;
  88.                 shi = 0;
  89.                 if(temp<100)
  90.                         P2=table[min%10]&0xfe;//闪秒
  91.                 else P2=table[min%10];
  92.         }
  93.         
  94. }

  95. void main()
  96. {
  97.         IO_init();
  98.         T0_init();
  99.         
  100.         while(1)
  101.         {
  102.                 if(flag)
  103.                 {
  104.                         flag=0;
  105.                         if(++count >= 200)
  106.                         {
  107.                                 count = 0;
  108.                                 sec--;
  109.                                 if(sec < 0)
  110.                                 {
  111.                                         sec = 59;
  112.                                         min--;
  113.                                         if(min < 0)
  114.                                                 min=99;
  115.                                 }
  116.                         }
  117.                         display();
  118.                 }
  119.         }
  120. }
  121.       
  122. void TM0_Isr() interrupt 1 //5毫秒
  123. {
  124.         TL0 = 0x00;                                //设置定时初始值
  125.         TH0 = 0xEE;                                //设置定时初始值
  126.         flag=1;
  127. }
复制代码
回复

使用道具 举报

ID:72649 发表于 2023-9-21 12:31 | 显示全部楼层
joyb 发表于 2023-9-21 09:57
设置定时初始值50us
count = 20;
50us×20=1000us=1ms

    TL0 = 0x66;                                 //65536-11.0592M/12/1000
    TH0 = 0xfc;
这样设置也不行啊
回复

使用道具 举报

ID:72649 发表于 2023-9-21 12:31 | 显示全部楼层
man1234567 发表于 2023-9-21 09:12
每次进中断都会进行初始化

应该怎样修改
回复

使用道具 举报

ID:72649 发表于 2023-9-21 12:33 | 显示全部楼层
hcfat51h 发表于 2023-9-21 09:23
if(count = 0)  后面还有一个  if(second = 0)

中断计数到了一秒,秒继续计数到一分钟啊。怎样修改?
回复

使用道具 举报

ID:72649 发表于 2023-9-21 12:47 | 显示全部楼层
man1234567 发表于 2023-9-21 09:12
每次进中断都会进行初始化

void TM0_Isr() interrupt 1
{
//    TL0 = 0x66;                                 //65536-11.0592M/12/1000
//    TH0 = 0xfc;                               //设置定时初始值
            count--;
}  屏蔽了也不行
回复

使用道具 举报

ID:466505 发表于 2023-9-21 14:35 | 显示全部楼层
hjx5548 发表于 2023-9-21 12:33
中断计数到了一秒,秒继续计数到一分钟啊。怎样修改?

你if后面括号里是赋值不是比较啊,,相当每个循环执行一次,定时器压根没用
回复

使用道具 举报

ID:72649 发表于 2023-9-25 06:32 来自手机 | 显示全部楼层
wulin 发表于 2023-9-21 11:35
问题比较多,给你改了。

测试了你的代码,应该是9分钟倒计时,怎么改为99分钟倒计时。
回复

使用道具 举报

ID:72649 发表于 2023-11-23 22:09 | 显示全部楼层
wulin 发表于 2023-9-21 11:35
问题比较多,给你改了。

参考你的代码修改为四位倒计时(99:59倒计时),哪里不对?下面是代码:
//99:59分倒计时
#include"stc8H.h"
#include "intrins.h"

#define  uint unsigned int
#define  uchar unsigned char

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

sbit time_ge  = P1^3;
sbit time_shi  = P1^2;
sbit time_bai  = P1^1;
sbit time_qian  = P1^0;

sbit temp_ge  = P3^3;
sbit temp_shi  = P1^5;
sbit temp_bai  = P1^4;


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

void GPIO_init();
void T0_init() ;
void time_display();
void time_daojishi();

void GPIO_init()
{
    P0M0 = 0x00; P0M1 = 0x00;
    P1M0 = 0x00; P1M1 = 0x00;
    P2M0 = 0x00; P2M1 = 0x00;
    P3M0 = 0x00; P3M1 = 0x00;
    P5M0 = 0x00; P5M1 = 0x00;
}

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 time_display()
{
        static bit i=0;
        static uchar temp=0;
        P2=0xff;
        i=~i;
        if(++temp>=200)temp=0;
        if(i==1)
        {
                time_ge  = 0;
                time_shi = 1;
                                              time_bai  = 1;
                time_qian  = 1;
                P2=table[min/10];
        }
                               

         else if(i==2)
        {
                time_ge  = 1;
                time_shi = 0;
                                              time_bai  = 1;
                time_qian  = 1;
                if(temp<100)
                P2=table[min%10]&0xfe;//闪秒
//                else P2=table[min%10];
        }
                               
                                else if(i==3)
        {
                time_ge  = 1;
                time_shi = 1;
                                              time_bai  = 0;
                time_qian  = 1;
                if(temp<60)
                P2=table[sec/10];
        }
                               
                                else if(i==4)
        {
                time_ge  = 1;
                time_shi = 1;
                                              time_bai  = 0;
                time_qian  = 1;
                if(temp<60)
                P2=table[sec%10]&0xfe;//闪秒
                else P2=table[min%10];
        }       
        
}

void main()
{
                GPIO_init();
                T0_init();
                       
                P2=table[8];       
                temp_ge  = 0;
                temp_shi  = 0;
                //temp_bai  = 0;
                       
                                                while(1)
                                                {
                                                                                if(flag)
                                                                                {
                                                                                                                flag=0;
                                                                                                                if(++count >= 200)
                                                                                                                {
                                                                                                                                                count = 0;
                                                                                                                                                sec--;
                                                                                                                                                if(sec < 0)
                                                                                                                                                {
                                                                                                                                                                                sec = 59;
                                                                                                                                                                                min--;
                                                                                                                                                                                if(min < 0)
                                                                                                                                                                                                                min=99;
                                                                                                                                                }
                                                                                                                }
                                                                                                                display();
                                                                                }
                }
}

void TM0_Isr() interrupt 1 //5毫秒定时器0
{
        TL0 = 0x00;                                //设置定时初始值
        TH0 = 0xEE;                                //设置定时初始值
        flag=1;
}
回复

使用道具 举报

ID:161164 发表于 2023-11-24 09:12 | 显示全部楼层
hjx5548 发表于 2023-11-23 22:09
参考你的代码修改为四位倒计时(99:59倒计时),哪里不对?下面是代码:
//99:59分倒计时
#include"stc ...

为啥把显示函数名改了?
STC8的定时器模式0是16位自动重装的
中断函数里那两句设置定时初始值可以不要
回复

使用道具 举报

ID:213173 发表于 2023-11-24 09:28 | 显示全部楼层
hjx5548 发表于 2023-11-23 22:09
参考你的代码修改为四位倒计时(99:59倒计时),哪里不对?下面是代码:
//99:59分倒计时
#include"stc ...

无标题.jpg
  1. #include"stc8H.h"
  2. #include "intrins.h"

  3. #define  uint unsigned int
  4. #define  uchar unsigned char

  5. uchar count;
  6. char sec,min;
  7. bit flag;

  8. uchar code table[]={      
  9. 0x03,/*0*/
  10. 0x9F,/*1*/
  11. 0x25,/*2*/
  12. 0x0D,/*3*/
  13. 0x99,/*4*/
  14. 0x49,/*5*/
  15. 0x41,/*6*/
  16. 0x1F,/*7*/
  17. 0x01,/*8*/
  18. 0x09,/*9*/};

  19. void GPIO_init();
  20. void T0_init() ;
  21. void time_display();

  22. void GPIO_init()
  23. {
  24.         P0M0 = 0x00; P0M1 = 0x00;
  25.         P1M0 = 0x00; P1M1 = 0x00;
  26.         P2M0 = 0x00; P2M1 = 0x00;
  27.         P3M0 = 0x00; P3M1 = 0x00;
  28.         P5M0 = 0x00; P5M1 = 0x00;
  29. }

  30. void T0_init(void)                //5毫秒@11.0592MHz
  31. {
  32.         AUXR &= 0x7F;                        //定时器时钟12T模式
  33.         TMOD &= 0xF0;                        //设置定时器模式
  34.         TMOD |= 0x01;                        //设置定时器模式
  35.         TL0 = 0x00;                                //设置定时初始值
  36.         TH0 = 0xEE;                                //设置定时初始值
  37.         TF0 = 0;                                //清除TF0标志
  38.         TR0 = 1;                                //定时器0开始计时
  39.         ET0 = 1;                                //使能定时器0中断
  40.         EA  = 1;                                //使能总中断
  41. }

  42. void time_display()
  43. {
  44.         static uchar i=0;
  45.         P1&=0xf0;
  46.         switch(i)
  47.         {
  48.                 case 0: P2=table[min/10]; break;
  49.                 case 1: P2=table[min%10]&0xfe; break;
  50.                 case 2: P2=table[sec/10]; break;
  51.                 case 3: P2=table[sec%10]; break;
  52.         }       
  53.         P1|=0x01<<i;
  54.         i=++i%4;
  55. }

  56. void main()
  57. {
  58.         GPIO_init();
  59.         T0_init();
  60.         while(1)
  61.         {
  62.                 if(flag)
  63.                 {
  64.                         flag=0;
  65.                         time_display();
  66.                         if(++count >= 200)
  67.                         {
  68.                                 count = 0;
  69.                                 if(--sec < 0)
  70.                                 {
  71.                                         sec = 59;
  72.                                         if(--min < 0)
  73.                                                 min=99;
  74.                                 }
  75.                         }
  76.                 }
  77.         }
  78. }

  79. void TM0_Isr() interrupt 1 //5毫秒定时器0
  80. {
  81.         TL0 = 0x00;  //设置定时初始值
  82.         TH0 = 0xEE;  //设置定时初始值
  83.         flag=1;
  84. }
复制代码



回复

使用道具 举报

ID:72649 发表于 2023-11-24 11:52 | 显示全部楼层
lkc8210 发表于 2023-11-24 09:12
为啥把显示函数名改了?
STC8的定时器模式0是16位自动重装的
中断函数里那两句设置定时初始值可以不要

//99:59分倒计时
#include"stc8H.h"
#include "intrins.h"

#define  uint unsigned int
#define  uchar unsigned char

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

sbit time_ge  = P1^3;
sbit time_shi  = P1^2;
sbit time_bai  = P1^1;
sbit time_qian  = P1^0;

sbit temp_ge  = P3^3;
sbit temp_shi  = P1^5;
sbit temp_bai  = P1^4;


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

void GPIO_init();
void T0_init() ;
void time_display();
void time_daojishi();

void GPIO_init()
{
    P0M0 = 0x00; P0M1 = 0x00;
    P1M0 = 0x00; P1M1 = 0x00;
    P2M0 = 0x00; P2M1 = 0x00;
    P3M0 = 0x00; P3M1 = 0x00;
    P5M0 = 0x00; P5M1 = 0x00;
}

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 time_display()
{
        static bit i=0;
        static uchar temp=0;
        P2=0xff;
        i=~i;
        if(++temp>=200)temp=0;
        if(i==1)
        {
                time_ge  = 0;
                time_shi = 1;
                time_bai  = 1;
                time_qian  = 1;
                P2=table[min/10];
        }
         else if(i==2)
        {
                time_ge  = 1;
                time_shi = 0;
                 time_bai  = 1;
                time_qian  = 1;
                if(temp<100)
                P2=table[min%10]&0xfe;//闪秒
                else P2=table[min%10];
        }                          
         else if(i==3)
        {
                time_ge  = 1;
                time_shi = 1;
                time_bai  = 0;
                time_qian  = 1;
                if(temp<60)
                P2=table[sec/10];
        }                     
         else if(i==4)
        {
                time_ge  = 1;
                time_shi = 1;
                 time_bai  = 0;
                time_qian  = 1;
                if(temp<60)
                P2=table[sec%10]&0xfe;//闪秒
                else P2=table[min%10];
        }        
}

void main()
{
            EA = 1;
      GPIO_init();
      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;
                                                                                        }
                                                                 }
                                                                time_display();
                                                 }
         }
}

void TM0_Isr() interrupt 1 //5毫秒定时器0
{
        flag=1;
}
回复

使用道具 举报

ID:72649 发表于 2023-11-24 12:24 | 显示全部楼层

这个代码9999和8888交替显示
回复

使用道具 举报

ID:72649 发表于 2023-11-24 12:33 | 显示全部楼层

       这里这样修改对吗?
        P1|=0xfe<<i;
        i=++i%4;

P1|=0xfe<<i; i=++i%4;

        P1|=0xfe<<i;         i=++i%4;
回复

使用道具 举报

ID:72649 发表于 2023-11-24 12:36 | 显示全部楼层
hjx5548 发表于 2023-11-24 12:24
这个代码9999和8888交替显示

应该这样的
111.png
回复

使用道具 举报

ID:72649 发表于 2023-11-24 13:02 | 显示全部楼层
数码管显示乱码
回复

使用道具 举报

ID:213173 发表于 2023-11-24 13:11 | 显示全部楼层

这样改
void time_display()
{
        static uchar i=0;
        P1|=0xff;
        switch(i)
        {
                case 0: P2=table[min/10]; break;
                case 1: P2=table[min%10]&0xfe; break;
                case 2: P2=table[sec/10]; break;
                case 3: P2=table[sec%10]; break;
        }       
        P1&=~(0x01<<i);
        i=++i%4;
}
回复

使用道具 举报

ID:72649 发表于 2023-11-24 21:26 | 显示全部楼层
wulin 发表于 2023-11-24 13:11
这样改
void time_display()
{

分钟十位数不能显示
回复

使用道具 举报

ID:213173 发表于 2023-11-25 06:49 | 显示全部楼层
hjx5548 发表于 2023-11-24 21:26
分钟十位数不能显示

检查软件端口定义与实际电路是否相符
无标题.jpg

回复

使用道具 举报

ID:213173 发表于 2023-11-25 08:11 | 显示全部楼层
hjx5548 发表于 2023-11-24 12:33
这里这样修改对吗?
        P1|=0xfe

123212pwm1eeufm6ykh31e.png
你提供的两个图不一样。如果按这个图的接线,数码管程序应该这样写
void time_display()
{
        static uchar i=0;
        P1|=0xff;
        switch(i)
        {
                case 0: P2=table[min/10];     P1&=0xfe; break;
                case 1: P2=table[min%10]&0xfe;P1&=0xfd; break;
                case 2: P2=table[sec/10];     P1&=0xf7; break;
                case 3: P2=table[sec%10];     P1&=0xfb; break;
        }              
        i=++i%4;
}

回复

使用道具 举报

ID:72649 发表于 2023-11-25 10:24 | 显示全部楼层
wulin 发表于 2023-11-25 08:11
你提供的两个图不一样。如果按这个图的接线,数码管程序应该这样写
void time_display()
{

显示正常了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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