📄 18_01_1.c
字号:
/*
;***************************************************************************
; 此实验实现简易的数字钟,通过数码管显示出来
; 学习数码管的动态扫描原理及方法
; 掌握定时器T0的TMOD控制寄存器的使用方法及初值的计算;
; 掌握定时器T0的溢出中断工作原理及方法
; supermcu@126.com
; www.supermcu.com
; SP0602-S52单片机学习实验开发系统
;***************************************************************************
*/
#include <REGX51.H>
#define LEDDATAPORT P0
#define LEDBITPORT P2
const unsigned char LEDDATA[]=
{
0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71,
0x00,0x40,0x38,0x37,
};
unsigned char LEDBuffer[8]={0,0,17,0,0,17,0,0};
unsigned char ScanLEDCount;
struct ClockStruct
{
unsigned char Hour;
unsigned char Minute;
unsigned char Second;
unsigned int Count;
unsigned char RunFlag;
};
struct ClockStruct Clock;
void main(void)
{
TMOD=0x01;
TH0=(65536-1843)/256;
TL0=(65536-1843)%256;
ET0=1;
TR0=1;
EA=1;
while(1);
}
void timer0(void) interrupt 1
{
TH0=(65536-1843)/256;
TL0=(65536-1843)%256;
LEDDATAPORT=LEDDATA[LEDBuffer[ScanLEDCount]];
LEDBITPORT=ScanLEDCount;
ScanLEDCount++;
if(ScanLEDCount==sizeof(LEDBuffer))ScanLEDCount=0;
Clock.Count++;
if((Clock.Count%500)==0)
{
if(LEDBuffer[2]==17)
{
LEDBuffer[2]=16;
LEDBuffer[5]=16;
}
else
{
LEDBuffer[2]=17;
LEDBuffer[5]=17;
}
}
if(Clock.Count==1000)
{
Clock.Count=0;
Clock.Second++;
if(Clock.Second==60)
{
Clock.Second=0;
Clock.Minute++;
if(Clock.Minute==60)
{
Clock.Hour++;
if(Clock.Hour==24)Clock.Hour=0;
}
}
LEDBuffer[0]=Clock.Second%10;
LEDBuffer[1]=Clock.Second/10;
LEDBuffer[3]=Clock.Minute%10;
LEDBuffer[4]=Clock.Minute/10;
LEDBuffer[6]=Clock.Hour%10;
LEDBuffer[7]=Clock.Hour/10;
}
}
/*
;***************************************************************************
; 在开发板上运行显示的格式为"HH-MM-SS"
;***************************************************************************
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -