📄 clock.c
字号:
/************************************************************************************/
/* 程序名:数码管显示的时钟代码 */
/* */
/* 晶振:12.0 M CPU型号:AT89S52 */
/* */
/* */
/* 功能描述: 数码管时钟显示,需将J2跳线帽插上 */
/* 但是要拔去LCD12864和LCD1602! */
/* */
/* http://www.mculover.net */
/* http://www.mculover.net/bbs */
/* */
/* */
/* 湘灵电子工作室 版权所有 */
/* 2006-03-20 */
/************************************************************************************/
#include<reg51.h>
#define _TH0_TL0_ (65536 - 50000)
#define HI (_TH0_TL0_ / 256) //给高8位赋值
#define LO (_TH0_TL0_ % 256) //给低8位赋值
#define M 20 //(1000/50)1秒要50个中断的累计
sbit P2_0 = P2 ^ 0;
sbit P2_1 = P2 ^ 1;
sbit P2_2 = P2 ^ 2;
sbit P2_3 = P2 ^ 3;
sbit P2_4 = P2 ^ 4;
sbit P2_5 = P2 ^ 5;
sbit P2_6 = P2 ^ 6;
sbit P2_7 = P2 ^ 7;
unsigned char hour = 12, min = 20, sec = 20; //初始化时分秒的值
unsigned char SEG_TAB[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};//0-9数字
/*********************************************************************************************/
void Delay(unsigned char a)//延时程序
{
unsigned char j;
while(--a != 0)
{
for (j = 0; j < 125; j++);
}
}
/*********************************************************************************************/
void Disp(void)//数码管显示
{
P2_7 = 0; //第一个数码管显示时的十位
P0 = SEG_TAB[ hour / 10 ];
Delay(4);
P2_7 = 1;
P2_6 = 0;//第2个数码管显示时的个位
P0 = SEG_TAB[ hour % 10 ];
Delay(4);
P2_6 = 1;
P2_4 = 0;//第4个数码管显示分的十位
P0 = SEG_TAB[ min / 10 ];
Delay(4);
P2_4 = 1;
P2_3 = 0;//第5个数码管显示分的个位
P0 =SEG_TAB[ min % 10 ];
Delay(4);
P2_3 = 1;
P2_1 = 0;//第7个数码管显示秒的十位
P0 = SEG_TAB[ sec / 10 ];
Delay(4);
P2_1 = 1;
P2_0 = 0;//第8个数码管显示秒的各位。
P0 = SEG_TAB[ sec % 10 ];
Delay(4);
P2_0 = 1;
}
/********************************************************************************************/
void IsrTimer0(void) interrupt 1 using 1 //定时器0中断服务程序
{
static unsigned char count = 0; //定义静态变量count
TR0 = 0; //以下调整出栈入栈的时间误差
TL0 += (_TH0_TL0_ + 9) % 256;
TH0 += (_TH0_TL0_ + 9) / 256 + (char)CY;
TR0 = 1;
count++;
if(count == M)//1秒种时间到
{
count = 0;
sec++;
if(sec == 60)//1分钟时间到
{
min++;
sec = 0;
if(min == 60)//1小时时间到
{
hour++;
min = 0;
if(hour == 24)//24小时时间到
{
hour = 0;
min = 0;
sec = 0;
}
}
}
}//if
}
/******************************************************************************************/
void Timer0Init(void) //初始化定时器0程序
{
TMOD = 0x01; //设置模式1 定时器0 工作方式0
TH0 = HI; //给TH0,TL0赋初始值
TL0 = LO;
TR0 = 1; //启动定时器0
ET0 = 1; //定时器中断开
EA = 1; //总中断开
}
/******************************************************************************************/
void main(void)//主函数
{
Timer0Init();//初始化定时器0
while(1)
{
Disp();//显示时间
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -