单片机 > 单片机程序设计 > 详情

一款51单片机电子钟制作(C语言)

发布时间:2023-09-01 发布时间:
|

/*一款电子钟程序,此电子钟是四位电子钟数码管组成的,功能分别有走时、响闹、走时间调整、闹钟时间调整等功能!调整部分分别由三个按键实现,一个功能键,一个+(加)键,另一个为-(减)键,其它功能键是复用功能!*/

硬键介绍:数码管个位.十位.百位.千位.小数点分别接P0.0 P0.1 P0.2 P0.3 P0.4。蜂鸣器接P3.5脚,功能按键接P3.2 加按键接P3.3 减按键接P3.4

以下是两张图片!!!



#include //头文件
#define uchar unsigned char//宏定义
#define uint unsigned int//宏定义
uchar shi,fen,nshi,nfen,mao,ding,ding1,ding3,yin;//变量定义
sbit ge=P0^0;//数码管个位
sbit shi4=P0^1;//数码管十位
sbit bai=P0^2;//数码管百位
sbit qian=P0^3;//数码管千位
sbit dian=P0^4;//两小数点位
sbit bbt=P3^5;//闹钟输出口
sbit key=P3^2;//功能按键定义
sbit key1=P3^3;//++按键定义
sbit key2=P3^4;//--按键定义
bita=0;//调时间功能时位定义
bitb=0;//调小时位定义
bitc=0;//调分钟位定义
bitd=0;//调闹钟小位定义
bite=0;//调闹钟分钟定义
bitg=0;//主程序位定义,它控制主程序中的显示子程序
uchar code table[]={
0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90,
0x88,0x83,0xc6,0xa1,0x86,
0x8e};//数组,即列表
void key11();//声时调时子程序
void delay(uint);//声明延时子程序
void disy(uchar,uchar);//声明时间显示子程序
void ndisy(uchar,uchar);//声明调时显示子程序1
void disy1(uchar);//声明调时时显示小时子程序
void disy2(uchar);//声明调时时显示分子程序
void chushi();//初始化程序
void bbbt();//闹钟子程序

//////////////主程序/////////////////

void main()//主程序开始
{
chushi();//初始化
while(1)//大循环
{
if(g!=1)//如果g不等于1,就执行下一句,否则跳过下一句
disy(fen,shi);//调用走时显示子程序
key11();//调用按键子程序
bbbt();//调用闹钟子程序
}
}

/////////////按键执行的子程序/////////////

void key11()//按键子函数
{

if(a!=0)//如果a不等于0,则执行大括号语句,否则跳过
{
dian=0;//将中间两个小数点打开
delay(10);//延时一会儿
dian=1;//将点关掉
delay(10);//延时一会儿,以上即是动态显示
disy(fen,shi);//调用显示子程序
delay(4000);//延时,使它闪烁
}
if(b!=0)//如果b不等于0,则执行大括号语句
{
disy1(shi);//调用小时显示子程序,此程序在前面声明
delay(2000);//延时,即使它闪烁
if(key1==0)//如果+按键有按下,则执行大括号内容
{
delay(10);//去抖
if(key1==0)//再次判断
{
shi++;//确实按下了就将小时时间+1
disy1(shi);//加1后调用小时显示子程序
delay(10);//延时一会儿
if(shi==24)//如果小时加到了24就执行下一个语句,否则跳过
shi=0;//到了24就清0
}
}
if(key2==0)//如果-按键有按下,则执行大括号内容
{
delay(10);//去抖动
if(key2==0)//再次确认
{
shi--;//确实按下就将小时减1
disy1(shi);//调用显示程序
delay(10);//延时
if(shi==(0-1))//如果小时到了(0-1)时,就给23
shi=23;//给23
}
}
}
if(c!=0)//如果b不等于0,则执行大括号语句
{
disy2(fen);//调用调分分显示子程序
delay(2000);//使它闪动
if(key1==0)//判断+按键是否有按下
{
delay(10);//延时
if(key1==0)//再次确认按下情况
{
fen++;//将分加1
disy2(fen);//调用显示子程序
delay(10);//延时一会儿
if(fen==60)//如果分到了60,则执行下一语句
fen=00;//清0
}
}
if(key2==0)//如果减按键按下了执行下一语句
{
delay(10);//延时一会儿
if(key2==0)//再次判断
{
fen--;//将分减1
disy2(fen);//调用显示子程序
delay(10);//延时
if(fen==(0-1))//如果分等于(0-1),则给59
fen=59;//给59
}

}

}
if(d!=0)//如果b不等于0,则执行大括号语句
{
ndisy(nshi,nfen);//调用闹钟显示程序
delay(2000);//使它闪
if(key1==0)//如果+按键按下了则执行括号内语句
{
delay(10);//去抖
if(key1==0)//再次判断
{
nshi++;//将闹钟时加1
ndisy(nshi,nfen);//调用显示子程序
delay(10);//延时
if(nshi==24)//如果等24就执行下一句话
nshi=0;//到了24,清0
}
}
if(key2==0)//如果-按键按下了,则执行括号内容
{
delay(10);//去抖
if(key2==0)//再次判断
{
nshi--;//自减1
ndisy(nshi,nfen);//调用显示程序
delay(10);//延时
if(nshi==(0-1))//如果小时等于(0-1),就执行下一句
nshi=23;//给23
}
}
}
if(e!=0)//如果b不等于0,则执行大括号语句
{
ndisy(nshi,nfen);//调用显示子程序
delay(2000);//闪烁
if(key1==0)//+按键按下了没?
{
delay(10);//去抖
if(key1==0)//再次确认
{
nfen++;//将分加1
ndisy(nshi,nfen);//调用显示子程序
delay(10);//延时
if(nfen==60)//到了60?
nfen=00;//清0
}
}
if(key2==0)//-按键有按下吗?
{
delay(10);//延时
if(key2==0)//再次确认
{
nfen--;//分减1
disy(nfen,nshi);//调用显示
delay(10);//延时
if(nfen==(0-1))//如果分等于(0-1),则执行下一句
nfen=59;//给59
}

}
}
}


