利用单片机定时器制作数字时钟

作者&投稿:包爬 (若有异议请与网页底部的电邮联系)
利用单片机的定时器和数码管,设计一个电子时钟~

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

/***************************************************
* 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;
}
}
} }
}

相关资料: 多功能数字钟设计 一 简介 时钟, 自从它发明的那天起,就成为人类的朋友,但随着时间的推移,人们对它的功能又提出了新的要求,怎样让时钟更好的为人民服务,怎样让我们的老朋友焕发青春呢?这就要求人们不断设计出新型时钟。本方案设计的多功能电子钟除了传统的显示时间功能之外还可以测试温度、电网频率、电压、并提供了过压报警、非接触止闹等功能。其中温度采用AD590温度传感器电路测得,非接触止闹则采用红外控制技术实现。 二 方案论证 时钟模块方案 方案一 基本门电路搭建 用基本门电路来实现数字钟,电路结构复杂,故障系数大,不易调试。 方案二 单片机编程 用单片机设计电路,由于使用软硬件结合的方式,所以电路结构简单、调试也相对方便。与第一种方案比较优点是非常明显的。我们选择了第二种方案 测温模块方案 方案一 热电阻测温 热电阻测量温度,精度和灵敏度都可以,但是它的电阻值与温度的线性关系不好.不便用数字的方法处理。 方案二 热电偶测温 热电偶是温度测量中应用最广泛的一种传感器 .在一般的测量和控制中,常用于中高温的温度检测.在 测量中需要温度的冷端补偿,在数字电子中实现不方便 方案三 AD590加运算放大器 二端式半导体温度传感器 AD590的工作电压要求不高,测温的范围比较宽最重要的是它的输出电流是紧随温度变化的电流源,所以它的线性非常好.我们选择了这种方案。 测电压模块方案 方案一 取样测试。用高速的取样电压取样,可得电压的峰值与主频率,并根据其电压大小进行相应的报警操作。此方案功能实现复杂,造价相对较高,不适合一般的家用。 方案二 测得电压有效值 测电压的有效值的方法比较简单,可以把一段时间内的电压的整体情况反映出来 ,但不能测出电压的瞬时变化的情况,对电网的突然冲击不能测出. 方案三 测得峰值推得有效值。交流电经过整流滤波后得到直流电压大小就是交流电的峰值,分压测出此电压大小,后根据交流电有效值和峰值的关系可推得有效值。这种方案采用的电路简单,实现方便,易于调试,精度较高, 为我们的设计采用。 非接触止闹模块方案 方案一 声音止闹 声音代替肢体给人带来了很大便利,但是要采用声控装置不得不考虑外界噪声对正常声音信号带来的干扰,而这一点又很难控制,因此虽然声控方便,但在这里不太适用所以割舍。 方案二 红外止闹 红外控制技术现在已被广泛地应用到各个领域,此技术有其独特的特点,首先操作方便抗干扰性好、探测灵敏度高、工作湿度范围宽设计电路有不太复杂,造价也不高,由于这些特点我们选用了红外遥控来止闹。 显示模块方案 方案一 段码显示。段码显示需要专门的驱动,增大了硬件电路,调试不易。而且用段码表示不够直观,因此不采用这种方案 方案二 单片机控制液晶显示。控制部分集成在单片机内软件调试,硬件集成度大,为本方案所采用。 综上所述得到以下方块图: 三 各模块功能 单片机控制显示部分:液晶显示片上显示时间、电压、温度,键盘控制,键盘如下图所示: 调节 ↑ 闹铃 ↓ 闹铃键用来设置闹铃,闹铃响时按下闹铃键可用来止闹,平时闹铃键可用来设置闹铃的开关,闹铃关时按下此键闹铃功能将被打开,反之闹铃功能将被关闭。需要调节时间时,按动调节按钮,显示片上需要设置的时间值以闪烁的方式出现,以示区别,表示当前调节内容,再次按动,跳至下个需要设置的时间值,我们可以通过切换选择我们需要调整的时间部分,然后按“上”“下”按钮进行设定。其中时钟部分以二十四或十二小时(AM/PM)制显示。 此外单片机还控制温度和电压的测量,通过测温端和测电压端输出的电压,由相应的函数关系求得被测端的被测参数,然后显示在液晶显示屏上. 测温部分 原理方块图: 温度检测电路的设计,电路图如下: 测温元件使用温度传感器AD590。A/D590在0℃时输出的电流I=273 uA,温度T每增加1℃,I增加1u A。输出的电压变化为: Δv=1uA×R2 系统要求电压变化范围在0—5伏,可解得R2<62.5K,设计中R2采用了52K的电阻。 当温度为-10摄氏度时,要
求采纳为满意回答。

下面是时间程序,直接下来用就行了.
/*******************************************************************************

********************************************************************************
* 描述: *
* 简易电子时钟,LED数码管显示 *
* K1---时调整 *
* K2---分调整 *
* *
* 上电时初始化显示: 12-00-00 *
* *
* * **** **** **** **** **** *
* * * * * * * * * * * *
* * * * * * * * * * * *
* * **** ****** * * * * ****** * * * * *
* * * * * * * * * * * *
* * * * * * * * * * * *
* * **** **** **** **** **** *
* *
* *

*******************************************************************************/

#include <reg51.h>
#include <intrins.h>

unsigned char data dis_digit;
unsigned char key_s, key_v;

unsigned char code dis_code[11]={0xc0,0xf9,0xa4,0xb0, // 0, 1, 2, 3
0x99,0x92,0x82,0xf8,0x80,0x90, 0xff};// 4, 5, 6, 7, 8, 9, off
unsigned char data dis_buf[8];
unsigned char data dis_index;
unsigned char hour,min,sec;
unsigned char sec100;

sbit K1 = P3^2;
sbit K2 = P3^3;

bit scan_key();
void proc_key();
void inc_sec();
void inc_min();
void inc_hour();
void display();
void delayms(unsigned char ms);

void main(void)
{
P0 = 0xff;
P2 = 0xff;
TMOD = 0x11; // 定时器0, 1工作模式1, 16位定时方式
TH1 = 0xdc;
TL1 = 0;

TH0 = 0xFC;
TL0 = 0x17;

hour = 12;
min = 00;
sec = 00;

sec100 = 0;

dis_buf[0] = dis_code[hour / 10]; // 时十位
dis_buf[1] = dis_code[hour % 10]; // 时个位
dis_buf[3] = dis_code[min / 10]; // 分十位
dis_buf[4] = dis_code[min % 10]; // 分个位
dis_buf[6] = dis_code[sec / 10]; // 秒十位
dis_buf[7] = dis_code[sec % 10]; // 秒个位
dis_buf[2] = 0xbf; // 显示"-"
dis_buf[5] = 0xbf; // 显示"-"

dis_digit = 0xfe;
dis_index = 0;

TCON = 0x01;
IE = 0x8a; // 使能timer0,1 中断

TR0 = 1;
TR1 = 1;

key_v = 0x03;

while(1)
{
if(scan_key())
{
delayms(10);
if(scan_key())
{
key_v = key_s;
proc_key();
}
}

}
}

bit scan_key()
{
key_s = 0x00;
key_s |= K2;
key_s <<= 1;
key_s |= K1;
return(key_s ^ key_v);
}

void proc_key()
{
EA = 0;
if((key_v & 0x01) == 0) // K1
{
inc_hour();
}
else if((key_v & 0x02) == 0) // K2
{
min++;
if(min > 59)
{
min = 0;
}
dis_buf[3] = dis_code[min / 10]; // 分十位
dis_buf[4] = dis_code[min % 10]; // 分个位
}

EA = 1;
}

void timer0() interrupt 1
// 定时器0中断服务程序, 用于数码管的动态扫描
// dis_index --- 显示索引, 用于标识当前显示的数码管和缓冲区的偏移量
// dis_digit --- 位选通值, 传送到P2口用于选通当前数码管的数值, 如等于0xfe时,
// 选通P2.0口数码
// dis_buf --- 显于缓冲区基地址
{
TH0 = 0xFC;
TL0 = 0x17;

P2 = 0xff; // 先关闭所有数码管
P0 = dis_buf[dis_index]; // 显示代码传送到P0口
P2 = dis_digit; //

dis_digit = _crol_(dis_digit,1); // 位选通值左移, 下次中断时选通下一位数码管
dis_index++; //

dis_index &= 0x07; // 8个数码管全部扫描完一遍之后,再回到第一个开始下一次扫描
}

void timer1() interrupt 3
{
TH1 = 0xdc;

sec100++;

if(sec100 >= 100)
{
sec100 = 0;
inc_sec();
}
}

void inc_sec()
{
sec++;
if(sec > 59)
{
sec = 0;
inc_min();
}
dis_buf[6] = dis_code[sec / 10]; // 秒十位
dis_buf[7] = dis_code[sec % 10]; // 秒个位
}

void inc_min()
{
min++;
if(min > 59)
{
min = 0;
inc_hour();
}
dis_buf[3] = dis_code[min / 10]; // 分十位
dis_buf[4] = dis_code[min % 10]; // 分个位
}

void inc_hour()
{
hour++;
if(hour > 23)
{
hour = 0;
}
if(hour > 9)
dis_buf[0] = dis_code[hour / 10]; // 时十位
else
dis_buf[0] = 0xff; // 当小时的十位为0时不显示
dis_buf[1] = dis_code[hour % 10]; // 时个位

}

void delayms(unsigned char ms)
// 延时子程序
{
unsigned char i;
while(ms--)
{
for(i = 0; i < 120; i++);
}
}

定时器其实就是单片机的一个内部自身时钟的计数器,每一个周期计数器加1,所以使用定时器功能时候先要给定时器付初值,就是先写th0tl0的值(如下),写完初值后就等着定时器功能的那个计数器记满了数后也就是到了65536后就溢出了,所以一次定时的过程就是65536-初值
之间的数
所代表的时钟周期,计数满了溢出要产生中断就要写一个中断服务子程序,子程序如下void
timer0()
interrrupt
x
中断服务子程序中还要给定时器计数器的th
tl付初值
进行下一次的计数,明白了吧。。楼上的那个没写interrupt
选择定时器工作方式。哎呀,妈呀
累死我了
void
main()
{
th0=(65536-50000)/256;
tl0=(65536-50000)%256;//定时器0初值,定时50ms
定时多少ms就多少*1000
ea=1;//开启总中断
et0=1;//定时器0中断允许
tr0=1;//开启定时器0
while(1)
{
}
}
void
timer0()
interrrupt
1
{
th0=(65536-50000)/256;
tl0=(65536-50000)%256;
}

不知道你用的那款单片机啊。
我本科毕业设计用的是飞思卡尔的08系列芯片,做的电子万年历。
如果用c语言的话比较简单,我当时加了一块时钟芯片,用的IIC与GP32通信的,比较方便,直接读时间就可以了,也比较精确,电路啥的电脑好像还有。

你用什么单片机的
我这有AVR的和430的
都是成功的程序
如果你需要就说声
gao_deqiang@163.com

找我,我有。。。


简述8051单片机定时计数器编程的基本步骤?
设置定时计数器的工作方式。给定时器赋初始值:THx 和TLx;允许定时器中断;允许全局中断;启动定制器;中断函数编写(这个是目的,定时计数最终要干什么?)

利用单片机定时器制作数字时钟
TMOD = 0x11; \/\/ 定时器0, 1工作模式1, 16位定时方式 TH1 = 0xdc;TL1 = 0;TH0 = 0xFC;TL0 = 0x17;hour = 12;min = 00;sec = 00;sec100 = 0;dis_buf[0] = dis_code[hour \/ 10]; \/\/ 时十位 dis_buf[1] = dis_code[hour % 10]; \/\/ 时个位 dis_buf[3] = ...

STC89C52单片机用定时器2怎么写1分钟延时的C程序?只要用定时器2的...
RCLK=0;\/\/接收时钟标志,0:使用定时器1作为串口接收发生器 1:使用定时器2作为串口接收发生器 TCLK=0;\/\/发送时钟标志,0:使用定时器1作为串口发送发生器 1:使用定时器2作为串口发送发生器 switch(control) \/\/启动方式选择 { case 0x00:CP_RL2=0;EXEN2=0;break; \/\/ 0:16位自动重装定时器计...

怎样编写程序使用单片机定时1分钟,并且统计1分钟输入的脉冲数?_百度知 ...
用定时器定出50ms的时间,进入中断20次即为1s,照此思路即可定出1min。在这1min内,用外部中断接收脉冲,直接计数就可以了,祝成功~

用c语言编写,单片机LED灯并用定时器延时,每隔0.5秒使LED依次点亮_百度知...
include "reg51.h" sfr AUXR = 0x8e; \/\/如果是用的AT89C51,把这句删了sbit led=P1^0; \/\/定义LED为P10,可以改为其他IOunsigned char jishi; void Timer0Init(void)\/\/50毫秒@12.000MHz{ AUXR &= 0x7F;\/\/定时器时钟12T模式 TMOD &= 0xF0;\/\/设置定时器模式 TL0 ...

有关单片机定时器的使用和定时器的介绍
导语:单片机,其实就是一种用于集成电路中的芯片,而单片机的定时器是一个电子元件,它是一个稳定的计数器,是由单片机本身提供的。它也是单片机上的一个连接部件,可以用来编程。定时器还有一个功能显而易见就是可以用来定时,同时,它也可以用来统计一些脉冲信号。下面就来介绍下单片机定时器的使用的...

利用51单片机的定时器和实验仪的数码管电路设计一个电子时钟,显示格式X...
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){ ...

用51单片机做定时器,时间显示在数码管上,要求有秒钟十秒钟分钟十分钟...
include<reg51.h>#define uchar unsigned char#define uint unsigned intuchar ledtab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};uchar disdat[4]={10,10,10,10};uchar num=0;uchar min=0,sec=0;void datdeal(){disdat[0]=min\/10;disdat[1]=min%10;dis...

定时器的使用(中断方式)编单片机程序
include<reg52.h> define uchar unsigned char define uint unsigned int void init();uchar a=0;main(){ init();while(1){ if(a == 40)a = 0;if(a <= 20)P0 = 0x00;else P0 = 0xFF;} } void init(){ TMOD=0X01;TH0=(65536-50000)\/256;TL0=(65536-50000)%256;EA=1;...

使用51单片机定时器T1的工作方式1,一次定时50ms,其计数初值的十进制和...
如果要实现一次50ms的定时,可以按照以下步骤进行计算:1. 计算每个计数周期的时间:12\/OSC 秒2. 计算需要多少个计数周期才能达到50ms:50ms \/ (12\/OSC) = 4166.673. 计算需要设置的初始值:65536 - 4167 = 61369因此,在使用51单片机定时器T1工作方式1实现一次50ms的定时任务时,其十进制初始值...

西安市18623107173: 数字钟设计 单片机 -
潘要晴世: 相关资料: 多功能数字钟设计 一 简介 时钟, 自从它发明的那天起,就成为人类的朋友,但随着时间的推移,人们对它的功能又提出了新的要求,怎样让时钟更好的为人民服务,怎样让我们的老朋友焕发青春呢?这就要求人们不断设计出新型时...

西安市18623107173: 基于单片机的数字时钟设计方案 -
潘要晴世: 数字钟〔★〕这里用了两种编写方法(即汇编语言与C语言) (1. 开机时,显示12:00:00的时间开始计时;(2. P0.0/AD0控制“秒”的调整,每按一次加1秒; (3. P0.1/AD1控制“分”的调整,每按一次加1分; (4. P0.2/AD2控制“时”的调...

西安市18623107173: 基于单片机的电子时钟 -
潘要晴世: 去百度文库,查看完整内容> 内容来自用户:啊宝1688 绪论 单片机在多功能数字电子钟中的应用已是非常普遍,人们对电子时钟的功能及工作顺序都已非常熟悉了,但是却很少知道它的内部结构以及工作原理.由单片机作为电子时钟的核心控...

西安市18623107173: 单片机C语言编程简易数字电子时钟 -
潘要晴世: #include unsigned char X=10,sec,flag;unsigned char key[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};// 数码管显示数字表unsigned char ke...

西安市18623107173: 第一次弄单片机,想实现一个数字时钟 -
潘要晴世: 做电子时钟,首先要设计电路啊,是用数码管显示,还是用LCD屏显示.要做实物还要焊接板子.这些电路做完了,才开始写程序的.没有电路是不好写程序的. 至于时钟就好写了,用定时器定时20ms,或50ms,采用中断方式,然后对中断计数,中断50次,或20次就是1秒. 有了1秒,就好办了,计60秒,为1分,计计60分,为1小时,计24小时,为1天.计时后再显示出来,就成了.

西安市18623107173: 51单片机的简易数字时钟
潘要晴世: 秒信号是通过定时器定时产生的,50MS中断一次,计20次一秒.P0口内部没有上啦

西安市18623107173: 可以把你制作单片机数字钟表的秘诀传授给小弟吗?感激涕零 -
潘要晴世: 没什么 秘诀.就是利用单片机的定时器,以12M晶振...

西安市18623107173: 用单片机设计一个电子时钟 -
潘要晴世: MAIN ORG 0000H AJMP MAIN ORG 000BH AJMP CLOCK ORG 0030H PORT EQU 8000H PORTA EQU 8001H PORTB EQU 8002H PORTC EQU 8003H DISP0 EQU 30H DISP1 EQU 31H DISP2 EQU 32H DISP3 EQU 33H DISP4 EQU 34H ...

西安市18623107173: 如何用51单片机和lcd1602做一个能够定时报警的数字时钟? -
潘要晴世: 既然会调整时间了,就在调整时间的过程中,当调到报警时间时,再按下一个设定报警时间的按键,可以再增加一个按键,按下后就保存这个时间作为报警时间,但不改变当前时钟的时间,只是保存报警时间,而时钟继续计时,同时,可以结束调整操作.设定了报警时间后,在正常计数时,当时钟每加一分,就与设定的报警时间比较,要比较小时相同,分相同.如果还要精确到秒,就要设定报警时间精确到秒,那就得每一秒就要比较一下设定的时间了.如果比较两个时间相同,就报警了.报警会吧,就是响铃就行了.当处于报警状态下,可设置一个标志位,报警了,标志位为1,当标志位为1时,再按下设定报警键时就停止报警状态了.

西安市18623107173: 用51单片机定时器编写一个定时闹钟 -
潘要晴世: 问题不是很清晰!首先,定时器溢出时间较短,需要在定时器中断外另设计数单元;其次,什么叫“检验对准时间”?我的理解是:使用一段程序来检验当前时间与设定时间(闹钟的定时值)的差值,差值为零时报时.基于该理解,有两种方式(根据你自己的情况自选):1)先设计出一个时钟,然后将时钟值与设定值比对,具体语句可以使用“异或”(两时间相同时,异或值为零),或CJNE指令;本人倾向于后者(如:万一出现干扰在两值相同时没有比较,前者就失效了,而后者还能继续比较).2) 预置一个变量,每个固定时间间隔(使用定时中断)减一,到零时报时;但要注意,直接在定时中断程序中减一时一定要在中断中判断到零否,否可能则会出现不报时的问题.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网