注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
张泽龙的个人空间 https://home.eeworld.com.cn/space-uid-126438.html [收藏] [复制] [分享] [RSS]
日志

数码管动态时钟

已有 1187 次阅读2009-12-12 14:35

/*******************************
目地:实现数码管动态时钟
目标系统:基于51单片机
应用软件: kile 
 
圆版时间: 2009-12-12
开发人员: Zhangzelong
*******************************/
/***************
硬件接法:P0口作为位选和段选数据线,
          P2.0接段选74LS573锁存器控制端LE0,
    P2.1接位选74LS573锁存器控制端LE1
*****************/
#include<reg51.h>
#include<INTRINS.H> //代码中引用_nop_()函数
#define uchar unsigned char   //宏定义简化程序
#define uint unsigned int
sbit LE_d=P2^0;     // 位定义LE_d和LE_w方便对段和位进行操作
sbit LE_w=P2^1;

//led_ca数组存放共阳字符码
uchar code led_ca[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,   //0~9
                     0x88,0x83,0xc6,0xa1,0x86,0x8e,                       //a~f
       0x89,0xc7,0x8c,0xce,0xc1,0x91,0xbf,0x7f,0xff };      //h,l,p,r,u,y,-,'.',熄灭

//t用作记定时器50MS溢出次数 ,S_time用作记秒,M_time用作记分,H_time用作记时
uint t=0,S_time=0,M_time=21,H_time=13;
void delay()
 {uchar i;
  for(i=0;i<1;i++)
   _nop_();
 }
/*********
  delay_10ms函数:使用T1工作方式0实现10MS延时
 ********/
void delay_5ms()
 {
         uchar i;
     TH1=0x63;TL1=0x18; //装初值
  
    TR1=1;            //开定时器
   while(!TF1);      //查询是否溢出
   TF1=0;            //软件清0
 
 }

/***********
To_int()函数:定时器0中断类型号为1,用于
************/
void To_int() interrupt 1
 {
    TH0=0X3C;
  TL0=0XB0;
    t++;
  if(t==20)
    {
    t=0; S_time++;
    if(S_time==60)
     {
       S_time=0;M_time++;
     if(M_time==60)
      {
         M_time=0;H_time++;
                 if(H_time==24)
         H_time=0;
      }
   }
  }
 }

/****************
display函数:动态显示数码管
   形参名:duan为选择要显示数字的字符,wei为选择要在第几位显示
*****************/ 
void display(uchar duan,uchar wei)
 {
   uchar w=1;        //位选码初始值为01H
  
 
 w<<=wei-1; P0=w;       //选择要显示的位
   LE_w=1;          //关闭位选锁器锁存功能,送出位选数据
 LE_w=0;          //开启位选锁器锁存功能
  
  
 P0=led_ca[duan];    //送出要显示数字 
 LE_d=1;          //关闭段选锁器锁存功能,送出段选数据
 LE_d=0;         //开启位段锁器锁存功能
   delay();    //显示10MS

   P0=0xff;         //消影
   LE_d=1;          //关闭段选锁器锁存功能,送出段选数据
 LE_d=0;          //开启位段锁器锁存功能
 }
 
 void main()
 {
 /*****
   使用T0工作方式一并开启其中断,
   使用T1定时器工件方式0用作数码管显示中的延时
    *****/
   TMOD=0X01;
   TH0=0X3C;TL0=0XB0;
 EA=1;ET0=1;TR0=1;
 LE_d=0;LE_w=0;
   while(1)
   {
      display(H_time/10,1);
   display(H_time%10,2);
   display(22,3);
       display(M_time/10,4);
   display(M_time%10,5);
         display(22,6);
       display(S_time/10,7);
         display(S_time%10,8);
   }
 }
发表评论 评论 (1 个评论)
回复 辛昕 2010-6-16 23:02
谢谢分享。
在你的程序里,我学到了消影,于是解决了我的问题。
另外,向你规范的编程习惯学习!!

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章