找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机60s倒计时程序为什么不能显示?

[复制链接]
跳转到指定楼层
楼主
//60s倒计时
#include"stc8.h"
#include "intrins.h"

#define  uint unsigned int
#define  uchar unsigned char   

#define  SEG P1

sbit SCON1 = P3^7;            
sbit SCON2 = P3^6;   

sbit KEY = P3^2;

uchar count=0;
char num=60,ge,shi;
uchar flag;

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

void T0_init()                                //5毫秒@11.0592MHz
{
        AUXR &= 0x7F;                        //定时器时钟12T模式
        TMOD &= 0xF0;                        //设置定时器模式
        TMOD |= 0x01;                        //设置定时器模式
        TL0 = 0x00;                                //设置定时初始值
        TH0 = 0xEE;                                //设置定时初始值
        TF0 = 0;                                //清除TF0标志
        TR0 = 1;                           
        ET0 = 1;                                //使能定时器0中断
        EA = 1;
}

void IO_init()
{
    P3M0 = 0x00; P3M1 = 0x00;
    P1M0 = 0xff; P1M1 = 0x00;

}

void TM0_Isr() interrupt 1 //5毫秒
{
        TL0 = 0x00;                                //设置定时初始值
        TH0 = 0xEE;                                //设置定时初始值
        flag++;
        if (flag=20)
        {
        flag=0;
                num--;
                if (flag=0)
        {
        flag=60;
        }
}
}

void main()
{
IO_init();
T0_init() ;
        while (1)
  {
                SEG=0xff;
                shi=num/10;
                ge=num%10;
                switch (count)
    {
            case0:SCON1 = 0;SCON2=1; SEG = table[ge];
                    break;
            case1:SCON1 = 1;SCON2=0; SEG = table[shi];
                    break;
            default:
                    break;
    }
                count++;
                if (count>1)count=0;
  }

}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1109793 发表于 2024-5-19 10:19 | 只看该作者
每当flag++到20时,flag = 0然后立刻flag=60,然后flag++以后就得等他++到255再变0,重复++到20时再变60,再重复。就是大概flag计数215次num--一次,1075ms减一次,应该可以啊。为啥不显示?是不显示还是不计时?另外,SEG=0XFF是想消隐,但是你这是共阴的,因为你的SCON是设置的标准IO,那么只能共阴极了。共阴极的段码要给0x00才行消隐,你这0xff不是一直亮着吗?还有扫描切换不要放到主循环,这扫描速度得有多快啊。一个位的显示时间可能太短了。消隐也可以把两个SCON都置1。
回复

使用道具 举报

板凳
ID:619259 发表于 2024-5-19 11:23 | 只看该作者
原程序有多处错误:1.  if (flag=20),应改为 if (flag==200)
2.  动态刷新时间太快,需合理设置count++的时间间隔
3.  case0、case1应为case 0、case 1
……
程序修改如下,仅供参考:
void TM0_Isr() interrupt 1 //5毫秒
{
        TL0 = 0x00;           //设置定时初始值
        TH0 = 0xEE;           //设置定时初始值
        flag++;
        if(flag==200)
        {
                flag=0;
                num--;
                if (num==0)
                {
                    num=60;
                       }
         }

        //动态扫描刷新周期为10毫秒
        count++;
             if (count>1)
             {
                       count=0;
             }
}

void main()
{
        IO_init();
        T0_init() ;
        while(1)
          {
                shi=num/10;
                ge=num%10;
                SCON1 = 1;  SCON2 = 1;  //消隐
                switch(count)
                    {
                            case 0:  SCON1 = 1;  SCON2 = 0;  SEG = table[ge];  break;
                            case 1:  SCON1 = 0;  SCON2 = 1;  SEG = table[shi]; break;
                            default: break;
                    }
          }
}


回复

使用道具 举报

地板
ID:72649 发表于 2024-5-19 13:43 | 只看该作者
xiaobendan001 发表于 2024-5-19 10:19
每当flag++到20时,flag = 0然后立刻flag=60,然后flag++以后就得等他++到255再变0,重复++到20时再变60, ...

共阳数码管

51hei图片_20240518215731.png (53.96 KB, 下载次数: 7)

51hei图片_20240518215731.png
回复

使用道具 举报

5#
ID:72649 发表于 2024-5-19 13:44 | 只看该作者
xiaobendan001 发表于 2024-5-19 10:19
每当flag++到20时,flag = 0然后立刻flag=60,然后flag++以后就得等他++到255再变0,重复++到20时再变60, ...

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

使用道具 举报

6#
ID:72649 发表于 2024-5-19 13:48 | 只看该作者
xiaobendan001 发表于 2024-5-19 10:19
每当flag++到20时,flag = 0然后立刻flag=60,然后flag++以后就得等他++到255再变0,重复++到20时再变60, ...

//倒计时
#include"stc8.h"
#include "intrins.h"

#define  uint unsigned int
#define  uchar unsigned char   

#define  SEG P1

sbit SCON1 = P3^7;            
sbit SCON2 = P3^6;   
  
sbit KEY = P3^2;

uchar count=0;
char num=60,ge,shi;
uchar flag;

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

void T0_init()                                //5毫秒@11.0592MHz
{
        AUXR &= 0x7F;                        //定时器时钟12T模式
        TMOD &= 0xF0;                        //设置定时器模式
        TMOD |= 0x01;                        //设置定时器模式
        TL0 = 0x00;                                //设置定时初始值
        TH0 = 0xEE;                                //设置定时初始值
        TF0 = 0;                                //清除TF0标志
        TR0 = 1;                           
        ET0 = 1;                                //使能定时器0中断
        EA = 1;
}

void IO_init()
{
    P3M0 = 0x00; P3M1 = 0x00;
    P1M0 = 0xff; P1M1 = 0x00;

}

void TM0_Isr() interrupt 1 //5毫秒
{
        TL0 = 0x00;                                //设置定时初始值
        TH0 = 0xEE;                                //设置定时初始值
        flag++;
        if (flag=20)
        {
        flag=0;
                num--;
                if (num=0)
        {
        num=60;
        }
}
}

void main()
{
IO_init();
T0_init() ;
        while (1)
  {
                SEG=0;
                shi=num/10;
                ge=num%10;
                switch (count)
    {
            case0:SCON1 = 0;SCON2=1; SEG = table[ge];
                    break;
            case1:SCON1 = 1;SCON2=0; SEG = table[shi];
                    break;
            default:
                    break;
    }
                count++;
                if (count>1)count=0;
  }

}



















回复

使用道具 举报

7#
ID:72649 发表于 2024-5-19 13:50 | 只看该作者
hjx5548 发表于 2024-5-19 13:44
void TM0_Isr() interrupt 1 //5毫秒
{
        TL0 = 0x00;                                //设置定 ...

这样也不能显示?
回复

使用道具 举报

8#
ID:1109793 发表于 2024-5-19 17:28 | 只看该作者

共阳极的那你得吧两个SCON设置为推挽才行啊。要不然标准IO的高电平电流同时点亮8个段,即使亮也几乎看不到吧。消隐要让SCON=0,输出SEG之后再把对应的SCON=1
回复

使用道具 举报

9#
ID:619259 发表于 2024-5-19 20:08 | 只看该作者

共阳的数码管,你用共阴的代码,提问之前请先说明清楚。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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