用数码管及定时器实现简易时钟

kuaidi.ping-jia.net  作者:佚名   更新日期:2024-07-10
利用单片机的定时器和数码管,设计一个电子时钟

给你个电路和程序,//前几天帮一个网友写,单片机定时时钟在调节功能,可以参考一下我程序

/***************************************************
* 6位数码管显示电子钟
*
* 功能: 按键加,按键减, 按键,启动和停止。
*
*
***************************************************/
#include "REG52.H"

sbit SHUG_01 = P2^0; //数码管1
sbit SHUG_02 = P2^1; //数码管2
sbit SHUG_03 = P2^2; //数码管3
sbit SHUG_04 = P2^3; //数码管4
sbit SHUG_05 = P2^4; //数码管5
sbit SHUG_06 = P2^5; //数码管6
sbit KEY0_01 = P0^0; //按键 启动或停止sbit KEY0_02 = P0^1; //按键 加
sbit KEY0_03 = P0^2; //按键减
sbit KEY0_04 = P0^3; //按键菜单
#define LED_DATA P1 //P1数据端口
unsigned char value_temp = 0;unsigned char value_Outk = 0;
unsigned char value_shio = 8;
unsigned char value_feno = 40;
unsigned char value_miao = 0;
unsigned char code value_tab0[]={0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90}; //共阳极unsigned char code value_tab1[]={0x40, 0x79, 0x24, 0x30, 0x19, 0x12, 0x02, 0x78, 0x00, 0x10}; //共阳极带点

/*
* 延时1ms延时子函数
**/
void Delay_1ms(unsigned int Time)
{
unsigned int x, y;
for(x = Time; x > 0; x--)
for(y = 120; y > 0; y--);
}
/* * 程序运行【启动和停止】子函数
**/
void Disp_layledketCmd(void)
{
/***小时***/
SHUG_01 = 1;
LED_DATA = value_tab0[value_shio / 10]; /*******小时的十位数显示***************/
Delay_1ms(5);
SHUG_01 = 0;
SHUG_02 = 1;
LED_DATA = value_tab1[value_shio % 10]; /*******小时的个位数显示***************/
Delay_1ms(5);
SHUG_02 = 0;
/***分钟***/ SHUG_03 = 1;
LED_DATA = value_tab0[value_feno / 10]; /*******分钟的十位数显示***************/
Delay_1ms(5);
SHUG_03 = 0;
SHUG_04 = 1;
LED_DATA = value_tab1[value_feno % 10]; /*******分钟的个位数显示***************/
Delay_1ms(5);
SHUG_04 = 0;
/***秒钟***/ SHUG_05 = 1;
LED_DATA = value_tab0[value_miao / 10]; /*******秒钟的十位数显示***************/
Delay_1ms(5);
SHUG_05 = 0;
SHUG_06 = 1;
LED_DATA = value_tab0[value_miao % 10]; /*******秒钟的个位数显示***************/
Delay_1ms(5);
SHUG_06 = 0;
}
/* * 定时器初始化定时50ms
**/
void Tero_Init(void)
{
TMOD = 0x01;
TH0 = 0x4C;
TL0 = 0x00;
ET0 = 1;
TR0 = 1;
EA = 1;
}
/* * 按键开关【启动和停止】子函数
**/
void Scan_keyoutCmd(void)
{
if(KEY0_01 == 0)
{
Delay_1ms(10);
if(KEY0_01 == 0)
{
TR0 = ~ TR0;
}
while(KEY0_01 == 0);
}
if(KEY0_02 == 0) {
Delay_1ms(10);
if(KEY0_02 == 0)
{
value_miao--;
if(value_miao == -1)
{
value_feno--;
value_miao = 59;
if(value_feno == -1)
{
value_shio--;
value_feno = 59;
if(value_shio == -1)
{
value_shio = 23;
}
}
}
while(KEY0_02 == 0);
}
}
if(KEY0_03 == 0) {
Delay_1ms(10);
if(KEY0_03 == 0)
{
value_miao++;
if(value_miao == 60)
{
value_miao = 0;
value_feno++;
if(value_feno == 60)
{
value_feno = 0;
value_shio++;
if(value_shio == 24)
{
value_shio = 0;
}
}
}
while(KEY0_03 == 0); //检测松手
}
}
}
/* * 函数主体
**/
int main(void)
{
P1 = P2 = P3 = 0x00;
Tero_Init();

while(1)
{
Scan_keyoutCmd();
Disp_layledketCmd(); //执行应运程序
}
}
/* * 定时器中断服务程序
**/
void Tmero()interrupt 1
{
TH0 = 0x4C;
TL0 = 0x00;
value_temp++;
if(value_temp == 20)
{
value_temp = 0;
value_miao++;
if(value_miao == 60)
{
value_feno++;
value_miao = 0;
if(value_feno == 60)
{
value_shio++;
value_feno = 0;
if(value_shio == 24)
{
value_shio = 0;
}
}
} }
}

ORG 0000HAJMP MAIN // ;跳转到主程序 ORG 000BH // ;T0中断入口AJMP PTF0 // ;中断处理首地址 //主程序MAIN: MOV SP,#05FH MOV 30H,#0 // ;缓冲单元设置初值12:00:00 MOV 31H,#0 MOV 32H,#0 MOV 36H,#0FH // ; 设置4000次中断计数 MOV 37H,#0A0H MOV TMOD,#02H // ;定时器启动 MOV TL0,#6 MOV TH0,#6 SETB TR0 // 启动T0计时器 MOV IE,#82H MOV IP,#20H//数码管动态显示LED6: LCALL DISPLAY JNB P1.0,CLEAR //;判断键盘输入 JNB P1.1,SET_MINUTE JNB P1.2,SET_HOUR AJMP LED6CLEAR: LCALL DISPLAY JNB P1.0,CLEAR MOV 30H,#12H //;时钟显示复位 A键 MOV 31H,#0 MOV 32H,#0 SJMP LED6SET_MINUTE: LCALL DISPLAY JNB P1.1,SET_MINUTE MOV A,31H //;调节分加1 B键 CJNE A,#59H,MIN MOV 31H,#0 SJMP LED6SET_HOUR: LCALL DISPLAY JNB P1.2,SET_HOUR MOV R1,#30H //;调节时加1 C键 MOV A,@R1 CJNE A,#23H,HOUR // 比较立即数和A,不相等则转移 MOV 30H,#0MIN: ADD A ,#1 //将1加到累加器 DA A // 累加器十进制调整 MOV 31H,A LCALL DELAY1 AJMP LED6HOUR: ADD A,#1 DA A MOV 30H,A LCALL DELAY1 AJMP LED6DISPLAY: MOV DPTR,#TAB //;表的首地址给16位数据指针寄存器DPTR MOV A,30H // ;时为的十位显示 SWAP A // A的高四位和低四位互换 ANL A,#0FH // A与00001111相与 MOVC A,@A+DPTR // 程序存储器代码字节传送到累加器 MOV P2,#7FH MOV P0,A LCALL DELAY //调用延时子程序 MOV A,30H // ;时位的个位显示 ANL A,#0FH MOVC A,@A+DPTR MOV P2,#0BFH JB 00H,DIS01 ORL A,#80HDIS01: MOV P0,A LCALL DELAY MOV A,31H // ;分位的十位显示 SWAP A ANL A,#0FH MOVC A,@A+DPTR MOV P2,#0EFH MOV P0,A LCALL DELAY MOV A,31H //;分位的个位显示 ANL A,#0FH MOVC A,@A+DPTR MOV P2,#0F7H JB 00H,DIS02 ORL A,#80HDIS02: MOV P0,A LCALL DELAY MOV A,32H // ;秒位的十位显示 SWAP A ANL A,#0FH MOVC A,@A+DPTR MOV P2,#0FDH MOV P0,A LCALL DELAY MOV A,32H //;秒位的个位显示 ANL A,#0FH MOVC A,@A+DPTR MOV P2,#0FEH MOV P0,A LCALL DELAY RET//中断程序PTF0: PUSH PSW ;中断处理 PUSH ACC MOV PSW,#8 DJNZ 37H,PTF0R DJNZ 36H,PTF0R MOV 36H,#0FH MOV 37H,#0A0H MOV R0,#32H //;定时到一秒 MOV A,@R0 ADD A,#1 DA A MOV @R0,A CPL 00H CJNE A,#60H,PTF0R MOV @R0,0 DEC R0 MOV A,@R0 ADD A,#1 DA A MOV @R0,A CJNE A,#60H,PTF0R MOV @R0,#0 DEC R0 MOV A,@R0 ADD A,#1 DA A MOV @R0,A CJNE A,#24H,PTF0R MOV @R0,#0PTF0R: POP ACC // 保护现场 POP PSW RETI // 中断返回DELAY: MOV R6,#10 //;动态显示延时L0: MOV R7,#250 DJNZ R7,$ DJNZ R6,L0 // 寄存器减一,不为0则转移 RET // 子程序返回DELAY1: MOV R5,#1BH //;调整时、分显示延时L1: MOV R6,#9HL2: MOV R7,#19H DJNZ R7,$ DJNZ R6,L2 DJNZ R5,L1 RET //数码显示表TAB: DB 3FH,06H,5BH,4FH,66H // ; 0,1,2,3,4 DB 6DH,7DH,07H,7FH,6FH // ; 5,6,7,8,9 END

