51单片机简易时钟(DS1302,数码管)
#include "reg51.h"
#include"ds1302.h"
#define uchar unsigned char
#define uint unsigned int
sbit smg1=P2^0;//数码管
sbit smg2=P2^1;
sbit smg3=P2^2;
sbit smg4=P2^3;
sbit smg5=P2^4;
sbit smg6=P2^5;
sbit K1=P3^2;//时间切换
sbit K2=P3^3;//+
sbit K3=P3^4;//-
uchar code smgduan0[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示0~9,无小数点
uchar code smgduan1[10]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//显示0~9,有小数点
uchar xian[]={0,0,0,0,0,0};//显存
uchar mode=0;//模式
uchar time0=0,sec=0;//定时变量
void delay(uint i)//延时
{
while(i–);
}
void disp0()//显示小时
{
if(mode==1)
{
if(sec<11)
{
P0=smgduan0[xian[0]];
smg1=0;delay(100);smg1=1;
P0=smgduan1[xian[1]];
smg2=0;delay(100);smg2=1;
}
}
else
{
P0=smgduan0[xian[0]];
smg1=0;delay(100);smg1=1;
P0=smgduan1[xian[1]];
smg2=0;delay(100);smg2=1;
}
}
void disp1()//显示分钟
{
if(mode==2)
{
if(sec<11)
{
P0=smgduan0[xian[2]];
smg3=0;delay(100);smg3=1;
P0=smgduan1[xian[3]];
smg4=0;delay(100);smg4=1;
}
}
else
{
P0=smgduan0[xian[2]];
smg3=0;delay(100);smg3=1;
P0=smgduan1[xian[3]];
smg4=0;delay(100);smg4=1;
}
}
void disp2()//显示秒
{
if(mode==3)
{
if(sec<11)
{
P0=smgduan0[xian[4]];
smg5=0;delay(100);smg5=1;
P0=smgduan0[xian[5]];
smg6=0;delay(100);smg6=1;
}
}
else
{
P0=smgduan0[xian[4]];
smg5=0;delay(100);smg5=1;
P0=smgduan0[xian[5]];
smg6=0;delay(100);smg6=1;
}
}
void main()//主函数
{
uchar j,k=0;
Ds1302ReadTime();
TIME[0]&=0X7F;
Ds1302Init();
TMOD=0X11;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
TH0=0X3C; //给定时器赋初值,定时50ms
TL0=0XB0;
ET0=1;//打开定时器1中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
while(1)
{
disp0();//显示
disp1();
disp2();
//按键检测
if(!K1 &&(k!=1)) //模式切换
{
k=1;
if(mode<3)
mode++;
else
mode=0;
}
if(mode==1)//调整小时
{
if(!K2 &&(k!=2))//+
{
k=2;
j=10*(TIME[2]>>4)+(TIME[2]&0X0F);
if(j<23)
j++;
else
j=0;
TIME[2]=((j/10)<<4)+j%10;
xian[0]=TIME[2]>>4; //时
xian[1]=TIME[2]& 0x0f;
Ds1302Init();
}
if(!K3 &&(k!=3))//-
{
k=3;
j=10*(TIME[2]>>4)+(TIME[2]&0X0F);
if(j>0)
j–;
else
j=23;
TIME[2]=((j/10)<<4)+j%10;
xian[0]=TIME[2]>>4; //时
xian[1]=TIME[2]& 0x0f;
Ds1302Init();
}
}
if(mode==2)//调整分钟
{
if(!K2 &&(k!=2))//+
{
k=2;
j=10*(TIME[1]>>4)+(TIME[1]&0X0F);
if(j<59)
j++;
else
j=0;
TIME[1]=((j/10)<<4)+j%10;
xian[2]=TIME[1]>>4; //分
xian[3]=TIME[1]& 0x0f;
Ds1302Init();
while(!K3);//等待松开
}
if(!K3 &&(k!=3))//-
{
k=3;
j=10*(TIME[1]>>4)+(TIME[1]&0X0F);
if(j>0)
j–;
else
j=23;
TIME[1]=((j/10)<<4)+j%10;
xian[2]=TIME[1]>>4; //分
xian[3]=TIME[1]& 0x0f;
Ds1302Init();
}
}
if(mode==3)//调整秒
{
if(!K2 &&(k!=2))//+
{
k=2;
j=10*(TIME[0]>>4)+(TIME[0]&0X0F);
if(j<59)
j++;
else
j=0;
TIME[0]=((j/10)<<4)+j%10;
xian[4]=TIME[0]>>4;
xian[5]=TIME[0]& 0x0f;
Ds1302Init();
while(!K3);//等待松开
}
if(!K3 &&(k!=3))//-
{
k=3;
j=10*(TIME[0]>>4)+(TIME[0]&0X0F);
if(j>0)
j–;
else
j=23;
TIME[0]=((j/10)<<4)+j%10;
xian[4]=TIME[0]>>4;
xian[5]=TIME[0]& 0x0f;
Ds1302Init();
}
}
if(K1 && K2 && K3)
k=0;
}
}
void Timer0() interrupt 1//T0中断
{
TH0=0X3C; //给定时器赋初值,定时50ms
TL0=0XB0;
if(time0<10)//定时
time0++;
else
{
time0=0;
//读取时间
Ds1302ReadTime();
xian[0]=TIME[2]>>4; //时
xian[1]=TIME[2]& 0x0f;
xian[2]=TIME[1]>>4; //分
xian[3]=TIME[1]& 0x0f;
xian[4]=TIME[0]>>4; //秒
xian[5]=TIME[0]& 0x0f;
}
if(sec<20)//1s
sec++;
else
sec=0;
}
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/97424.html