新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 51單片機(jī)C編程(六、定時(shí)器時(shí)鐘顯示時(shí)分秒)

51單片機(jī)C編程(六、定時(shí)器時(shí)鐘顯示時(shí)分秒)

作者: 時(shí)間:2016-11-27 來源:網(wǎng)絡(luò) 收藏
六位數(shù)碼管顯示時(shí)分秒,通過四個(gè)按鍵進(jìn)行時(shí)間的控制。按下"調(diào)時(shí)"按鍵,時(shí)間顯示停止;按下"選擇時(shí)分秒"按鍵,數(shù)碼管上方的發(fā)光二極管會(huì)點(diǎn)亮,對(duì)應(yīng)著選中的要修改的時(shí)間是小時(shí)、分鐘還是秒;按下"按下增加"按鍵,選中的時(shí)間將會(huì)增加;按下"完成"按鍵,時(shí)間繼續(xù)顯示。

已通過proteus仿真,電路圖如下所示,希望大家多多指點(diǎn),積極留言:

本文引用地址:http://butianyuan.cn/article/201611/322159.htm

//編程:jumpmysoul

#include
#define ulong unsigned long
char tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共陽數(shù)碼管數(shù)字碼
char tab_dp[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x70,0x10};//共陽數(shù)碼管數(shù)字碼(帶小數(shù)點(diǎn))

#define LED P0//P0為數(shù)碼管的段選
#define LIGHT P1//P1為時(shí)分秒位的指示燈
#define WS P2//P2為數(shù)碼管的位選

sbit time_change=P3^0;//P3^0為“調(diào)時(shí)”按鍵
sbit time_choose=P3^1;//P3^1為“選擇時(shí)分秒”按鍵
sbit time_inc=P3^2;//P3^2為“增加”按鍵
sbit time_ok=P3^3;//P3^3為“完成”按鍵

ulong t;
ulong sec,min,hour,sec_ge,sec_shi,min_ge,min_shi,hour_ge,hour_shi;//定義秒,分,時(shí),秒的個(gè)位,十位,分的個(gè)位,十位,時(shí)的個(gè)位,十位
int choose_n;//按下“選擇時(shí)分秒”按鍵的次數(shù)
int flag;//定義“調(diào)時(shí)”按鍵的標(biāo)志位
//---------------------------------------------------------------------
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;//定義定時(shí)器0工作與方式1
TH0=(65536-5536)/256;//定時(shí)器賦初值
TL0=(65536-5536)%256;
EA=1;//開總中斷和T0中斷
ET0=1;
}
//--------------------------------延時(shí)子函數(shù)------------------------------------
void delay(int x)
{
int i,j;
for(i=x;i>0l;i--)
for(j=255;j>0;j--);
}
//-------------------------------顯示子函數(shù)---------------------------------------
void display()
{
int i=0;

if(TF0==1)//如果定時(shí)器溢出
{
TF0=0;//清中斷標(biāo)志位
t++;
if(t==10)
{
t=0;
sec++;//秒加1
if(sec==60)//如果秒為60,則清零,分加1
{
sec=0;
min++;
}
if(min==60)//如果分為60,則清零,時(shí)加1
{
min=0;
hour++;
}
if(hour==24)//如果時(shí)為24,則清零
{
hour=0;
}
}
}
sec_ge=sec%10;//秒的個(gè)位和十位
sec_shi=sec/10;
min_ge=min%10;//分的個(gè)位和十位
min_shi=min/10;
hour_ge=hour%10;//時(shí)的個(gè)位和十位
hour_shi=hour/10;

WS=0x20;//循環(huán)掃描
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);
}
//----------------------------調(diào)時(shí)子程序-------------------------------
void time_modify()
{
if(time_change==0)//如果“調(diào)時(shí)”按鍵按下
{
delay(5);//延時(shí)去抖
if(time_change==0)
{
flag=1;//標(biāo)志位置1
while(flag)//當(dāng)標(biāo)志位為1時(shí)才能進(jìn)行時(shí)間調(diào)整
{
TR0=0;//定時(shí)器停止
display();//顯示停止時(shí)的時(shí)間
if(time_ok==0)//如果“完成”按鍵按下
{
delay(15);//延時(shí)去抖
if(time_ok==0)
{
flag=0;//標(biāo)志位清零
}
}
if(time_choose==0)//如果“時(shí)分秒選擇”按鍵按下
{
delay(30);//延時(shí)去抖
if(time_choose==0)
{
++choose_n;//按下的次數(shù)增加
if(choose_n==4)//如果次數(shù)達(dá)到4次
{
choose_n=1;//次數(shù)清零
}
if(choose_n==1)//如果次數(shù)為1,秒指示燈亮
{
LIGHT=0x03;
}
else if(choose_n==2)//如果次數(shù)為2,分指示燈亮
{
LIGHT=0x0c;
}
else if(choose_n==3)//如果次數(shù)為3,時(shí)指示燈亮
{
LIGHT=0x30;
}
}
}
if(time_inc==0)//如果“增加”按鍵按下
{
delay(30);//延時(shí)去抖
if(time_inc==0)
{
switch(choose_n)//分支結(jié)構(gòu),根據(jù)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,時(shí)加1,到24清零
{
hour++;
if(hour==24)
hour=0;
break;
}
default:break;
}
}
}
}
}
}
}



評(píng)論


技術(shù)專區(qū)

關(guān)閉