资源简介
设计一60秒LED旋转显示的电子钟,且能定时响闹。要求“秒”在圆周上的LED实时显示,“分”与“时”各2位在LED数码管上显示。设置有3个键,3个键的功能如下:
复位键:把“分”与“时”清零;
校时键:能够调整“分”与“时”;
定闹键:能够设置响闹时间(分与时)。
内含Proteus仿真电路和keilc源程序。
代码片段和文件信息
/*
程序功能:60秒LED旋转显示的电子钟程序,可调时间,且能定时响闹,
作者:于海超 (转载请注明出处)
*/
#include
#include
#define uint unsigned int
#define uchar unsigned char
uchar temp1temp2aabbK1numK2numK1K2num;
uint miaofenfen1shishi1;fengefenshishigeshishifen1gefen1shishi1geshi1shiNflag1flag2flag3flag4;
uchar code table[]={0x3f0x060x5b0x4f0x660x6d0x7d0x070x7f0x6f};//共阴数码管的编码
sbit K1=P1^0; //两个按键
sbit K2=P1^1;
sbit beep=P1^2; //蜂鸣器
sbit B4=P1^4; //四位数码管的位选端
sbit B5=P1^5;
sbit B6=P1^6;
sbit B7=P1^7;
void init(); //声明初始化函数
void delay(uint z); //声明延时函数
void display(uint fengeuint fenshiuint shigeuint shishi); //声明显示函数
void keyscan(); //声明键盘扫描函数
void main()
{
init();//初始化子程序
while(1)
{
keyscan();
fenge=fen%10; //取分钟的个位,下同
fenshi=fen/10; //取分钟的十位,下同
shige=shi%10;
shishi=shi/10;
fen1ge=fen1%10;
fen1shi=fen1/10;
shi1ge=shi1%10;
shi1shi=shi1/10;
if(flag4==1) display(fengefenshishigeshishi);
else display(fen1gefen1shishi1geshi1shi);
}
}
void delay(uint z) //延时函数
{
uint xy;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void init() //初始化函数
{
aa=0; //中断累加次数初始化
bb=0;
K1num=0;
K2num=0;
K1K2num=0;
miao=0; //系统时间初始化
fen=0;
shi=0;
N=0; //N用于控制校时或定闹时时间闪烁显示,以提醒为校时或是定闹状态
fen1=1; //定时时间初始化
shi1=0;
flag1=1; //flag1=1用于标记闹钟没有响闹,flag1=0用于标记闹钟正在响闹,这两种情况下按下K2键所起的作用是不一样的
flag2=1; //闹钟是否响闹的一个标记变量,如果flag2=1,则闹钟时间到,闹钟响闹,如果此时按下K2键,将置flag2=0,是闹钟停止响闹
flag3=1; //flag3用于控制当调整闹钟时间时,闹钟不可以响闹
flag4=1; //flag4=1用于控制调用显示函数显示的是系统的时间,flag4=0用于控制当K2被按下后,调用显示函数显示的是定时的时间
beep=0; //蜂鸣器初始化
temp1=0xfe; //点亮LED的初始化,点亮第一组第一个
temp2=0x01; //点亮LED的初始化,选中第一组
P3=temp2;
P2=temp1;
TMOD=0x01;//设置定时器0为工作方式1
TH0=(65536-50000)/256; //计数器装入初值
TL0=(65536-50000)%256;
EA=1;//开总中断
ET0=1;//开定时器0中断
TR0=1;//启动定时器0
}
void keyscan() //键盘扫描函数
{
if(K2==0&&flag1==0); //flag1=0代表此时闹钟正在响闹,如果按下K2键,则使闹钟停止响闹
{
delay(5);
if(K2==0)
{
flag2=0; //定闹键按下,停止闹钟
}
}
if(K1==0&&K2num==0) //判断K1按下按下前没有按下K2键,则开始修改系统时间
{
delay(5);
if(K1==0)
{
TR0=0; //关闭计数器0
N=500; //N=500用于控制校时或定闹时时间闪烁显示,以提醒为校时或是定闹状态
K1num++; //K1按键次数累加
while(!K1)
if(K1num==1)
{
//第一次按下校时键调整分钟,见下面的代码
}
if(K1num==2)
{
//第二次按下校时键时,调整小时,见下面的代码
}
if(K1num==3) //第三项按下校时键,系统时间调解完毕,
{
N=0; //数码管不再显示
K1num=0; //清零K1num
TR0=1; //开启定时器
}
}
}
if((K2==0)&&(K1num==0)&&(flag1==1)) //判断K2按下按下前没有按下K1键,并且闹钟没有响闹,则开始修改闹钟时间
{
delay(5);
if(K2==0)
{
N=500; //N=500用于控制校时或定闹时时间闪烁显示,以提醒为校时或是定闹状态
K2num++; //K2按键次数累加
flag3=0; //flag3=0用于控制当调整闹钟时间时,闹钟不可以响闹
flag4=0; //flag4=0用于控制当K2被按下后,调用显示函数显示的是定时的时间
while(!K2)
if(K2num==1)
{
//第一次按下定闹键调整分钟
}
if(K2num==2)
{
//第二次按下定闹键调整小时
}
if(K2num==3)
{
N=0; //N=0用于控制校时或定闹时时间停止闪烁
K2num=0;
flag3=1;
flag4=1;
}
}
}
if(K
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 196213 2010-05-30 01:36 0701201班于海超题2\Last Loaded pro2.DBK
文件 11154 2010-05-24 18:28 0701201班于海超题2\pro.M51
文件 13395 2010-05-24 18:30 0701201班于海超题2\pro.omf.plg
文件 8506 2010-05-24 18:45 0701201班于海超题2\pro2
文件 6468 2010-05-30 01:55 0701201班于海超题2\pro2.c
文件 196213 2010-05-30 01:46 0701201班于海超题2\pro2.DSN
文件 2872 2010-05-30 01:55 0701201班于海超题2\pro2.hex
文件 16245 2010-05-30 01:55 0701201班于海超题2\pro2.LST
文件 14899 2010-05-30 01:55 0701201班于海超题2\pro2.M51
文件 13650 2010-05-30 01:55 0701201班于海超题2\pro2.OBJ
文件 11017 2010-05-30 01:55 0701201班于海超题2\pro2.omf
文件 356 2010-05-30 01:56 0701201班于海超题2\pro2.omf.plg
文件 1014 2010-05-30 01:37 0701201班于海超题2\pro2.Opt
文件 3167 2010-05-24 18:49 0701201班于海超题2\pro2.plg
文件 1363 2010-05-30 01:56 0701201班于海超题2\pro2.PWI
文件 1987 2010-05-29 20:54 0701201班于海超题2\pro2.Uv2
....... 1014 2010-05-29 21:26 0701201班于海超题2\pro2_Opt.Bak
文件 2049 2010-05-24 21:41 0701201班于海超题2\pro2_Uv2.Bak
文件 5115 2002-04-16 15:32 0701201班于海超题2\STARTUP.A51
文件 11768 2010-05-24 15:52 0701201班于海超题2\STARTUP.lst
文件 538624 2010-05-30 01:41 0701201班于海超题2\说明文档.doc
目录 0 2010-05-30 01:56 0701201班于海超题2
----------- --------- ---------- ----- ----
1057089 22
评论
共有 条评论