数字时钟.docx

上传人:b****7 文档编号:10615472 上传时间:2023-02-21 格式:DOCX 页数:20 大小:186.37KB
下载 相关 举报
数字时钟.docx_第1页
第1页 / 共20页
数字时钟.docx_第2页
第2页 / 共20页
数字时钟.docx_第3页
第3页 / 共20页
数字时钟.docx_第4页
第4页 / 共20页
数字时钟.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

数字时钟.docx

《数字时钟.docx》由会员分享,可在线阅读,更多相关《数字时钟.docx(20页珍藏版)》请在冰豆网上搜索。

数字时钟.docx

数字时钟

单片机课程设计报告

 

系部:

机电工程系

班级组别:

二班四组

组长:

邹建华_

成员:

邹建华杨云冲王国庆

设计题目:

数字时钟

指导教师:

龙芬

设计日期:

二零一二年十二月十日至十六日

一设计要求

1、课程设计内容

综合运用51单片机知识设计一个具备校准功能的时钟。

(其中用到定时器、中断、按键、数码管、液晶、时钟芯片)

设计题目1——数字钟的设计与制作

设计并制作出具有如下功能的数字钟:

1)自动计时,由4位LED显示器显示时、分。

第二个数码管的小数点每隔1s闪烁一次,表示秒。

2)具备校准功能,可以设置当前时间。

二.系统方案选择

STC89C52

1.简介:

STC89C52是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。

在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。

具有以下标准功能:

8k字节Flash,512字节RAM,32位I/O口线,看门狗定时器,内置4KBEEPROM,MAX810复位电路,2个16位定时器/计数器,一个6向量2级中断结构,全双工串行口。

另外STC89X52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。

空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。

掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。

最高运作频率35MHz,6T/12T可选。

 

2.特性:

  STC89C52RC单片机:

  8K字节程序存储空间;

  512字节数据存储空间;存储空间;

  内带2K字节EEPROM

  可直接使用串口下载;

  AT89S52单片机:

  8K字节程序存储空间;

  256字节数据存储空间;

  没有内带EEPROM存储空间;

3.编辑本段参数:

  1.增强型8051单片机,6时钟/机器周期和12时钟/机器周期可以任意选择,指令代码完全兼容传统8051.[1]

  2.工作电压:

5.5V~3.3V(5V单片机)/3.8V~2.0V(3V单片机)

  3.工作频率范围:

0~40MHz,相当于普通8051的0~80MHz,实际工作频率可达48MHz

  4.用户应用程序空间为8K字节

  5.片上集成512字节RAM

  6.通用I/O口(32个),复位后为:

P0/P1/P2/P3是准双向口/弱上拉,P0口是漏极开路输出,作为总线扩展用时,不用加上拉电阻,作为I/O口用时,需加上拉电阻。

  7.ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无需专用仿真器,可通过串口(RxD/P3.0,TxD/P3.1)直接下载用户程序,数秒即可完成一片

  8.具有EEPROM功能

  9.具有看门狗功能

  10.共3个16位定时器/计数器。

即定时器T0、T1、T2

  11.外部中断4路,下降沿中断或低电平触发电路,PowerDown模式可由外部中断低电平触发中断方式唤醒

  12.通用异步串行口(UART),还可用定时器软件实现多个UART

  13.工作温度范围:

-40~+85℃(工业级)/0~75℃(商业级)

  14.PDIP封装

 

4.时钟电路

STC89C52内部有一个用于构成振荡器的高增益反相放大器,引脚RXD和TXD分别是此放大器的输入端和输出端。

时钟可以由内部方式产生或外部方式产生。

内部方式的时钟电路如图4—2(a)所示,在RXD和TXD引脚上外接定时元件,内部振荡器就产生自激振荡。

定时元件通常采用石英晶体和电容组成的并联谐振回路。

晶体振荡频率可以在1.2~12MHz之间选择,电容值在5~30pF之间选择,电容值的大小可对频率起微调的作用。

外部方式的时钟电路如图4—2(b)所示,RXD接地,TXD接外部振荡器。

对外部振荡信号无特殊要求,只要求保证脉冲宽度,一般采用频率低于12MHz的方波信号。

片内时钟发生器把振荡频率两分频,产生一个两相时钟P1和P2,供单片机使用。

示,RXD接地,TXD接外部振荡器。

对外部振荡信号无特殊要求,只要求保证脉冲宽度,一般采用频率低于12MHz的方波信号。

片内时钟发生器把振荡频率两分频,产生一个两相时钟P1和P2,供单片机使用。

RXD接地,TXD接外部振荡器。

对外部振荡信号无特殊要求,只要求保证脉冲宽度,一般采用频率低于12MHz的方波信号。

片内时钟发生器把振荡频率两分频,产生一个两相时钟P1和P2,供单片机使用。

(a)内部方式时钟电路(b)外部方式时钟电路

图4—2时钟电路

5.复位电路

(1)复位操作

复位是单片机的初始化操作。