用单片机+数码管,可以制作简易吋钟。

#include<reg51.h>

#define uchar unsigned char

#define uint unsigned int

sbit qingling=P1^0;    //清零

sbit tiaofen=P1^1;    //调分

sbit tiaoshi=P1^2;    //调时

sbit sounder=P1^7;    //naozhong

uint a,b;

uchar hour,minu,sec,     //时钟

hour0,minu0,sec0,  //秒表

hour1,minu1,sec1;

h1,h2,m1,m2,s1,s2, //显示位

k,s;     //状态转换标志

uchar code select[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};

uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

/*****************函数声明***********************/

void keyscan();

void init();

void delay(uchar z);

void display(uchar,uchar,uchar);

void sounde();

/*****************主函数*************************/   

void main()

{

init();

while(1)

{          

while(TR1)

{

keyscan();  // 扫描函数

while(s==1) // s是状态标志,当s=0时,闹钟取消。s=1时,设定闹钟时间

//(也是通过调时,调分函数);

{         //s=2时,闹钟工作,时间与设定时刻一致时,闹钟响

// (一分钟后自动关闭,可手动关闭)。再次切换,s=0.

keyscan(); //s状态切换(0-》1-》2-》0)通过外部中断1实现。

display(hour1,minu1,sec1); //闹钟时刻显示

}

display(hour0,minu0,sec0);//时钟表显示      

while(k)  /*k是秒表状态(0-》1-》2-》0)通过外部中断0实现。

0秒表关;1秒表从零计时;2秒表停,显示计时时间*/

{

display(hour,minu,sec);  //秒表显示      

}

}

}

}

/*****************初始化函数***********************/

void init()

{

a=0;

b=0;

k=0;

s=0;

hour0=0;

minu0=0;

sec0=0;

hour=0;

minu=0;

sec=0;

hour1=0;

minu1=0;

sec1=0;

TMOD=0x11;          //定时器0,1工作于方式1;赋初值

TH0=(65536-5000)/256;

TL0=(65536-5000)%256;

TH1=(65536-50000)/256;

TL1=(65536-50000)%256;

EA=1;

EX0=1;     //秒表中断

EX1=1;     //闹钟设定中断

ET0=1;

ET1=1;

IT0=1;      //边沿触发方式

IT1=1;

PX0=1;

PX1=1;

TR0=0;        //初始,秒表不工作

TR1=1;      //时钟一开始工作  

}

