/*******************************
目地:实现数码管动态时钟
目标系统:基于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);
}
}