基于51单片机的时钟设计
程序员文章站
2022-03-13 17:18:11
...
#基于51单片机的时钟设计
此文章为某年某月某次单片机作业,一点拙见
首先:再keil上写下代码,用protues调试(不懂得百度搜索“keil与protues联机调试”)
使用的芯片和器件图中自己找
这次没有使用38译码器,直接将数码管引脚全部放在单片机上
不多说,上代码和图:
代码如下
/***********************************/
/* 时间2019.12.20,地点:dq218 转载请说明出处 */
/***********************************/
#include<reg51.h>
#define uChar unsigned char
#define uInt unsigned int
#define d 60
#define q 20
sbit Key1 = P3^0; //规定四个按键‖第五个按键K5为常开触点,按下后不弹起
sbit Key2 = P3^1;
sbit Key3 = P3^2;
sbit Key4 = P3^3;
sbit Buzzer=P1^1;
uChar a[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
uChar b[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uChar second=50,minute=30,hour=21,year=19,month=12,day=10,flag=0,flag1=0,count;
/***************延时函数***************/
void Delay(uInt t)
{
while(t)
{
t--;
}
}
/***************显示时间函数***************/
void Dispaly1(uChar second,uChar minute,uChar hour)
{
P2=b[0];
P0=a[hour/10];
Delay(d);
P2=b[1];
P0=a[hour%10];
Delay(d);
P2=b[2];
P0=0x40;
Delay(d);
P2=b[3];
P0=a[minute/10];
Delay(d);
P2=b[4];
P0=a[minute%10];
Delay(d);
P2=b[5];
P0=0x40;
Delay(d);
P2=b[6];
P0=a[second/10];
Delay(d);
P2=b[7];;
P0=a[second%10];
Delay(d);
}
/***************显示日期函数***************/
void Dispaly2(uChar day,uChar month,uChar year)
{
P2=b[0]; //第一位
P0=a[2];
Delay(d);
P2=b[1]; //第二位
P0=a[0];
Delay(d);
P2=b[2]; //第三位
P0=a[year/10];
Delay(d);
P2=b[3]; //第四位
P0=a[year % 10];
Delay(d);
P2=b[4];
P0=a[month/10]; //第五位
Delay(d);
P2=b[5];
P0=a[month%10]; //第六位
Delay(d);
P2=b[6]; //第七位
P0=a[day/10];
Delay(d);
P2=b[7]; //第八位
P0=a[day%10];
Delay(d);
}
/****************按键函数1****************/
/***************功能:修改时间**********/
void Keyscan1()
{
static uChar i=0,j=0;
if(Key1==0)
{
Delay(q);
if(Key1==0)
while(!Key1);
i++;
}
if(i%2==1) //关闭定时器
{
TR0=0;
}
if(i%2==0) //打开定时器
{
TR0=1;
}
if(Key2==0)
{
Delay(q);
if(Key2==0)
while(!Key2);
j++;
}
if(j%3==0&&i%2==1) //修改时分秒
{
if(Key3==0)
{
Delay(q);
if(Key3==0)
while(!Key3);
second++;
if(second==60)
second=0;
}
}
if(j%3==1&&i%2==1) //当k1按下后才能修改时间
{
if(Key3==0)
{
Delay(q);
if(Key3==0)
while(!Key3);
minute++;
if(minute==60)
minute=0;
}
}
if(j%3==2&&i%2==1)
{
if(Key3==0)
{
Delay(q);
if(Key3==0)
while(!Key3);
hour++;
if(hour==24)
hour=0;
}
}
}
/****************按键函数2****************/
/****************功能:修改日期***********/
void Keyscan2()
{
static uChar m=0,n=0;
if(Key1==0) //K1按下后才能修改日期或时间
{
Delay(d);
if(Key1==0)
while(!Key3);
m++;
}
if(m%2==1)
{
TR0=0; //定时器关
}
if(m%2==0)
{
TR0=1; //定时器开
}
if(Key2==0) //K2功能:选择修改 “时分秒“ 或者 ”年月日”
{
Delay(10);
if(Key2==0)
while(!Key2);
n++;
}
if(n%3==0) //选择修改天数
{
if(Key3==0)
{
Delay(d);
if(Key3==0)
while(!Key3);
day++;
if(day==30)
day=0;
}
}
if(n%3==1) //选择修改月份
{
if(Key3==0)
{
Delay(10);
if(Key3==0)
while(!Key3);
month++;
if(month==12)
month=0;
}
}
if(n%3==2) //选择修改年份
{
if(Key3==0)
{
Delay(d);
if(Key3==0)
while(!Key3);
year++;
if(year==99)
year=0;
}
}
}
/***************主函数***************/
void main()
{
TMOD=0x01;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256; /*10ms*/
EA=1;
ET0=1;
TR0=1;
while(1)
{
static uChar h=0;
if(Key4==0) //K4功能:12小时/24小时/日期切换
{
Delay(10);
if(Key4==0)
{
while(!Key4);
h++;
}
}
if(h%3==0)
{
Dispaly1(second,minute,hour); //显示24小时制
Keyscan1();
}
if(h%3==1)
{
Dispaly1(second,minute,hour-12); //显示12小时制
Keyscan1();
}
if(h%3==2)
{
Dispaly2(year,month,day); //显示日期
Keyscan2();
}
if(Key3==0)
{
Delay(d);
if(Key3==0)
while(!Key3);
flag++;
}
if(flag%2==0) //记录K3按下后flag加一
{
flag1=0;
}
if(flag%2==1)
{
flag1=1;
}
/***********闹钟设定时间21:31开始响,无人应答30s后关闭*/
if(minute==31&&(second>0&&second<30)&&hour==21&&flag1==0)
Buzzer=0;//蜂鸣器响
else
Buzzer=1;//蜂鸣器关
}
}
/**************中断函数***************/
void time0_int(void) interrupt 1
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
count++;
if(count==100) //10ms*100=1s
{
count=0;
second++;
if(second==60) //秒归零
{
second=0;
minute++;
if(minute==60) //分钟归零
{
minute=0;
hour++;
if(hour==24) //小时归零
{
hour=0;
day++;
if(day==30) //天数归零
{
day=0;
month++;
if(month==12) //月份归零
{
month=0;
year++;
if(year==99) //年份归零
{
year=0;
}
}
}
}
}
}
}
}