📄 main.c
字号:
#include <reg52.h>
#include <absacc.h>
#define uint unsigned int
#define uchar unsigned char
//
#define DPSEC 0 //Clock[DPSEC]数组的元素0,存放时钟时间 DPSEC:Second
#define DPMIN 1 //Clock[DPMIN]数组的元素1,存放时钟时间 DPMIN:minute
#define DPHOUR 2 //Clock[DPHOUR]数组的元素2,存放时钟时间 DPHOUR:hour
#define WHMILSEC 0 //Watch[WHMILSEC]数组的元素0,存放秒表时间 WHMILSEC:milliSecond
#define WHSEC 1 //Watch[WHSEC]数组的元素1,存放秒表时间 WHSEC:Second
#define KEYMIN 14 //按键号:分钟加一
#define KEYHOUR 13 //按键号:小时加一
#define KEYSTARPRESS 11 //按键号:秒表启动/停止
#define CLOCKMODE 0 //时钟模式
//定义管脚
sbit K0=P1^0; //时钟分钟调整键
sbit K1=P1^1; //时钟小时调整键
sbit K2=P1^2; //秒表启动停止键
sbit K4=P3^2; //时钟/秒表状态切换键
sbit BELL=P1^7; //响闹输出端
uchar data ClockMode=CLOCKMODE; //时钟/秒表模式标记位-CLOCKMODE:时钟 1:秒表
uchar data SwitchClockMode=0; //时钟/秒表状态切换标记-0:没有发生过切换1:发生过切换
uchar data DecSec=0; //秒的分频位
uchar data Refersh=6; //数码管个数
uchar data Clock[3]={0,0,0}; //存放时钟时间(依次是秒,分,时)
uchar data Watch[2]={0,0}; //存放秒表时间(依次是百分秒,秒,分)
uchar data Buffer[6]={0,0,0,0,0,0}; //显示缓冲区(依次从低位到高位,共6位数码管)
uchar code TABLE[]={0xC0,0xf9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x98,0xbf};
//共阳数码管显示"0"-"9","-"
/*------声明区--------*/
void delay(); //显示延时函数
void addTime(uchar mode); //调整时间时加1子函数
uchar key(); //按键函数
void bell(void); //闹铃函数
void clockDisplay( uchar ClockMode ); //显示函数
void main(void) //主函数体
{
uchar data keyLockFlag=0; //按键延迟锁标记位,1:表示锁定
uchar data keyLock=0; //
uchar data keyValue; //键值暂存
uchar data startWatch=1; //秒表状态
EA=1;EX0=1;ET0=1;ET1=1;ET2=1; //开总中断源,开外部中断1,开Timer0,Timer1中断
IT0=1; //下降沿触发
TMOD=0x11; //T1方式1计数,T0方式1计时
TH0=0X54;TL0=0; //初始化计数器0初值
TH1=0X10;TL1=0; //初始化计数器1初值
TH1=0;TL1=0; //初始化计数器1初值
TR0=1;TR1=0;TR2=1; //启动定时器
while(1) //主循环
{
//-----------时钟模式------------//
while( ClockMode == CLOCKMODE ) //如果选择时钟模式
{
if( SwitchClockMode == 1 ) //如果时钟/秒表状态切换
{
clockDisplay( CLOCKMODE ); //显示
SwitchClockMode=0; //清除切换标记位
}
keyValue=key();
switch(keyValue) //按键跳转
{
case KEYMIN: //时钟按键分调整程序
{
keyLockFlag=1; //按键调节时钟后,时钟不是立刻走时,而是等待2秒钟
TR0=0; //关闭定时器,时钟停止运行
addTime(keyValue); //调用调节时钟加1函数
delay();delay();delay();
} break;
case KEYHOUR: //时钟按键小时调整程序
{
keyLockFlag=1;
TR0=0;
addTime(keyValue); //调用调节时钟加1函数
delay();delay();delay();
} break;
default :break;
}
if(keyLockFlag == 1) //按键延迟锁延迟约两秒
{
if(++keyLock == 20 )
{
keyLockFlag=0;keyLock=0;
TR0=1; //时钟设置完毕开始运行
}
}
clockDisplay( ClockMode ); //刷新时钟显示
}
//-----------秒表模式------------//
while( ClockMode != CLOCKMODE ) //如果选择秒表模式
{
if( SwitchClockMode == 1 ) //如果时钟/秒表状态切换
{
Buffer[0]=0; //显示'-'
Buffer[1]=0;
Buffer[2]=0;
Buffer[3]=0;
Buffer[4]=10;
Buffer[5]=10;
Watch[WHMILSEC]=0; //
Watch[WHSEC]=0; //预置秒表值
TR1=0;
SwitchClockMode=0; //清除切换标记位
}
keyValue=key();
if( keyValue == KEYSTARPRESS ) //如果秒表启动停止按键按下
{
if( startWatch == 0 )
{
TR1=1; //启动定时器
startWatch=1;
}
else
{
TR1=0;
startWatch=0;
}
delay();delay();delay();delay();delay();delay();
}
clockDisplay( ClockMode ); //显示
}
}
}
void time0(void) interrupt 1 using 2
{
TH0=0X112;
TL0=0x30; //计时器放入预置时间,大概10毫秒
DecSec++;
if(DecSec==16)
{ DecSec=0;
Clock[DPSEC]++; //秒位加1
if(Clock[DPSEC]==60) //1分钟到
{
Clock[DPSEC]=0; //秒位清0
Clock[DPMIN]++; //分位加1
if(Clock[DPMIN]==60) //1小时到
{
Clock[DPMIN]=0; //分位清0
Clock[DPHOUR]++; //时位加1
if(Clock[DPHOUR]==24) //24小时到
{
Clock[DPHOUR]=0; //时位清0
}
}
}
}
}
void bell(void)
{
BELL=1;delay();delay();delay();delay();delay();
BELL=0;delay();delay();delay();delay();delay();
BELL=1;delay();delay();delay();delay();delay();
BELL=0;delay();delay();delay();delay();delay();
BELL=1;
}
void intsrl(void) interrupt 0 using 2 //外中断IT0中断服务子函数,K3按键触发
{
SwitchClockMode=1; //置位切换标志位
if( ClockMode == CLOCKMODE ) //如果在时钟模式下运行
{
ClockMode=1; //转到秒表模式下运行
}
else
{
ClockMode= CLOCKMODE;
}
}
void time1(void) interrupt 3 using 2
{
TH1=0Xe0;
TL1=0x10; //计时器放入预置时间,大概10毫秒
Watch[WHMILSEC]++; //毫秒位减1
if(Watch[WHMILSEC]==99) //0.1秒到
{
Watch[WHMILSEC]=0; //毫秒位清0
Watch[WHSEC]++; //秒位减1
if(Watch[WHSEC]==99) //1秒到
{ Watch[WHSEC]=0;
bell(); //报警
}
}
}
void time2(void) interrupt 5 using 2 //定时器T2中断服务子函数
{
TF2=0;
TH2=0Xe0;
TL2=0x00; //计时器2放入预置时间,大概10毫秒
switch(--Refersh)
{ case 0:P2=32;break;
case 1:P2=16;break;
case 2:P2=8;break;
case 3:P2=4;break;
case 4:P2=2;break;
case 5:P2=1;break;
}
P0=TABLE[Buffer[Refersh]]; //输入要显示数据
if(Refersh==0) Refersh=6;
}
void addTime(uchar mode) //加1子函数
{
switch(mode) //判断当前状态
{
case KEYMIN: //时钟分调整时
{
Clock[DPMIN]++; //分位加1
if(Clock[DPMIN]==60) //到60时
{
Clock[DPMIN]=0; //分位清0
}
}break;
case KEYHOUR: //时钟时调整
{
Clock[DPHOUR]++; //时位加1
if(Clock[DPHOUR]==24) //24小时到
{
Clock[DPHOUR]=0; //时位清0
}
}break;
}
}
void clockDisplay( uchar ClockMode ) //动态显示函数
{
if(ClockMode == CLOCKMODE) //时钟模式
{
Buffer[0]=Clock[DPSEC]%10; //数码管显示秒个位
Buffer[1]=Clock[DPSEC]/10; //秒十位
Buffer[2]=Clock[DPMIN]%10; //分钟个位
Buffer[3]=Clock[DPMIN]/10; //分钟十位
Buffer[4]=Clock[DPHOUR]%10; //小时个位
Buffer[5]=Clock[DPHOUR]/10; //小时十位
}
else
{
Buffer[0]=Watch[WHMILSEC]%10; //数码管显示秒个位
Buffer[1]=Watch[WHMILSEC]/10; //秒十位
Buffer[2]=Watch[WHSEC]%10; //分钟个位
Buffer[3]=Watch[WHSEC]/10; //分钟十位
}
/*
disp=Buffer[--Refersh]; //刷新
switch(Refersh)
{ case 0:P2=32;break;
case 1:P2=16;break;
case 2:P2=8;break;
case 3:P2=4;break;
case 4:P2=2;break;
case 5:P2=1;break;
}
P0=TABLE[disp]; //输入要显示数据
delay10ms();
if(Refersh==0) Refersh=6;
*/
}
uchar key(void) //键盘输入
{
uchar i;
i= P1&0x0f;
if(i != 0x0f) //键盘屏蔽
{
i= P1&0x0f;
if(i != 0x0f)
{ return (P1&0x0f);
}
}
else return 0;
}
void delay(void) //键盘去抖延时
{
uchar j,i;
for(j=0;j<=40;j++)
for(i=0;i<=200;i++);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -