導航:首頁 > 操作系統 > 單片機led點陣做模擬時鍾

單片機led點陣做模擬時鍾

發布時間:2023-03-25 12:06:33

㈠ 誰能告訴我51單片機簡單的led數碼管時鍾程序 24小時制的(c語言版的)

#include "reg52.h"
#define uint unsigned int
#define uchar unsigned char
uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar shi,fen,miao;
uchar time;
void delay(uint x)
{
uint y;
for(;x>0;x--)
{
for(y=0;y<124;y++);
}
}
void display(uchar shi,uchar fen,uchar miao)
{
P2=0; //位碼
P0=(tab[shi/10]); //段碼
delay(2);
P2=1;
P0=(tab[shi%10]);
delay(2);
P2=2; //位碼
P0=0x40; //段碼
delay(2);
P2=3; //位碼
P0=(tab[fen/10]); //段碼
delay(2);
P2=4;
P0=(tab[fen%10]);
delay(2);
P2=5; //位碼
P0=0x40; //段碼
delay(2);
P2=6; //位碼
P0=(tab[miao/10]); //段碼
delay(2);
P2=7;
P0=(tab[miao%10]);
delay(2);

}
void main()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
while(1)
{

if(time==20)
{
time=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
shi=0;
}

}

}
display(shi,fen,miao);
}
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
time++;
}

/*還有什麼不明白繼續追加*/

㈡ 求助單片機匯編語言:在LED上實現時鍾功能

程序就不寫了,因為每個人有每個人的寫作風格,我給你的程序,你不一定能理解我的思路,拿一個現成的程序讓你看,那最終不是你自己的,所以要讓自己弄懂,就給你一個思路,你就把程序做出來,那才是自己的東西,這里就給你一個思路

把0……9的數碼顯示代碼存在ROM里,用tab:db……(字型碼)來存,做一段1秒的定時程序,在程序的初始化時要做幾個計數器,分別對時分秒計數,先從秒開始,設初始值為10,然後是「分」60個,最後一個是「時」也是60,開中斷,啟動1秒定時器,一秒到了以後,把1的字型碼發送到串列口,然後秒計數器減1,在啟動1秒定時,到了後,把2字型碼發送出去……直到減為0,個位進1,將秒的「十」位字型碼發送到出去,分計數器從60開始減計數,這里要注意,定時器不能停,要一直的循環執行1秒定時,採用中斷方式,分進位後,再對時計數器減計數,就象這樣,不停的減計數,直至溢出後將相應的代碼發送出去,基本思路就是這樣,關鍵的就是幾個計數器的控制,要主要完成了一個周期後,要重新賦值

㈢ 求一段用51單片機來實現60個led燈循環點亮的程序,沒過一秒點亮一盞(就是模擬時鍾的秒針)

51單片機來實現60個led燈循環點亮的程序://************************************匯編程序:
#include<at89x51.h>
#define uchar unsigned char
#define uint unsigned int
uchar data count=0;
bit flag=0;
//*********主函數*****************
void main(void)
{
uchar i=0,k=0xfe;
TMOD=0x01;
TH0=0x4c;TL0=0x00;//定時50ms
EA=1;ET0=1;TR0=1;
while(1)
{
if(flag==1){k=k<<1|0x01;flag=0;i++;}
if(i==8){i=0;k=0xfe;}
P1=k;
}
}
//*********中斷函數*****************//0111 1111
void dy1s(void) interrupt 1 using 1
{
TH0=0x4c;TL0=0x00;//定時50ms
count++;
if(count==20){flag=1;count=0;} //1s到了
}。C語言程序編寫。
void main() { P1=0XFF; /*定義初始狀態為全滅*/while(1) { delay(2000); P1=0X7e; delay(2000); P1=0Xbd; delay(2000);P1=0Xdb;delay(2000); P1=0Xe7; delay(2000); P1=0Xdb;delay(2000); P1=0Xbd;delay(2000); P1=0X7e; delay(2000); P1=0XFF; /********此循環使得發光二極體按照07,16,25,34,43,52,61,70的順序循環交替兩兩點亮*******/} /*end while*/}/*end main*/

㈣ 用proteus模擬做LED點陣屏幕時鍾的時候,時間不真實,過七八秒,秒位才跳一次,CPU過載,請問怎麼解決

是用延時子程序計時得到的秒嗎?這樣就不準確,最好採用定時器並中斷的方扒純式還比較准點,但是模擬運行,這時間肯定是不準裂型的,與電腦的性能有關,如果電腦CPU的頻度不高,會影響模擬春源咐速度的。如果是採用定時器及中斷方式,就要優化程序了。

㈤ 用51單片機做一個LED顯示的電子鍾

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]="ME-400-A clock";
uchar code table1[]=" --:--:-- ";
uchar code table2[]="ALL:00:00:-- ";
uchar code table3[]=" ";
uchar clk_time[3]; //秒,分,時寄存器初始值
sbit T_RST=P2^2;//ds1302-5
sbit T_IO=P2^3;//ds1302-6
sbit T_CLK=P2^4;//ds1302-7
sbit en=P2^5; //參照LCD1602說明檔,使能信號
sbit rw=P2^6; //。。。。。。。。,讀寫信號端(輸入高電頻時為讀,低電為寫)
sbit rs=P2^7; //。。。。。。。。,數據/命令選擇端(H/L)
sbit led=P1^0;
sbit la=P1^1;
sbit wela=P1^2;
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
sbit up=P3^3;
sbit down=P3^4;
sbit set=P3^2;
sbit did=P1^4;
uchar num,clock_ss,clock_sg,clock_fs,clock_fg,clock_ms,clock_mg,b,clock_s,clock_g;
char hour,mie,sei,c,nhour,nmie,shour,smie;
/******************DS1302:寫入操作(上升沿)*********************/

void write_byte(uchar da)
{
uchar i;
ACC=da;
for(i=8;i>0;i--)
{
T_IO=ACC0;
T_CLK=0;
T_CLK=1;
ACC=ACC>>1;
}
}

/******************DS1302:讀取操作(下降沿)*****************/
uchar read_byte(void)
{
uchar i;
for(i=0;i<8;i++)
{
ACC=ACC>>1;
T_CLK = 1;
T_CLK = 0;
ACC7 = T_IO;
}
return(ACC);

}

/******************DS1302:寫入數據(先送地址,再寫數據)***************************/
void write_1302(uchar addr,uchar da)
{
T_RST=0; //停止工作
T_CLK=0; //只有在CLK為低電平時,才能將RST置為高電平,然後才能傳輸數據
T_RST=1; //重新工作
write_byte(addr); //寫入地址

write_byte(da);
T_RST=0;
T_CLK=1;
}

/******************DS1302:讀取數據(先送地址,再讀數據)**************************/
uchar read_1302(uchar addr)
{
uchar temp;
T_RST=0; //停止工作
T_CLK=0;
T_RST=1; //重新工作
write_byte(addr); //寫入地址
temp=read_byte();
T_RST=0;
T_CLK=1; //停止工作
return(temp);
}

/***********************延時程序=a*1ms**************************************/
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void fn()
{
did=0;
delay(120);
did=1;
delay(120);
did=0;
delay(120);
did=1;
delay(120);
did=0;
delay(120);
did=1;
delay(120);
did=0;
delay(320);
did=1;
delay(400);
}
void write_com(uchar com)
{
led=1;
wela=1;
P0=0xff;
delay(1);
led=0;
wela=0;
P0=0x00;
la=1;
delay(1);
la=0;
rs=0;
P0=com;
delay(5);
en=1;
delay(5);
en=0;
}

