導航:首頁 > 操作系統 > 單片機led時鍾

單片機led時鍾

發布時間:2022-09-01 18:59:08

❶ 如何用c語言編程實現用89c51單片機控制8個led燈像電子時鍾那樣顯示

假設你單片機的p1口連了led燈:
#include
sbit
led
=
p1^0;//這是點第一位燈
int
main(void)
{
while(1)
{
led
=
0;//假設led燈為共陽極的
}
return
0;
}
點亮led燈的形式有很多,這里給出一種僅供參考

❷ 用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做的時鍾

❸ 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;

}

❹ 誰能告訴我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秒定時,採用中斷方式,分進位後,再對時計數器減計數,就象這樣,不停的減計數,直至溢出後將相應的代碼發送出去,基本思路就是這樣,關鍵的就是幾個計數器的控制,要主要完成了一個周期後,要重新賦值

❻ 求一個簡單的單片機時鍾程序

#include<reg51.h>
#defineucharunsignedchar
ucharcodeledtab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0-9
unsignedcharsec=0,min=0,hour=0,scanled;
unsignedcharkey,time;
unsignedchardisdat[6];
sbitK=P1^0;
voiddischg()
{
disdat[0]=sec%10;
disdat[1]=sec/10;
disdat[2]=min%10;
disdat[3]=min/10;
disdat[4]=hour%10;
disdat[5]=hour/10;
}
voidt0isr()interrupt1 //秒計時
{
TR0=0;
TH0=0x3c;
TL0=0xb0;
TR0=1;
time++;
if(time==20)
{
time=0;
sec++;
if(sec>59)
{
sec=0;
min++;
if(min>59)
{
min=0;
hour++;
if(hour>23)hour=0;
}
}
}
dischg();
}
voidt1isr()interrupt3 //顯示
{
TH1=0xec;
TL1=0x78;
switch(scanled)
{
case0:
P2=0x01;
P0=~ledtab[disdat[5]];
break;
case1:
P2=0x02;
P0=~ledtab[disdat[4]]&0x7f;
break;
case2:
P2=0x04;
P0=~ledtab[disdat[3]];
break;
case3:
P2=0x08;
P0=~ledtab[disdat[2]]&0x7f;
break;
case4:
P2=0x10;
P0=~ledtab[disdat[1]];
break;
case5:
P2=0x20;
P0=~ledtab[disdat[0]];
break;
default:break;
}
scanled++;
scanled%=6;
}
main()
{
TMOD=0x11;
TH0=0x3c;
TL0=0xb0;
TH1=0xec;
TL1=0x78;
EA=1;
TR1=1;
ET0=1;
ET1=1;
sec=0;
min=0;
hour=0;
scanled=0;
time=0;
key=0;
dischg();
while(1)
{
if(K==0)
{
while(K==0);
key++;
key%=2;
}
switch(key)
{
case0:
TR0=1;
break;
case1:
TR0=0;
break;
}
}
}

❼ 怎麼用51單片機做一個時鍾

  1. 一片單片機+一個LED數碼模塊或LCD液晶模塊+一段簡單的程序=一個簡單的時鍾。

  2. 一片單片機+一片DS1302或其他的時基晶元+一個LED數碼模塊或LCD液晶模塊+一段簡單的程序=一個實用的時鍾。

  3. 系統構成確定了以後,程序就有現成的了,可以移步到網路網頁「網路一下」里搜索,資源多如牛毛。

❽ 基於51單片機的旋轉LED數字電子鍾

這可是要做出實物才能實現的功能。要做實物,還要遙控,這製作很有難度。可不是就憑你這幾句就能做到的,就算給你電路圖,可實際製作過程,需要什麼元件和工具清楚嗎?做不到,就等於一堆空話。

❾ 51單片機電子時鍾設計怎麼更改led燈閃爍頻率用匯編語言

你這個程序錯誤太多了,用匯編時關鍵的幾個程序段都未分清:主程序、定時器T0中斷、定時器T1中斷等,因MOV IE,#8AH語句說明用的是中斷方式,顯然漏了 ORG 0000H、ORG 000BH和ORG 001BH偽指令。要改時間可改CJNE R7,#160,JW中的160。

❿ 單片機製作的LED電子時鍾的功能,寫在實驗報告上的,最好詳細點,實在扯不出來了

1、可以顯示切換顯示年、月、日、時、分、秒、星期
2、可以對時間日期進行設置,在設置時設置值閃爍顯示
3、星期根據基姆拉爾森計算公式自動算出
4、閏年修正
5、硬體至少有4個按鍵,4位數碼管加兩秒點

閱讀全文

與單片機led時鍾相關的資料

熱點內容
華為的伺服器現在被什麼公司收購 瀏覽:285
伺服器粘包怎麼處理 瀏覽:726
怎麼進創意工坊的伺服器 瀏覽:786
空調壓縮機加變頻器 瀏覽:968
加密貨幣有哪些可以玩 瀏覽:993
騰訊雲伺服器如何生成備案授權碼 瀏覽:950
計算機學演算法好還是人工智慧 瀏覽:500
java命令運行eclipse 瀏覽:979
u盤加密其他辦法 瀏覽:808
zm螺紋演算法 瀏覽:778
excel與數據分析pdf 瀏覽:153
特斯拉的智能演算法 瀏覽:204
單片機開發費用 瀏覽:937
軸流壓縮機原理 瀏覽:290
右鍵只顯示文件夾 瀏覽:548
壓縮皮膚哪個好用嗎 瀏覽:504
為什麼右鍵中新建文件夾沒有了 瀏覽:177
算術平均演算法教程 瀏覽:558
電視上App怎麼調亮度 瀏覽:946
優酷app怎麼點擊彈窗 瀏覽:703