其主要功能是把PC初始化为0000H,使单片机从0000H单元开始执行程序。

除了进入系统的正常初始化之外,当由于程序运行出错或操作错误使系统处于死锁状态时,为摆脱困境,也需按复位键重新启动。

除PC之外,复位操作还对其他一些寄存器有影响,它们的复位状态如表一所示。

表一一些寄存器的复位状态

寄存器

复位状态

寄存器

复位状态

PC

0000H

TCON

00H

ACC

00H

TL0

00H

PSW

00H

TH0

00H

SP

07H

TL1

00H

DPTR

0000H

TH1

00H

P0-P3

FFH

SCON

00H

IP

XX000000B

SBUF

不定

IE

0X000000B

PCON

0XXX0000B

TMOD

00H

(2)复位信号及其产生

RST引脚是复位信号的输入端。

复位信号是高电平有效,其有效时间应持续24个振荡周期(即二个机器周期)以上。

若使用颇率为6MHz的晶振,则复位信号持续时间应超过4us才能完成复位操作。

产生复位信号的电路逻辑如图4—3所示:

图4—3复位信号的电路逻辑图

整个复位电路包括芯片内、外两部分。

外部电路产生的复位信号(RST)送至施密特触发器,再由片内复位电路在每个机器周期的S5P2时刻对施密特触发器的输出进行采样,然后才得到内部复位操作所需要的信号。

复位操作有上电自动复位相按键手动复位两种方式。

上电自动复位是通过外部复位电路的电容充电来实现的,其电路如图4—4(a)所示。

这佯,只要电源Vcc的上升时间不超过1ms,就可以实现自动上电复位,即接通电源就成了系统的复位初始化。

按键手动复位有电平方式和脉冲方式两种。

其中,按键电平复位是通过使复位端经电阻与Vcc电源接通而实现的,其电路如图4—4(b)所示;而按键脉冲复位则是利用RC微分电路产生的正脉冲来实现的,

其电路如图4—4(c)所示:

(a)上电复位(b)按键电平复位(c)按键脉冲复位

图4—4复位电路

上述电路图中的电阻、电容参数适用于6MHz晶振,能保证复位信号高电平持续时间大于2个机器周期。

本系统的复位电路采用图4—4(b)上电复位方式。

STC89C52具体介绍如下:

①主电源引脚(2根)

VCC(Pin40):

电源输入,接+5V电源

GND(Pin20):

接地线

②外接晶振引脚(2根)

XTAL1(Pin19):

片内振荡电路的输入端

XTAL2(Pin20):

片内振荡电路的输出端

③控制引脚(4根)

RST/VPP(Pin9):

复位引脚,引脚上出现2个机器周期的高电平将使单片机复位。

ALE/PROG(Pin30):

地址锁存允许信号

PSEN(Pin29):

外部存储器读选通信号

EA/VPP(Pin31):

程序存储器的内外部选通,接低电平从外部程序存储器读指令,如果接高电平则从内部程序存储器读指令。

④可编程输入/输出引脚(32根)

STC89C52单片机有4组8位的可编程I/O口,分别位P0、P1、P2、P3口,每个口有8位(8根引脚),共32根。

PO口(Pin39~Pin32):

8位双向I/O口线,名称为P0.0~P0.7

P1口(Pin1~Pin8):

8位准双向I/O口线,名称为P1.0~P1.7

P2口(Pin21~Pin28):

8位准双向I/O口线,名称为P2.0~P2.7

P3口(Pin10~Pin17):

8位准双向I/O口线,名称为P3.0~P3.7

STC89C52主要功能如表二所示。

表二STC89C52主要功能

主要功能特性

兼容MCS51指令系统

8K可反复擦写FlashROM

32个双向I/O口

256x8bit内部RAM

3个16位可编程定时/计数器中断

时钟频率0-24MHz

2个串行中断

可编程UART串行通道

2个外部中断源

共6个中断源

2个读写中断口线

3级加密位

低功耗空闲和掉电模式

软件设置睡眠和唤醒功能

6.动态驱动显示

动态显示是指每隔一段时间循环点亮每个LED数码管,每次只有一个LED被点亮。

根据人眼的视觉暂留效应,当循环点亮的速度很快的时候,可以认为各个LED是稳定显示的。

动态显示的硬件连接比较简单。

这里使用了4个LED数码管,将所有LED的8段引脚并联在一起,连接到8位的I/O数据总线上。

而各个LED的共阳极引脚或共阴极引脚分别由另一组I/O线控制,从图中可以看出,使用两个8位的I/O端口便可以动态显示8位LED数码管。

其中一个并口作为LED数码管的控制引脚,另一个并口作为公共的数据总线。

程序中采用扫描显示的方式,即在同一时刻,只使用一个LED显示数据。

通过为共阴极LED(或共阳极LED)的公共引脚赋低电平(或高电平),从而选择某个LED显示。

如此循环,使每个LED显示该LED应显示的数据,并进行适当的延时,形成视觉暂留效果。

这样便可以达到动态显示的目的