/////////////闹钟子子程序/////////////

void bbbt()//闹钟子程序
{
if(ding1==2)//如果计数器ding1到了2次中断?就执行括号内容
{
ding1=0;//清0计数器
if(shi==nshi)//走时小时时间与闹钟小时时间相等吗?
{
if(fen==nfen)//走时分钟时间与闹钟分钟时间相等吗?
{
bbt=~bbt;//将蜂呜器取反,使它发声
}
}

}
else
bbt=1;//否则将蜂呜器关掉
}


/////////////初始化子程序/////////////

void chushi()//初始化子函数
{
TMOD=0x11;//两个定时器工作在方式1方式下
EA=1;//开总中断
ET0=1;//开定时器0中断允许
ET1=1;//开定时器1中断允许
TR0=1;//开定时器0
TR1=1;//开定时器0
TH0=(65536-50000)/256;//定时器0高位赋值
TL0=(65536-50000)%256;//定时器0低位赋值
TH1=(65536-10000)/256;//定时器1高位赋值
TL1=(65536-10000)%256;//定时器1低位赋值
shi=23;//开机小时显示23
fen=59;//开机分钟显示59
nshi=12;//开机闹钟小时显示12
nfen=00;//开机闹钟分钟显示00
}


/////////////走时显示子程序/////////////

void disy(uchar shi,uchar fen)//走时显示子程序
{
P1=table[shi%10];//小时个位赋值
ge=0;//开个位位选
delay(5);//延时
ge=1;//关个位位选
P1=table[shi/10];//小时十位赋值
shi4=0;//开小时位选端
delay(5);//延时
shi4=1;//关小时位选端
P1=table[fen%10];//分钟个位赋值
bai=0;//将百位打开
delay(5);//延时
bai=1; //将百位关闭
P1=table[fen/10];//分钟十位赋值
qian=0;//打开千位位选
delay(5);//延时
qian=1; //关闭千位
}

/////////////调时显示子程序/////////////

void ndisy(uchar nshi,uchar nfen)//调时显示子程序
{
P1=table[nshi%10&0x7f];//赋值给小时个位
bai=0;//开位选
delay(30);//延时
bai=1;//关位选
P1=table[nshi/10];//赋值给小时十位
qian=0;//开位选
delay(30);//延时
qian=1;//关位选
P1=table[nfen%10];//赋值分十位
ge=0;//开位选
delay(30);//延时
ge=1; //关位选
P1=table[nfen/10];//送分个位
shi4=0;//开位选
delay(30);//延时
shi4=1; //关位选
dian=0;//小数点打开
delay(10);//延时
dian=1;//关闭
}


/////////////调时小时显示子函数/////////////

void disy1(uchar fen)//调时小时显示子函数
{
P1=table[shi%10];//送小时个位
bai=0;//打开小时个位位选
delay(40);//延时
bai=1;//关闭位选
P1=table[shi/10];//关十位代码
qian=0;//打开十位位选
delay(40);//延时
qian=1;//关闭千位
shi4=1; //关闭十位数码管
ge=1; //关闭个位数码管
}


/////////////调时分钟显示子函数/////////////

void disy2(uchar fen)//调时分钟显示子函数
{
P1=table[fen%10];//送分钟个位
ge=0;//打开分个位位选
delay(30);//关闭位选
ge=1;//关十位代码
P1=table[fen/10];//送个位代码
shi4=0;//打开位选
delay(30);//延时
shi4=1;//关闭位选
bai=1;//关闭百位数码管
qian=1; //关闭千位数码管
}


/////////////延时程序/////////////

void delay(uint z)//延时子函数
{
uint x,y;//定义局部变量
for(x=10;x>0;x--)//第一循環
for(y=z;y>0;y--);//内循环
}


/////////////T0中断服务程序/////////////

void zhong() interrupt 1//T0中断服务程序
{
TH0=(65536-50000)/256;//赋值给高位
TL0=(65536-50000)%256;//赋值给低位
ding++; //将走时计数器加1
ding1++;//将响闹计数器加1


/////////////走时程序/////////////

if(ding==10)//走时计数器到了10次中断0.5秒吗?
{
ding=0;//清0
dian=~dian;//将小数点取反一次
mao++;//将秒变量加1
if(mao==120)//如果秒变量mao到了120次中断(即1分钟),就执行下语句
{
mao=0;//将秒mao变量清0
fen++;//将分变量加1
}
if(fen==60)//判断分变量是否到了60
{
fen=0;//到了就清0
shi++;//将小时加1
if(shi==24)//如果小到了24就清0
shi=0;//清0
}
}

[1] [2]
51单片机电子钟C语言

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
MSP430低功耗模式-while循环失效