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

用数码管及定时器实现简易时钟。
时钟要求:
1.实现日、 时、分钟、秒。
2.日以30日,时以24小时,分钟以60分钟,秒以60秒为标准。
3.初始时间可自由定义。
4.使用工作方式1,16计数方式实现。
5.八位数码管前两位显示日,三四位显示时,五六位显示分钟,七八位显示秒。

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

#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--);

}

温馨提示:内容为网友见解,仅供参考
第1个回答  2018-01-15
数字钟 万年历 电路 程序 仿真都有

用数码管及定时器实现简易时钟
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_...

基于51单片机简易时钟闹钟八位数码管显示Proteus仿真
本设计旨在实现一个基于51单片机的多功能数字时钟闹钟,其主要功能包括显示时、分、秒,并能设置时间和闹钟。该设计采用单片机内部定时器实现计时功能,通过八位数码管显示当前时间。用户可以对时、分、秒进行独立设置,设置时数码管将闪烁。此外,闹钟功能可让用户设置特定时间,当时间到达,蜂鸣器将每秒鸣响...

设计电子时钟 要用AT89S51单片机的定时器实现,用4位数码管显示,用点的...
实验方法:TIMER0中断用来计时,控制数码时钟的时间显示 还可设置半秒或四分之一秒,用来控制音调 TIMER1用来控制音普,,timer0用MODE2自动加载模式 *\/ include<reg52.h> sbit speaker=P2^3 ;sbit AA=P2^2 ; \/\/调时用 sbit BB=P2^1 ; \/\/调分用 sbit CC=P2^0 ; \/\/ 设置闹钟用 sbit P1...

采用定时器,设计制作一个时钟,用六位数码管显示时间,用三个按键可以调整...
用51单片机的定时器,设计一个时钟,用8位一体共阴数码管显示时间时分秒,用三个按键可以调整时间。可用proteus仿真实现,仿真图如下。

设计电子时钟 要用AT89S51单片机的定时器实现,用4位数码管显示,用点的...
我的 设计电子时钟 要用AT89S51单片机的定时器实现,用4位数码管显示,用点的闪烁表示秒,我需要电路原理图 80 时间可以通过按键修改2个或者3个或者4个按键都可以... 时间可以通过按键修改 2个或者3个或者4个按键都可以 展开  我来答 4个回答 #热议# 已婚女性就应该承担家里大部分家务吗?hz...

八位数码管和锁存器制作电子时钟
时间时初值 setb tr0 ;启动定时器T0 setb tr1 ;启动定时器T1loop:lcall display ;调用时间显示程序 lcall keysan ;调用时间调节按钮 lcall keynz ;调用闹钟控制按钮 ajmp loopinti0:push psw ;压入堆栈指针,保护现场 push acc clr ea ;关中断 mov th0,#4ch ;重...

实现实时时钟在数码管上显示时间
实现实时时钟在数码管上显示时间的实验涉及到DS1302实时时钟模块的应用,DS1302是一种串行接口的实时时钟芯片,其内部具备日历时钟功能。芯片通过简单的串行接口与微处理器通信,提供秒数、分钟、小时、星期、日期、月份和年份信息。该芯片设计为低功耗运行,数据和时钟信息在1μs内保留。DS1302芯片使用同步...

单片机控制多位数码管的电子时钟程序
\/*** 项目名称:数码管电子时钟 实现功能:数码管显示时间、日期,时间、日 期可调,可设置闹钟,闹铃响一分钟。 ***\/ #include reg52.h #define uint unsigned int #define uchar unsigned char uint numwe,tt,t,numdu,set,aclock,rili; unsigned long int time,time1=0; unsigned long int...

单片机课程设计8位数码管电子钟at89c52代码怎么写?
设计旨在打造一个基于51单片机的多功能数字时钟闹钟,通过八位数码管进行显示,并具备多种功能。主要功能包括采用单片机内部定时器实现计时,使用八位数码管显示时分秒,实现时、分、秒的加减设置并伴有闪烁提示,设置闹钟并配置其响铃间隔与持续时间,以及手动消除闹钟。通过 Proteus 仿真软件,实现从硬件到...

相似回答