怎么在里面添加一个闹钟啊?在调闹钟的时候要关闭定时器的吗?
时间:10-02
整理:3721RD
点击:
#include <reg51.h> //添加头文件
#define uint unsigned int
#define uchar unsigned char
sbit K1=P1^0;
sbit K2=P1^1;
sbit K3=P1^2;
sbit K4=P1^3;
uint num;
uchar H,M,S,count=0; //时分秒
uchar DAT[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴数码管编码0~9
void key();
void delay(unsigned int i)
{
char j;
for(i; i > 0; i--)
{
for(j = 200; j > 0; j--);
}
}
void judge() //改变时分秒的值,使分秒都为60进制,时为24进制
{
if(S==60)
{
S=0;
M++;
}
if(M==60)
{
M=0;
H++;
}
if(H==24)
{
H=0;
}
}
void show() //显示函数,P2为位选,P0为段选
{
P2=0X7F;
P0=DAT[H/10];
delay(150); //第一位选中时,显示时的高位,延时下
P2=0XBF;
P0=DAT[H%10];
delay(150); //第二位选中时,显示时的低位,延时下
P2=0XDF;
P0=0X40;
delay(150); //第三位选中时,显示“-”,延时下
P2=0XEF;
P0=DAT[M/10];
delay(150); //第四位选中时,显示分的高位,延时下
P2=0XF7;
P0=DAT[M%10];
delay(150); //第五位选中时,显示分的低位,延时下
P2=0XFB;
P0=0X40;
delay(150); //第六位选中时,显示“-”,延时下
P2=0XFD;
P0=DAT[S/10];
delay(150); //第七位选中时,显示秒的高位,延时下
P2=0XFE;
P0=DAT[S%10];
delay(150); //第八位选中时,显示秒的低位,延时?
}
void main() //主函数
{
TMOD=0X01; //定时器0工作在方式1
TH0=(65536-50000)/256;
TL0=(65536-50000)%256; //设置定时器的初值,使得定时时间为50ms(晶振为12MHZ时)
EA=1; //开启总中断
ET0=1; //允许定时器0中断
TR0=1; //开启定时器0
while(1){
show(); //一直执行显示函
key();
}
}
void timer0()interrupt 1 //定时器0中断服务程序
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256; //重新设置初值
count++; //每中断一次,计数寄存器加1
if(count>=20) //当定时20次时,即50MS*20=1000ms=1s
{
count=0; //将计数值重新归零
S++;
judge(); //修改时分秒的值
}
}
void key() //按键函数,功能为对时间进行调整
{
if(K1==0) //key1键按下进入选择并停止定时器
{
delay(10);
while(!K1); //松手检测
TR0=0;
num++; //每按一次key1 num自加1
}
if(num==1) //key1按一次进行“小时”调整
{
if(K2==0) //key2按下时间增加
{
delay(10);
while(!K2);
H++;
if(H==24)
H=0;
}
if(K3==0) //key3按下时间减少
{
delay(10);
while(!K3);
H--;
if(H<0)
H=23;
}
}
if(num==2) //按下key1两次进行“分钟调整”
{
if(K2==0)
{
delay(10);
while(!K2);
M++;
if(M==60)
M=0;
}
if(K3==0)
{
delay(10);
while(!K3);
M--;
if(M<0)
M=59;
}
}
if(num==3) //key1按下三次对“秒”进行调节
{
if(K2==0)
{
delay(10);
while(!K2);
S++;
if(S==60)
S=0;
}
if(K3==0)
{
delay(10);
while(!K3);
S--;
if(S<0)
S=59;
}
}
if(num==4) //key1按下四次认为调节完毕开启定时器并将num清0
{
num=0;
TR0=1;
}
}
#define uint unsigned int
#define uchar unsigned char
sbit K1=P1^0;
sbit K2=P1^1;
sbit K3=P1^2;
sbit K4=P1^3;
uint num;
uchar H,M,S,count=0; //时分秒
uchar DAT[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴数码管编码0~9
void key();
void delay(unsigned int i)
{
char j;
for(i; i > 0; i--)
{
for(j = 200; j > 0; j--);
}
}
void judge() //改变时分秒的值,使分秒都为60进制,时为24进制
{
if(S==60)
{
S=0;
M++;
}
if(M==60)
{
M=0;
H++;
}
if(H==24)
{
H=0;
}
}
void show() //显示函数,P2为位选,P0为段选
{
P2=0X7F;
P0=DAT[H/10];
delay(150); //第一位选中时,显示时的高位,延时下
P2=0XBF;
P0=DAT[H%10];
delay(150); //第二位选中时,显示时的低位,延时下
P2=0XDF;
P0=0X40;
delay(150); //第三位选中时,显示“-”,延时下
P2=0XEF;
P0=DAT[M/10];
delay(150); //第四位选中时,显示分的高位,延时下
P2=0XF7;
P0=DAT[M%10];
delay(150); //第五位选中时,显示分的低位,延时下
P2=0XFB;
P0=0X40;
delay(150); //第六位选中时,显示“-”,延时下
P2=0XFD;
P0=DAT[S/10];
delay(150); //第七位选中时,显示秒的高位,延时下
P2=0XFE;
P0=DAT[S%10];
delay(150); //第八位选中时,显示秒的低位,延时?
}
void main() //主函数
{
TMOD=0X01; //定时器0工作在方式1
TH0=(65536-50000)/256;
TL0=(65536-50000)%256; //设置定时器的初值,使得定时时间为50ms(晶振为12MHZ时)
EA=1; //开启总中断
ET0=1; //允许定时器0中断
TR0=1; //开启定时器0
while(1){
show(); //一直执行显示函
key();
}
}
void timer0()interrupt 1 //定时器0中断服务程序
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256; //重新设置初值
count++; //每中断一次,计数寄存器加1
if(count>=20) //当定时20次时,即50MS*20=1000ms=1s
{
count=0; //将计数值重新归零
S++;
judge(); //修改时分秒的值
}
}
void key() //按键函数,功能为对时间进行调整
{
if(K1==0) //key1键按下进入选择并停止定时器
{
delay(10);
while(!K1); //松手检测
TR0=0;
num++; //每按一次key1 num自加1
}
if(num==1) //key1按一次进行“小时”调整
{
if(K2==0) //key2按下时间增加
{
delay(10);
while(!K2);
H++;
if(H==24)
H=0;
}
if(K3==0) //key3按下时间减少
{
delay(10);
while(!K3);
H--;
if(H<0)
H=23;
}
}
if(num==2) //按下key1两次进行“分钟调整”
{
if(K2==0)
{
delay(10);
while(!K2);
M++;
if(M==60)
M=0;
}
if(K3==0)
{
delay(10);
while(!K3);
M--;
if(M<0)
M=59;
}
}
if(num==3) //key1按下三次对“秒”进行调节
{
if(K2==0)
{
delay(10);
while(!K2);
S++;
if(S==60)
S=0;
}
if(K3==0)
{
delay(10);
while(!K3);
S--;
if(S<0)
S=59;
}
}
if(num==4) //key1按下四次认为调节完毕开启定时器并将num清0
{
num=0;
TR0=1;
}
}
有按键按下进入闹钟设置,不管定时器,打开显示然后调整,完了之后跳回到时间显示就好了