微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 8位数码管同时显示两个时钟

8位数码管同时显示两个时钟

时间:10-02 整理:3721RD 点击:
小白刚学单片机,想弄个8位数码管同时显示两个时钟,但是仿真的时候一直停留在如图画面:

代码如下,哪位大神能帮我看一下吗?
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar a1,a2,fen1,miao1,fen2,miao2,fen11,fen12,fen21,fen22,miao11,miao12,miao21,miao22;
uchar code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};  //LED显示字模
uchar BitTab[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01 }; //LED位驱动码
void init();//初始化函数
void display();//显示函数
void delay(uint z);//延时函数
void main()//主函数
{
init();
while(1)//等待中断,并不停地动态扫描,定时器的时间到了,则中断发生,然后时间数值变化一次,时间不到则不停动态扫描。
      {
    fen11=fen1/10;//数值变化
           fen12=fen1%10;
           miao11=miao1/10;
           miao12=miao1%10;
    fen21=fen2/10;//数值变化
           fen22=fen2%10;
           miao21=miao2/10;
           miao22=miao2%10;
    display();//显示函数
  }
}
void delay(uint z)//延时子函数
{       uint x,y;
     for(x=z;x>0;x--)
        for(y=110;y>0;y--);
}
void init()//初始化变量,开启中断
{      
fen1=1;
miao1=0;

TMOD=0x11;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1; //计数器0开始运行
TR1=1;
    EA=1;
ET1=1;
}
void display()//显示子函数
{
    P2=BitTab[0];//位选
  P0=table[fen11];//段选
  delay(1);
    P2=BitTab[1];
  P0=table[fen12];
  delay(1);
    P2=BitTab[2];
  P0=table[miao11];
  delay(1);
    P2=BitTab[3];
  P0=table[miao12];
  delay(1);
    P2=BitTab[4];//位选
  P0=table[fen21];//段选
  delay(1);
    P2=BitTab[5];
  P0=table[fen22];
  delay(1);
    P2=BitTab[6];
  P0=table[miao21];
  delay(1);
    P2=BitTab[7];
  P0=table[miao22];
  delay(1);
}
void T0_time() interrupt 1 //中断服务程序
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
a1++;
a2++;
   if(a1==20)//一秒钟
   {
       a1=0;
       miao1++;
       if(miao1==60)//秒钟
       {   
            miao1=0;
            fen1++;
            if(fen1==60)//分钟
            {
             fen1=0;
                    
            }
       }
   }
if(a2==20)//一秒钟
   {
       a2=0;
       miao2++;
       if(miao2==60)//秒钟
       {   
            miao2=0;
            fen2++;
            if(fen2==60)//分钟
            {
             fen1=0;
                    
            }
       }
   }
}


初始化定时器少了一句:ET0 = 1;加上去就OK了~

另外把TR1 = 1;和 ET1 = 1注释掉

  嗯嗯,谢谢。早上起来的时候也发现了这个问题,但是改了这个问题还是不行,后来我把中断拆分成了两个中断就运行正常了

东西不错,学习一下,谢谢小编

        

这个只是一部分功能,我想通过按键实现设置每一位数码管的值,不知道如何写程序

提供个思路,你用定时器扫描数码管,主程序WHILE里面扫描按键

中断程序尽量短,可以把判断语句放在主循环,另外数码管显示在输入新的段数据并延时后要关闭位选

顶顶顶顶顶顶顶顶顶

谢谢分享的好资料

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top