用数码管及定时器实现简易时钟
给你个电路和程序,//前几天帮一个网友写,单片机定时时钟在调节功能,可以参考一下我程序
/***************************************************
* 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,再开始!!! 展开 ...
答:系统运行时,由8个LED数码管分别显示时、分、秒。在任何时候都可以通过键盘来调... 以AT89S51为核心组成一个电子钟。电路主要由微处理器(AT89S51)、电源电路、键盘电路和显示电路组成。系统运行时,由8个LED数码管分别显示时、分、秒。在任何时候都可以通过键盘来调整时间。系统具有定时功能,当时间走到预定的时间时...
答:;定时器中断服务程序,对分钟和小时的计数 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...
答:一个调分钟键,一个设置闹钟时间键 实验方法:TIMER0中断用来计时,控制数码时钟的时间显示 还可设置半秒或四分之一秒,用来控制音调 TIMER1用来控制音普,,timer0用MODE2自动加载模式 */ include<reg52.h> sbit speaker=P2^3 ;sbit AA=P2^2 ; //调时用 sbit BB=P2^1 ; //调分用 sbit CC...
答:/***定时器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位数码管显示,用点的闪烁表示秒,我需要电路原理图 80 时间可以通过按键修改2个或者3个或者4个按键都可以... 时间可以通过按键修改 2个或者3个或者4个按键都可以 展开 我来答 4个回答 #热议# 已婚女性就应该承担家里大部分家务吗?hz...