利用AT89C52编写一个简易的时钟

这个是学校单片机上机考试的一个例题,自己简单编了一下。

上方是一个简单的原理图,利用的是共阳极的八位数码管。

下方就直接附上程序。

#include <reg51.h>
#include <stdio.h>
#define uchar unsigned char 
#define uint unsigned int 
uchar code t[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
uchar code seg1[]={0xa4,0xc0,0xa4,0xb0,0xf9,0xa4,0xa4,0x80};//20231228
uchar list[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0-9
uchar seg2[8]={0xa4,0xb0,0xbf,0x92,0x90,0xbf,0x92,0xc0};  //重点,如果数组里的数需要改变的话,不能定义为uchar code ,23-59-50
uchar a=23,b=59,c=50;//a存储小时,b存储分钟,c存储秒
uchar a1,a2,b1,b2,c1,c2;//a1,a2存储小时拆分成十位和个位,其他同理
uchar temp=0;//存储50ms的计数值,满20使秒数进1
void delayXms(uint x)
{
   uchar j;
   while(x--)for(j=0;j<125;j++){;}
   }
void int0() interrupt 1 using 1
{
       TH0=0x3c; //定时值50ms
       TL0=0xb0;
       temp++;
      if(temp==20)   
      {
	 temp=0;
	 c++;
	 c1=c/10;
	 c2=c%10;
	 seg2[6]=list[c1];
	 seg2[7]=list[c2];
	 if(c==60)
	 {
	    c=0;
	    c1=c/10;  //重新对于c清零后的数组赋值
	    c2=c%10;
	    seg2[6]=list[c1];
	    seg2[7]=list[c2];
	    b++;
	    b1=b/10;
	    b2=b%10;
	    seg2[3]=list[b1];
	    seg2[4]=list[b2];
	    if(b==60)
	    {
	       b=0;
	        b1=b/10;  //重新对于b清零后的数组赋值
		b2=b%10;
	       seg2[3]=list[b1];
	       seg2[4]=list[b2];
	       a++;
	       a1=a/10;
	       a2=a%10;
	       seg2[0]=list[a1];
	       seg2[1]=list[a2];
	       if(a==24)
		  {
		  a=0;
		  a1=a/10;  //重新对于a清零后的数组赋值
		  a2=a%10;
		  seg2[0]=list[a1];
		  seg2[1]=list[a2];
		   }
	       }
	 }
      }
}
void main(void)
 { 
    uchar i;
    TMOD=0x01;
    EA=1;
    ET0=1;
    TH0=0x3c; //定时值50ms
    TL0=0xb0;
    TR0=1;
   while (1)
   {
      if(c2>=0&&c2<5)
      {
      for(i=0;i<8;i++)
      {
	 P2=t[i];
	 P0=seg2[i];
	 delayXms(3);
	 }
      }
      if(c2>=5&&c2<=9)
      {
	 for(i=0;i<8;i++)
      {
	 P2=t[i];
	 P0=seg1[i];
	 delayXms(3);
	 }
	 }
      }
      
 }

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值