硬件课程设计.docx
- 文档编号:12819468
- 上传时间:2023-04-22
- 格式:DOCX
- 页数:42
- 大小:410.84KB
硬件课程设计.docx
《硬件课程设计.docx》由会员分享,可在线阅读,更多相关《硬件课程设计.docx(42页珍藏版)》请在冰豆网上搜索。
硬件课程设计
硬件课程设计实践报告
实验课题:
1、带有闹钟功能的可调电子钟设计
2、按键选择播放不同歌曲设计
班级:
学号:
姓名:
指导教师:
1、概要………………………………………………………………………………3
2、焊接工艺总结……………………………………………………………………3
3、焊接成果…………………………………………………………………………4
4、实验原理图………………………………………………………………………5
5、89S52单片机与DS1302芯片的简介…………………………………………6
6、实验设计思想………………………………………………………………………8
7、程序框图…………………………………………………………………………10
8、核心代码…………………………………………………………………………14
9、心得体会…………………………………………………………………………18
10、附源代码………………………………………………………………………19
概要
我们这次的硬件课程设计实验所用的开发板是AT89S52系列单片机,由于电路板是铜版印刷电路板,已经布好线,我们所做的只是根据电路图把原件对应焊接到电路板上,并通过实验所给的烧写程序检验电路板的焊接是否通过。
在电路板焊接完成后,根据我们所学的单片机基本知识,学习如何使用单片机实现自己需要的功能。
其中,我们主要做的设计包含有两个实验程序:
数字钟和电子音乐。
本次实验所需要的程序主体是使用C语言编写,其中音乐部分在C语言程序中调用了汇编所实现的准确计时。
在制作数字钟时我们使用了DS1302芯片,通过DS1302的准确自动计时,实现数字钟在单片机掉电的情况下能够正常计时。
以下是本开发板配置:
1、STC89C52RC单片机,支持串口ISP在线下载。
2、8位数码管(可做静态显示,动态扫描实验,数字钟时间显示)。
3、16位LED发光二极管(可做流水灯实验)。
4、6个按键按键查询,按键中断
5、MAX232芯片构成标准的RS232串行通信接口,本板可同PC机,单片机开发板进行串行通信,也可直接由计算机串口下载程序至单片机FLASHROM(8K)进行程序的烧录。
.
6、蜂鸣器(可做单片机发声,播放音乐实验)。
7、DS1302时钟芯片(SPI串行实时时钟)。
(DS1302时钟芯片网上有丰富的相关资料和参考程序。
)
8、DS18B20温度传感器接口(初步掌握单片机操作后即可亲自编写程序获知当时的温度)。
9、单片机的34个IO口全部由DIP40插座引出,方便用户进行自由扩展进行各种实验。
10、USB供电系统,通过直接插接到电脑USB口即可得到+5V电源,不需另接直流电源,方便用户节省费用。
(USB座4芯只用到1和4,其中4正1负.)注意:
理论上USB2。
0接口电压3.3-5V,最大电流500MA。
为避免初学者使用USB口烧坏主板,(尤其是笔记本电脑)可另配DC9V电源。
本开发板已预留了稳压与滤波电路,并具有防止反接保护功能。
11、STC89C52RC系列单片机下载编程次数达十万次(AST89S521000次)。
焊接工艺总结
我们用的电路板是制作好的铜板印刷电路板,我们所做的是根据电路图把原件对应焊接到电路板上。
通过自己的努力,在老师规定的实验时间内把自己的板子焊机好了,但还是出现了一些小问题,最后排查结果是有一个电阻没焊好,导致数码管有一个杠不亮,在重新焊好后问题便解决了。
下面是我在焊接过程中的一点经验与总结。
在焊接电路板之前要检查电路图所使用的各种电路元件和芯片是否齐全。
配齐所需元件查看电路图,弄明白电路的一些基本连接所实现的基本功能,为什么要如此连接。
为了方便焊接,先把电路板的支架安装上,稳定电路板。
观察电路板和电路图,对具有层次结构的部分,先焊接底层部分,然后才能焊接上层部分。
一般情况下应该先焊接面积较大的元件,其次是面积较小的器件。
当然也不是固定的,焊接时应该考虑到,各种元器件的分布结构,元件的焊接不能影响其他元件的焊接。
对于各种芯片的焊接,要先焊接芯片插座,这样,如果由于操作失误或板子问题导致芯片烧坏的话,只需换块芯片就行了,而不必重新焊接插座大量引脚。
对于极性元件,比如二极管、极性电容、蜂鸣器等原件必须分清其正负极,然后对应焊接,否则会毁坏芯片或者部分功能不能实现。
对于电阻排、芯片等多引脚元件要认清元件的型号和元件上对应的标志对号入座。
在焊接时,每点的锡条用量既不能太多也不能太少。
太多的话不仅影响美观更可能导致相邻节点的短接。
太少的话,可能会导致电路接触不良,在电路故障排查时比较费力。
在焊接过程中,不可能一蹴而就。
当产生错误时要会排查电路,通过电路图分析导致错误的可能电路,用万用表逐步排查电路是否连通,是不是有可能是元件损坏导致等引起的,最终确保电路板焊接正确无误。
在修改电路板焊接时有可能会导致电路板上的铜片掉落,此时就需要“跳线”了,所谓的“跳线”就是沿着电路图查找该节点的上一个节点,把该节点的连线转移到上一节点。
通过不断地尝试和修改,我完成了电路板的焊接,总体上来说电路板的焊接节点能够实现平整光滑,焊接过程完成后,电路的各个元件都能够正常工作。
指导老师所给的烧写程序也能够正常运行。
焊接成果
实验电路原理图
89S52单片机简介
许多有关硬件设计中都使用到单片机89S52,其功能比以往的单片机强大的多。
89S52是一种高性能低功耗的采用CMOS工艺制造的8位微控制器,它提供下列标准特征:
4K字节的程序存储器,128字节的RAM,32条I/O线,2个16位定时器/计数器,一个5中断源两个优先级的中断结构,一个双工的串行口,片上震荡器和时钟电路。
引脚说明:
·VCC:
电源电压
·GND:
地
图89S52引脚图
·P0口:
P0口是一组8位漏极开路型双向I/O口,作为输出口用时,每个引脚能驱动8个TTL逻辑门电路。
当对0端口写入1时,可以作为高阻抗输入端使用。
当P0口访问外部程序存储器或数据存储器时,它还可设定成地址数据总线复用的形式。
在这种模式下,P0口具有内部上拉电阻。
在EPROM编程时,P0口接收指令字节,同时输出指令字节在程序校验时。
程序校验时需要外接上拉电阻。
·P1口:
P1口是一带有内部上拉电阻的8位双向I/O口。
P1口的输出缓冲能接受或输出4个TTL逻辑门电路。
当对P1口写1时,它们被内部的上拉电阻拉升为高电平,此时可以作为输入端使用。
当作为输入端使用时,P1口因为内部存在上拉电阻,所以当外部被拉低时会输出一个低电流(IIL)。
·P2口:
P2是一带有内部上拉电阻的8位双向的I/O端口。
P2口的输出缓冲能驱动4个TTL逻辑门电路。
当向P2口写1时,通过内部上拉电阻把端口拉到高电平,此时可以用作输入口。
作为输入口,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出电流(IIL)。
P2口在访问外部程序存储器或16位地址的外部数据存储器(例如MOVX@DPTR)时,P2口送出高8位地址数据。
在这种情况下,P2口使用强大的内部上拉电阻功能当输出1时。
当利用8位地址线访问外部数据存储器时(例MOVX@R1),P2口输出特殊功能寄存器的内容。
当EPROM编程或校验时,P2口同时接收高8位地址和一些控制信号。
·P3口:
P3是一带有内部上拉电阻的8位双向的I/O端口。
P3口的输出缓冲能驱动4个TTL逻辑门电路。
当向P3口写1时,通过内部上拉电阻把端口拉到高电平,此时可以用作输入口。
作为输入口,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出电流(IIL)。
P3口同时具有AT89S52的多种特殊功能,具体如下表1所示:
端口引脚
第二功能
P3.0
RXD(串行输入口)
P3.1
TXD(串行输出口)
P3.2
(外部中断0)
P3.3
(外部中断1)
P3.4
T0(定时器0)
P3.5
T1(定时器1)
P3.6
(外部数据存储器写选通)
P3.7
(外部数据存储器都选通)
表1P3口的第二功能
(此系统的基准信号1s定时及测频正是用P3.4和P3.5的T0、T1进行定时计数实现的)
·RST:
复位输入。
当振荡器工作时,RST引脚出现两个机器周期的高电平将使单片机复位。
·ALE/
:
当访问外部存储器时,地址锁存允许是一输出脉冲,用以锁存地址的低8位字节。
当在Flash编程时还可以作为编程脉冲输出(
)。
一般情况下,ALE是以晶振频率的1/6输出,可以用作外部时钟或定时目的。
但也要注意,每当访问外部数据存储器时将跳过一个ALE脉冲。
·
:
程序存储允许时外部程序存储器的读选通信号。
当AT89S52执行外部程序存储器的指令时,每个机器周期
两次有效,除了当访问外部数据存储器时,
将跳过两个信号。
·
/VPP:
外部访问允许。
为了使单片机能够有效的传送外部数据存储器从0000H到FFFH单元的指令,
必须同GND相连接。
需要主要的是,如果加密位1被编程,复位时EA端会自动内部锁存。
当执行内部编程指令时,
应该接到VCC端。
·XTAL1:
振荡器反相放大器以及内部时钟电路的输入端。
·XTAL2:
振荡器反相放大器的输出端。
时钟电路DS1302简介
DS1302的性能特性:
●实时时钟,可对秒、分、时、日、周、月以及带闰年补偿的年进行比较;
●用于高速数据暂存的31*8位RAM;
●最少引脚的串行I/O;
●2.5~5.5V电压工作范围;
●2.5V时耗小于300nA;
●用于时钟或RAM数据读/写的单字节或多字节(脉冲方式)数据传送方式;
●简单的三线接口;
●可选的慢速充电(至Vcc1)的能力。
DS1302在任何数据传送时必须先初始化,把RST脚置为高电平,然后把8位地址和命令字装入移位寄存器,数据在SCLK的上升沿被访问到。
在开始8个时钟周期,把命令字节装入移位寄存器后,另外的时钟周期在读操作时输出数据,在写操作时写入数据。
时钟脉冲的个数在单字节方式下为8+8,在多字节方式下为8+字节数,最大可达248字节数。
如果在传送过程中置RST脚为低电平,则会终止本次数据传送,并且I/O引脚变为高阻态。
上电运行时,在Vcc≥2.5V之前,RST脚必须保持低电平。
只有在SCLK为低电平时,才能将RST置为高电平。
DS1302的控制字如表所示。
控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入到DS1302中。
位6如果为0,则表示存取日历时钟数据;为1则表示存取RAM数据。
位5~1(A4~A0)指示操作单元的地址。
最低有效位(位0)如果为0,则表示进行写操作;为1表示进行读操作。
控制字节总是从最低位开始输入/输出。
为了提高对32个地址寻址能力(地址/命令位1~5=逻辑1),可以把时钟/日历或RAM寄存器规定为多字节(burst)方式。
位6规定时钟或RAM,而位0规定读或写。
在时钟/日历寄存器中的地址9~31或RAM寄存器中的地址31不能存储数据。
在多字节方式下,读或写从地址0的位0开始。
必须按数据传送的次序写最先的8个寄存器。
但是,当以多字节方式写RAM时,为了传送数据不必写所有的31字节,不管是否谢了全部31字节,所写的每一字节都将传送至RAM。
表2.1DS1302控制字
DS1302共有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式。
其日历、时间寄存器及其控制字如上表所示,其中奇数为读操作,偶数为写操作。
时钟暂停:
秒寄存器的位7定义位时钟暂停位。
当它为1时,DS1302停止振荡,进入低功耗的备份方式,通常在对DS1302进行写操作时(如进入时钟调整程序),停止振荡。
当它为0时,时钟将开始启动。
AM-PM/12-24小时方式:
小时寄存器的位7定义为12或24小时方式选择位。
它为高电平时,选择12小时方式。
在此方式下,位5为第二个10小时位(20~23h)。
DS1302的晶振选用32768Hz,电容推荐值为6pF。
因为振荡频率较低,也可以不接电容,对计时精度影响不大。
实验设计思想
本次实验主要实现基于STC89C52单片机完成两个设计:
带有闹钟功能的可调电子钟和按键选择蜂鸣器播放不同歌曲的设计,我是使用C语言编写的程序。
(一)闹钟功能的可调电子钟
电子钟能够实现四个功能:
模式一时显示时间时分秒,模式二是能够显示日期年月日,模式三时能够显示设定的闹铃时间,模式四是能够对当前时、分、秒、年、月、日和闹铃的时分秒进行调整。
为了实现在单片机掉电的情况下能够实现正常计时,采用DS1302计时芯片,通过3.2V锂电池供电实现连续计时。
下面是电子钟的设计思想:
1、首先编写DS1302芯片的读写驱动程序。
2、按键功能设计:
K1键选择时分年月日;
K2键是切换时间、日期和闹铃显示;
K5键是加一键;
K6键是减一键。
3、七段数码管显示部分,显示时间时采用24进制,时分秒之间用短连接符隔开。
显示日期时,年份只显示后两位,年月日之间用空格隔开,通过数码管显示数字不同来确定调整模式,在调整时为了区分调整位,我通过小数点来标识,要调哪一位则这位的个位小数点点亮。
在设置闹钟时,可以进行时分秒的设置。
本程序为了能够让闹钟和数码管扫描同时进行,采用定时器扫描,通过定时器扫描对应数码管应该显示数字,再通过位控制来循环扫描,从而显示时间或日期。
外部中断0用于模式选择,外部中断1用来对当前数码管显示位的待调位进行加1操作。
在主程序中应该对外部中断和定时器进行初始化,同时对调整过后的数据写入DS1302,并从DS1302中读取当前模式所需数据。
通过软件查询判断K1,K2,K5,K6是否按下,并实现相应功能。
主程序中还应该实现当前时间与闹钟时间的对比,如果相等的话则调用闹铃程序,否则不操作。
(二)按键选择蜂鸣器播放不同歌曲
构成声音的三要素分别是振幅、频率和音色。
其中振幅关系到声音的大小,由电流决定,频率牵涉到声音的高低音,音色则是声音中谐波的成分。
在实验中只考虑声音的高低音变化,即通过让52定时器产生不同的方波用以实现不同频率。
除此之外,还要考虑到拍子的长短。
在拍子的延时时通过调用汇编所写的软件精确延时达到所需延时。
方波的产生由定时器控制。
定时器T0工作在定时方式1,改变TH0及TL0,产生不同的音频频率。
必须考虑到中断响应时间的影响,尤其在高音部分,若忽略中断响应时间,会使音频频率比标准值低几十Hz,相当于1/4音程,很容易听出来,对低音部分影响不大。
一般中断响应时间为3~6个机器周期,经过反复试验取5个机器周期作为校正最为恰当,表1中所给的定时初值就是考虑中断响应后的定时常数。
另外,为避免T1中断可能引起杂音,应将定时器T0中断设为高优先级。
这样编写出来的程序播放的音与标准音叉进行差频校音,非常准确和谐。
关于音乐的原理知识
在音乐中使用的各个固定频率的音叫音级[1]。
常用符号C、D、E、F、G、A、B、c、d、e、……a1、b1、c2、d2……表示,它们对应于钢琴上的白键。
两音之间音高的距离叫音程。
在上述音级中,E与F、B与C之间音高的距离仅为其它相邻音级之间距离的一半,称它们之间的音程为半音音程,而称其它相邻各音之间的距离为全音音程。
在这些全音音程之间又加入新的半音音级,用符号﹟C、﹟D、﹟F、﹟G、﹟A、﹟c、﹟d、﹟f、……表示,对应于钢琴上的黑键。
音持续时间的长短即时值,一般用拍数表示。
休止符表示暂停发音。
下面分别是各音符及对应频率(表2.1)与节拍表(表2.2)
表2.1各音符及对应频率
音符
低DO
低#DO
低RE
低#RE
低MI
低EA
简谱码
DO_L
DO#_L
RE_L
RE#_L
MI_L
FA_L
频率
262HZ
277HZ
294HZ
311HZ
330HZ
349HZ
音符
低#FA
低SO
低#SO
低LA
低#LA
低SI
简谱码
FA#_L
SO_L
SO#_L
LA_L
LA#_L
SI_L
频率
370HZ
393HZ
415HZ
440HZ
466HZ
494HZ
音符
中DO
中#DO
中RE
中#RE
中MI
中EA
简谱码
DO
DO#
RE
RE#
MI
FA
频率
523HZ
554HZ
587HZ
622HZ
659HZ
698HZ
音符
中#FA
中SO
中#SO
中LA
中#LA
中SI
简谱码
FA#
SO
SO#
LA
LA#
SI
频率
740HZ
785HZ
831HZ
880HZ
932HZ
988HZ
音符
高DO
高#DO
高RE
高#RE
高MI
高EA
简谱码
DO_H
DO#_H
RE_H
RE#_H
MI_H
FA_H
频率
1047HZ
1109HZ
1174HZ
1245HZ
1318HZ
1397HZ
音符
高#FA
高SO
高#SO
高LA
高#LA
高SI
简谱码
FA#_H
SO_H
SO#_H
LA_H
LA#_H
SI_H
频率
1480HZ
1568HZ
1661HZ
1760HZ
1865HZ
1976HZ
每个音符分为简谱码和节拍码。
简谱码为D0-L到SI-H,节拍码为1到16。
对应的节拍表如表2.2所示。
对应的拍子:
2/2。
。
。
。
。
。
。
。
。
。
。
以二分音符为一拍,每小节有两拍(二分音符代表一拍)
2/4。
。
。
。
。
。
。
。
。
。
。
以四分音符为一拍,每小节有两拍(四分音符代表一拍)
3/4。
。
。
。
。
。
。
。
。
。
。
以四分音符为一拍,每小节有三拍(四分音符代表一拍)
4/4。
。
。
。
。
。
。
。
。
。
。
以四分音符为一拍,每小节有四拍(四分音符代表一拍)
表2.2节拍表
拍数
字符
拍数
字符
1/8
00H
2
08H
1/4
01H
5/2
09H
1/2
02H
3
0AH
3/4
03H
7/2
0BH
1
04H
4
0CH
5/4
05H
5
0DH
3/2
06H
6
0EH
7/4
07H
8
0FH
程序框图
一、电子钟程序框图
1、K1键程序框图:
2、K2键程序框图:
3、主程序的程序框图:
二、按键控制蜂鸣器播放音乐程序框图
1、定时器0中断程序框图:
2、奏乐函数程序框图:
3、主函数程序框图:
核心代码
一、电子钟核心代码:
1、/*DS1302单字节写入:
*/
voidwrite_ds1302_byte(uchardat)
{
uchari;
for(i=0;i<8;i++)
{
sck=0;
io=dat&0x01;//从最低位开始写
dat=dat>>1;
sck=1;
}
}
/*DS1302多字节写入:
*/
voidwrite_ds1302(ucharadr,uchardat)
{
rst=0;
_nop_();//空操作,产生延时
sck=0;
_nop_();
rst=1;
_nop_();
write_ds1302_byte(adr);
write_ds1302_byte(dat);
rst=0;
_nop_();
io=1;
sck=1;
}
/*DS1302读取:
*/
ucharread_ds1302(ucharadd)
{
uchari,value;
rst=0;
_nop_();
sck=0;
_nop_();
rst=1;
_nop_();
write_ds1302_byte(add);
for(i=0;i<8;i++)
{
value=value>>1;
sck=0;
if(io)value=value|0x80;
sck=1;
}
rst=0;
_nop_();
sck=0;
_nop_();
sck=1;
io=1;
returnvalue;
}
以上部分代码是DS1302的写命令步骤、写数据步骤、读数据步骤。
2、/*显示时间:
*/
voidshijiandisplay()
{
P2=0x01;
if(mod==8)
{//增加下标是为了确定选择的操作是什么
P0=table[miao%16]&0x7f;//增加下标点,确定是选择闹铃的秒进行调节
delay
(2);};
P0=table[miao%16];
delay
(2);
P2=0x02;
日期显示同时间显示的写法。
3、/*蜂鸣:
*/
voidfmzz()
{
uinti;
for(i=0;i<100;i++)
{
fm=!
fm;
delay
(2);
}
}
4、/*延时程序:
*/
voiddelay(uintz)
{
uinti,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
二、按键选择蜂鸣器播放不同歌曲核心代码
1、//定时中断0,用于产生唱歌频率
timer0()interrupt1
{
TL0=tl0_f;//调入预定时值
TH0=th0_f;
BEEP=~BEEP;//取反音乐输出IO
}
2、//奏乐函数
voidplay(uchar*songdata)
{
uchari,c,j=0;
uintn;
ucharxdatadiaodata[112];//音调缓冲
ucharxdatajiedata[112];//音长缓冲
changedata(songdata,diaodata,jiedata);//解释音乐符号串
TR0=1;
for(i=0;diaodata[i]!
=0;i++)//逐个符号演奏
{
tl0_f=freq[diaodata[i]*2];//取出对应的定时值送给T0
th0_f=freq[diaodata[i]*2+1];
for(c=0;c { for(n=0;n<32000;n++); if((! K1)||(! K2)||(! K3)||(! K4))//发现按键,立即退出播放 { TR0=0; return; } } TR0=0; for(n=0;n<500;n++);//音符间延时 TR0=1; } TR0=0; } 4、//三个按键选择三首不同的音乐播放,一个键停止播放 voidmain(void)//主程序 { TMOD=0x01;//使用定时器0的16位工作模式 TR0=0; ET0=1;//定时器0中断 EA=1;//打开总中断 while (1) { if(! K1) { while(! K1); play(xianjian);//播放音乐 } if(! K2) { while(! K2); play(song3);//播放音乐 }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 硬件 课程设计