打印

电子时钟分秒

[复制链接]
1731|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
#include <reg51.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit LS138A = P2^0;   
sbit LS138B = P2^1;     
sbit LS138C = P2^2;
sbit s1=P3^2;
sbit s2=P3^3;
sbit s3=P3^4;
uint tt,num0,num1,num2,num3,s1num=0,s2num=0;
void delay(uint);  
void Show();
void Button();
void init();   
uchar code Disp_Tab0[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xc0,0xff};
uchar code Disp_Tab1[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0xc0,0xff};
uchar code Disp_Tab2[] = {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x40,0x7f};
void main()   //主函数
{
init();  //调用初始函数
Show();//调用显示函数
}
void init()// 初始函数
{
num0=1;
num1=1;
num2=1;
num3=1;
P0=0xc0;
P2=0x00;
P2=0x01;
P2=0x03;
P2=0x04;
P0=0x40;
P2=0x02;
tt=0;
TMOD=0x01;//设置定时器0为工作方式1
TH0=(65536-50000)/256;//定时器0高8位初值
TL0=(65536-50000)%256;// 定时器0低8位初值
EA=1;//开总中断
ET0=1;//开定时器0中断
TR0=1;//启动定时器0
}
void Show()//显示函数
{
while(1)
{
  if(s1==0)//判断第一个按钮是否按下
  {
   delay(5);
   if(s1==0)//第一个按键去抖
   {
    s1num++;
    s2num=0;
    while(!s1);
   }
  }
  if(s1num==1)
  {
   tt=0;
   Button();//调用按键函数
  }
  else     //进入时钟运行状态
  {
   s1num=0;
   if(tt==20)
   {
    tt=0;
    if(num0<11)
    {
     P2=0x04;
     P0=Disp_Tab0[num0];//时钟的秒个位
     P2=0x00;
     num0++;
    }
    if(num0==11)
    {
     num0=1;
     if(num1<7)
     {
      P2=0x04;
      P0=Disp_Tab1[num1];//时钟的秒十位
      P2=0x01;
      num1++;
     }
     if(num1==7)
     {
      num1=1;
      if(num2<11)
      {
       P2=0x04;
       P0=Disp_Tab2[num2];//时钟的分个位
       P2=0x02;
       num2++;
      }
      if(num2==11)
      {
       num2=1;
       if(num3<7)
       {
        P2=0x04;
        P0=Disp_Tab1[num3];//时钟的分十位
        P2=0x03;
        num3++;
       }
       if(num3==7)
        num3=1;
      }
     }
    }
   }
  }
}
}
void Button()//按键函数
{
P2=0x04;
if(s2==0)//判断第二个键是否按下
{
  delay(5);
  if(s2==0)//去抖动
  {
   s2num++;
   while(!s2);
  }
}
if(s2num<5)
{
  if(s2num==0)
  {s2num++;};
  if(s2num==1)
  {
   P0=Disp_Tab0[11];//数码管闪烁中的变暗
   P2=0x00;
   delay(100);
   P0=Disp_Tab0[num0-1];//数码管闪烁中的变亮
   delay(100);
   P2=0x04;
   if(s3==0)//判断第三个按钮是否按下
   {
    delay(5);
    if(s3==0)//去抖动
    {
     while(!s3);
     num0++;
     if(num0<11)
     {
      P1=Disp_Tab0[num0];
      P2=0x00;
      P1=0xff;
     }
     else
      num0=1;
    }
   }
  }
  if(s2num==2)
  {
   P0=Disp_Tab0[11];
   P2=0x01;
   delay(100);
   P0=Disp_Tab1[num1-1];
   delay(100);
   P2=0x04;
   if(s3==0)
   {
    delay(5);
    if(s3==0)
    {
     while(!s3);
     num1++;
     if(num1<7)
     {
      P1=Disp_Tab1[num1];
      P2=0x01;
      P1=0xff;
     }
     else
      num1=1;
    }
   }
  }
  if(s2num==3)
  {
   P0=Disp_Tab2[11];
   P2=0x02;
   delay(100);
   P0=Disp_Tab2[num2-1];
   delay(100);
   P2=0x04;
   if(s3==0)
   {
    delay(5);
    if(s3==0)
    {
     while(!s3);
     num2++;
     if(num2<11)
     {
      P1=Disp_Tab2[num2];
      P2=0x02;
      P1=0xff;
     }
     else
      num2=1;
    }
   }
  }
  if(s2num==4)
  {
   P0=Disp_Tab0[11];
   P2=0x03;
   delay(100);
   P0=Disp_Tab1[num3-1];
   delay(100);
   P2=0x04;
   if(s3==0)
   {
    delay(5);
    if(s3==0)
    {
     while(!s3);
     num3++;
     if(num3<7)
     {
      P1=Disp_Tab1[num3];
      P2=0x03;
      P1=0xff;
     }
     else
      num3=1;
    }
   }
  }
}
else
s2num=0;
}
void delay(uint z)//延时函数
{
uint x,y;
for(x=z;x>0;x--)
  for(y=110;y>0;y--);
}
void time0() interrupt 1     //定时器0函数
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
tt++;
}

QQ截图未命名.gif (22.45 KB )

QQ截图未命名.gif

相关帖子

沙发
闪电风暴|  楼主 | 2011-3-21 23:46 | 只看该作者
实验说明:
        1. 一秒定时的实现。
        设定定时器每100us中断一次,在中断服务程序中,对中断次数进行计数,计数10000次就是1秒。
        2.分、秒的显示
        用四个数码管配合373芯片的锁存功能就可以完整地显示分、秒信息。373芯片的片选则需要138芯片的译码和04芯片的取反。
        3. 调时的实现
        利用单片机的外部中断和三个按键,我们可以方便的实现调时功能。比如三个按键开关产生的中断信息可以分别用于“开始(停止)调时”、“选择调时位”、“当前选择位+1”。
        4. 实现按键的软件去抖动功能。
        5. 最好能够实现调时位的闪烁功能。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

24

帖子

1

粉丝