void write_data(uchar date)
{
led=1;
wela=1;
P0=0xff;
delay(1);
led=0;
wela=0;
P0=0x00;
la=1;
delay(1);
la=0;
rs=1;
P0=date;
delay(5);
en=1;
delay(5);
en=0;
}
void morning()
{ shour=clock_ss*10+clock_sg;
smie=clock_fs*10+clock_fg;
if(b==0)
{
if(nhour==shour)
{
if(smie>=nmie)
{
fn();
}
}
}

}
void init()
{
b=0;
P0=0xff;
delay(5);
led=1;
delay(5);
P0=0xff;
led=0;
la=0;
wela=1;
delay(5);
wela=0;//關ME-400開發板數碼管
nhour=0;
nmie=0;
rw=0;
en=0;
write_com(0x38);//設置液晶
write_com(0x0c);//設游標等
write_com(0x06);//寫一個字元地址指針加1且游標加1
write_com(0x01);//清屏
write_com(0x80);//設置s地址指針
}
void display(uchar add,date)
{
if(b==0)
{
clock_ms=clk_time[0]/ 16; clock_mg=clk_time[0]%16;
led=0;
clock_fs=clk_time[1]/ 16; clock_fg=clk_time[1]%16;
led=0;
clock_ss=clk_time[2]/ 16; clock_sg=clk_time[2]%16;
write_com(0x80+0x44);
write_data(0x30+clock_ss);
write_com(0x80+0x45);
write_data(0x30+clock_sg);
write_com(0x80+0x47);
write_data(0x30+clock_fs);
write_com(0x80+0x48);
write_data(0x30+clock_fg);
write_com(0x80+0x4a);
write_data(0x30+clock_ms);
write_com(0x80+0x4b);
write_data(0x30+clock_mg);

}
if(b!=0)
{
clock_s=date/ 10; clock_g=date%10;
write_com(0x80+0x40+add);
write_data(0x30+clock_s);
write_data(0x30+clock_g);
}

}
void key()
{
uchar clock_s1, clock_s2, clock_f1, clock_f2;
rw=0;

if(set==0)
{
delay(10);
if(set==0)
{
did=0;
delay(10); did=1;
b++;

}
while(!set);

if(b==1)
{
hour=clock_ss*10+clock_sg;
mie=clock_fs*10+clock_fg;
write_com(0x80+0x45);
write_com(0x0f);

}
if(b==2)
{
write_com(0x80+0x48);

}
if(b==3)
{
write_com(0x80+0x40);
for(num=0;num<13;num++)
{
write_data(table2[num]);

}

write_com(0x80+0x45); display(4,nhour);write_com(0x80+0x45);
}
if(b==4)
{

write_com(0x80+0x48);
display(7,nmie); write_com(0x80+0x48);

}
if(b==5)
{
write_com(0x80+0x40);
for(num=0;num<4;num++)
{
write_data(table3[num]);

}
write_com(0x80+0x45);
write_com(0x0c);
b=0;
clock_s1=hour/10;//十進制轉十六進制
clock_s2=hour%10;//十進制轉十六進制
clock_s1=clock_s1&0xff;//十進制轉十六進制
clock_s2=clock_s2&0xff;//十進制轉十六進制
clock_s1<<=4;//十進制轉十六進制
clock_s1=clock_s1|clock_s2;//十進制轉十六進制

clock_f1=mie/10;//十進制轉十六進制
clock_f2=mie%10;//十進制轉十六進制
clock_f1=clock_f1&0xff; //全1出1 與運算
clock_f2=clock_f2&0xff;//十進制轉十六進制
clock_f1<<=4;//十進制轉十六進制
clock_f1=clock_f1|clock_f2;//十進制轉十六進制

write_1302(0x8e,0x00); //WP=0 寫操作
write_1302(0x80,0x00);//寫秒
write_1302(0x82,clock_f1);//寫分
write_1302(0x84,clock_s1);//寫時
write_1302(0x86,0x14);//寫日
write_1302(0x88,0x02);//寫月
write_1302(0x8a,0x06);//寫星期
write_1302(0x8c,0x09);
write_1302(0x8e,0x80); //WP=1 防寫

}
}
if(b!=0)
{
if(up==0)
{
delay(10);
if(up==0)
{
did=0;
delay(10);
did=1;
while(!up);
if(b==1)
{

hour++;
if(hour>=24)
{
delay(1);
hour=0;
}
display(4,hour);
write_com(0x80+0x45);

}
if(b==2)
{
mie++;

if(mie>=60)
{
mie=0;
}
display(7,mie);
write_com(0x80+0x48);
}
if(b==3)
{

nhour++;
if(nhour>=24)
{
delay(1);
nhour=0;
}
display(4,nhour);
write_com(0x80+0x45);

}
if(b==4)
{
nmie++;

if(nmie>=60)
{
nmie=0;
}
display(7,nmie);
write_com(0x80+0x48);
}
}

}

if(down==0)
{
delay(10);
if(down==0)
{
did=0;
delay(10);
did=1;
while(!down);
if(b==1)
{
hour--;
if(hour<0)
{

hour=23;
}
display(4,hour);
write_com(0x80+0x45);

}
if(b==2)
{
mie--;
if(mie<0)
{
mie=59;
}
display(7,mie);
write_com(0x80+0x48);
}
if(b==3)
{
nhour--;
if(nhour<0)
{

nhour=23;
}
display(4,nhour);
write_com(0x80+0x45);

}
if(b==4)
{
nmie--;
if(nmie<0)
{
nmie=59;
}
display(7,nmie);
write_com(0x80+0x48);
}

}

}
}
}

