📄 clock2.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位赋值3C
#define LO (_TH0_TL0_ % 256) //给低8位赋值B0
#define M 20 //(1000/50)1秒要50个中断的累计
//65536-0X3CB0=50000
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 = 0, sec = 0; //初始化时分秒的值
struct Time{
unsigned char hour;
unsigned char min;
unsigned char sec;
}clock;
//struct Time clock;
unsigned char SEG_TAB[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};//0-9数字
unsigned char Led[6];
/*********************************************************************************************/
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 ];
Led[0] = clock.hour / 10;
P0 = SEG_TAB[Led[0]];
Delay(4);
P2_7 = 1;
P2_6 = 0;//第2个数码管显示时的个位
//P0 = SEG_TAB[ hour % 10 ];
Led[1] = clock.hour % 10;
P0 = SEG_TAB[Led[1]];
Delay(4);
P2_6 = 1;
P2_4 = 0;//第4个数码管显示分的十位
// P0 = SEG_TAB[ min / 10 ];
Led[2] = clock.min / 10;
P0 = SEG_TAB[Led[2]];
Delay(4);
P2_4 = 1;
P2_3 = 0;//第5个数码管显示分的个位
// P0 =SEG_TAB[ min % 10 ];
Led[3] = clock.min % 10;
P0 = SEG_TAB[Led[3]];
Delay(4);
P2_3 = 1;
P2_1 = 0;//第7个数码管显示秒的十位
// P0 = SEG_TAB[ sec / 10 ];
Led[4] = clock.sec / 10;
P0 = SEG_TAB[Led[4]];
Delay(4);
P2_1 = 1;
P2_0 = 0;//第8个数码管显示秒的各位。
// P0 = SEG_TAB[ sec % 10 ];
Led[5] = clock.sec % 10;
P0 = SEG_TAB[Led[5]];
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;
clock.sec++;
if( clock.sec == 60)//1分钟时间到
{
clock.min++;
clock.sec = 0;
if( clock.min == 60)//1小时时间到
{
clock.hour++;
clock.min = 0;
if( clock.hour == 24)//24小时时间到
{
clock.hour = 0;
clock.min = 0;
clock.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 + -