#include<reg52.h>//头文件
#include<intrins.h>
#defineucharunsignedchar//宏定义
#defineuintunsignedint
sbitkey1=P3^5;//位声明
sbitkey2=P3^6;
sbitkey3=P3^7;
sbitfmq=P2^0;
ucharcodetable[]={0x3f,0x06,0x5b,//数码管显示的数值
0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,
0xbf,0x86,0xdb,//带小数点的数值
0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
voidjia();//函数声明
voidjian();
uchartable_1[6];//定义数组,数组内含有6个数值
uchartable_2[6];
ucharshi=23,fen=59,miao=50;//显示初始值
ucharshi1,fen1,miao1,shi2,fen2,miao2,shi3,fen3,miao3;//定义全局变量
ucharflag,flag1,cnt,count;//定义全局变量
voiddelay(uchari)//延时函数,用于动态扫描数码管
{
ucharx,y;
for(x=i;x>0;x--)
for(y=110;y>0;y--);
}
voidinit()//初始化函数
{
TMOD=0X01;//工作方式1
TH0=(65536-50000)/256;//定时时间为:50ms
TL0=(65536-50000)%256;
ET0=1;//打开定时器
EA=1;//开总中断
TR0=1;//启动定时器
}
voiddisplay()//显示子函数,用于显示时间数值
{
uchari,j;
table_1[0]=miao%10;//分离秒的各位与十位
table_1[1]=miao/10;
table_1[2]=fen%10+11;//分离分的各位与十位
table_1[3]=fen/10;
table_1[4]=shi%10+11;//分离时的各位与十位
table_1[5]=shi/10;
j=0x7f;//从秒到时的扫描
for(i=0;i<6;i++)
{
P2=j;
P0=table[table_1[i]];//显示数值
delay(10);
j=_cror_(j,1);//循环右移
}
}
voiddisplay_1()//显示子函数,用于显示定时时间
{
uchari,j;
table_2[0]=miao2%10;//以下含义同上
table_2[1]=miao2/10;
table_2[2]=fen2%10+11;
table_2[3]=fen2/10;
table_2[4]=shi2%10+11;
table_2[5]=shi2/10;
j=0x7f;
for(i=0;i<6;i++)
{
P2=j;
P0=table[table_2[i]];
delay(10);
j=_cror_(j,1);
}
}
voidshijian()//时间子函数
{
if(flag>=20)//判断是否到一秒
{
flag=0;//到了,则标志位清零
miao++;//秒加1
if(miao>=60)//判断秒是否到60s
{
miao=0;//到了,则清零
fen++;//分加1
if(fen>=59)//以下含义同上
{
fen=0;
shi++;
if(shi>23)
shi=0;
}
}
}
}
voidkey_scan()//键盘扫描子函数
{
uchari;//定义局部变量
if(key1==0)
{
while(!key1)//防止掉显
{
if(cnt==0||cnt==1||cnt==2||cnt==3||cnt==4||cnt==8)
{
display();
}
if(cnt==5||cnt==6||cnt==7)
{
display_1();
}
}
cnt++;//记下按键key1按下的次数
if(cnt==1)//第一次按下,停止计数
TR0=0;
if(cnt==2)//第二次按下
{
miao1=miao;//保存秒的数值
miao=99;//显示99,表示可以调节秒的数值了
for(i=0;i<100;i++)
display();//显示99
miao=miao1;//恢复前一刻秒的数值
}
if(cnt==3)//以下含义同上
{
fen1=fen;
fen=99;
for(i=0;i<100;i++)
display();
fen=fen1;
}
if(cnt==4)
{
shi1=shi;
shi=99;
for(i=0;i<100;i++)
display();
shi=shi1;
}
if(cnt==5)
{
miao1=miao2;
miao2=88;
for(i=0;i<100;i++)
display_1();
miao2=miao1;
}
if(cnt==6)
{
fen1=fen2;
fen2=88;
for(i=0;i<100;i++)
display_1();
fen2=fen1;
}
if(cnt==7)
{
shi1=shi2;
shi2=88;
for(i=0;i<100;i++)
display_1();
shi2=shi1;
}
if(cnt==8)//第八次按下
{
TR0=1;//开始计数
cnt=0;//按下次数清零
}
}
if(key2==0)//判断key2是否按下
{
while(!key2)//防止掉显
{
if(cnt==0||cnt==1||cnt==2||cnt==3||cnt==4||cnt==8)
{
display();
}
if(cnt==5||cnt==6||cnt==7)
{
display_1();
}
}
jia();//调用加1的子函数
}
if(key3==0)//判断key3是否按下
{
while(!key3)//防止掉显
{
if(cnt==0||cnt==1||cnt==2||cnt==3||cnt==4||cnt==8)
{
display();
}
if(cnt==5||cnt==6||cnt==7)
{
display_1();
}
}
jian();//调用减1子函数
}
}
voidjia()//加1子函数
{
if(cnt==2)//判断key1按下的次数是否为2
{
miao++;//是,则秒加1
if(miao>59)//判断秒是否大于59,是,则秒清零
miao=0;
}
if(cnt==3)//以下含义同上
{
fen++;
if(fen>59)
fen=0;
}
if(cnt==4)
{
shi++;
if(shi>23)
shi=0;
}
if(cnt==5)
{
miao2++;
if(miao2>59)
miao2=0;
}
if(cnt==6)
{
fen2++;
if(fen2>59)
fen2=0;
}
if(cnt==7)
{
shi2++;
if(shi2>23)
shi2=0;
}
}
voidjian()//减1子函数
{
if(cnt==2)//判断key1按下的次数是否为2,是则秒减1
{
miao--;
if(miao==255)//判断秒是否减到255,是,则秒清零
miao=59;
}
if(cnt==3)
{
fen--;
if(fen==255)
fen=59;
}
if(cnt==4)
{
shi--;
if(shi==255)
shi=23;
}
if(cnt==5)
{
miao2--;
if(miao2==255)
miao2=59;
}
if(cnt==6)
{
fen2--;
if(fen2==255)
fen2=59;
}
if(cnt==7)
{
shi2--;
if(shi2==255)
shi2=23;
}
}
voidclock()//闹铃子函数
{
if(miao2==miao)//显判断秒的数值是否相等
if(fen2==fen)//是,在判断分是否相等
if(shi2==shi)//是,再判断时是否相等
{
flag1=0;//是,则标志位,flag1清零
while(!(flag1==100))//判断flag1是否到100
{
fmq=0;//没有,则,继续驱动蜂鸣器响,时间约为:5s
shijian();//调用时间子函数
display();//调用显示子函数
}
fmq=1;//关闭蜂鸣器
}
}
voidmain()
{
init();//调用初始化子函数
while(1)
{
key_scan();//调用键盘扫描子函数
shijian();//时间子函数
clock();//闹钟子函数
//显示子函数
if(cnt==0||cnt==1||cnt==2||cnt==3||cnt==4||cnt==8)
{
display();
}
if(cnt==5||cnt==6||cnt==7)
{
display_1();
}
}
}
voidtime0()interrupt1//定时器0
{
TH0=(65536-50000)/256;//初值50ms
TL0=(65536-50000)%256;
flag++;//标志位
flag1++;
}
导读:目前正在解读《C51定时闹钟程序》的相关信息,《C51定时闹钟程序》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《C51定时闹钟程序》的详细说明。
提醒:《C51定时闹钟程序》最后刷新时间 2024-03-14 01:23:20,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《C51定时闹钟程序》该内容的真实性请自行鉴别。