单片机,数字电子钟

新年将至,研究所的其他同学已经到家了,作为外省的我还留在学校。父母在家倍是思念,因此,我也即将离去。寒假决定学习单片机,现在还在路上,回家后就不能像在所里面软硬件结合的学习了,除了看书还是看书,于是回家之际,结合郭天祥的单片机实验开发板,我自己设计了一个很简单的数字电子钟的C语言程序,以激励自己不断地学习单片机。

 

本程序采用数码管动态显示的方式,7段数码管分时选用,采用定时中断操作。其中定时器0作为秒的计时,定时器1作为数码管的扫描时间的定时,简单实现时间的按秒显示,在运行24个小时后,启动扬声器作为一个循环的信号,然后Keil 编译,烧写入单片机,实现程序的运行,源程序如下:

 

 

 

#include<reg52.h>
#define uint unsigned int
#define ucr unsigned char
sbit d1=P2^3;//扬声器的控制端
sbit d2=P2^6;
sbit d3=P2^7;
ucr code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
ucr shishi,shige,fenshi,fenge,miaoshi,miaoge;aa,bb;
unsigned long temp;
void innit(void);
void delay(uint);
void display(ucr,ucr,ucr,ucr,ucr,ucr);
unsigned long jiance(ucr,ucr,ucr,ucr,ucr,ucr);

 

void main()
{
    innit();
   while(1)
   {  
      while(bb>=5);//不断地进行扫描
      {
           if(aa==20);//1秒定时到时
             {
                  d1=1;
                   aa=0;
                    temp++;// 显示的数字加1
             }
           else          //不断地进行扫描显示
            {
                 bb=0;
                  shishi=temp/100000;
                  shige=temp%100000/10000;
                  fenshi=temp%10000/1000;
                  fenge=temp%1000/100;
                  miaoshi=temp%100/10;
                  miaoge=temp%10;
                  jiance(shishi,shige,fenshi,fenge,miaoshi,miaoge);
            }
        }
    }
}

 

void innit()           //初始化程序
{
      d2=0;
      d3=0;
       temp=0;
      TMOD=0x21;
      TH0=(65536-50000)/256;
      TL0=(65536-50000)%256;
      TL1=200;
      EA=1;
      ET0=1;
      ET1=1;
      TR0=1;
      TR1=1;
}


void timer0() interrupt 1
{
     TH0=(65536-50000)/256;
     TL0=(65536-50000)%256;
     aa++;
}

 

void timer1() interrupt 3
{
     TL1=220;
     bb++;
}

 

void delay(uint z)
{
      uint x,y;
      for(x=z;x>0;x--)
            for(y=110;y>0;y--);
}

 

unsigned long jiance(ucr shishi,ucr shige,ucr fenshi,ucr fenge,ucr miaoshi,ucr miaoge)//时间和十进制的转换
{
     if(miaoshi==6)
    {
       miaoshi=0;
       fenge++;
    }
   else if(fenshi==6)
   {
      fenshi=0;
      shige++;
   }
   else if(shishi==2&&shige==4)
   {
     shishi=0;
     shige=0;
     fenge=0;
     fenshi=0;
     miaoshi=0;
     miaoge=0;
     d1=0;                       //当时间是凌晨00时扬声器鸣一次
   }

   display(shishi,shige,fenshi,fenge,miaoshi,miaoge);
   temp=shishi*100000+shige*10000+fenshi*1000+fenge*100+miaoshi*10+miaoge;
   return (temp);
}


void display(ucr shishi,ucr shige,ucr fenshi,ucr fenge,ucr miaoshi,ucr miaoge)//显示时间
{

      d2=1;
       P0=table[shishi];
      d2=0;
      d3=1;
      P0=0xfe;
      d3=0;
      delay(1);

 

      d2=1;
      P0=table[shige];
      d2=0;
      d3=1;
      P0=0xfd;
      d3=0;
      delay(1);

 

      d2=1;
      P0=table[fenshi];
      d2=0;
      d3=1;
      P0=0xfb;
      d3=0;
      delay(1);

 

      d2=1;
      P0=table[fenge];
      d2=0;
      d3=1;
      P0=0xf7;
      d3=0;
      delay(1);

 

      d2=1;
       P0=table[miaoshi];
      d2=0;
      d3=1;
      P0=0xef;
     d3=0;
     delay(1);

 

      d2=1;
     P0=table[miaoge];
     d2=0;
     d3=1;
     P0=0xdf;
     d3=0;
     delay(1);   
}

 

                                                                                    小贝,记于2009年自动化研究所最后一晚(农历)

                                                                                                              2010年2月7日

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值