/*****************定时器0中断*************/

void timer0_int() interrupt 1  //秒表

{

TH0=(65536-5000)/256;

TL0=(65536-5000)%256;

a++;

if(a==2)

{

a=0;

sec++;

if(sec==100)

{

sec=0;    //毫秒级

minu++;

if(minu==60)

{

minu=0;      //秒

hour++;

if(hour==60)    //分

{

hour=0;

}

}

}

}

}

/*************外部中断0中断函数************/

void ex0_int() interrupt 0

{    

k++;

if(k==3)

k=0;

if(k==1)

{

TR0=~TR0;

if(TR0==1)

{        

hour=0;

minu=0;

sec=0;    

}

}

if(k==2)

{

TR0=~TR0;

}    

}

/*************外部中断1中断函数************/

void ex1_int() interrupt 2

{

s++;

if(s==3)

s=0;

}

/*************定时器1中断****************/

void timer1_int() interrupt 3     //控制时钟工作

{

TH1=(65536-50000)/256;

TL1=(65536-50000)%256;

if(s==2)

{

if(hour1==hour0 && minu0==minu1)

sounde();

}

b++;

if(b==20)

{

b=0;

sec0++;

if(sec0==60)

{  

sec0=0;

minu0++;

if(minu0==60)

{

minu0=0;

hour0++;

if(hour0==24)

hour0=0;

}

}

}

}

/*************键盘扫描****************/

void keyscan()

{

if(s==1)

{

if(qingling==0)

{

delay(10);

if(qingling==0)

{

sec1=0;

minu1=0;

hour1=0;

}

}

if(tiaofen==0)

{

delay(10);

if(tiaofen==0)

{

minu1++;

if(minu1==60)

{

minu1=0;

}

while(!tiaofen);

}

}

if(tiaoshi==0)

{

hour1++;

if(hour1==24)

{

hour1=0;

}

while(!tiaoshi);

}

}

else   //调整时钟时间

{

if(qingling==0)

{

delay(10);

if(qingling==0)

{

sec0=0;

minu0=0;

hour0=0;

}

}

if(tiaofen==0)

{

delay(10);

if(tiaofen==0)

{

minu0++;

if(minu0==60)

{

minu0=0;

}

while(!tiaofen);

}

}

if(tiaoshi==0)

{

hour0++;

if(hour0==24)

{

hour0=0;

}

while(!tiaoshi);

}

}  

}

/*************显示函数****************/

void display(uchar hour,uchar minu,uchar sec)

{

h1=hour/10;

h2=hour%10;

m1=minu/10;

m2=minu%10;

s1=sec/10;

s2=sec%10;

P0=0xff;

P2=table[h1];

P0=select[7];

delay(5);

P0=0xff;

P2=table[h2];

P0=select[6];

delay(5);

P0=0xff;

P2=0x40;;

P0=select[5];

delay(5);

P0=0xff;

P2=table[m1];

P0=select[4];

delay(5);

P0=0xff;

P2=table[m2];

P0=select[3];

delay(5);

P0=0xff;

P2=0x40;

P0=select[2];

delay(5);

P0=0xff;

P2=table[s1];

P0=select[1];

delay(5);

P0=0xff;

P2=table[s2];

P0=select[0];

delay(5);

}

/*************闹钟函数****************/

void sounde()

{

sounder=~sounder;  

}

/*************延时函数****************/

void delay(uchar z)

{

int x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}