void main()
{
uchar temp=0x80;
uchar i;
init();
for(num=0;num<14;num++)
{
write_data(table[num]);
delay(100);
}

write_com(0x80+0x40); // 設置數據地址指針為0X40
for(num=0;num<15;num++)
{
write_data(table1[num]);

}
/*for(num=0;num<16;num++)
{
write_com(0x18);
delay(20);
}*/
write_1302(0x8e,0x00);
write_1302(0x90,0xa4);
write_1302(0x8e,0x80);
while(1)
{

if(b==0)

{ temp=0x81;
for(i=0;i<3;i++)
{
clk_time[i]=read_1302(temp);
temp+=2;
}
display(0x4b,0x00);
}

morning();
key();

}
}

1602做的時鍾

㈥ 如何做一個單片機電子時鍾

這個很簡單啊,兩種思路:1,用單片機定時器來做,優點是外圍電路簡單,只需要一個單片機最小系統,和一個顯示模塊(1602液晶比較好);缺點是:定時不是很准,跑的時間長了會有誤差,而且主要是程序,要寫很多,不過程序不是很難。2,用時鍾晶元,一般都用DS1302,還需要單片機最小系統和顯示模塊,優點是:定時准確,誤差很小,在有備用電池的情況下,即使單片機掉電,也可以維持很長時間,程序相對簡單。缺點是:外圍電路比前者相對復雜一點。如果想做個實際的東西拿來用,建議使用第二種方法,如果是想鍛煉自己的編程能力的話,選第一種吧。祝成功!

㈦ 單片機製作電子時鍾用DS1302做時鍾源,一個16X16LED點陣顯示屏滾動顯示,可通過按鍵調節時間。

這要是模擬,還省點事。要做實物,費時了,用萬能電路板焊能快些。

㈧ 51單片機多功能LED點陣顯示數字時鍾

數字時鍾
這段程序是在PRTUES上完全好使
你可以根據 程序自己在PROTUES上畫圖

#include<reg51.h>
#define uint unsigned int
char code tab[]=;
char code table[]=;
sbit an=P2^5;
sbit wei=P2^6;
sbit button1=P1^0;
sbit button2=P1^1;
sbit button3=P1^2;
sbit button4=P1^3;
sbit button5=P1^4;
sbit button6=P1^5;
sbit button7=P1^6;
sbit button8=P1^7;
void delay(uint z);
void start();
void display();
static char a,b,c,d,k,e,f,g,h;
static char num1,num2,num3,num4;
void main()
{ start();
while(1)

if(button2==0)
if(button3==0)
if(button4==0)
{ delay(10);
if(button4==0)
}}
while(button4==0)
}
if(button5==0)
{ delay(10);
if(button5==0)
}
while(button5==0)
}
if(button6==0)
{ delay(10);
if(button6==0)
}
while(button6==0)
}
if(button7==0)
{delay(10);
if(button7==0)
{num3--;
if(num3<0)
}
while(button7==0)
}
if(button8==0)
{delay(10);
if(button8==0)

while(button8==0)
}
display();
} }

