❶ 單片機led顯示時間年月日
如果想使單片機控制的LED數碼管或點陣屏顯示時間年月日,需要根據硬體配置編寫完整的時鍾、日歷程序,程序調試好了下載到單片機里在整個系統供電正常時就可以自動顯示了。
❷ 51單片機如何實時顯示時間
單片機實時顯示時間,可以用ds1302產生時鍾,然後計算時鍾,並送出結果。
❸ 我剛接觸單片機,想用51單片機做一個程序,控制數碼管顯示時間,時間是要一直走下去,而且盡量准確
用51單片機的定時器是達不到這個
准確
的要求的。。。。有專用的時鍾晶元。。DS1302就是最基本的時鍾晶元。。
方法也很簡單。。找到DS1302晶元的PDF資料。。然後按照資料裡面的電路連接,然後編寫程序就OK了。。關鍵在於程序。。基本原理是。。單片機讀取DS1302那裡面的時鍾數據,然後判斷是否是你定的時間,如果是繼電器工作,不是就等下一次循環。。。就像看手錶一樣。。看到幾點幾分,做什麼事一樣。。。。
❹ STC單片機四位數碼管怎麼顯示時間
這個程序有你要的功能 給你參考一下 電路可能和你的不一樣
#include<AT89X51.H>
#define uchar unsigned char
#define uint unsigned int
#define LedDisp_Port P0
sbit smg1=P1^0;
sbit smg2=P1^1;
sbit smg3=P1^2;
sbit smg4=P1^3;
sbit Led1=P2^7;
unsigned char t0IntCnt=0x00; //定義變數
unsigned char second,minute,hour,x,y;
void display(); //聲明函數
void key_detect();
void delay_ms(uchar);
void system_init();
sbit key1=P3^7; //埠定義
sbit key2=P3^6;
sbit key3=P3^5;
sbit key4=P3^4; //埠定義
sbit key5=P3^3;
sbit key6=P3^2;
unsigned char code tab[10]=
{
0xC0,/*0*/ //共陽
0xF9,/*1*/
0xA4,/*2*/
0xB0,/*3*/
0x99,/*4*/
0x92,/*5*/
0x82,/*6*/
0xF8,/*7*/
0x80,/*8*/
0x90,/*9*/ //共陽
//0x3f, /*0*/ // 共陰
//0x06, /*1*/
//0x5b, /*2*/
//0x4f, /*3*/
//0x66, /*4*/
//0x6d, /*5*/
//0x7d, /*6*/
//0x07, /*7*/
//0x7f, /*8*/
//0x6f, /*9*/ // 共陰
};
/*--------------------------------
主程序
--------------------------------*/
void main()
{
system_init();
while(1)
{
display();
key_detect();
}
}
/*--------------------------------
初始化程序
--------------------------------*/
void system_init()
{
TMOD=0x01;
TR0=1;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
t0IntCnt=0x00;
second=0x00;
minute=0x00;
hour=0x00;
}
/*--------------------------------
定時器0中斷程序
--------------------------------*/
void timer0_ISR() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t0IntCnt++;
if(t0IntCnt==20)
{
t0IntCnt=0x00;
P1_0=!P1_0;
second++;
if(second==60)
{
second=0x00;
minute++;
if(minute==60)
{
minute=0x00;
hour++;
if(hour==24)
{
hour=0x00;
}
}
}
}
}
/*--------------------------------
毫秒延時程序
--------------------------------*/
void delay_ms(uchar no)
{
uchar i,j;
for(i=0;i<no;i++)
{
for(j=0;j<164;j++);
for(j=0;j<164;j++);
}
}
/*--------------------------------
動態掃描顯示程序
--------------------------------*/
void display()
{
/*======顯示秒和分=======
LedDisp_Port=tab[minute/10];
LedDisp_com1=0;
delay_ms(1);
LedDisp_com1=1;
LedDisp_Port=tab[minute%10];
if(t0IntCnt<11 )
{ LedDisp_dp=0; }
else
{ LedDisp_dp=1; }
LedDisp_com2=0;
delay_ms(1);
LedDisp_com2=1;
LedDisp_Port=tab[second/10];
LedDisp_com3=0;
delay_ms(1);
LedDisp_com3=1;
LedDisp_Port=tab[second%10];
LedDisp_com4=0;
delay_ms(1);
LedDisp_com4=1;
*/
/*=======顯示小時和分鍾=========*/
if(key==0)
{
P0=tab[x/10];
smg1=0;
delay_ms(1);
smg1=1;
P0=tab[x%10];
if(t0IntCnt<11 ) //定義dp點閃爍
{ LedDisp_dp=0; }
else
{ LedDisp_dp=1; } //定義dp點閃爍
LedDisp_com2=0;
delay_ms(1);
LedDisp_com2=1;
LedDisp_Port=tab[y/10];
LedDisp_com3=0;
delay_ms(1);
LedDisp_com3=1;
LedDisp_Port=tab[y%10];
if(t0IntCnt<11 ) //定義dp點閃爍
{ LedDisp_dp=0; }
else
{ LedDisp_dp=1; } //定義dp點閃爍
LedDisp_com4=0;
delay_ms(1);
LedDisp_com4=1;
LedDisp_Port=tab[0/10];
LedDisp_com5=0;
delay_ms(1);
LedDisp_com5=1;
LedDisp_Port=tab[0%10];
LedDisp_com6=0;
delay_ms(1);
LedDisp_com6=1;
}
else
{LedDisp_Port=tab[hour/10];
LedDisp_com1=0;
delay_ms(1);
LedDisp_com1=1;
LedDisp_Port=tab[hour%10];
if(t0IntCnt<11 ) //定義dp點閃爍
{ LedDisp_dp=0; }
else
{ LedDisp_dp=1; } //定義dp點閃爍
LedDisp_com2=0;
delay_ms(1);
LedDisp_com2=1;
LedDisp_Port=tab[minute/10];
LedDisp_com3=0;
delay_ms(1);
LedDisp_com3=1;
LedDisp_Port=tab[minute%10];
if(t0IntCnt<11 ) //定義dp點閃爍
{ LedDisp_dp=0; }
else
{ LedDisp_dp=1; } //定義dp點閃爍
LedDisp_com4=0;
delay_ms(1);
LedDisp_com4=1;
LedDisp_Port=tab[second/10];
LedDisp_com5=0;
delay_ms(1);
LedDisp_com5=1;
LedDisp_Port=tab[second%10];
LedDisp_com6=0;
delay_ms(1);
LedDisp_com6=1;
}
}
/*--------------------------------
按鍵檢測程序
--------------------------------*/
void key_detect()
{
if(!key_hour) //判斷鍵是否按下
{
hour++;
hour%=24;
while(!key_hour) //等待按鍵釋放
{
display();
}
}
if(!key_h) //判斷鍵是否按下
{
if(hour>0)
{
hour--;
hour%=24;
}
else
{
hour=23;
}
while(!key_h) //等待按鍵釋放
{
display();
}
}
if(!key_minute) //判斷鍵是否按下
{
minute++;
minute%=60;
while(!key_minute) //等待按鍵釋放
{
display();
}
}
if(!key_m) //判斷鍵是否按下
{
if(minute>0)
{
minute--;
minute%=60;
}
else
{
minute=59;
}
while(!key_m) //等待按鍵釋放
{
display();
}
}
if(!key_clr) //判斷鍵是否按下
{
hour=0x00;
minute=0x00;
second=0x00;
while(!key_clr) //等待按鍵釋放
{
display();
}
}
if(!key_a) //判斷鍵是否按下
{while(!key_a){display();}
x++;
if(x==24){x=0;}
}
if(!key_b) //判斷鍵是否按下
{while(!key_b){display();}
y++;
if(y==60)
{y=0;}
}
}
❺ 單片機電子時鍾怎麼顯示
HOUR EQU 40H ;存放時信息的單元
MINUTE EQU 41H ;存放分信息的單元
SECOND EQU 42H ;存放秒信息的單元
NUM EQU 43H ;存放T0溢出次數的單元
ORG 0000H ;程序入口
AJMP MAIN
ORG 0030H ;主程序入口
MAIN:MOV SP,#60H ;指定堆棧棧底
MOV HOUR,#00H
MOV MINUTE,#00H
MOV SECOND,#00H ;將時、分、秒分別清零
MOV NUM,#0
MOV TMOD,#01H ;設T0工作於方式1,用於定時
MOV TH0,#4CH ;設置T0的初始值
MOV TL0,#00H
MOV IE,#00H ;關中斷
SETB TR0 ;開啟定時器T0
LOOP:NOP
NOP
ACALL DISPLAY ;調用顯示子程序
NOP
NOP
LOOP1:JB TF0,TIME ;等待定時溢出
LJMP LOOP1
TIME:CLR TR0 ;關閉定時器
PUSH DPL ;保護現場
PUSH DPH
PUSH ACC
MOV TH0,#4CH ;重新設置T0的值
MOV TL0,#00H
SETB TR0 ;開啟T0
MOV A,NUM
INC A ;溢出次數+1
MOV NUM,A
CJNE A,#0AH,TT1 ;檢測鍵盤
MOV P1,#0FH ;設鍵盤初值
MOV R0,#04H ;延時消抖
LCALL DELAY
JNB P1.0,T0C1 ;為0表示P1.0按下,轉T0C1調整秒
JNB P1.1,T0C2 ;為0表示P1.1按下,轉T0C2調整分
JNB P1.2,T0C3 ;為0表示P1.2按下,轉T0C3調整時
TT1: CJNE A,#140,RR4
MOV NUM,#00H
T0C1:MOV A,SECOND
INC A ;秒單元內容加1
DA A ;調整為BCD碼
MOV SECOND,A
CJNE A,#60H,RR4 ;不為60秒繼續等待
setb flag:
clr flag
RR1: MOV SECOND,#00H ;為60秒將秒單元清零
T0C2:MOV A,MINUTE
INC A ;分單元內容加1
DA A ;調整為BCD碼
MOV MINUTE,A
CJNE A,#60H,RR4 ;不為60分繼續等待
RR2: MOV MINUTE,#00H ;為60分,分單元清零
T0C3:MOV P1,#0F0H ; 1小時閃一次
LCALL DELAY ;延時
MOV P1,#0FH
MOV A,HOUR
INC A ;時單元內容加1
DA A ;調整為BCD碼
MOV HOUR,A
CJNE A,#24H,RR4 ;不為24小時繼續等待
RR3: MOV HOUR,#00H ;為24小時,時單元清零
RR4: POP ACC ;恢復現場
POP DPH
POP DPL
LJMP LOOP
DELAY:MOV R1,#10H ;延時子程序
DELAY1:MOV R2,#20H
DJNZ R2,$
DJNZ R1,DELAY1
DJNZ R0,DELAY
RET
DISPLAY:MOV DPTR,#TAB ;送表頭基地址
MOV A,HOUR
ANL A,#0FH ;屏蔽時高位
MOVC A,@A+DPTR ;查時高位
MOV P0,A
CLR P2.6 ;開顯示
MOV R0,#1 ;延時消除鬼影
LCALL DELAY
SETB P2.6 ;關顯示
MOV A,HOUR
ANL A,#0F0H
SWAP A
MOVC A,@A+DPTR
MOV P0,A
CLR P2.7
MOV R0,#1
LCALL DELAY
SETB P2.7
MOV A,MINUTE
ANL A,#0FH
MOVC A,@A+DPTR
MOV P0,A
CLR P2.4
MOV R0,#1
LCALL DELAY
SETB P2.4
MOV A,MINUTE
ANL A,#0F0H
SWAP A
MOVC A,@A+DPTR
MOV P0,A
CLR P2.5
MOV R0,#1
LCALL DELAY
SETB P2.5
MOV A,SECOND
ANL A,#0FH
MOVC A,@A+DPTR
MOV P0,A
CLR P2.2
MOV R0,#1
LCALL DELAY
SETB P2.2
MOV A,SECOND
ANL A,#0F0H
SWAP A
MOVC A,@A+DPTR
MOV P0,A
CLR P2.3
MOV R0,#1
LCALL DELAY
SETB P2.3
RET
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
END
❻ 單片機可以列印出當前日期和時間表,是怎麼搞的
兩者都可以,矩陣鍵盤還可以幫助你理解程序,可以按照自己意願操作,按鍵按下的時候讀取按鍵對應IO口的狀態,然後跳轉到顯示部分,再按下其他按鍵後讓其進行加減等操作即可~
❼ 單片機從PC端讀取當前時間
單片機是無法直接讀取pc上的時間的,只能接收pc主動發出的數據。所以需要pc上運行小軟體實時讀取系統時間,通過串口、usb等方法傳到單片機上,再讓單片機顯示出來。
❽ 單片機控制8位數碼管,顯示年月日和時分秒,但是這兩者該如何切換呢
可以這樣做
年月日:11-12-14
時分秒:11-58-02
這樣每串都是8位,先顯示時分秒,20秒之後顯示一次年月日(可以持續5秒),這樣大部分時間都是顯示時間,還可以看到年月日。
你應該看過公交車的顯示屏,他不止顯示年月日、時分秒,還有溫度 適度等信息,就是這么顯示的。
也可以使用外接一個按鍵,來進行功能選擇,不過感覺輪換顯示的方式就行了,很實用。
❾ 單片機控制8位數碼管,顯示年月日和時分秒,但是這兩者該如何切換呢
切換方式可以有兩種,一種是手動的,就是用一個按鈕,按一下顯示年月日,再按一下顯示時鍾,再按就重復了。
另一種是自動切換,可以定時幾秒鍾一切換顯示。
你注意一下共交車上的時鍾和溫度的顯示就是自動切換的,可以用這種方式比較好。