数字钟 万年历 电路 程序 仿真都有

  • 采用定时器,设计制作一个时钟,用六位数码管显示时间,用三个按键可以调整...
    答:用51单片机的定时器,设计一个时钟,用8位一体共阴数码管显示时间时分秒,用三个按键可以调整时间。可用proteus仿真实现,仿真图如下。
  • 用数码管及定时器实现简易时钟
    答:TR0=0; //初始,秒表不工作 TR1=1; //时钟一开始工作 }
  • 利用单片机的定时器和数码管,设计一个电子时钟
    答:LED_DATA = value_tab1[value_feno % 10]; /***分钟的个位数显示***/ Delay_1ms(5);SHUG_04 = 0;/***秒钟***/ SHUG_05 = 1;LED_DATA = value_tab0[value_miao / 10]; /***秒钟的十位数显示***/ Delay_1ms(5);SHUG_05 = 0;SHUG_06 = 1;LED_DATA = value_...
  • 八位数码管和锁存器制作电子时钟
    答:时间时初值 setb tr0 ;启动定时器T0 setb tr1 ;启动定时器T1loop:lcall display ;调用时间显示程序 lcall keysan ;调用时间调节按钮 lcall keynz ;调用闹钟控制按钮 ajmp loopinti0:push psw ;压入堆栈指针,保护现场 push acc clr ea ;关中断 mov th0,#4ch ;重...
  • 做一个电子钟,利用六个数码管显示分、秒。
    答:做一个电子钟,利用六个数码管显示分、秒。中间两个数码管显示两个横线**--**(例如45--10表示45分10秒)用到段锁存器74LS273、位锁存器(8031CPU的P1口当位锁存器使用)同时显示多位数字技术。利用定时器定时中断单片机程序 和 原理图 分到60直接显示00--00,再开始!!! 展开 ...
  • 用AT89S51(单片机)设计一个电子钟
    答:系统运行时,由8个LED数码管分别显示时、分、秒。在任何时候都可以通过键盘来调... 以AT89S51为核心组成一个电子钟。电路主要由微处理器(AT89S51)、电源电路、键盘电路和显示电路组成。系统运行时,由8个LED数码管分别显示时、分、秒。在任何时候都可以通过键盘来调整时间。系统具有定时功能,当时间走到预定的时间时...
  • 跪求简易数字钟设计电路,只显示小时和分钟,输入时钟脉冲周期为1min,4...
    答:;定时器中断服务程序,对分钟和小时的计数 INT_T0:MOV TH0,#3CH MOV TL0,#0B0H INCTCNT MOVA,TCNT CJNEA,#20,RETUNE;计时1秒 INCSECOND MOVTCNT,#0 MOVA,SECOND CJNEA,#60,RETUNE INCMINUTE MOVSECOND,#0 MOVA,MINUTE CJNEA,#60,RETUNE INCHOUR MOVMINUTE,#0 MOVA,HOUR CJNEA,#24...
  • 设计电子时钟 要用AT89S51单片机的定时器实现,用4位数码管显示,用点的...
    答:一个调分钟键,一个设置闹钟时间键 实验方法:TIMER0中断用来计时,控制数码时钟的时间显示 还可设置半秒或四分之一秒,用来控制音调 TIMER1用来控制音普,,timer0用MODE2自动加载模式 */ include<reg52.h> sbit speaker=P2^3 ;sbit AA=P2^2 ; //调时用 sbit BB=P2^1 ; //调分用 sbit CC...
  • ...数码管(用74HC595驱动)显示的简易时分秒的电子钟。需要c语言程序...
    答:/***定时器1中断***/void timer1_int() interrupt 3 //控制时钟工作{ TH1=(65536-50000)/256; TL1=(65536-50000)%256; if(s==2) { if(hour1==hour0 && minu0==minu1) sounde(); } b++; if(b==20) { b=0; sec0++; if(sec0=...
  • 设计电子时钟 要用AT89S51单片机的定时器实现,用4位数码管显示,用点的...
    答:我的 设计电子时钟 要用AT89S51单片机的定时器实现,用4位数码管显示,用点的闪烁表示秒,我需要电路原理图 80 时间可以通过按键修改2个或者3个或者4个按键都可以... 时间可以通过按键修改 2个或者3个或者4个按键都可以 展开  我来答 4个回答 #热议# 已婚女性就应该承担家里大部分家务吗?hz...