void start()
{ EA=1;
TMOD=0x01;ET0=1;
TH0=(65536-4000)/256;
TL0=(65536-4000)%256;}

void delay(uint z )
{ uint x,y;
for(x=z;x>0;x--)
for(y=120;y>0;y--);}

void timer1() interrupt 1
{ TH0=(65536-4000)/256;
TL0=(65536-4000)%256;
k++;
if(k==2) //總忘k把清零
{k=0;num1++;
if(num1==100)
{num1=0;num2++;
if(num2==60){num2=0;num3++;
if(num3==60){num3=0;num4++;
if(num4==24)}
}} }}

void display()
{a=num1/10;b=num1%10;c=num2/10;d=num2%10;
e=num3/10;f=num3%10;g=num4/10;h=num4%10;
wei=1;P0=0x80;wei=0;
an=1;P0=tab[b];an=0;delay(1);
P0=0x00;
wei=1;P0=0x40;wei=0;
an=1;P0=tab[a];an=0;delay(1);
P0=0x00;
wei=1;P0=0x20;wei=0;
an=1;P0=tab[d];an=0;
an=1;P0=table[d];an=0;delay(1);
P0=0x00;
wei=1;P0=0x10;wei=0;
an=1;P0=tab[c];an=0;delay(1);
P0=0x00;

wei=1;P0=0x08;wei=0;
an=1;P0=table[f];an=0;delay(1);
an=1;P0=tab[f];an=0;delay(1);
P0=0x00;
wei=1;P0=0x04;wei=0;
an=1;P0=tab[e];an=0;delay(1);
P0=0x00;
wei=1;P0=0x02;wei=0;
an=1;P0=tab[h];an=0;
an=1;P0=table[h];an=0;delay(1);
P0=0x00;
wei=1;P0=0x01;wei=0;
an=1;P0=tab[g];an=0;delay(1);
P0=0x00;

}

㈨ 利用AT89C51單片機設計簡易電子鍾(六位),通過8位LED數碼管實現時間顯示;系統可以通過三個按鍵實現時間


程序設計思路:1.利用單片機內部定時器作為計時器,調用timer函數;2、設計一套按鍵子程序;(3)設計一套數碼顯示管子程序。下列提供一套程序供參考。


#include<iom16v.h>

#include <macros.h>

#define uchar unsigned char

#define uint unsigned int


const uchar table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0-9對應字元

const uchar key_value[16]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};

uchar data[4]={0}; //顯示初始值為0

uint count=0; //初始計數值為0

uchar keynum;



void port_init() //埠初始化函數

{DDRA=0XFF; //埠A為推挽1輸出

PORTA=0XFF;

PORTB=0XFF; //埠B為推挽1輸出

DDRB=0XFF;

DDRC=0XFF; //埠C為不帶上拉電阻的輸入

PORTC=0XFF;

DDRD=0XFF; //埠D低4位為輸出

PORTD=0X0F;

}



void delay(uint j) //延時函數

{uint k;

while(j--)

{for(k=1000;k>0;k--) ;}

}



void display(uchar *p) //顯示函數

{uchar i,sel=0x01;

for(i=0;i<4;i++)

{PORTA=sel; //選通最右邊的數碼管

PORTB=table[p[i]]; //送字型碼

delay(1);

sel=sel<<1; //左移一位

}

}



uchar get_key(void)

{if((PIND&0X0F)!=0X0F) delay(3);

{

PORTD=0XEF;

switch(PIND&0X0F)

{case 0x0e: keynum=key_value[0];break;

case 0x0d: keynum=key_value[4];break;

case 0x0b: keynum=key_value[8];break;

case 0x07: keynum=key_value[12];break;

default:break;

}

PORTD=0xdf;

switch(PIND&0X0F)

{case 0x0e:keynum=key_value[1];break;

case 0x0d:keynum=key_value[5];break;

case 0x0b:keynum=key_value[9];break;

case 0x07:keynum=key_value[13];break;

default:break;

}


PORTD=0xbf;

switch(PIND&0X0F)

{case 0x0e:keynum=key_value[2];break;

case 0x0d:keynum=key_value[6];break;

case 0x0b:keynum=key_value[10];break;

case 0x07:keynum=key_value[14];break;

default:break;

}

PORTD=0x7f;

switch(PIND&0X0F)

{case 0x0e:keynum=key_value[3];break;

case 0x0d:keynum=key_value[7];break;

case 0x0b:keynum=key_value[11];break;

case 0x07:keynum=key_value[15];break;

default:break;

}

while((PIND&0x0f)!=0x0f);

}


return keynum;

}


