led电子时钟报告册 本文关键词:时钟,报告,电子,led
led电子时钟报告册 本文简介:摘要数字钟是采用数字电路实现对日期、时、分、秒,数字显示的计时装置,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表,钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表的报时功能。数字钟已成为人们日常生活中的必需品,广泛应用于家庭、车站、码头、剧院、
led电子时钟报告册 本文内容:
摘要
数字钟是采用数字电路实现对日期、时、分、秒,数字显示的计时装置,由
于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表,钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表的报时功能。数字钟已成为人们日常生活中的必需品,广泛应用于家庭、车站、码头、剧院、办公室等场所,给人们的生活、学习、工作带来极大的方便。不仅如此,在现代化的进程中,也离不开电子钟的相关功能和原理,比如机械手的控制、家务的自动化、定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的。而且是控制的核心部分。因此,研究数字钟及扩大其应用,有着非常现实的意义。
本设计使用12MHZ晶振与单片机AT89C51相连接,以AT89C51芯片为核心,采用动态扫描方式显示,通过使用该单片机,实现在8个LED数码管上显示时间,通过4个按键进行调时、复位等功能,在实现各功能时数码管进行相应显示。软件部分用C语言实现,分为显示、延迟、调时、复位等部分。通过软硬件结合达到最终目的。
关键词:AT89C51;中断;键盘控制
目
录
1
绪论1
1.1数字电子时钟背景1
1.2
数字电子时钟意义1
1.3
数字电子时钟应用1
2
课程设计目的及要求2
2.1课程设计目的2
2.2
课程设计要求2
3
设计内容3
4
硬件设计需求4
4.1
单片机模块4
4.2
LED数码管显示模块6
4.3
按键模块6
5系统的软件设计与实现7
5.1
protues软件简介7
5.2
系统软件设计主函数流程图7
5.3键盘扫描函数程序框图8
5.4显示函数程序框图9
5.5仿真9
6
参考文献11
附录12
附录112
附录212
1
绪论
1.1数字电子时钟背景
20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。目前,单片机正朝着高性能和多品种方向发展趋势将是进一步向着CMOS化、低功耗、小体积、大容量、高性能、低价格和外围电路内装化等几个方面发展。单片机应用的重要意义还在于,它从根本上改变了传统的控制系统设计思想和设计方法。从前必须由模拟电路或数字电路实现的大部分功能,现在已能用单片机通过软件方法来实现了。这种软件代替硬件的控制技术也称为微控制技术,是传统控制技术的一次革命。
单片机模块中最常见的是数字钟,数字钟是一种用数字电路技术实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更更长的使用寿命,因此得到了广泛的使用。
1.2
数字电子时钟意义
数字钟是采用数字电路实现对.时,分,秒.数字显示的计时装置,广泛用于个人家庭,车站,码头办公室等公共场所,成为人们日常生活中不可少的必需品,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表,钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的。因此,研究数字钟及扩大其应用,有着非常现实的意义。
1.3
数字电子时钟应用
数字钟已成为人们日常生活中:必不可少的必需品,广泛用于个人家庭以及车站、码头、剧场、办公室等公共场所,给人们的生活、学习、工作、娱乐带来极大的方便。由于数字集成电路技术的发展和采用了先进的石英技术,使数字钟具有走时准确、性能稳定、携带方便等优点,它还用于计时、自动报时及自动控制等各个领域。
2
课程设计目的及要求
2.1课程设计目的
单片机课程设计作为独立的教学环节,是自动化及相关专业集中实践性环节系列之一,是学习完《单片机原理及应用》课程后,并在进行相关课程设计基础上进行的一次综合练习。
单片机课程设计过程中,学生通过查阅资料,接口设计,程序设计,安装调试等环节,完成一个基于MCS-51系列单片机,涉及多种资源应用,并且有综合功能的小应用系统设计。使学生不但能够将课堂上学到的理论知识与实际应用结合起来,而且能够对电子电路,电子元器件等方面的知识进一步加深认识,同时在软件编程,调试,相关仪器设备和相关软件的使用技能等方面得到较全面的锻炼和提高。使学生增进对单片机的感性认识,加深对单片机理论方面的理解,加深单片机的内部功能模块的应用,如定时器/计数器,中断,片内外存储器,I/O接口,串行口等。使学生了解和掌握单片机应用系统的软硬件设计过程,方法及实现,强化单片机应用电路的设计与分析能力。提高学生在单片机应用方面的实践技能和科学作风,培育学生综合运用理论知识解决问题的能力。
2.2
课程设计要求
设计一个电子钟,要求如下:
(1)利用单片机最小系统设计一个电子钟(不能采用单片机开发系统)
(2)使用按键修改时间
(3)显示方式:**
时**
分**
秒
(4)时间可以任意修改
系统简单设计框图如下:
显示
键盘
单片机
图2.2
系统简单设计框图
3
设计内容
设计一个电子产品,首先了解它能实现的功能,时钟系统最基本的功能就是实现计时,在这里设计的数字电子时钟,它能实现计时和校时的功能,给电子钟加上电自动计时,设计三个按键对时间进行调整。电子计时器主要由AT89C51、显示模块、控制模块三大部分组成。其中控制模块和计时运算模块主要对时、分、秒的数值显示和调整进行操作,并且秒计算到60时,自动清零并向分进1;分计算到60时,自动清零并向时进1;时计算到24时,自动清零。这样,就形成了循环计时,显示模块主要用来显示当前计数值。A89C51是整个设计的核心,主要用来产生定时中断,传输数据和控制各个部件工作。
硬件设计很简单,主要包括:单片机、按键电路,以及LED显示器四个部分。单片机选用AT89C51芯片,它无须外扩程序存储器,设计电路很简单。由于只用了三个按键,所以采用独立式按键使设计更简单。显示时、分、秒加两个分隔符,采用两个共阴极数码管及键盘达到时间显示和修改的功能。
简易数字时钟可实现校时和整点报时功能,该软件采用C语言来实现,主要包括主程序、键输入程序、显示程序、定时程序和中断程序等软件模块。把原程序加入原理图,做出电子钟的仿真,以秒计数并显示时、分、秒。其中秒和分为60进制,小时为24进制计数。
4
硬件设计需求
4.1
单片机模块
选用的AT89S51与同系列的AT89C51在功能上有明显的提高,最突出是的可以实现在线的编程。用于实现系统的总的控制。AT89C51引脚图见图4.1。
图4.1
AT89C51引脚图
其主要功能列举如下:
(1)为一般控制应用的8位单片机
(2)晶片内部具有时钟振荡器(传统最高工作频率可至
33MHz)
(3)内部程式存储器(ROM)为4KB
(4)内部数据存储器(RAM)为128B
(5)外部程序存储器可扩充至64KB
(6)外部数据存储器可扩充至
64KB
(7)32条双向输入输出线,且每条均可以单独做I/O的控制
(8)5个中断向量源
(9)2组独立的16位定时器
(10)1个全双工串行通信端口
(11)8751及8752单芯片具有数据保密的功能
(12)单芯片提供位逻辑运算指令
RESET:AT89S51的重置引脚,高电平动作,当要对晶片重置时,只要对此引脚电平提升至高电平并保持两个机器周期以上的时间,AT89S51便能完成系统重置的各项动作,使得内部特殊功能寄存器之内容均被设成已知状态,并且至地址0000H处开始读入程序代码而执行程序。
端口0是一个8位宽的开路电极(Open
Drain)双向输出入端口,共有8个位,P0.0表示位0,P0.1表示位1,依此类推。其他三个I/O端口(P1、P2、P3)则不具有此电路组态,而是内部有一提升电路,P0在当作I/O用时可以推动8个LS的TTL负载。如果当EA引脚为低电平时(即取用外部程序代码或数据存储器),P0就以多工方式提供地址总线(A0~A7)及数据总线(D0~D7)。设计者必须外加一个锁存器将端口0送出的地址锁住成为A0~A7,再配合端口2所送出的A8~A15合成一组完整的16位地址总线,而定位地址到64K的外部存储器空间。
PORT2(P2.0~P2.7):端口2是具有内部提升电路的双向I/O端口,每一个引脚可以推动4个LS的TTL负载,若将端口2的输出设为高电平时,此端口便能当成输入端口来使用。P2除了当作一般I/O端口使用外,若是在ATAT89S51扩充外接程序存储器或数据存储器时,也提供地址总线的高字节A8~A15,这个时候P2便不能当作I/O来使用了。
PORT1(P1.0~P1.7):端口1也是具有内部提升电路的双向I/O端口,其输出缓冲器可以推动4个LS
TTL负载,同样地,若将端口1的输出设为高电平,便是由此端口来输入数据。如果是使用8052或是8032的话,P1.0又当作定时器2的外部脉冲输入脚,而P1.1可以有T2EX功能,可以做外部中断输入的触发引脚。
PORT3(P3.0~P3.7):端口3也具有内部提升电路的双向I/O端口,其输出缓冲器可以推动4个TTL负载,同时还多工具有其他的额外特殊功能,包括串行通信、外部中断控制、计时计数控制及外部数据存储器内容的读取或写入控制等功能。
其引脚分配见表4.2。
表4.2
P3端口引脚兼用功能表
P3引脚
兼用功能
P3.0
串行通讯输入(RXD)
P3.1
串行通讯输出(TXD)
P3.2
外部中断0(INT0)
P3.3
外部中断1(INT1)
P3.4
定时器0输入(T0)
P3.5
定时器1输入(T1)
P3.6
外部数据存储器的写入信号(WR)
P3.7
外部数据存储器的读取信号(RD)
4.2
LED数码管显示模块
本次数码管采用共阴极8段式LED数码管QH5011AS。该数码管参数见附录本系统共用8个数码管,从右到左依次显示秒个位、秒十位、横线、分个位、分十位、横线、时个位和时十位。数码管显示的信息用8个内存单元存放,这8个内存单元称为显示缓冲区,其中秒个位和秒十位、分个位和分十位、时个位和时十位分别由秒数据、分数据和小时数据分拆得到。在本系统中数码管显示采用软件译码动态显示。在存储器中首先建立一张显示信息的字段码表,显示时,
先从显示缓冲区中取出显示的信息,然后通过查表程序在字段码表中查出所显示的信息的字段码,从P0口输出,同时在P2口将对应的位选码输出选中显示的数码管,就能在相应的数码管上显示显示缓冲区的内容。
4.3
按键模块
按键处理设置为:如没有按键,则时钟正常走时。按下K0键:进入调分状态,时钟停止走动;按K1和K2键:可进行加1和减1操作;继续按K0键:可分别进行分和小时的调整;最后按K0键:退出调整状态,时钟开始计时运行。
5系统的软件设计与实现
5.1
protues软件简介
Proteus软件是英国Labcenter
electronics公司出版的EDA工具软件(该软件中国总代理为广州风标电子技术有限公司)。它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。它是目前最好的仿真单片机及外围器件的工具。Proteus是世界上著名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。是目前世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等,2010年又增加了Cortex和DSP系列处理器,并持续增加其他系列处理器模型。在编译方面,它也支持IAR、Keil和MPLAB等多种编译器。
5.2
系统软件设计主函数流程图
这次的数字电子钟设计用到很多子程序,它们的流程图如下所示。
主程序是先开始,然后启动定时器,定时器启动后在进行按键检测,检测完后,就可以显示时间。主函数程序框图见图5.1。
开始
T0,T1方式1计数
允许中断
调用中断程序
按键按下?
调用显示程序
否
是
图5.1
主函数程序框图
5.3键盘扫描函数程序框图
开始
调分=0?
清零=0?
调时=0?
延时
显示
延时
延时
标志s=1?
时=24?
分=60?
是
是
是
是
是
否
否
否
否
否
时加1
秒,分,时,归零
分=0
时=0
分加1
图5.2
键盘扫描函数程序框图
5.4显示函数程序框图
开始
从秒到时,从个位到十位依次扫描,并分别延时,输出
显示
图5.3
显示框图
5.5仿真
仿真图见图5.5。
图5.4仿真图
6
总结与心得体会
对于电子时钟的课程设计的第一感觉是无从下手,感到盲从,不知道怎么去做。是啊,万事开头难,难的不是不会做,而是不知道如何下手。当坚持努力之后,经过查找资料从了解到掌握一些知识,总算有了点思路。是的,对于这个课程设计,要分模块,一点一点的去解决问题。从电子时钟需要的功能开始去找,要有控制部分,显示部分,主函数,按键部分,就可以组合成一个系统了。在整个过程中,我去搜索了很多资料,是的,想完成一件事,最好的就是多看,多想,汲取别人的设计思想与设计方法,弥补自己的不足。从熟悉proteus的基本操作到现在,已经基本能操作它的不同操作了,这是值得欣慰的。
以上是对于课程设计的总体感受,下面做一些自我总结。进过好几天的边学边用,复习了已学的知识,同时学到了新的东西。真的,进过自己动手操作,才能有更深的体会,对于学过的知识。我现在已经掌握了中断的使用,知道怎么初始化,怎么设置延时等。对于我的不足,我认为,这里面还有很多东西要学,有些东西还不懂,比如我对一些算法还掌握不牢,不知道怎么去转化,应该多去看看,想想。对于课程设计的完成,总会有很多好的收获,能帮助我更好的学习与掌握东西。在做事中,我觉得还是多实践,多操作才是对的。
参考文献
[1]
高玉芹.单片机原理及应用及C51编程技术.北京:机械工业出版社,2011.6
[2]
沈精虎.Protel
99SE基础教程[J].
[3]
李广弟,朱月秀,冷祖祁.
单片机的硬件结构[J]
.
页码148。
[4]
谭丙煜.怎样撰写科学论文[M].2版.沈阳:辽宁人民出版社,1982
[5]
陈正义.
单片机控制实习[D].页码148。
[6]
朱定华.单片机原理及接口技术实验[M].北京:北方交通大学出版社2002.11.
[7]
刘湘涛.江世明.单片机原理与应用[M].
北京:电子工业出版社,2006.
附录
附录1
附录2
#include
#define
uchar
unsigned
char
#define
uint
unsigned
int
sbit
qingling=P1^0;
//清零
sbit
tiaofen=P1^1;
//调分
sbit
tiaoshi=P1^2;
//调时
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
main()
{
init();
while(1)
{
display(hour0,minu0,sec0);//时钟表显示
while(k)
/*k是秒表状态(0-》1-》2-》0)通过外部中断0实现。*/
{
display(hour,minu,sec);
//秒表显示
}
}
}
/*****************初始化函数***********************/
void
init()
{
a=0;
b=0;
k=0;
s=0;
hour0=0;
minu0=0;
sec0=0;
hour=0;
minu=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;
//秒表中断
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;
}
}
/*************键盘扫描****************/
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)
{
delay(10);
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)
{
delay(10);
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
delay(uchar
z)
{
int
x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
18
篇2:基于51系列单片机及DS1302时钟芯片的电子时钟-C语言-Proteus仿真-报告
基于51系列单片机及DS1302时钟芯片的电子时钟-C语言-Proteus仿真-报告 本文关键词:时钟,仿真,芯片,机及,语言
基于51系列单片机及DS1302时钟芯片的电子时钟-C语言-Proteus仿真-报告 本文简介:基于单片机的电子时钟姓名:班级:学号:指导教师:完成日期:目录摘要一、引言………………………………………………………………………1二、基于单片机的电子时钟硬件选择分析…………………………………22.1主要IC芯片选择……………………………………………………22.1.1微处理器选择…………………………
基于51系列单片机及DS1302时钟芯片的电子时钟-C语言-Proteus仿真-报告 本文内容:
基于单片机的电子时钟
姓名:
班级:
学号:
指导教师:
完成日期:
目
录
摘要
一、引言………………………………………………………………………1
二、基于单片机的电子时钟硬件选择分析…………………………………2
2.1主要IC芯片选择……………………………………………………2
2.1.1微处理器选择…………………………………………………2
2.1.2
DS1302简介
…………………………………………………4
2.1.3
DS1302引脚说明
……………………………………………4
2.2电子时钟硬件电路设计
……………………………………………5
2.2.1时钟电路设计…………………………………………………6
2.2.2整点报时功能…………………………………………………7
三、Protel软件画原理图……………………………………………………8
3.1系统工作流程图
……………………………………………………8
3.2原理图
………………………………………………………………9
四、proteus软件仿真及调试
………………………………………………9
4.1电路板的仿真
………………………………………………………9
4.2软件调试
……………………………………………………………9
五、
源程序
…………………………………………………………………10
六、课设心得…………………………………………………………………13
七、参考文献…………………………………………………………………13
基于单片机电子时钟设计
摘
要
电子时钟主要是利用电子技术将时钟电子化、数字化,拥有时钟精确、体积小、界面友好、可扩展性能强等特点,被广泛应用于生活和工作当中。另外,在生活和工农业生产中,也常常需要温度,这就需要电子时钟具有多功能性。
本设计主要为实现一款可正常显示时钟/日历、带有定时闹铃的多功能电子时钟。
本文对当前电子钟开发手段进行了比较和分析,最终确定了采用单片机技术实现多功能电子时钟。本设计应用AT89C52芯片作为核心,6位LED数码管显示,使用DS1302实时时钟日历芯片完成时钟/日历的基本功能。这种实现方法的优点是电路简单,性能可靠,实时性好,时间精确,操作简单,编程容易。
该电子时钟可以应用于一般的生活和工作中,也可通过改装,提高性能,增加新功能,从而给人们的生活和工作带来更多的方便。
关键词:电子时钟;多功能;AT89C52;时钟日历芯片
基于单片机的电子时钟
一、引
言
时间是人类生活必不可少的重要元素,如果没有时间的概念,社会将不会有所发展和进步。从古代的水漏、十二天干地支,到后来的机械钟表以及当今的石英钟,都充分显现出了时间的重要,同时也代表着科技的进步。致力于计时器的研究和充分发挥时钟的作用,将有着重要的意义。
1.1
多功能电子时钟研究的背景和意义
20世纪末,电子技术获得了飞速的发展。在其推动下,现代电子产品几乎渗透到了社会的各个领域,有力的推动和提高了社会生产力的发展与信息化程度,同时也使现代电子产品性能进一步提升,产品更新换代的节奏也越来越快。
时间对人们来说总是那么宝贵,工作的忙碌性和繁杂容易使人忘记当前的时间。然而遇到重大事情的时候,一旦忘记时间,就会给自己或他人造成很大麻烦。平时我们要求上班准时,约会或召开会议必然要提及时间;火车要准点到达,航班要准点起飞;工业生产中,很多环节都需要用时间来确定工序替换时刻。所以说能随时准确的知道时间并利用时间,是我们生活和工作中必不可少的[1]。
电子钟是采用电子电路实现对时、分、秒进行数字显示的计时装置,广泛应用于个人家庭,车站,
码头办公室等公共场所,成为人们日常生活中不可少的必需品。由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表,钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。诸如定时自动报警、0按时自动打铃、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的。因此,研究数字钟及扩大其应用,有着非常现实的意义。
1.2
电子时钟的功能
电子时钟主要是利用电子技术将时钟电子化、数字化,拥有时间精确、体积小、界面友好、可扩展性能强等特点,被广泛应用于生活和工作当中。当今市场上的电子时钟品类繁多,外形小巧别致。也有体型较大的,诸如公共场所的大型电子报时器等。电子时钟首先是数字化了的时间显示或报时器,在此基础上,人们可以根据不同场合的要求,在时钟上加置其他功能,比如定时闹铃,万年历,环境温度、湿度检测,环境空气质量检测,USB扩展口功能等。
本设计电子时钟主要功能为:
1.
具有时间显示和手动校对功能,24小时制;
2.
具有年、月、日显示和手动校对功能;
3.
具有整点报时功
二、基于单片机的电子时钟硬件选择分析
考虑单片机货源充足、价格低廉,可软硬件结合使用,能够较方便的实现系统的多功能性,故采用单片机作为本设计的硬件基础。
2.1主要IC芯片选择
2.1.1微处理器选择
目前在单片机系统中,应用比较广泛的微处理器芯片主要为8XC5X系列单片机。该系列单片机均采用标准MCS-52内核,硬件资源相互兼容,品类齐全,功能完善,性能稳定,体积小,价格低廉,货源充足,调试和编程方便,所以应用极为广泛。
例如比较常用的AT89C2052单片机,带有2KB
Flash可编程、可擦除只读存储器(E2PROM)的低压、高性能8位CMOS微型计算机。拥有15条可编程I/O引脚,2个16位定时器/计数器,6个中断源,可编程串行UART通道,并能直接驱动LED输出。
仅仅是为了完成时钟设计或者是环境温度采集设计,应用AT89C2052单片机完全可以实现。但是将两种功能结合在一片单片机上,就需要更多的I/O引脚,故本设计采用具有32根I/O引脚的AT89C52单片机。
AT89C52单片机是一款低功耗,低电压,高性能CMOS
8位单片机,片内含4KB(可经受1000次擦写周期)的FLASH可编程可反复擦写的只读程序存储器(EPROM),器件采用CMOS工艺和ATMEI公司的高密度、非易失性存储器(NURAM)技术制造,其输出引脚和指令系统都与MCS-52兼容。片内的FLASH存储器允许在系统内可改编程序或用常规的非易失性存储器编程器来编程。因此,AT89C52是一种功能强,灵活性高且价格合理的单片机,可方便的应用在各个控制领域[6]。
AT89C52具有以下主要性能:
1.
4KB可改编程序Flash存储器;
2.
全静态工作:0——24Hz;
3.
128×8字节内部RAM;
4.
32个外部双向输入/输出(I/O)口;
5.
6个中断优先级;
2个16位可编程定时计数器;
6.
可编程串行通道;
7.
片内时钟振荡器。
此外,AT89C52是用静态逻辑来设计的,其工作频率可下降到0Hz,并提供两种可用软件来选择的省电方式——空闲方式(Idle
Mode)和掉电方式(Power
Down
Mode)。在空闲方式中,CPU停止工作,而RAM、定时器/计数器、串行口和中断系统都继续工作。在掉电方式中,片内振荡器停止工作,由于时钟被“冻结”,使一切功能都暂停,只保存片内RAM中的内容,直到下一次硬件复位为止。
图2.1
AT89C52芯片PDIP封装引脚图
AT89C51为适应不同的产品需求,采用PDIP、TQFP、PLCC三种封装形式,本系统采用双列直插PDIP封装形式。
2.1.2
DS1302简介
DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟日历芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。实时时钟可提供秒、分、时、日、星期、月和年,一个月小于31天时可以自动调整,且具有闰年补偿功能。工作电压宽达2.5~5.5V。采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后备电源进行涓细电流充电的能力。有主电源和备份电源双引脚,而且备份电源可由大容量电容(>1F)来替代。需要强调的是,DS1302需要使用32.768KHz的晶振。
2.1.3
DS1302引脚说明
图2.2
DS1302芯片引脚图
其的引脚功能参照表2.1。
表2.1
DS1302引脚功能说明
引脚号
名称
功能
1
VCC1
备份电源输入
2
X1
32.768KHz晶振输入
3
X2
32.768KHz晶振输出
4
GND
地
5
RST
控制移位寄存器/复位
6
I/O
数据输入/输出
7
SCLK
串行时钟
8
VCC2
主电源输入
2.2电子时钟硬件电路设计
电子闹钟至少要包括秒信号发生器、时间显示电路、按键电路、供电电源、闹铃指示电路等几部分。硬件电路框图参照图2.3。
该系统使用AT89C51单片机作为核心,通过读取时钟日历芯片DS1302数据,完成此电子时钟的主要功能——时钟。使用比较通用的8段共阳数码管,做7位显示,分别显示时、分、秒。
图2.3
多功能电子时钟硬件系统框图
键盘是为了完成时钟/日历的校对和日历/温度的显示功能。由于此电子时钟要求具有闹铃功能,所以设计有闹铃电路,进行声音响铃。
整个电路使用了两种电源,+5V电源将为整个电路供电。而+3V电源仅作为DS1302的备用电源。当+5V电源被切断后,DS1302启用+3V电源,可以保持DS1302继续工作。当+5V电源恢复供电,LED依旧显示当前时间,而不会因为断电使系统复位到初始化时间,避免了重新校时的麻烦。
2.2.1时钟电路设计
系统时钟应用了实时时钟日历芯片DS1302,其连接如图2.4。该硬件电路设计简单,抗干扰能力强。
如图,AT89C51单片机P1.7直接接DS1302的RST端,上电后,AT89C51的P1.7脚自动输出高电平。P1.5作为串行时钟接口,P1.6作为时钟数据的I/O。DS1302采用双电源供电,平时由+5V电源供电,当+5V掉电之后,由图中BT1(+3V备用电池)供电。
特别需要注意X1和X2两端连接的晶振Y1,该晶振频率为32.768KHz。
图2.4
系统时钟电路
2.2.2整点报时功能
采用蜂鸣器闹铃结构简单,控制方便,但是发出的闹铃声音单一。也可以在编程的时候编写一段音乐程序,待闹铃时间到时,调用该音乐程序给扬声器,便响起音乐。不过该方法只能做一些简单音乐,并且音乐程序会占用很多单片机存储资源。
还有一种方法是采用录音放音芯片1420做闹铃,先对录放音设备录入一段音乐,当到设定时间时,单片机控制录放音设备放音。采用录放音电路,铃声可以是预先设定的一段自己喜欢的音乐,符合电器设备人性化的要求。且1420芯片可以分段录音,还具有语音报时功能。
另外,也可以购置一块音乐集成电路,加置在单片机和蜂鸣器之间,当单片机连接闹铃电路的管脚送出高电平时,音乐集成电路会给蜂鸣器特定脉冲,使蜂鸣器发声。此类集成电路体积较小,使用方便,不足的是音乐简单、单一。
闹铃的闹钟不是本设计中的重点,故采用最简单的方法,占用单片机一根I/O口P1.7,
中间用PNP型三极管S9012连接P1.7和蜂鸣器。当P1.7引脚为低电平时,S9012的发射极和集电极导通,使蜂鸣器发声。当响铃标志位为“1”时,P1.7送一定频率脉冲,使蜂鸣器U11发出声音。如图2.5
图2.5
闹铃电路
1、
Protel软件画原理图
3.1系统工作流程图
3.2
原理图
四、proteus软件仿真及调试
4.1电路板的仿真
利用keil软件编写源程序。在protues中画好其电路图如下图4.1所示:
4.2软件调试
在硬件调试完毕的基础上,需要进一步完善程序,也就是进入软件调试阶段。在本设计中,软件调试主要分两大部分:实时时钟日历子程序调试、按键子程序调试。将这两部分调试成功,那么整个设计的软件部分也就基本完成了。
图4.1
数字钟仿真图
五、
源程序
用C语言编写:
17
#include
#include
#define
uchar
unsigned
char
#define
uint
unsigned
int
uchar
data_7seg[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,};
uchar
hour,min,sec;
sbit
shi=P1^0;
sbit
fen=P1^1;
sbit
miao=P1^2;
sbit
rst=P1^4;
sbit
sck=P1^5;
sbit
io=P1^6;
sbit
fm=P1^7;
/*函数声明:*/
void
write_ds1302_byte(uchar
dat);
void
write_ds1302(uchar
add,uchar
dat);
uchar
read_ds1302(uchar
add);
void
read_rtc();
void
set_rtc();
void
display();
void
delay(int
n);
void
show();
void
fmzz();
/*DS1302单字节写入:*/
void
write_ds1302_byte(uchar
dat)
{
uchar
i;
for
(i=0;i>1;
sck=1;
}
}
/*DS1302多字节写入:*/
void
write_ds1302(uchar
add,uchar
dat)
{
rst=0;_nop_();
sck=0;_nop_();
rst=1;_nop_();
write_ds1302_byte(add);
write_ds1302_byte(dat);
rst=0;_nop_();
io=1;
sck=1;
}
/*DS1302读取:*/
uchar
read_ds1302(uchar
add)
{
uchar
i,value;
rst=0;_nop_();
sck=0;_nop_();
rst=1;_nop_();
write_ds1302_byte(add);
for
(i=0;i>1;
sck=0;
if
(io)
value=value|0x80;
sck=1;
}
rst=0;_nop_();
sck=0;_nop_();
sck=1;
io=1;
return
value;
}
/*调整时间:*/
void
set_rtc()
{
if
(shi==0)
delay(100);
if
(shi==0)
{
hour=(hour>>4)*10+(hour
hour++;
if
(hour==24)
hour=0;
hour=((hour/10)>4)*10+(min
min++;
if
(min==60)
min=0;
min=((min/10)>4)*10+(sec
sec++;
if
(sec==60)
sec=0;
sec=((sec/10)<<4)+(sec%10);
write_ds1302(0x80,sec);
}
}
/*读取时间:*/
void
read_rtc()
{
hour=read_ds1302(0x85);
min=read_ds1302(0x83);
sec=read_ds1302(0x81);
}
/*显示时间:*/
void
display()
{
unsigned
int
a=1;
P2=0x01;P0=data_7seg[hour/16];delay(a);
P2=0x02;P0=data_7seg[hour%16];delay(a);
P2=0x04;P0=data_7seg[min/16];delay(a);
P2=0x08;P0=data_7seg[min%16];delay(a);
P2=0x10;P0=data_7seg[sec/16];delay(a);
P2=0x20;P0=data_7seg[sec%16];delay(a);
}
/*蜂鸣:*/
void
fmzz()
{
uint
i;
for
(i=0;i<100;i++)
{
fm=!fm;
delay(2);
}
}
/*延时程序:*/
void
delay(int
n)
{
unsigned
int
i,j;
for(i=0;i { for(j=0;j<121;j++) {;} } } /*显示学号:*/ void show() { unsigned int m; for(m=0;m<20;m++) { uint a=10; P2=0x01;P0=data_7seg[7];delay(a); P2=0x02;P0=data_7seg[2];delay(a); P2=0x04;P0=data_7seg[4];delay(a); P2=0x08;P0=data_7seg[1];delay(a); P2=0x10;P0=data_7seg[1];delay(a); P2=0x20;P0=data_7seg[8];delay(a); } } /*主程序:*/ void main() { show(); write_ds1302(0x84,0x12);//初始化 write_ds1302(0x82,0x00); write_ds1302(0x80,0x00); while (1) { set_rtc(); read_rtc(); display(); if(min==0) { if(sec==0) {fmzz();} } } } 六、课设心得 略 七、参考文献 1、倪晓军 章韵等.单片机原理与接口技术教程.北京:清华大学出版社,2009 2、DS1302中文手册 3、谭浩强等.C程序设计.北京:清华大学出版社,2005 4、王守忠 聂元铭.51单片机开发入门与典型实例.北京:人民邮电出版社,2009 篇3:c51多功能电子时钟设计报告 c51多功能电子时钟设计报告 本文关键词:多功能,时钟,报告,设计,电子 c51多功能电子时钟设计报告 本文简介:机电工程系课程设计报告题目:数字时钟课程设计专业:通信技术班级:07通信学号:0706090111姓名:庄再标指导老师:郑晓青时间:2010年1月10日目录一、设计目的、设计题目……………………………………………3二、设计任务、功能描述……………………………….……………3三、硬件原理分析…………… c51多功能电子时钟设计报告 本文内容: 机 电 工 程 系 课 程 设 计 报 告 题目: 数字时钟课程设计 专 业: 通信技术 班 级: 07通信 学 号: 0706090111 姓 名: 庄再标 指导老师: 郑晓青 时 间:2010年1月10日 目录 一、 设计目的、设计题目……………………………………………3 二、 设计任务、功能描述……………………………….……………3 三、 硬件原理分析…………………………………………………….3 四、 软件设计………………………………………………………….7 1 地址空间分配……………………………………………………….7 2 软件整体架构分析………………………………………………….8 2.1总体架构说明:设计思路………………………………………8 2.2主程序功能描述及分析、主程序流程图………………………9 2.3各子程序功能描述及子程序入口出口、各程序流程图………9 五、 程序清单………………………………………………………….12 一、 设计题目:数字时钟。 设计的时钟能够实现日常的时钟显示,同时具有时钟调整、两个闹钟及正点报时功能。 二、 设计任务、功能描述 整体设计任务:本电子时钟设计首要的工作是结合以往所学的单片机程序编写理论和编写规则来编写电子时钟的软件部分,编写时要结合所配的AT89S52芯片的管脚功能和其他硬件电路,该部分运用keil单片机软件来完成。在编写完软件并检测完正确后再编译成.hex载入用Isis仿真软件布好的仿真硬件中运行检测程序是否正确,并调试。待这一切工作做好后再利用已焊接好的小系统板硬件电路来实践实现软件功能与硬件的结合。此步骤要用progisp单片机烧写软件来实现。 在硬件设计上: (1)用四个电位按键来实现对电子时钟的调试工作,当按第一下总控键时进入时钟的调整状态,有两个电位按键分别来调整时钟的分和时,在调整时秒正常运行;当按第二下总控键时时钟进入闹钟一设置,有两个电位按键分别来调整时钟的分和时的设定,另外有一个时钟控键来实现闹钟是否开启;当按第三下总控键时时钟进入闹钟二设置,其余操作同闹钟一设置操作,当按第四下总控键时时钟退出调整模式进入正常时钟走势。 (2)用两个四位数码管来实现设计的显示部分,其演示模式是: 时时-分分-秒秒 该数码管组合的功能管脚是八个位选择连接芯片的p2引脚,八个显示管位并联再接入到芯片p0引脚。从而在功能上区分开,实现数码管的显示功能。 (3)用一个led灯和电阻组成的简易电路结合设计来实现正点报时的功能,当时钟走到正点时,该led灯便能够闪烁五秒刚好是五下,之后进入暗的状态,等到下一个整点到来。 (4)用一个喇叭和三极管等配件组成一个闹钟电路,再与芯片的p1.0引脚连接。当时钟到设定的报时点时便会发出“嘟嘟嘟嘟….‘的声音来实现闹钟功能。 (5)用一个按键和其他部件组成的复位电路与芯片连接来实现整个程序及硬件的重新复位功能。 三、 硬件原理分析 电路设计分析 电路原理设计是基于小系统包括电源电路、复位电路、按键电路、时钟电路、数码管显示驱动电路、输出控制电路。电源部分是用电池来提供的3v-5v,晶体振荡器采用的是12MHz的石英晶体振荡器。 总体硬件设计框图如下: 主 控 制 器 AT89S52系列单片机芯片 电源 复位电路 按键电路 时钟振荡电路 七段数码管 数码管显示驱动电路 输出控制电路 1.1复位电路 本次设计采用按键电平复位,按键电平复位相当于按复位键后,复位端通过电阻与Vcc电源接通; 1.2振荡器和时钟电路设计 1.21振荡器和时钟电路工作原理 80C51系列单片机内部有一个高增益反相放大器,用于构成振荡器,但要形成时钟,外部还需附加电路。XTAL1引脚为反相放大器和时钟发生电路的输入端,XTAL2引脚为反相放大器的输出端。片内时钟发生器实质是个2分频的触发其输入来自振荡器的fosc,输出为2相时钟信号,即节拍信号P1、P2,器频率为fosc/2。2个节拍为1个状态时钟S。状态时钟再3分频后为ALE信号,其频率为fosc/6,状态时钟6分频后为机器周期信号,器频率为fosc/12。特殊功能寄存器PCON的PD位可以控制振荡器的工作,当PD=0时,振荡器停止工作,单片机进入低功耗工作状态,复位后,PD=0,振荡器正常工作。 1.22 本次设计采用常用的内部时钟方式接法:通过在引脚XTAL1和XTAL2两端跨接晶体或陶瓷谐振器,再利用芯片内部的振荡电路,就构成了稳定的自激振荡器,其发出的脉冲直接送入内部时钟电路,如图所示,外接晶振时,C5和C6的值通常选择为20-30pf。C5、C6对频率有微调作用,影响振荡的稳定性和起振速度。所采用的晶体或陶瓷谐振器得频率选择0-24/33MHz。为了减小寄生电容,更好的保证振荡器稳定、可靠的工作,谐振器和电容赢尽可能与单片机芯片靠近安装。 1.3电源 因为该电路所需电压为3-5v,可直接用电池供应或也可以用直流电源供应,但需经过变压才行。 1.4数码管显示电路 采用LED共阳极数码管的发光二极管接到高电平(电压为5V),用LED动态扫描显示方式,在单片机电路里,芯片的驱动电流很小,一般为微安级别的,要通过三极管(可驱动电流为毫安级别,甚至更大)来驱动LED(正常工作电流为几十毫安)发光,本设计由P2端口扫描数码管的选通,P0口送数据显示。 1.5按键电路 S1按键接在P3.0口,用于切换正常走时、调时间、设定闹钟;S2按键接在P3.1口,用于调整时钟分加一和调闹钟时间分加一的功能;S3按键接在P3.2口,用于调整时钟时加一和调闹钟时加一的功能;S4按键接在P3.3口,用于设定是否开启闹钟。 1.6输出控制电路 在P1.1和P1.0端口分别接一个发光二极管,用于整点报时,和一个蜂鸣器,用于响闹铃。 1.7整体布局图 四、 软件设计分析 1、地址空间及端口分配 30h—37h地址空间分别分配给led1、led2、led3、led7、led4、led8、led5、led6.用于数码管显示。 38h地址空间分配给gn,定义38h空间为按键次数读取的缓存空间。 3bh地址空间分配给nk1,定义3bh空间是闹钟开启开关按键次数读取缓存空间。 39h地址空间分配给nao1f,用于存储调整闹钟一分加一按键次数读取缓存。 3ah地址空间分配给nao1s,用于存储调整闹钟一时加一按键次数读取缓存。 3dh地址空间分配给nao2f,用于存储调整闹钟二分加一按键次数读取缓存。 3eh地址空间分配给nao2s,用于存储调整闹钟二时加一按键次数读取缓存。 50h地址空间用于存放50ms中断寄存。 51h地址空间用与存放秒的十位和个位。 52h地址空间用与存放分的十位和个位。 53h地址空间用与存放时的十位和个位。 p1.1端口分配给zdled ,定义灯接到p1.1.利用setb和clr zdled控制灯的亮暗起到整点报时显示作用。 p1.0 端口分配给nb,定义蜂鸣器接到p1.0 利来实现闹肿 p0端口分配给数码管显示控制 p2端口分配给数码管选择显示控制。 2、总体架构说明 该时钟程序设计思路如下: (1)、在程序头将设计中的一些固定空间进行分配并注释。 (2)、初始化程序,如设定时钟初始显示00—59—56 以便一开始就能进入整点报时状态,显示该功能;设定使用定时器1;将一些未到时钟设计功能的功能端口关闭等。 (3)开始主程序进行程序扫描,先扫描拆字子程序,将分配好的时分秒等高地位的数字调入到显示子程序中。——>显示子程序通过分配的空间对应口将拆字子程序的内容在七段数码管上显示相应的时分秒,再调用走时程序使时钟进行读秒等工作。——>进入按键扫描,判断按键是否有变动,若有就根据设计程序对相应的按键按入次数而进行实现相应的功能。如进入时间调整、闹钟一设置、闹钟开启与否等。——>进入闹钟一、二的判断,在时分上与设置的闹铃时间吻合的话就做相对应的判断,再依据是否有开启闹钟而进行响铃与否,如果有响铃则设置其一直响铃知道有人为按取消按键取消闹铃。——>进入整点报时扫描,判断是否在时分上都进入了整点,如果是就报时显示灯闪烁五下(5s),然后就退出整点报时,等到下一个整点的到来。——>最后返回主程序头重新依次扫描。显示过程设有消隐,按键设有去斗。 (4)、子程序部分。在主程序的调用下依据不同的子程序工能而编写子程序,有多级嵌套。这些子程序包括显示子程序、拆字子程序、延时子程序、走时间子程序、整点报时子程序、按键处理子程序、调时间子程序、闹钟设置子程序、闹钟子程序、闹钟开启子程序。 3、各子程序功能及出入口地址 (1)各子程序功能: 显示子程序:将拆分好的高低位时分秒拆分码放入相对应的数码管,调用tab选通相应的七段数码显示时分秒当前数字。 拆字子程序:将空间51h、52h、53h内的秒时分拆成高低字节分配到,30h、31h、33h、34h、36h、37h实现时分秒的显示。 延时子程序:该子程序是为了实现八个七段数码管显示的顺序显示选通时间,2ms的显示时间频率是的显示效果稳定,同时作为按键开关扫描判断去抖 走时间子程序:该程序功能是使得秒程序走动,走到59后进位分,后变00从新开始计时,分走到59后进位时,分从新开始00计时,时走到23,分走到59,秒走到59后进入从新日期周期计时。 整点报时子程序:在达到整点时该程序的功能实现报时,报时以led灯闪烁显示为报时信号。 按键处理子程序:该程序进行按键处理的功能判断分别是有调试按键处理,闹钟设置按键处理,闹钟开启与否按键处理。 调时间子程序:该程序功能实现时间的调整。 调闹钟子程序:该程序闹钟程序设计与按键结合实现闹钟设置调整的功能。 闹钟开启子程序:该功能实现闹钟开启与否而达到闹钟响铃功能。 4、程序流程图 开始 调用拆字节子程序 调用延时显示时分秒 调用按键子程序 调用闹钟1.2判断闹钟 调用闹钟子程序 调用整点报时子程序 结束,循环子程序 Led1—>r0 tab—>dptr 查表 #07—>r2,显示控制 #0feh—>r3,秒个位显示 a—>@r0,@a+dptr —>a,查表 #0ffh—>p2 消隐 a—>p0,显示当前文字 R3—>a,a—>p2,选通相应数码管 Inc r0,指向下一位显示 a—>r3,保存下一位选码 延时2ms显示当前数字 R2-1=?0 拆字子程序 Y N (一)主程序流程图 (二)显示子程序 显示闹钟二 A=?#3 显示闹钟二的时分秒 Lcall bcd处理led3,led6显示 显示闹钟一时分秒 显示闹钟一 调用bcd 调用bcd ACC、PSW入栈保存 Chaizi1.显示 A=?#2 ret bcd程序 ret Y Y N (三)拆字子程序 T1.重新赋值 Th150h,重新赋值,再定时1s PSW .ACC出栈 reti 50h-1=?0 51h=?60 52h=?60 53h=?24 Y Y Y Y N N N N (四)走时间子程序 #0FF—>a,a—>p1 调用延时 ret #0—>gn gn+1 gn—>a P2.0=?1 P2.0=?1 调用延时 P2.0=?1 a=?4 调时间程序 N Y N Y Y N N Y (五)按键处理 五、 程序清单 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;; 初始化 ;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; led1 equ 30h ;定义30h = 第8个数码管(最右边第1个数码管)的显示内容 =LED1=秒的个位 led2 equ 31h ;定义31h = 第7个数码管显示内容 =LED2=秒的十位 led3 equ 32h ;定义32h = 第6个数码管显示内容 =LED3=时分秒中间的一个横杆 led7 equ 33h ;定义33h = 第5个数码管显示内容 =LED7=分的个位 led4 equ 34h ;定义34h = 第4个数码管显示内容 =LED4=分的十位 led8 equ 35h ;定义35h = 第3个数码管显示内容 =LED8=时分秒中间的一个横杆 led5 equ 36h ;定义36h = 第2个数码管显示内容 =LED5=时的个位 led6 equ 37h ;定义37h = 第1个数码管显示内容 =LED6=时的十位 gn equ 38h ;定义38h空间为按键次数读取的缓存空间 bssj equ 3fh ; zdled bit p1.1 ;定义灯接到p1.1.利用setb和clr zdled控制灯的亮暗 nb bit p1.0 ;定义蜂鸣器接到p1.0 利来实现闹铃响 nk1 equ 3bh nao1f equ 39h nao1s equ 3ah nao2f equ 3dh nao2s equ 3eh org 00h ; 这句话把下面那条指令定位到(烧写到)00h这个地址去 sjmp main ;这里是单片机复位后运行的第一条指令,这句话使单片机跳到main那里继续执行程序 org 001bh ;这句话把下面那条指令定位到(烧写到)001b这个地址去. ljmp zoushijian ;这句话是定时器50毫秒定时到之后,TH0,TL0记数到FFFFH时单片机自动跳到 这里运行,我们再把它跳到zoushijian 继续执行,因为这个时候主程序已经暂停运行,我们称主程序发生了中断,而zuoshijian就是中断服务主程序. org 40h ;把主程序main定位到40h这个地址 main: mov sp,#5FH;设置堆栈指针,存放进入50ms中断时的PC值 mov 50h,#01;50h存放定时器中断的次数,现在定时器每50ms中断一次,所以 ;赋初值20,利用djnz减,减到0时自然就是1秒到了 mov 51h,#55;51h存放秒的十位和个位,现在给32h等于十进制的50,相当于一开始让 ;第7个,第8个数码管显示50秒,尽快到达整点,利于调试整点报时. mov 52h,#59;52h存放分的十位和个位,现在给3bh等于十进制的59,相当于一开始让 ;第4个,第5个数码管显示59分,尽快到达整点,利于调试整点报时. mov 53h,#00;53h存放小时的十位和个位,现在给00h等于十进制的00,相当于一开始让 ;第1个,第2个数码管显示00小时,mov tmod,#10h;使定时器1工作在工作模式1,即16位定时器工作模式 mov th1,#3ch;65536us-50000us=15536微秒,刚好是3cb0h,这样定时器1每50ms进入中断一次 mov tl1,#0afh setb zdled ; 还没到整点,先让灯暗 mov a,#0 mov r1,a mov bssj,#10 clr rs0 clr rs1 clr gn clr nao1f clr nao1s clr nk1 setb nb setb tr1 ;开启定时器1,使TH1,TL1不断加1 setb et1 ;开启定时器1中断,使TH1,TL1加到FFFF时让单片机自动跳到001bh去执行,如果不 开启这个中断标志,那么即使单片机TH1,TL1记数到FFFF,单片机也不会跳到001bh去的. setb ea ;开启总中断 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;; 主程序 ;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; l5: nop lcall chaizi;把当前的时分秒的值(即53h~51h的内容)按照十位,个位拆到35h~30h中 lcall display;把拆好的时分秒的十位,个位分别显示到相应的数码管上面. lcall anjian ;理按键 lcall xiang1 ;判断闹钟 lcall xiang2 lcall nk ;设置闹钟是否开 lcall zdbs ;整点报时 sjmp l5;主循环结束,又跳到主循环开始处 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;显示子程序,把拆好的时分秒的十位,个位分别显示到相应的数码管上面 ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;入口地址:r2、r3 ;出口地址:p0、p2 display:mov r0,#led1;从LED1开始显示,即从第8个数码管秒的个位开始 mov dptr,#tab mov r2,#08;8个数码管同时显示 mov r3,#0feh;选通第8个数码管,关闭其他的数码管 disp_1: mov a,@r0;把当前要显示的数放到A里面 movc a,@a+dptr;得到当前要显示数的7段码 mov p2,#0ffh ;关掉所有数码管显示,消隐,把残留在数码管上面的乱码消去 mov p0,a;显示当前的数,运行到这里,人的眼睛应该看到显示内容 mov a,r3;位选给A mov p2,a;选通相应的数码管 rl a;得到新的位选码 inc r0;指针指向下一个要显示的内容 mov r3,a;保存下一个位选码,以便选通下一个数码管. lcall delay;延时4毫秒显示当前的数码管 djnz r2,disp_1;跳回去,进入下一个数码管的显示 ret tab: db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h,0bfh,0ffh,8ch,3fh,7fh ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;; 采用除法指令实现的拆字程序 ;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;入口地址:38h、 ;出口地址:30h—38h、3bh chaizi: mov a,gn ;显示闹钟二 cjne a,#3,chaizi2 mov a,nao2f mov b,#10 div ab mov led2,a mov led1,b mov a,nao2s mov b,#10 div ab mov led4,a mov led7,b mov led5,#02h mov led6,#0ch ret chaizi2:mov a,gn ;显示闹钟一 cjne a,#2,chaizi1 mov a,nao1f mov b,#10 div ab mov led2,a mov led1,b mov a,nao1s mov b,#10 div ab mov led4,a mov led7,b mov led5,#01h mov led6,#0ch lcall bcd ret chaizi1:mov a,51h;把51h这个秒的数值拆成个位和十位 mov b,#10 div ab mov led2,a;秒的十位进入LED2保存 mov led1,b;秒的个位进入LED1保存 mov a,52h;把52h这个分的数值拆成个位和十位 mov b,#10 div ab mov led4,a;分的十位进入LED4保存 mov led7,b;分的个位进入LED7保存 mov a,53h;把53h这个时的数值拆成个位和十位 mov b,#10 div ab mov led6,a;时的十位进入LED6保存 mov led5,b;时的个位进入LED5保存 lcall bcd1 lcall bcd2;处理第3个和第6个数码管的显示 ret bcd1: mov a,gn cjne a,#0,l3 cjne r1,#0,l3 mov a,50h;读取50ms中断的次数,看看经过了几次50ms的中断 cjne a,#09,l1 l1: jc l3 mov a,nk1 cjne a,#1,k_1 mov led3,#0dh ret k_1: mov led3,#0bh;没到0.5秒,显示横杆 ret ;是否经过了0.5秒(即是否经过了10次的50ms中断) l3: mov a,nk1 cjne a,#1,k_2 mov led3,#0eh ret k_2: mov led3,#0ah;已经到了0.5秒,让两个横杆消失,这样造成两个横杆一闪一闪效果 ret bcd2: mov a,gn cjne a,#0,l13 cjne r1,#0,l13 mov a,50h;读取50ms中断的次数,看看经过了几次50ms的中断 cjne a,#09,l11 l11: jc l13 mov a,nk1 cjne a,#1,k_11 mov led8,#0dh ret k_11: mov led8,#0bh;没到0.5秒,显示横杆 ret ;是否经过了0.5秒(即是否过了10次50ms中断) l13: mov a,nk1 cjne a,#1,k_21 mov led8,#0eh ret k_21: mov led8,#0ah;已经到了0.5秒,让两个横杆消失,这样造成两个横杆一闪一闪效果 ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;; 延时程序 ;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;入口地址:r6、r7 ;出口地址:r6 delay: mov r6,#5 ;这是一个((1+1+2)*100+2+1)*5=2015微秒=2毫秒的延时程序 dl2: mov r7,#100 ;1微秒 dl1: nop ;1 微秒 nop ;1微秒 djnz r7,dl1 ;2微秒 djnz r6,dl2 ;2微秒 ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;; 走时间 ;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;入口地址:acc、psw ;出口地址:acc zoushijian: PUSH acc ;0E0H就是A,见课本44页,因为这个时候SP=5fh,故把A的值保存在5fh里面去 PUSH psw ;因为0D0H就是PSW(见课本44页),此时SP=60H,所以这句话是把PSW的值保存到60h中去 mov th1,#3ch ;重新给定时器赋初值,让它再定时50ms mov tl1,#0afh djnz 50h,l2 ;判断是否到了1秒没有,50h减到0表示已经进行了20次的50ms,刚好1秒 mov 50h,#20 ;已经到1秒,重新赋次数,再定时记数一秒 inc 51h mov a,51h ;从51h读取秒的值(包含十位,个位) cjne a,#60,l2 ;判断是否到60秒,没到60秒,中断返回退到主程序 mov 51h,#0 ;到60秒,重新从0秒加起,分钟加1 inc 52h mov a,52h ;读取分钟 cjne a,#60,l2 ;判断是否到了60分钟,没到60分钟,中断返回退到主程序 mov 52h,#0 ;到60分钟,重新从0分钟加,小时加1 inc 53h mov a,53h ;读取小时值 cjne a,#24,l2 ;判断是否到了24小时,没到24小时街卸戏祷赝说街鞒绦? mov 53h,#0 ;到了24小时,重新清零小时,从00小时又开始新一天定时 l2: POP psw ;把放在60h的东西放回到PSW里面,因为这个时候SP=60h,0D0H就是PSW POP acc ;把放在60h的东西放回到PSW里面,因为这个时候SP=5fh,0E0H就是A reti ;PC指针变回进入中断时的下一条指令的值 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;; 整点报时子程序 ?报时时间为 5 秒 ;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;入口地址:51h、52h ;出口地址:p1.1 zdbs: mov a,52h cjne a,#0,zdbs_1 mov a,50h cjne a,#10,zdbs_2 zdbs_2: jc zdbs_3 mov a,51h cjne a,#5,zdbs_4 zdbs_4: jnc zdbs_1 clr p1.1 ret zdbs_3: mov a,51h cjne a,#5,zdbs_5 zdbs_5: jnc zdbs_1 setb p1.1 ret ;打开整点报时的指示灯 zdbs_1: setb zdled ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;; 按键处理 ;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;入口地址:38h、p3 ;出口地址:p3.0 anjian: mov a,#0ffh mov p3,a ;0000给P1口上拉高电频 jb p3.0,js_1 lcall delay jb p3.0,js_1 a_1: jnb p3.0,a_1 lcall delay jnb p3.0,a_1 inc gn mov a,gn cjne a,#4,js_1 mov gn,#0 ret fanhui: ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;; 调时间 ;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;入口地址:38h、52h、53h ;出口地址:38h、p3.1、p3.2 js_1: mov a,gn cjne a,#1,jn1_1 js1_2: jb p3.1,js2_2 lcall delay jb p3.1,js2_2 js1_1: jnb p3.1,js1_1 lcall delay jnb p3.1,js1_1 inc 52h mov a,52h cjne a,#60,anjian mov 52h,#0 ret js2_2: jb p3.2,jn1_1 lcall delay jb p3.2,jn1_1 js2_1: jnb p3.2,js2_1 lcall delay jnb p3.2,js2_1 inc 53h mov a,53h cjne a,#24,anjian mov 53h,#0 ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;; 调闹钟一 ;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;入口地址:38h ;出口地址:p3.1、p3.2 jn1_1: mov a,gn cjne a,#2,en1_1 jb p3.1,jn1_3 lcall delay jb p3.1,jn1_3 jn1_2: jnb p3.1,jn1_2 lcall delay jnb p3.1,jn1_2 inc nao1f mov a,nao1f cjne a,#60,jn1_3 mov nao1f,#0 ret jn1_3: jb p3.2,en1_1 lcall delay jb p3.2,en1_1 jn2_2: jnb p3.2,jn2_2 lcall delay jnb p3.2,jn2_2 inc nao1s mov a,nao1s cjne a,#24,en1_1 mov nao1s,#0 ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;; 调闹钟二 ;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;入口地址:38h ;出口地址:p3.1、p3.2 en1_1: mov a,gn cjne a,#3,bd_1 jb p3.1,en1_3 lcall delay jb p3.1,en1_3 en1_2: jnb p3.1,en1_2 lcall delay jnb p3.1,en1_2 inc nao2f mov a,nao2f cjne a,#60,en1_3 mov nao2f,#0 ret en1_3: jb p3.2,bd_1 lcall delay jb p3.2,bd_1 en2_2: jnb p3.2,en2_2 lcall delay jnb p3.2,en2_2 inc nao2s mov a,nao2s cjne a,#24,bd_1 mov nao2s,#0 ret bd_1: ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;; 响闹钟 ;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; :入口地址:3bh、53h、52h ;出口地址:p1.0 xiang1: mov a,nk1 cjne a,#1,x_1 mov a,53h cjne a,nao1s,x_1 mov a,52h cjne a,nao1f,x_1 mov a,50h cjne a,#10,x_2 x_2: jnc x_3 clr nb ret x_3: setb nb ret x_1: setb p1.0 ret xiang2: mov a,nk1 cjne a,#1,x2_1 mov a,53h cjne a,nao2s,x2_1 mov a,52h cjne a,nao2f,x2_1 mov a,50h cjne a,#10,x2_2 x2_2: jnc x2_3 clr nb ret x2_3: setb nb ret x2_1: setb p1.0 ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;; 是否开启闹钟 ;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;入口地址:3bh ;出口地址:p3.3 nk: jb p3.3,nk_1 lcall delay jb p3.3,nk_1 nk_2: jnb p3.3,nk_2 lcall delay jnb p3.3,nk_2 inc nk1 mov a,nk1 cjne a,#2,nk_1 mov nk1,#0 ret nk_1: ret end 23