7.键盘功能定义

键盘用来修改时间。

分别与P1.0P1.1P1.2相连

按键功能:

key_1键为时钟参数修改功能键

1.按键按一次,修改时钟的分

2.按键按两次,修改时钟的时

Key_2键为时钟增一功能键

Key_3确认键

8.工作流程设计

(1)主流程图

(2).S1按键流程图

三系统硬件设计

仿真原理图

四系统软件设计

参考程序:

#include

sbitP27=P2^7;//分个位控制端

sbitP26=P2^6;//分十位控制端

sbitP25=P2^5;//时个位控制端

sbitP24=P2^4;//时十位控制端

sbitkey0=P2^0;//模式设置

sbitkey1=P2^1;//加1

sbitkey2=P2^2;//确认

unsignedcharhour,min,sec,T50ms;

unsignedcharmodstate;//模式状态

bitflag;

unsignedcharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x7f};//段码

voidinit();//初始化子程序声明

voiddelay500us(unsignedcharX);//延时子程序声明

voiddisplay();//显示子程序声明

voiddisplay001();//显示子程序声明

voiddisplay002();//显示子程序声明

voidkeyscan();//按键识别子程序声明

voidmain()

{

init();

while

(1)

{

keyscan();

}

}

voidinit()//初始化子程序

{

TMOD=0x01;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

ET0=1;

EA=1;

TR0=1;

}

voiddelay500us(unsignedcharX)

{

unsignedchari,j;

for(i=X;i>0;i--)

for(j=248;j>0;j--);

}

voidtimer0()interrupt1

{

TMOD=0x01;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

T50ms++;

if(T50ms>=20)

{

T50ms=0;

flag=~flag;

sec++;

if(sec>=60)

{

sec=0;

min++;

if(min>=60)

{

min=0;

hour++;

if(hour>=24)

hour=0;

}

}

}

}

voiddisplay()

{

P27=1;

P26=1;

P25=1;

P24=1;

P0=table[hour/10];

P27=0;

delay500us(5);

P27=1;

P26=1;

P25=1;

P24=1;

P0=table[hour%10];

P26=0;

delay500us(5);

if(flag==1)

{

P27=1;

P26=1;

P25=1;

P24=1;

P0=table[10];

P26=0;

delay500us(5);

}

P27=1;

P26=1;

P25=1;

P24=1;

P0=table[min/10];

P25=0;

delay500us(5);

P27=1;

P26=1;

P25=1;

P24=1;

P0=table[min%10];

P24=0;

delay500us(5);

}

voiddisplay001()

{

P27=1;

P26=1;

P25=1;

P24=1;

P0=table[hour/10];

P27=0;

delay500us(10);

P27=1;

P26=1;

P25=1;

P24=1;

P0=table[hour%10];

P26=0;

delay500us(10);

}

voiddisplay002()

{

P27=1;

P26=1;

P25=1;

P24=1;

P0=table[min/10];

P25=0;

delay500us(10);

P27=1;

P26=1;

P25=1;

P24=1;

P0=table[min%10];

P24=0;

delay500us(10);

}

voidkeyscan()//按键识别钟程序

{

while(modstate==0)

{

display();

if(key0==0)

{

display();

if(key0==0)modstate++;

while(key0==0)display001();//等待按键释放。

}

}

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

while(modstate==1)

{

display001();

if(key0==0)

{

display001();

if(key0==0)modstate++;//这两句加在一起为延时10ms软件防抖设计。

while(key0==0)display002();//等待按键释放。

}

if(key1==0)

{

display001();

if(key1==0)

{

hour++;

if(hour>=24)hour=0;

while(key1==0)display001();

}

}

if(key2==0)

{

display();

if(key2==0);

{

modstate=0;

TR0=1;

}

while(key2==0)display();

}

}

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

while(modstate==2)

{

display002();

if(key0==0)

{

display002();

if(key0==0)modstate=0;//这两句加在一起为延时10ms软件防抖设计。

while(key0==0)display();//等待按键释放。

}

if(key1==0)

{

display002();

if(key1==0)

{

min++;

if(min>=60)min=0;

while(key1==0)display002();

}

}

if(key2==0)

{

display();

if(key2==0);

{

modstate=0;

TR0=1;

}

while(key2==0)display();

}

}

}

五总结

1.心得

单片机作为我们主要的专业课程之一,我觉得单片机课程设计很有必要,而且很有意义。

在做的过程中能够发现很多的问题,只有自己亲身去做了就会遇到你在书上所没有的,并且你要一个又一个的解决,这个有点难,要找到自己的错误在哪里,这还真的难,有时候自己的错误自己很难的看出来,我就一个main写错了,我找了半天还没找问题在哪里,表面看是看不出的,因为我只是a与i对调了一下,害的我搞了半天才查出来,这个无形的,编译是不会出错,只是一个警告,但是下载单片机里就是不出现结果,改了之后就ok了,在写程序的时候大小写特别要注意的,还有程序的结构清楚明了,最后还是完成任务。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 农学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1