void process(uint i,uchar *q) //拆分BCD碼函數,顯示千、百、十、個位

{ q[0]=i/1000;

i=i%1000;

q[1]=i/100;

i=i%100;

q[2]=i/10;

i=i%10;

q[3]=i;

}


void main(void)

{port_init();

PORTB=0xff;

PORTA=0X00;

delay(50);

PORTA=0xff;

while(1)

{get_key();

count=keynum;

process(count,data);

display(data);

}

}

㈩ 誰有proteus LED點陣時鍾模擬,最好proteus圖形,單片機是c51的哦,程序是c語言的哦急急急!!!

#include<reg51.h>

unsignedcharseven_seg[]={0xc0,0xf9,0xa4,0xb0,0x99,

0x92,0x82,0xf8,0x80,0x90};

unsignedcharflash,mode=0;

charmin=50,hour=12,hour_rom,min_rom,sec=25;

unsignedcharj,k;

unsignedinti;

unsignedcharkey_set_s,key_up_s,key_down_s,key_reset_s;

sbitP0_7=P0^7;

sbitkey_set=P3^4;

sbitkey_up=P3^5;

sbitkey_down=P3^6;

sbitkey_reset=P3^7;

sbitbuzzer=P1^0;

bitdop,bb;//聲明

voiddelay(unsignedintx)//延時

{

while(x--);

}

voidtimer0_isr(void)interrupt1//中斷枯瞎基服務函數

{

TH0=0xf8;//為65535-2000=63535轉化為16進製取高八位

TL0=0x2f;//取低八位

i++;

bb=!bb;

if(i>=250)//半秒,五百一秒

{

i=0;

k++;

flash=~flash;

dop=!dop;

}

if(k>=2)//大於二歸零

{

k=0;

sec++;

}

if(sec>=60)//秒

{

sec=0;

min++;

}

if(min>=60)//分

{

min=0;

hour++;

}

if(hour>=24)//小時

hour=0;

P0=0xff;//P0初始化為全111111111

if(mode==0)//正常顯示

{

switch(j)//控制語句

{

case0:P0=seven_seg[sec%10];P2=0xfe;break;//秒個位

case1:P0=seven_seg[sec/10];P2=0xfd;break;//秒十位

case2:P0=seven_seg[min%10];P0_7=dop;P2=0xfb;break;

case3:P0=seven_seg[min/10];P2=0xf7;break;

case4:P0=seven_seg[hour%10];P0_7=dop;P2=0xef;break;//dop為小數點

case5:P0=seven_seg[hour/10];P2=0xdf;break;

}

}

////////////////////

if(mode==1)//模式一C1狀態

{

switch(j)

{

case0:P0=seven_seg[min%10];P2=0xfe;break;

case1:P0=seven_seg[min/10];P2=0xfd;break;

case2:P0=seven_seg[hour%10]|沒謹flash;P2=0xfb;break;//flash為閃爍

case3:P0=seven_seg[hour/10]|flash;P2=0xf7;break;

case4:P0=seven_seg[1];P2=0xef;break;//1為C1狀態

case5:P0=0xc6;P2=0xdf;break;//0xc6為顯示C

}

}神悶

////////////////////

if(mode==2)//模式二C1狀態

{

switch(j)

{

case0:P0=seven_seg[min%10]|flash;P2=0xfe;break;

case1:P0=seven_seg[min/10]|flash;P2=0xfd;break;

case2:P0=seven_seg[hour%10];P2=0xfb;break;

case3:P0=seven_seg[hour/10];P2=0xf7;break;

case4:P0=seven_seg[1];P2=0xef;break;

case5:P0=0xc6;P2=0xdf;break;

}

}

////////////////////

if(mode==3)//模式三C2狀態

{

switch(j)

{

case0:P0=seven_seg[min_rom%10];P2=0xfe;break;

case1:P0=seven_seg[min_rom/10];P2=0xfd;break;

case2:P0=seven_seg[hour_rom%10]|flash;P2=0xfb;break;

case3:P0=seven_seg[hour_rom/10]|flash;P2=0xf7;break;

case4:P0=seven_seg[2];P2=0xef;break;

case5:P0=0xc6;P2=0xdf;break;

}

}

////////////////////

if(mode==4)//模式四C2狀態

{

switch(j)

{

case0:P0=seven_seg[min_rom%10]|flash;P2=0xfe;break;

case1:P0=seven_seg[min_rom/10]|flash;P2=0xfd;break;

case2:P0=seven_seg[hour_rom%10];P2=0xfb;break;

case3:P0=seven_seg[hour_rom/10];P2=0xf7;break;

case4:P0=seven_seg[2];P2=0xef;break;

case5:P0=0xc6;P2=0xdf;break;

}

}

j++;

if(j>=6)

j=0;

}

