数字时钟教学内容Word文档格式.docx
《数字时钟教学内容Word文档格式.docx》由会员分享,可在线阅读,更多相关《数字时钟教学内容Word文档格式.docx(18页珍藏版)》请在冰豆网上搜索。
最高运作频率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接外部振荡器。
RXD接地,TXD接外部振荡器。
(a)内部方式时钟电路(b)外部方式时钟电路
图4—2时钟电路
5.复位电路
(1)复位操作
复位是单片机的初始化操作。
其主要功能是把PC初始化为0000H,使单片机从0000H单元开始执行程序。
除了进入系统的正常初始化之外,当由于程序运行出错或操作错误使系统处于死锁状态时,为摆脱困境,也需按复位键重新启动。
除PC之外,复位操作还对其他一些寄存器有影响,它们的复位状态如表一所示。
表一一些寄存器的复位状态
寄存器
复位状态
PC
0000H
TCON
00H
ACC
TL0
PSW
TH0
SP
07H
TL1
DPTR
TH1
P0-P3
FFH
SCON
IP
XX000000B
SBUF
不定
IE
0X000000B
PCON
0XXX0000B
TMOD
(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<
reg52.h>
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>
j--);
voidtimer0()interrupt1
T50ms++;
if(T50ms>
=20)
{
T50ms=0;
flag=~flag;
sec++;
if(sec>
=60)
{
sec=0;
min++;
if(min>
{
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);
P0=table[hour%10];
P26=0;
if(flag==1)
P0=table[10];
P0=table[min/10];
P25=0;
P0=table[min%10];
P24=0;
voiddisplay001()
delay500us(10);
voiddisplay002()
voidkeyscan()//按键识别钟程序
while(modstate==0)
display();
if(key0==0)
display();
if(key0==0)modstate++;
while(key0==0)display001();
//等待按键释放。
//****************************************************************************//
while(modstate==1)
display001();
display001();
//这两句加在一起为延时10ms软件防抖设计。
while(key0==0)display002();
if(key1==0)
if(key1==0)
=24)hour=0;
while(key1==0)display001();
}
if(key2==0)
if(key2==0);
modstate=0;
TR0=1;
}
while(key2==0)display();
while(modstate==2)
display002();
display002();
if(key0==0)modstate=0;
while(key0==0)display();
min++;
if(min>
=60)min=0;
while(key1==0)display002();
{
modstate=0;
TR0=1;
}
五总结
1.心得
单片机作为我们主要的专业课程之一,我觉得单片机课程设计很有必要,而且很有意义。
在做的过程中能够发现很多的问题,只有自己亲身去做了就会遇到你在书上所没有的,并且你要一个又一个的解决,这个有点难,要找到自己的错误在哪里,这还真的难,有时候自己的错误自己很难的看出来,我就一个main写错了,我找了半天还没找问题在哪里,表面看是看不出的,因为我只是a与i对调了一下,害的我搞了半天才查出来,这个无形的,编译是不会出错,只是一个警告,但是下载单片机里就是不出现结果,改了之后就ok了,在写程序的时候大小写特别要注意的,还有程序的结构清楚明了,最后还是完成任务。