當前位置:編程學習大全網 - 編程語言 - 請高手用單片機C語言編寫c51時鐘程序,含有6個數顯管,3個按鍵,要自己寫的,不要百度什麽的復制粘貼

請高手用單片機C語言編寫c51時鐘程序,含有6個數顯管,3個按鍵,要自己寫的,不要百度什麽的復制粘貼

這是我初學時寫的,剛好也是數碼管 /*位選接P2口,三個按鈕分別接P25~P27。段碼接P1,T0計數

*/

#include<reg51.h>

#define DOU 1818//按鍵消抖時間sbit led_1=P2^0;

sbit led_2=P2^1;

sbit led_3=P2^2;

sbit led_4=P2^3;

sbit led_5=P2^4;

sbit dp=P1^7;sbit an_mod=P2^5;

sbit an_movright=P2^6;

sbit an_up=P2^7;unsigned char code tab[]={0x90,0xd7,0xa2,0x86,0xc5,0x8c,0x88,0xd6,0x80,0x84};unsigned char num=0,hour=0,minute=0,secon=0,week=1;//20個num是壹秒

unsigned char hour_1=0,hour_2=0,minute_1=0,minute_2=0,week_1=1;

bit first_flag=0,adj=0;

unsigned char mod=0;

unsigned char led_mov=0;/*以上是全局變量*/void init()

{

P1=0XFF;

P2=0xff;

EA=1;//開放中斷

ET0=1;

PT0=1;//設T0優級

TMOD=0X01;//T0以16位計時方式工作

TH0=0x3c;//49996us

TL0=0xb7;

TR0=1;

}void delay(unsigned int us)

{

while(--us);

}void led_show()

{

if((hour/10)<=0)//時第壹位小於10,則關閉第壹位顯示

{

led_1=1;

}else

{

P1=tab[hour/10];

led_1=0;//開1

delay(250);

led_1=1;

} P1=tab[hour%10];

if(num<10){dp=1;}//秒點熄滅

else{dp=0;}//秒點點亮

led_2=0;//開2

delay(230);

led_2=1;

P1=tab[minute/10];

led_3=0;//開3

delay(290);

led_3=1;

P1=tab[minute%10];

led_4=0;//開4

delay(290);

led_4=1;

P1=tab[week];

led_5=0;//開5

delay(80);

led_5=1;

}void led_adj()

{

P1=tab[hour_1];

led_1=0;//開1

if(led_mov==0){delay(200);}else{

delay(2);}

led_1=1; P1=tab[hour_2];

led_2=0;//開2

if(led_mov==1){delay(200);}else{

delay(2);}

led_2=1; P1=tab[minute_1];

led_3=0;//開3

if(led_mov==2){delay(200);}else{

delay(2);}

led_3=1; P1=tab[minute_2];

led_4=0;//開4

if(led_mov==3){delay(200);}else{

delay(2);}

led_4=1; P1=tab[week_1];

led_5=0;//開5

if(led_mov==4){delay(50);}else{

delay(1);}

led_5=1;

}void keyscan()

{

switch(mod)

{

case 0:

if(an_mod==0)

{

delay(DOU);

if(an_mod==0){

mod=1;

}

while(!an_mod);

}

if(an_up==0)

{

delay(DOU);

if(an_up==0){

mod=2;

}

while(!an_up);

}

break;

case 1:

if(first_flag==0)//first_flag=0代表第壹次掃描,把當前時間賦值給調整時間

{

led_mov=0;

hour_1=hour/10;

hour_2=hour%10;

minute_1=minute/10;

minute_2=minute%10;

week_1=week;

first_flag=1;//將first_flag置位

}else{

if(an_mod==0&&adj==0)//按模式鍵 adj=0代表沒有調整過數值,將不改變任何設置直接退出

{

delay(DOU);

if(an_mod==0){

mod=0;

first_flag=0;

}

while(!an_mod);

}

if(an_movright==0)//右移鍵

{

delay(DOU);

if(an_movright==0){

led_mov++;

}

while(!an_movright);

}

if(an_up==0)//向上調整時間

{

delay(DOU);

if(an_up==0)

{

switch(led_mov)

{

case 0:hour_1++;

break;

case 1:hour_2++;

break;

case 2:minute_1++;

break;

case 3:minute_2++;

break;

case 4:week_1++;

break;

}

adj=1;

}

while(!an_up);

}

if(an_mod==0&&adj==1)//經過調整後按mod鍵寫入數據

{

delay(DOU);

if(an_mod==0)

{

first_flag=0;//確定後重新置位

adj=0;

mod=0;

hour=hour_1*10+hour_2;

minute=minute_1*10+minute_2;

secon=0;

week=week_1;

num=0;

}

while(!an_mod);

}

}

break;

case 2:

if(an_up==0)

{

delay(DOU);

if(an_up==0){mod=0;}

while(!an_up);

}

}

}void check_num()

{

if(week>=8){week=1;} if((hour_1*10+hour_2)>=24){hour_1=0;hour_2=0;}

if(minute_1>=7){minute_1=0;}

if(minute_2>=10){minute_2=0;}

if(week_1>=8){week_1=1;} if(led_mov>=5){led_mov=0;}

}void conver()

{

if(num>=20)

{

secon++;

num=0;

if(secon>=60){minute++;secon=0;}

if(minute>=60){hour++;minute=0;}

if(hour>=24){week++;hour=0;}

// if(hour==23&&minute==55&&secon==0){secon=secon+1;}//每天的23時55分0秒自動校準時間

}

}

void main()

{

init();

while(1)

{

keyscan();

switch(mod)

{

case 0:led_show();

break;

case 1:led_adj();

break;

case 2:P1=0xff;P2=0xff;

}

conver();

check_num();

}

}void zd() interrupt 1

{

TH0=0x3c;//49996us

TL0=0xb7;

num++;

}

  • 上一篇:怎麽設置電腦U盤啟動
  • 下一篇:玩冒險島時CPU使用率太高。
  • copyright 2024編程學習大全網