❶ 单片机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位数码管,显示年月日和时分秒,但是这两者该如何切换呢
切换方式可以有两种,一种是手动的,就是用一个按钮,按一下显示年月日,再按一下显示时钟,再按就重复了。
另一种是自动切换,可以定时几秒钟一切换显示。
你注意一下共交车上的时钟和温度的显示就是自动切换的,可以用这种方式比较好。