📄 -
字号:
/***********************Copyright (c)
** File name: ShuZiZhong.c
** Last modified Date: 20101220
** Created by: 邹海春
** Descriptions: 单片机数字钟
**********************************/
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define CYCLE 1000 /*定时1ms */
unsigned char i,j,k,ID; /*ID 为case 的次数 K为LED灯控制。*/
unsigned char temp;
unsigned char b,c;
uchar hour=0,min=0,sec=0; /*定义秒时分初始值*/
uchar a[6]; /*定数码管显示缓冲*/
uint t=0;
uint flag=0;
bit fla;
unsigned char count;
sbit KEY1=P3^0;
sbit KEY2=P3^1;
sbit KEY3=P3^2;
sbit KEY4=P3^3;
sbit LED2=P1^0;
sbit BEEP=P0^7;
void Modifytime(); /*时间调整模块*/
void Adjust();
void scan(); /*扫描数码模块*/
void Time_BEEP();
void delay10ms(void)/*软件10ms定时*/
{ unsigned char i,j;
for(i=20;i>0;i--)
for(j=248;j>0;j--); /*2us*248*20=9920软件延时*/
}
void dely250(void)
{ unsigned char i,j;
for(i=2;i>0;i--) /* 248*2us*2=1ms 软件延时*/
for(j=248;j>0;j--);
}
/* Mian函数*/
void main()
{
TCON=0x01; /*TIMER0工作在方式1*/
TMOD=0x01;
TH0=(65536-CYCLE)/256; /*设定T0每隔1000us(1ms)中断一次*/
TL0=(65536-CYCLE)%256;
TR0=1;
IE=0x82;
Modifytime();
while(1)
{
if (flag==100)
{
{
temp=0xfe;
P1=temp;
delay10ms();
for(k=0;k<8;k++)
{
b=temp<<k;
c=temp>>(8-k);
P1=b|c;
delay10ms();
}
for(k=0;k<8;k++)
{
b=temp>>k;
c=temp<<(8-k);
P1=b|c;
delay10ms();
}
}
}
if(flag==1000) /*判断1秒钟到否*/
{
sec++; /*秒加一*/
Modifytime();
flag=0;
while ((min==0)&(sec==0))
{
if (flag==100)
{
{ BEEP=0;
BEEP=1;
}
}
if (flag==600) break;
}
}
while(KEY1== 0)
{
while(1)
{
if(KEY1==0)
{
delay10ms();
if(KEY1==0)
{
ID++;
if(ID==2)
{
ID=0;
}
while(KEY1==0);
}
}
switch(ID)
{
case 0: Adjust();
break;
case 1:
LED2=0;
if(flag==1000) /*判断1秒钟到否*/
{
sec++; /*秒加一*/
Modifytime();
flag=0;
while ((min==0)&(sec==0))
{ if (flag==100)
{
{ BEEP=0;
BEEP=1;
}
}
if (flag==600) break;
}
}
break;
}
}
}
}
}
/*时间调整模块*/
void Modifytime()
{
uchar temp;
temp=sec; /*uchar temp=sec;*/
sec%=60;
min+=temp/60; /*求余*/
temp=min;
min%=60;
hour=(hour+temp/60)%24;
a[0]=(sec%10); /*调整过的时间送到显示缓冲中*/
a[1]=(sec/10); /*对于秒计数单元中的数据要把它十位数和个数分开,方法仍采用对10整除和对10求余。 */
a[2]=(min%10); /*对于分计数单元中的数据要把它十位数和个数分开,方法仍采用对10整除和对10求余。 */
a[3]=(min/10);
a[4]=(hour%10); /*对于时计数单元中的数据要把它十位数和个数分开,方法仍采用对10整除和对10求余。 */
a[5]=(hour/10);
}
/*扫描数码模块*/
void scan( ) /*扫描6个数码管子程序*/
{ static uchar x;
x++;
if(x>5) x=0; /*6个数码管都扫描过了则重新开始*/
P0=x|(a[x]<<3); /*选中需要扫描的数码管并送数据*/
}
/*中断模块*/
void Timer0Int() interrupt 1 using 2
{ t++;
if(t==100)
{
flag=100;
}
else if(t==200)
{
flag=200;
}
else if(t==600)
{
flag=600;
}
else if (t==1000)
{
flag=1000;
t=0;
}
else
flag=0;
scan();
TH0=(65536-CYCLE)/256;
TL0=(65536-CYCLE)%256;
}
/*键盘控制模块*/
void Adjust()
{
while(1)
{
if(KEY2==0)
{
for(i=40;i>0;i--) /*248*2us*5=2480=2.5ms 软件延时*/
for(j=248;j>0;j--);
if(KEY2==0)
{
sec++;
for(count=200;count>0;count--)
{
BEEP=~BEEP;
dely250();
}
if(sec==60)
{
sec=0;
}
a[0]=(sec%10);
a[1]=(sec/10);
while(KEY2==0);
}
}
if(KEY3==0)
{
for(i=16;i>0;i--)
/*248*2us*40=20ms 软件延时*/
for(j=248;j>0;j--);
if(KEY3==0)
{
min++;
for(count=200;count>0;count--)
{
BEEP=~ BEEP;
dely250();
}
for(count=200;count>0;count--)
{
BEEP =~ BEEP;
dely250();
dely250();
}
if(min==60)
{
min=0;
}
a[2]=(min%10);
a[3]=(min/10);
while(KEY3==0);
}
}
if(KEY4==0)
{
for(i=40;i>0;i--) /*(248*2us*40=1980ns=20ms) 软件延时*/
for(j=248;j>0;j--);
if(KEY4==0)
{
hour++;
for(count=200;count>0;count--)
{
BEEP =~BEEP;
dely250();
dely250();
}
if(hour==24)
{
hour=0;
}
a[4]=(hour%10);
a[5]=(hour/10);
while(KEY4==0);
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -