资源描述
科协技术文档
题目:电子时钟
学院:自动化与信息工程学院
组员:何明杰
目录
摘要 3
1.系统方案选择和论证 4
1.1 系统基本方案 4
1.2 各模块方案选择和论证 4
1.2.1控制器选择方案 4
1.2.2电源方案 4
1.2.3闹钟方案 5
1.2.4显示模块方案 5
2.系统的电路设计与实现 5
2.1系统硬件的基本组成部分 5
2.2主要单元电路的设计 6
1.2.1最小系统设计 6
1.2.2数码管显示设计 6
1.2.3键盘控制设计 7
2.3系统电路总设计 8
3.程序源代码 9
参考文献 12
电子时钟
作者:何 明 杰
摘要
该作品是基于stc89c52设计的有按键调节时间、设置或取消闹钟的多功能电子时钟。显示模块通过数码管实现;调时功能通过按键开关实现;闹钟通过蜂鸣器的鸣响实现;另有复位按键和4.5v干电池供电。所有功能基于c语言程序对c52单片机进行控制。
关键字: 电子闹钟 89c52 蜂鸣器 数码管
1. 系统方案选择和论证
1.1系统基本方案
该作品以89c52单片机为控制芯片,通过对芯片外部中断定时的控制:给中断寄存器赋初值,当中断溢出时进行计时操作,将时间值通过8位数码管动态显示出来。
1.2各模块方案选择和论证
1.21控制器选择方案
本系统的核心问题是通过何种芯片、什么程序控制硬件的各种功能。
方案一
采用ATmage16芯片,通过程序启用该芯片的中断功能,给中断寄存器赋初值,当中断溢出时进行计时操作,将时间值通过8位数码管动态显示出来从而实现。
方案二
采用STC89C52芯片,通过程序启用该芯片的外部中断功能,给中断寄存器赋初值,当中断溢出时进行计时操作,60秒进1分,60分进1时,将时间值通过8位数码管动态显示出来从而实现。
考虑到方案二程序易于编写,故采用方案二。
1.22电源选择方案
工作电压3-6v,本作品对电压稳定性要求不高,故用三节5号电池或usb接口供电皆可。
1.23闹钟模块方案
方案一
采用喇叭作为闹钟的鸣响器。
方案二
采用蜂鸣器作为闹钟的鸣响器。
考虑到功耗问题和硬件体积大小,采用方案二。
1.24显示模块方案
方案一
采用1602液晶显示时间。
方案二
采用8位共阴数码管显示时间。
考虑到1602程序复杂、功耗大、价格高,故采用8位共阴数码管显示时间。
2. 系统的电路设计与实现
2.1系统硬件的基本组成部分
4.5v干电池
微控制器
Stc89c52
蜂鸣器
按键
8位数码管
2.2主要单元电路的设计
2.21最小系统设计
单片机的最小系统是由电源、复位、晶振、/EA=1组成。
电源引脚 Vcc 40 电源端 GND 20 接地端
2.22数码管显示电路
数码管显示器是现在最常用的显示器之一,如下图所示。
显示电路显示模块需要实时显示当前的时间,即时、分、秒,因此需要6个数码管,采用动态显示方式显示时间,硬件连接如下图所示,时的十位和个位分别显示在第一个和第二个数码管,分的十位和个位分别显示在第三个和第四个数码管,秒的十位和个位分别显示在第五个和第六个数码管,采用动态扫描的方法进行显示,其硬件连接方式如下图所示。
数码管的硬件连接示意图
数码管使用条件:
2.23 键盘控制电路
该设计需要校对时间,所以用三个按键来实现。按khour来调节小时的时间,按 kmin来调节分针的时间,按 ksec来调节秒的时间。下图是按键硬件连接图。
2.3系统总设计电路
八位数码管
3. 程序源代码
#include<reg52.h>
#include<math.h>
sbit feng=P1^0;
sbit ksec=P3^7;//调节秒的按键3.7
sbit kmin=P3^6;//调分
sbit khour=P3^5;//调时
sbit nao=P3^4;//闹钟设置键
int p,q,m;
char z;
void naozhong1();
unsigned char secshi=0,secge=0,minshi=0,minge=0,hourshi=0,hourge=0;
unsigned int num=0,sec=0,min=0,hour=12;
unsigned char
code table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void delay(unsigned int);
void time0();
void display();//时间显示程序
void keyscan();
void main()
{TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;ET0=1;TR0=1;
while(1)
{
bbb:keyscan();
display();
if(nao==0)
{ delay(10);
if(nao==0)
{z=1;
p=(10*hourshi+hourge);
q=(10*minshi+minge);
m=10*secshi+secge-1;
}
}
if((p==(10*hourshi+hourge))&&(q==(10*minshi+minge))&&(m==10*secshi+secge)&&(z==1))
goto aaa;
}
aaa:naozhong1();
goto bbb;
}
void delay(unsigned int z)
{unsigned int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);}
void time0() interrupt 1
{num++;
TH0=(65536-46034)/256;
TL0=(65536-46034)%256; }
void display()
{ if(num==20)
{num=0;
sec++;
if(sec==60)
{sec=0;
min++;
if(min==60)
{min=0;
hour++;
if(hour==24)
{hour=0;
min=0;
sec=0;
}
}
}
}
secge=sec%10;
secshi=sec/10;
minge=min%10;
minshi=min/10;
hourge=hour%10;
hourshi=hour/10;
P2=0x7f;
P0=table[secge];
delay(1);
P2=0xbf;
P0=table[secshi];
delay(1);
P2=0xdf;
P0=0x40;
delay(1);
P2=0xff;//消隐
P2=0xef;
P0=table[minge];
delay(1);
P2=0xff;//消隐
P2=0xf7;
P0=table[minshi];
delay(1);
P2=0xff;//消隐
P2=0xfb;
P0=0x40;
delay(1);
P2=0xff;//消隐
P2=0xfd;
P0=table[hourge];
delay(1);
P2=0xff;//消隐
P2=0xfe;
P0=table[hourshi];
delay(1);
P2=0xff;//消隐}
void keyscan()
{if(ksec==0)
{delay(10);
if(ksec==0)
{sec+=2;
feng=1;
if(sec>=60)
sec=0;
}
while(ksec==0)
display();
}
if(kmin==0)
{delay(10);
if(kmin==0)
{min++;
if(min>=60)
min=0;
}
while(kmin==0)
display();
}
if(khour==0)
{delay(10);
if(khour==0)
{hour++;
if(hour>=24)
hour=0;
}
while(khour==0)
display();
}
}
void naozhong1()
{char x;
feng=0;
z=0;}
参考文献
l 《C程序设计》清华大学出版社 第三版
l 《例说51单片机(C语言版)》人民邮电出版社
- 13 -
展开阅读全文