电子时钟实习报告Word文档下载推荐.docx
《电子时钟实习报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《电子时钟实习报告Word文档下载推荐.docx(24页珍藏版)》请在冰点文库上搜索。
在闹钟时间设定状态时,按下此键同样进入设置状态,完成分、秒设置的切换。
(2)递增键:
在设置状态时,按一次递增键,被设置的分钟数字或时钟数字增1,持续按下数字自动增1。
(3)递减键:
在设置状态时,按一次递减键,被设置的分钟数字或时钟数字减1,持续按下数字自动增1。
(4)计时键:
在设置状态或闹钟时间设定状态时,按下此键则单片机切换到计时的显示模式,按照新的时.分设置值进行计时。
如果已经在计时状态则此键无效。
(5)闹钟键:
在计时模式时,按下此键则单片机切换到闹钟时间设定状态的显示模式。
等待“设定键”、“递增键”、“递减键”来设定分钟和秒钟。
3、当计时到闹钟设定时间,用发光二极管闪烁,十秒钟后结束闪烁,正常计时。
3设计过程
3.1PROTEUS软件
PROTEUS是英国LabcenterElectronic公司研发的EDA。
PROTEUS不仅是摸拟电路、数字电路、模数混合电路的设计与仿真平台,更是目前世界上最先进的、最完整的多种型号单片机(微控制器)应用系统的设计与仿真平台。
它真正实现了在计算机上完成从原理图设计与电路设计、电路分析与仿真、单片机代码级调试与仿真、系统测试与功能验证到形成PCB的完整的电子设计、研发过程。
主要由ISIS电路设计与仿真平台、ProSPICE模数混合仿真器、VSM单片机系统协同仿真和ARESPCB设计构成。
PROTEUS还有众多的虚拟仪器(示波器、逻辑分析仪等)、信号源;
还有高级图表仿真ASF。
它们提供了检测、调试、分析的手段。
3.2硬件部分
3.2.1STC89C52单片机介绍
STC89C52单片机是由深圳宏晶公司代理销售的一款MCU,是由美国设计生产的一种低电压、高性能CMOS
8位单片机,片内含8kbytes的可反复写的FlashROM和256bytes的RAM,2个16位定时计数器。
STC89C52单片机内部主要包括累加器ACC(有时也简称为A)、程序状态字PSW、地址指示器DPTR、只读存储器ROM、随机存取存储器RAM、寄存器、并行I/O接口P0~P3、定时器/计数器、串行I/O接口以及定时控制逻辑电路等。
这些部件通过内部总线联接起来,构成一个完整的微型计算机。
其管脚图如图1所示。
图1STC89C52单片机管脚结构图
3.3功能设计流程
根据题目的要求,需要实现如下几个方面的功能。
(1)计时功能:
要实现计时功能则需要使用定时器来计时,通过设置定时器的初始值来控制溢出中断的时间间隔,再利用一个变量记录定时器溢出的次数,达到定时1秒中的功能。
然后,当计时每到1秒钟后,倒计时的计数器减1。
当倒计时计数器到0时,触发另一个标志变量,进入闪烁状态。
(2)显示功能:
显示倒计时的数字要采用动态扫描的方式将数字拆成“十位”和“个位”动态扫描显示。
如果处于闪烁状态,则可以不需要动态扫描显示,只需要控制共阴极数码管的位控线,实现数码管的灭和亮。
(3)键盘扫描和运行模式的切换:
主程序在初始化一些变量和寄存器之后,需要不断循环地读取键盘的状态和动态扫描数码管显示相应的数字。
根据键盘的按键值实现设置状态、计时状态及闹钟模式的切换。
电子时钟设计原理框图如下所示(设计源程序见附录C):
设置状态
(处于设置分的状态)
闹钟设置状态
增一
减一
设置时的状态
计时键
闹钟键
设置键
递增&
递减键
图2程序设计总体流程框图
3.4模块功能
3.4.1按键扫描模块
本次实习所用单片机包含的为矩阵式键盘,又称行列式键盘。
用I/O口线组成行、列结构,按键设置在行列的交点上。
4*4的行列结构可构成16个键的键盘,无键按下时各行、列线彼此相交而不相连,一般使之处于高电平状态;
当有按键按下时,则与其相连的行线、列线相连,一般使之处于低电平状态。
由行、列线的点平状态可以识别唯一与之相连的按键。
此次编程用STC芯片上的P2口扫描读取键盘上我们所需的仅5个键盘值。
扫描获取键值程序如下:
unsignedcharscan_key()
{unsignedchara,t,b;
b=255;
a=0xef;
P2=a;
t=P2&
0x0f;
//列
switch(t)
{case0x0e:
b=1;
//P2.0列down
break;
case0x0d:
b=2;
//P2.1列down
case0x0b:
b=3;
//P2.2列down
case0x07:
b=4;
//P2.3列down
}
a=0xdf;
b=5;
}
returnb;
}
3.4.2数码管显示模块
所有数码管通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示。
将所有数码管的8个显示笔划"
a,b,c,d,e,f,g,dp"
的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。
本次编程用到四个数码管,分别显示时的十位和个位、分的十位和个位,用P3.4-P3.7口分别控制四个数码管的显示。
数码管显示模块程序如下:
voidled_show(unsignedintu,unsignedintv,unsignedintw)
{
unsignedchari;
P3=0xff;
i=u/10;
//暂存十位
P0=~led_seg_code[i];
P3=0x7f;
delay(100);
//延时
i=u%10;
//暂存个位
if(w==1)
{P0=P0&
0x7f;
else
{
P0&
=0xFF;
P3=0xbf;
i=v/10;
P3=0xdf;
i=v%10;
P3=0xef;
3.4.3闹钟模块
蜂鸣器发声原理是电流通过电磁线圈,使电磁线圈产生磁场来驱动振动膜发声的。
因此需要一定的电流才能驱动它,单片机IO口输出的电流较小,其TTL电平基本上驱动不了蜂鸣器,因此需要增加一个电流放大的电路。
程序中通过改变单片机对应IO口输出波形的频率,就可以调整控制蜂鸣器音调,产生各种不同音色、音调的声音。
另外,改变其占空比,也可以控制蜂鸣器的声音大小。
它有两种驱动方式,即用PNP或NPN三极管电流放大电路驱动。
因此,我们可以通过程序控制IO口输出的电平来使蜂鸣器发出声音和关闭,从而实现各种可能音响的产生。
闹钟模块编程如下:
voidalarm()
{deng=1;
speak=1;
if(sec<
=nsec+10)
if(banmiao==1)
{deng=1;
else{deng=0;
speak=0;
}
else{deng=1;
speak=1;
}
3.5电路板焊接
运用所学知识识别元器件,并动手在已画好线路的电路板上将元器件焊接进去,使电路板正常工作。
对所焊接的电路进行仔细的检查,判断是否有焊接错误的地方或者短路的地方,对出现的异常情况根据现象判别原因,并解决问题。
下图为焊接好后的电路板:
图3电路板
4硬件调试
4.1调试结果
连接电脑,将源程序烧录到STC芯片中,开启电源,调试程序,检查结果显示是否正常,如有错误,及时修改源程序,直到调试结果正确。
图4设置状态
图5计时状态
5实习总结
两周的实习结束了,有很多的心得体会,有关于单片机的,也有关于模电数电等基本电子基础的。
因为单片机知识已经很久没复习,刚拿到任务书的时候,不知道如何着手,后来通过对书本的回顾,加深了对单片机的记忆。
有些知识会迁移和联系模电数电。
课堂教学考虑到大多数同学的需求,主要强调“基本”——基本知识、基本理论、基本方法、基本技能。
而这次实习正是为我们提供了一个深入学习、探索的机会,成为课堂教学的有益补充。
我们正面临就业问题,这次课设给了我们一个机会去试验。
单片机理论的学习是为课程的设计作准备的,但有时学习的理论也解决不了实践中的问题。
实践中获得的知识能让我对单片机的知识有更好的认识和理解。
这次的实习中不单单是考察编程能力,还锻炼了我动手调试和解决问题的能力,不过更应该感谢老师们的耐心教导,在遇到问题向老师求教时,老师不仅仅只是解决问题,还会时不时帮我们扩展思维。
在焊接电路板的过程中,有一段一插曲,我用了一上午在实验室认识元器件并学习焊接技巧,自己细心的焊接好每个引脚,可在调试的时候出问题了,电路跑不起来,我当时就傻眼了,感觉这预示着我要重新焊一块板子啊,当我请教了老师之后,老师很耐心的给我讲解了这种情况应该如何应对并解决,在老师的帮助下我顺利的找出了问题所在并解决了。
虽然此次实践我参考了一些文献资料,没有做到很大程度上的创新,但在对程序的读写过程中我明白了许多。
这次课程设计的最大收获是只有把理论用到实践中我们才能真正掌握好所学知识。
参考文献
[1]李鸿等.单片机原理及应用[M].湖南大学出版社,2005.
[2]何立民.单片机高级教程---应用与设计[M].北京航空航天大学出版社,2000,8.
[3]戴佳.51单片机C语言应用程序设计实例精讲[M].北京:
电子工业出版社,2006.
[4]于京.
51系列单片机C程序设计与应用案例[M].北京:
中国电力出版社,2006.
[5]孙育才.
ATMEL新型AT89S52系列单片机及其应用[M].北京:
清华大学出版社,2005.
[6]李华.MCS-51系列单片机实用接口技术[M].北京:
北京航空航天大学出版社,2000.
附录A电路板原理图
附录B元器件清单
名称
PartType
Designator
数量
Footprint
PCB封装库
金属线
0欧姆,金属线,单面板中元件面的跳线
R21、R23、R24、R25、R27、R28、R29、R30、R31、R32、R33、R34、R35、R39
14
AXIAL0.4
Protel99库
色环金属电阻
100欧姆
R1、R2、R3、R4、R5、R6、R7、R8、R36
9
500欧姆
R14、R15、R17、R18、R19、R26
6
1K欧姆
R9、R10、R11、R12、R16、R20
10K
R13、R22、R38
3
9PIN排阻
1K
RP2
1
SIP9
RP1、RP3
2
电解电容
1u
E2、E3、E4、E5、E6
5
RB.1/.2
自制
10U
C1、E1
C_1
30p
C2、C3
RAD0.1
晶振
11.0592M
Y1
XTAL1
元件
24C01
IC2
DIP8
DS18B20三芯座
J9
DS18B20
MAX232
IC4
DIP16
STC89C52
IC1
DIP40
四位共阳极数码管
LED5641BR
U1
二极管
1N5817
D1
DIODE-0.4H
发光二极管
红色
L1、L2、L3、L4、L5、L6、L7、L8、L11、L14、L15、L20、L21
13
LED
黄色
L10、L13、L16、L19
4
绿色
L9、L12、L17、L18
三极管
9012
Q1、Q2、Q3、Q4、Q5
PNP3
5V无源蜂鸣器
BELL
U7
RAD0.3
自锁开关
SW-DPDT
S20
DIP_KEY6
轻触开关
S1、S2、S3、S4、S5、S6、S7、S8、S9、S10、S11、S12、S13、S14、S15、S16、S23
17
TP-KEY
跳线端子
3Pin排针
S17、S18、S19、S22、J2
SIP3
接插件
2芯接线端
DC5V_IN
CON2P
S51_ISP
JP1
IDC10
DB9
J1
DB9/F
USB
J3
USB-A-F-90
IC座
跳线帽
自恢复保险丝
附录C电子时钟模块原理图
附录D电子时钟源程序
#include"
c:
\DocumentsandSettings\Administrator\桌面\dzsz.prj"
sbitdeng=P1^7;
sbitspeak=P1^0;
unsignedchardatakey_val_old,key_val_new;
//暂存倒计数的初始值和保存倒计数的当前值
unsignedintdataT1_cnt=0;
//保存定时器溢出次数
unsignedintdatastate_val=0,nao=0;
//状态值
unsignedchardatakey_pre,key_cur;
//存放当前扫描的键和前一次按下的键值
unsignedintbanmiao=0;
charsec=0,min=0,hour=0;
charksec,kmin,khour;
charnsec=10,nmin=0,nhour=0;
Charcodeled_seg_code[10]={0x3f,0x06,0x05b,0x04f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f};
//-----------延时-------------
voiddelay(unsignedinti)
{while(--i);
//-------------获取键值-----------
switch(t)
{case0x0e:
//----------数码管显示--------------
//----------T1中断---------------
voidtimer1()interrupt3//T1中断,250us中断一次
{TH1=(65535-5000)/256;
TL1=(65535-5000)%256;
T1_cnt++;
if(T1_cnt>
1999)//如果计数>
1999,计时0.5s
banmiao=1;
3999)//如果计数>
3999,计时1s
{T1_cnt=0;
sec++;
banmiao=0;
if(sec==60)
{sec=0;
min++;
if(min==60)
{min=0;
hour++;
if(hour==24)
{hour=0;
min=0;
sec=0;
//---------闹钟----------------
speak=1;
//---------主程序----------------
main()
{TH1=(65535-5000)/256;
/******装入计数初值****/
TL1=(65535-5000)%256;
state_val=0;
key_val_old=255;
T1_cnt=0;
TMOD=0x20;
//用T1计时8位自动装载定时模式
//TH1=0x19;
//250微秒溢出一次;
250=(256-x)*12/11.0592->
x=230.4
//TL1=0x19;
EA=1;
//打开总中断允许
ET1=1;
//开中断允许
TR1=1;
//开定时器T1
while
(1)
{
if(hour==nhour&
&
min==nmin&
sec>
=nsec)
alarm();
led_show(hour,min,banmiao);
key_val_new=sc