找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51时钟小制作

[复制链接]
跳转到指定楼层
楼主
ID:85129 发表于 2015-7-10 19:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以下是时钟的程序,希望能帮助大家!

#include <reg51.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit LS138A = P2^2;   //定义138译码器的输入A脚由P2.2控制
sbit LS138B = P2^3;     //定义138译码器的输入脚B由P2.3控制
sbit LS138C = P2^4;  //定义138译码器的输入脚C由P2.4控制
sbit k1=P2^0;
sbit k2=P2^1 ;
sbit k3=P2^5;
bit flag;
uchar sec=0,min=0,hour=12;
uchar count_10ms, DelayCNT;   // 10ms计时,延时
int m=1;
//此表为 LED 的字模, 共阴数码管 0-9  -
unsigned char code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
void delay(uint z)
{
int x,y;
for(x=z;x>0;x--)
for(y=20;y>0;y--);
}
void timer()
{
TMOD=0x01;         //定时器0的方式1
TH0=0xdc;        //TH0初值 220
TL0=0x00;        //TL0初值 0
EA=1;         //开总中断
ET0=1;      //打开TO中断
TR0=1;      //运行TO中断
}
void key()
{ int t;
  if(k1==0)
   {   
    delay(30);
    if(k1==0)
     { while(!k1);
    t++;
    m=t%2;  //求余数运算,不是1就是0;
   }
   }
}

/************主函数**********************/
main()
{ unsigned int i ;
   unsigned int LedOut[10];
   timer();
  while(1)  //进入循环状态
  {  
   if(m==0)
   {
    if(k2==0)
  {
   delay(30);
   if(k2==0)
   while(!k2);
   hour++;
  }
  if(hour>=24)
  hour=0;
  if(k3==0)
  {
   delay(30);
   if(k3==0)
  
   while(!k3);
  min++;
  }
  if(min>=60)
  min=0;
   }
  LedOut[0]=Disp_Tab[hour/10];
     LedOut[1]=Disp_Tab[hour%10];
     LedOut[2]=Disp_Tab[10];
     LedOut[3]=Disp_Tab[min/10];
  LedOut[4]=Disp_Tab[min%10];   
     LedOut[5]=Disp_Tab[10];  
     LedOut[6]=Disp_Tab[sec/10];     
     LedOut[7]=Disp_Tab[sec%10];               

  for( i=0; i<9; i++)  //实现8位动态扫描循环
  {  
   P0 = LedOut[i];  //将字模送到P0口显示
     
   switch(i)   //使用switch 语句控制位选  也可以是用查表的方式 学员可以试着自己修改      
      {     
   case 0:LS138A=0; LS138B=0; LS138C=0;  break;         
         case 1:LS138A=1; LS138B=0; LS138C=0;  break;              
         case 2:LS138A=0; LS138B=1; LS138C=0;  break;
         case 3:LS138A=1; LS138B=1; LS138C=0;  break;
   case 4:LS138A=0; LS138B=0; LS138C=1;  break;
   case 5:LS138A=1; LS138B=0; LS138C=1;  break;
   case 6:LS138A=0; LS138B=1; LS138C=1;  break;
   case 7:LS138A=1; LS138B=1; LS138C=1;  break;
   
      }
       delay(10);
   }
   
     
  }   
}
void timer1() interrupt 1   // 中断函数
{
  TH0=0xdc;
TH0=0x00;
     key();
if(m)
{
{
count_10ms++;
}
if(count_10ms==10)
{
  count_10ms=0;
  sec++;
  if(sec>=60)
  {
   sec=0;
   min++;
   if(min>=60)
   {
    min=0;
    hour++;
    if(hour>=24)
    {
    hour=0;sec=0;min=0;
    }
   }
  }
}

}
}

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的积分奖励!

查看全部评分

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

使用道具 举报

沙发
ID:1 发表于 2015-7-10 19:40 来自手机 | 只看该作者
很好,谢谢分享,能提供一下电路图吗?
回复

使用道具 举报

板凳
ID:239765 发表于 2017-10-15 22:02 | 只看该作者
楼主好,我自己有一个单片机开发板,用你的程序烧录了下去,现实完美,我想问一下,下面代码中bit flag的作用是什么?我把它删掉了烧录,也现实正常?
sbit k1=P2^0;
sbit k2=P2^1 ;
sbit k3=P2^5;
bit flag;
uchar sec=0,min=0,hour=12;
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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