|
軟件設計:
#include<reg51.h>
#define ulong unsigned long
char tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共陽數碼管數字碼
char tab_dp[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x70,0x10};//共陽數碼管數字碼(帶小數點)
#define LED P0 //P0為數碼管的段選
#define LIGHT P1 //P1為時分秒位的指示燈
#define WS P2 //P2為數碼管的位選
sbit time_change=P3^0; //P3^0為“調時”按鍵
sbit time_choose=P3^1; //P3^1為“選擇時分秒”按鍵
sbit time_inc=P3^2; //P3^2為“增加”按鍵
sbit time_red=P3^3; //P3^3為“減小”按鍵
sbit time_ok=P3^4; //P3^4為“完成”按鍵
ulong t;
ulong sec,min,hour,sec_ge,sec_shi,min_ge,min_shi,hour_ge,hour_shi; //定義秒,分,時,秒的個位,十位,分的個位,十位,時的個位,十位
int choose_n; //按下“選擇時分秒”按鍵的次數
int flag; //定義“調時”按鍵的標志位
void init();
void display();
void delay(int);
void time_modify();
void main()
{
init();
while(1)
{
TR0=1;
display();
time_modify();
}
}
void init()
{
WS=t=LIGHT=choose_n=0;
sec_ge=sec_shi,min_ge,min_shi,hour_ge,hour_shi=sec=min=hour=flag=0;
TMOD=0x01; //定義定時器0工作與方式1
TH0=(65536-5536)/256; //定時器賦初值
TL0=(65536-5536)%256;
EA=1; //開總中斷和T0中斷
ET0=1;
}
//--------延時子函數-------------------//
void delay(int x)
{
int i,j;
for(i=x;i>0l;i--)
for(j=255;j>0;j--);
}
//-------------顯示子函數---------------//
void display()
{
int i=0;
if(TF0==1) //如果定時器溢出
{
TF0=0; //清中斷標志位
t++;
if(t==10)
{
t=0;
sec++; //秒加1
if(sec==60) //如果秒為60,則清零,分加1
{
sec=0;
min++;
}
if(min==60) //如果分為60,則清零,時加1
{
min=0;
hour++;
}
if(hour==24) //如果時為24,則清零
{
hour=0;
}
}
}
sec_ge=sec%10; //秒的個位和十位
sec_shi=sec/10;
min_ge=min%10; //分的個位和十位
min_shi=min/10;
hour_ge=hour%10; //時的個位和十位
hour_shi=hour/10;
WS=0x20; //循環掃描
LED=tab[sec_ge];
delay(1);
WS=0x10;
LED=tab[sec_shi];
delay(1);
WS=0x08;
LED=tab_dp[min_ge];
delay(1);
WS=0x04;
LED=tab[min_shi];
delay(1);
WS=0x02;
LED=tab_dp[hour_ge];
delay(1);
WS=0x01;
LED=tab[hour_shi];
delay(1);
}
//----------------調時子程序----------------------//
void time_modify()
{
if(time_change==0) //如果“調時”按鍵按下
{
delay(5); //延時去抖
if(time_change==0)
{
flag=1; //標志位置1
while(flag) //當標志位為1時才能進行時間調整
{
TR0=0; //定時器停止
display(); //顯示停止時的時間
if(time_ok==0) //如果“完成”按鍵按下
{
delay(15); //延時去抖
if(time_ok==0)
{
flag=0; //標志位清零
}
}
if(time_choose==0) //如果“時分秒選擇”按鍵按下
{
delay(30); //延時去抖
if(time_choose==0)
{
++choose_n; //按下的次數增加
if(choose_n==4) //如果次數達到4次
{
choose_n=1; //次數清零
}
if(choose_n==1) //如果次數為1,秒指示燈亮
{
LIGHT=0x03;
}
else if(choose_n==2) //如果次數為2,分指示燈亮
{
LIGHT=0x0c;
}
else if(choose_n==3) //如果次數為3,時指示燈亮
{
LIGHT=0x30;
}
}
}
if(time_inc==0) //如果“增加”按鍵按下
{
delay(30); //延時去抖
if(time_inc==0)
{
switch(choose_n) //分支結構,根據choose_n的值來判斷哪一位加1
{
case 1: //如果choose_n為1,秒加1,到60清零
{
sec++;
if(sec==60)
sec=0;
break;
}
case 2: //如果choose_n為2,分加1,到60清零
{
min++;
if(min==60)
min=0;
break;
}
case 3: //如果choose_n為3,時加1,到24清零
{
hour++;
if(hour==24)
hour=0;
break;
}
default:break;
}
}
}
if(time_red==0) //如果“減小”按鍵按下
{
delay(30); //延時去抖
if(time_red==0)
{
switch(choose_n) //分支結構,根據choose_n的值來判斷哪一位加1
{
case 1: //如果choose_n為1,秒減1,到0清零
{
sec--;
if(sec==0)
sec=60;
break;
}
case 2: //如果choose_n為2,分減1,到0清零
{
min--;
if(min==0)
min=60;
break;
}
case 3: //如果choose_n為3,時減1,到0清零
{
hour--;
if(hour==0)
hour=24;
break;
}
default:break;
}
}
}
}
}
}
}
硬件設計:
|
-
捕獲.PNG
(42.08 KB, 下載次數: 77)
下載附件
2019-11-17 22:29 上傳
可調數字時鐘的設計
評分
-
查看全部評分
|