/*-----------------------------------------------
名称:电子时钟
编写:周文东
日期:2019.1
修改:无
内容:8位数码管分别显示小时,分钟, 秒
------------------------------------------------*/
#include<reg51.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换
sbit LATCH1=P2^3;//定义锁存使能端口 段锁存
sbit LATCH2=P2^2;// 位锁存
unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9
unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码
unsigned char TempData[8]; //存储显示值的全局变量
unsigned char ms;//定义一个变量
unsigned char sec,min,hour;//定义秒,分,时
void Delay(unsigned int t); //函数声明
void Display(unsigned char FirstBit,unsigned char Num);
void Deal_Tim(void);
/*------------------------------------------------
函数与主函数
------------------------------------------------*/
void TIM_Init()
{
TMOD = 0X01;//开启定时器0
TH0 = 0X3C;//初始值的高四位。
TL0 = 0XB0;//初始值的低四位。
EA = 1;//中断允许总开关
ET0 = 1;//定时器0 中断允许。
TR0 = 1;//TCON控制寄存器,定时器0的运行控制位
}
void main()
{
TIM_Init();
while(1)
{
Deal_Tim();//调用时间处理函数。
TempData[0]=dofly_DuanMa[hour/10];//分解显示信息,
TempData[1]=dofly_DuanMa[hour%10];
TempData[2]=0x40;
TempData[3]=dofly_DuanMa[min/10];//分解显示信息,
TempData[4]=dofly_DuanMa[min%10];
TempData[5]=0x40;
TempData[6]=dofly_DuanMa[sec/10];//分解显示信息,
TempData[7]=dofly_DuanMa[sec%10];
Display(0,8);
}
}
/*------------------------------------------------
延时函数,含有输入参数 unsigned int t,无返回值
unsigned int 是定义无符号整形变量,其值的范围是
0~65535
------------------------------------------------*/
void Delay(unsigned int t)
{
while(--t);
}
/*------------------------------------------------
显示函数,用于动态扫描数码管
输入参数 FirstBit 表示需要显示的第一位,如赋值2表示
从第三个数码管开始显示
如输入0表示从第一个显示。
Num表示需要显示的位数,如需要显示99两位数值则该值输入2
------------------------------------------------*/
void Display(unsigned char FirstBit,unsigned char Num)
{
unsigned char i;
for(i=0;i<Num;i++)
{
DataPort=0; //清空数据,防止有交替重影
LATCH1=1; //段锁存
LATCH1=0;
DataPort=dofly_WeiMa[i+FirstBit]; //取位码
LATCH2=1; //位锁存
LATCH2=0;
DataPort=TempData[i]; //取显示数据,段码
LATCH1=1; //段锁存
LATCH1=0;
Delay(200); // 扫描间隙延时,时间太长会闪烁,
//太短会造成重影
}
}
void ISR_TIM(void) interrupt 1
{
EA = 0;//进入中断函数时,先关闭。
TH0 = 0X3C;//高四位
TL0 = 0XB0;//低四位
ms++;
if(ms == 20)//因为一个周期是50ms,当计量ms为20,即20*50ms=1s时,sec+1
{
ms = 0;//ms归0
sec++;
}
EA =1;//中断允许总开关打开
}
void Deal_Tim(void)//时间处理函数,将秒,分, 时的进位单独写一个函数,减少中断函数运行时间。
{
if(sec == 60)//当秒为60时,秒归0,分+1
{
sec = 0;
min++;
}
if(min == 60)//当分为60时,分归0,时+1
{
min = 0;
hour++;
}
if(hour == 24)//当时为24时,小时归0,
{
hour = 0;
}
}
跑表(精度0.01s)
#include<reg51.h>
#define DataPort P0
sbit LATCH1=P2^3;//定义段
sbit LATCH2=P2^2;//定义位
unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//
unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//
unsigned char TempData[8];
unsigned char j;//定义计数
unsigned char ms, s;//定义毫秒与秒
void Delay(unsigned int t);
void Display(unsigned char FirstBit,unsigned char Num);
void Deal_Tim(void);
/*------------------------------------------------
函数与主函数
------------------------------------------------*/
void TIM_Init()//定时器0的初始定义
{
TMOD = 0X01;
TH0 = 0xd8;
TL0 = 0xf0;
EA = 1;
ET0 = 1;
TR0 = 1;
}
main()
{
TIM_Init();
while(1)
{
Deal_Tim();
TempData[0]=dofly_DuanMa[s/10];
TempData[1]=dofly_DuanMa[s%10];
TempData[2]=0x80;
TempData[3]=dofly_DuanMa[ms/10];
TempData[4]=dofly_DuanMa[ms%10];
Display(3,5);
}
}
void Delay(unsigned int t)//delay函数
{
while(--t);
}
void Display(unsigned char FirstBit,unsigned char Num)
{
unsigned char i;
for(i=0;i<Num;i++)
{
DataPort=0;
LATCH1=1;
LATCH1=0;
DataPort=dofly_WeiMa[i+FirstBit];
LATCH2=1;
LATCH2=0;
DataPort=TempData[i];
LATCH1=1;
LATCH1=0;
Delay(200);
}
}
void ISR_TIM(void) interrupt 1
{
EA = 0;
TH0 = 0xd8;
TL0 = 0xf0;
j++;
if(j == 1)
{
j = 0;
ms++;
}
EA =1;
}
void Deal_Tim(void)
{
if(ms == 100)
{
ms = 0;
s++;
}
if(s == 100)
{
s = 0;
}
}
10秒定时炸弹
#include <reg51.h>
#define DataPort P0
sbit LATCH1=P2^3;
sbit LATCH2=P2^2;
sbit B1 = P1^0;
unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char TempData[8];
unsigned char j = 0;
unsigned char s = 10;//由10倒数
unsigned int n;//定义一个蜂鸣器循环时长
void Delay(unsigned int t);
void Display(unsigned char FirstBit,unsigned char Num);
/*------------------------------------------------
函数与主函数
------------------------------------------------*/
void TIM_Init()
{
TMOD = 0X01;
TH0 = 0x3c;
TL0 = 0xb0;
EA = 1;
ET0 = 1;
TR0 = 1;
}
main()
{
TIM_Init();
while(1)
{
TempData[0]=dofly_DuanMa[s/10];
TempData[1]=dofly_DuanMa[s%10];
Display(6,2);
}
}
void Delay(unsigned int t)
{
while(--t);
}
void Display(unsigned char FirstBit,unsigned char Num)
{
unsigned char i;
for(i=0;i<Num;i++)
{
DataPort=0;
LATCH1=1;
LATCH1=0;
DataPort=dofly_WeiMa[i+FirstBit];
LATCH2=1;
LATCH2=0;
DataPort=TempData[i];
LATCH1=1;
LATCH1=0;
Delay(200);
}
}
void ISR_TIM(void) interrupt 1
{
EA = 0;
TH0 = 0x3c;
TL0 = 0xb0;
j++;
if(j == 20)
{
j = 0;
s--;
}
if(s == 0)
{
TempData[0]=dofly_DuanMa[s/10];
TempData[1]=dofly_DuanMa[s%10];
Display(6,2);
n = 2000;
while(n--)
{
B1 = ~B1;
Delay(100);
}
TR0 = 0;
}
EA =1;
}