voidkey(void)//調用開關函數

{

////////////////

if(key_set==0)//設置

{

delay(300);

if(key_set==0)

key_set_s=1;

}

if(key_set==1&&key_set_s==1)

{

mode++;

if(mode>=5)

mode=1;

key_set_s=0;

}

/////////

if(key_up==0)//上調

{

delay(300);

if(key_up==0)

key_up_s=1;

}

if(key_up==1&&key_up_s==1)

{

if(mode==1)hour++;

if(mode==2)min++;

if(mode==3)hour_rom++;if(hour_rom>=24)hour_rom=0;

if(mode==4)min_rom++;if(min_rom>=60)min_rom=0;

key_up_s=0;

}

/////////////////

if(key_down==0)//下調

{

delay(300);

if(key_down==0)

key_down_s=1;

}

if(key_down==1&&key_down_s==1)

{

if(mode==1)hour--;if(hour<0)hour=23;

if(mode==2)min--;if(min<0)min=59;

if(mode==3)hour_rom--;if(hour_rom<0)hour_rom=23;

if(mode==4)min_rom--;if(min_rom<0)min_rom=59;

key_down_s=0;

}

/////////////////

if(key_reset==0)//復位

{

delay(300);

if(key_reset==0)

key_reset_s=1;

}

if(key_reset==1&&key_reset_s==1)

{

key_reset_s=0;

mode=0;

}

}

voidtimer0_init(void)//timero初始化函數

{

TMOD=0x01;//方式1

TH0=0xf8;

TL0=0x2f;

EA=1;//中斷開關

ET0=1;//中斷小開關

TR0=1;//開始計數

}

voidmain(void)//主函數

{

timer0_init();

while(1)

key();

{

if(hour==hour_rom&&min==min_rom)

buzzer=bb;//buzzer為蜂鳴器

}

}

閱讀全文

與單片機led點陣做模擬時鍾相關的資料

熱點內容
cocos2dluapdf 瀏覽:491
假的加密鎖靠譜嗎 瀏覽:176
經營聖手伺服器怎麼調 瀏覽:749
arduino手機編程 瀏覽:481
西醫pdf下載 瀏覽:29
後浪電影學院pdf 瀏覽:813
程序員怎麼做到不被人嫉妒 瀏覽:669
cmd新建文件夾md命令 瀏覽:570
php數組中的數值排序 瀏覽:832
安卓手機怎麼避免小孩內購 瀏覽:171
聯想伺服器出現黃色嘆號怎麼辦 瀏覽:991
約翰編譯器製作教程 瀏覽:130
大地pdf 瀏覽:109
pdfplus 瀏覽:577
匯編O命令 瀏覽:970
plt轉pdf 瀏覽:365
魔獸60宏命令大全 瀏覽:479
php志願者網站源碼 瀏覽:875
貿易pdf 瀏覽:497
dbug命令 瀏覽:352