📄 01.c
字号:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
#define NOP(); {_nop_(); _nop_(); _nop_(); _nop_();} /* 定义空操作指令 */
sbit shuma1_cs = P2^0;
sbit shuma2_cs = P2^1;
sbit shuma3_cs = P2^2;
sbit shuma4_cs = P2^3;
sbit shumadp_cs = P2^4;
sbit BEEP = P1^4;
sbit stop = P1^3;
sbit inter = P3^3;
uint Data[4];
uchar data CLOCK[4] = {0,0,0,0}; /*存放时钟时间(依次为百分秒,秒,分,时)*/
uchar data SECOND[2] = {0,0}; /*存放秒表时间,(依次为百分秒,秒)*/
uchar data REVERSE[4] = {0,0,0,0}; /*存放倒计时时间(依次为百分秒,秒,分,时)*/
uchar data STATE = 0;
unsigned char code SEG_DATA[17] =
{
0xbf,0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, /* 0*-, 0,1,2,3,4,5,6,7 */
0x80,0x90,0x88,0x83,0xa7,0xa1,0x86,0x8e, /* 8* 8,9,A,B,C,D,E,F */
};
/**************************************延时程序***********************************/
void delay(unsigned long v)
{
while(v!=0)v--;
}
/***************************************显示程序**********************************/
void LEDplay(a)
{
uint i;
for (i = 0;i < a;i++)
{
//********数码1***********
shuma1_cs = 0;
P0 = SEG_DATA[Data[0]];
delay (100);
shuma1_cs = 1;
//********数码2***********
shuma2_cs = 0;
P0 = SEG_DATA[Data[1]];
delay (100);
shuma2_cs = 1;
//********数码3**********
shuma3_cs = 0;
P0 = SEG_DATA[Data[2]];
delay (100);
shuma3_cs = 1;
//********数码4**********
shuma4_cs = 0;
P0 = SEG_DATA[Data[3]];
delay (100);
shuma4_cs = 1;
//********************
}
}
/****************************用T0完成24小时时钟显示***********************/
void time0 (void) interrupt 1 using 1
{
TH0=0xDC; // 单片机的晶振为11.0592M时,且选择了模式1,要定时10ms是
TL0=0X00;
/*时钟处理*/
CLOCK[0] = CLOCK[0] + 1;
if (CLOCK[0] == 100)
{
CLOCK[0] = 0;
CLOCK[1] = CLOCK[1]+1;
if (CLOCK[1] == 60)
{
CLOCK[1] = 0;
CLOCK[2] = CLOCK[2] + 1;
if (CLOCK[2] == 60)
{
CLOCK[2] = 0;
CLOCK[3] = CLOCK[3] + 1;
if (CLOCK[3] == 24)
{
CLOCK[3] = 0;
}
}
}
}
}
/************************用T2完成秒表和倒计时***************************/
void time2 (void) interrupt 5 using 1
{
TF2=0;
TH2=0xDC;//重置定时常数 单片机的晶振为11.0592M时,且选择了模式1,要定时10ms是,经计算得TH0=0xDC,TL0=0x00
TL2=0X00;
/*秒表处理*/
if (STATE == 0)
{
SECOND[0] = SECOND[0] + 1;
if ( SECOND[0] == 100)
{
SECOND[0] = 0;
SECOND[1] = SECOND[1] + 1;
if ( SECOND[1] == 100)
{
SECOND[1] = 0;
}
}
}
/*秒倒计时处理*/
if (STATE == 3)
{
REVERSE[0] = REVERSE[0] + 1;
if (REVERSE[0] == 100)
{
REVERSE[0] = 0;
REVERSE[1] = REVERSE[1] -1;
}
if (REVERSE[1] == 0)
{
if ((REVERSE[2] == 0)&&(REVERSE[1] == 0))
{
BEEP = 0;
TR2 = 0;
}
else
{
REVERSE[2] = REVERSE[2] - 1;
REVERSE[1] =59;
}
}
}
}
/*************************************时间挑调整:********************************/
void intsvr1 (void) interrupt 2 using 2
{
if(STATE==5) //时钟分调整
{
CLOCK[2] = CLOCK[2]+1;
if(CLOCK[2] == 60) CLOCK[2] = 0;
}
if(STATE == 6) //时钟时调整
{
CLOCK[3] = CLOCK[3]+1;
if(CLOCK[3] == 24) CLOCK[3] = 0;
}
if (STATE == 1) //秒表定数:
{
REVERSE[1] = REVERSE[1]+1;
if(REVERSE[1] == 60) REVERSE[1] = 0;
}
if (STATE == 2)
{
REVERSE[2] = REVERSE[2]+1;
if (REVERSE[2] == 60) REVERSE[2] = 0;
}
if ((STATE == 0)&&(stop == 1))
{
uint i;
SECOND[0] = 0;
SECOND[1] = 0;
for (i = 0;i < 4;i++)
switch (i)
{
case 0:Data[2] = SECOND[0]%10; break;
case 1:Data[3] = SECOND[0]/10; break;
case 2:Data[1] = SECOND[1]%10; break;
default :Data[0] = SECOND[1]/10;
}
}
}
/*****************************************主程序***************************************/
void main (void)
{
uint i;
TMOD = 0x01;
T2CON = 0x00;
TH0 = 0xDC; //重置定时常数 单片机的晶振为11.0592M时,且选择了模式1,要定时10ms
TL0 = 0X00;
TH2 = 0xDC; //重置定时常数 单片机的晶振为11.0592M时,且选择了模式1,定时10ms
TL2 = 0X00;
for(i = 0;i < 4;i++)
{ CLOCK[i] = 0;
SECOND[i%2] = 0;
REVERSE[i] = 0;}
STATE = P1&0x07;
EA = 1; ET0 = 1; IT1 = 1; EX1 = 1; TR0 = 1;
shumadp_cs = 0;
while (1)
{
switch (STATE)
{
case 0:
{
BEEP = 1;
TR2 = 1;
EX1 = 0;
ET1 = 1;
if(stop == 1) TR2 = 0;
else
for (i = 0;i < 4;i++)
switch (i)
{
case 0:Data[2] = SECOND[0]%10+1;break;
case 1:Data[3] = SECOND[0]/10+1;break;
case 2:Data[1] = SECOND[1]%10+1;break;
default :Data[0] = SECOND[1]/10+1;
}
}break;
case 1:
{
BEEP = 1;
IE1 = 0;
EX1 = 1;
ET1 = 0;
ET2 = 1;
TR0 = 0;
for(i=0;i<4;i++)
switch(i)
{
case 0:Data[3]=REVERSE[1]%10+1;break;
case 1:Data[2]=REVERSE[1]/10+1;break;
case 2:Data[1]=REVERSE[2]%10+1;break;
default :Data[0]=REVERSE[2]/10+1;
}
} break;
case 2:
{
BEEP=1;
IE1 = 0;
EX1 = 1;
ET1 = 0;
ET2 = 1;
TR0 = 0;
for(i=0;i<4;i++)
switch(i)
{
case 0:Data[3]=REVERSE[1]%10+1;break;
case 1:Data[2]=REVERSE[1]/10+1;break;
case 2:Data[1]=REVERSE[2]%10+1;break;
default :Data[0]=REVERSE[2]/10+1;
}
} break;
case 3:
{
if ((REVERSE[2] == 0)&&(REVERSE[1] == 0)) TR2=0;
else TR2=1;
EX1 = 0;
ET1 = 1;
ET2 = 1;
for(i=0;i<4;i++)
switch(i)
{
case 0:Data[3]=REVERSE[1]%10+1;break;
case 1:Data[2]=REVERSE[1]/10+1;break;
case 2:Data[1]=REVERSE[2]%10+1;break;
default :Data[0]=REVERSE[2]/10+1;
}
}break;
case 5:
{
BEEP=1;
IE1 = 0;
EX1 = 1;
ET1 = 0;
ET2 = 1;
TR0 = 0;
for(i=0;i<4;i++)
switch(i)
{
BEEP=1;
case 0:Data[3]=CLOCK[2]%10+1;break;
case 1:Data[2]=CLOCK[2]/10+1;break;
case 2:Data[1]=CLOCK[3]%10+1;break;
default :Data[0]=CLOCK[3]/10+1;
}
} break;
case 6:
{
BEEP=1;
IE1 = 0;
EX1 = 1;
ET1 = 0;
ET2 = 1;
TR0 = 0;
for(i=0;i<4;i++)
switch(i)
{
case 0:Data[3]=CLOCK[2]%10+1;break;
case 1:Data[2]=CLOCK[2]/10+1;break;
case 2:Data[1]=CLOCK[3]%10+1;break;
default :Data[0]=CLOCK[3]/10+1;
}
} break;
default:
EA=1;ET0=1;IT1=1;EX1=1;TR0=1;BEEP=1;
for(i=0;i<4;i++)
switch(i)
{
case 0:Data[3]=CLOCK[2]%10+1;break;
case 1:Data[2]=CLOCK[2]/10+1;break;
case 2:Data[1]=CLOCK[3]%10+1;break;
default :Data[0]=CLOCK[3]/10+1;
}
}
shumadp_cs = CLOCK[1]%2;
LEDplay (5);
STATE = P1&0x07;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -