Advertisement

湖南大学计算机科学与技术大二实训综合作业

阅读量:

课程实验报告

课 程 名 称: _STC 实验板综合设计 _

实验项目名称: _ 简易随身听 _

专 业 班 级: _计科1502 班 _

姓 名: 杨 晶

学 号: 201508010230

指 导 教 师: 方恺晴

完 成 时 间: 2017912

一、 设计背景 4****

二、实验硬件说明 4****

1.STC实验板的概况 4

2. STC实验板的组成结构 4

3. STC实验板相关电路的原理图 5

二、设计目标与功能 10****

三、 软件功能模块设计 10****

1、流程图设计 10

2. 初始化模块 11

3. 延时模块 12

4. 音乐转化功能模块 12

5. 切歌模块 14

6. 暂停模块 16

7. 快进模块 17

四、 综合调试 18****

1. 软件测试 18

2. 硬件测试 19

五、 总结 20****

一、设计背景

目前单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。导弹的导航装置,飞机上各种仪表的控制,计算机的网络通讯与数据传输,工业自动化过程的实时控制和数据处理,广泛使用的各种智能IC卡,民用豪华轿车的安全保障系统,录像机、摄像机、全自动洗衣机的控制,以及程控玩具、电子宠物等等,这些都离不开单片机。更不用说自动控制领域的机器人、智能仪表、医疗器械以及各种智能机械了。因此,单片机的学习、开发与应用将造就一批计算机应用与智能化控制的科学家、工程师。

1.单片机广泛应用于仪器仪表、家用电器、医用设备、航空航天、专用设备的智能化管理及过程控制等领域。现在的家用电器广泛采用了单片机控制,从电饭煲、洗衣机、电冰箱、空调机、彩电、其他音响视频器材、再到电子秤量设备和白色家电等。

二、实验硬件说明

1. STC 实验板的概况

单片机是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域广泛应用。从上世纪80年代,由当时的4位、8位单片机,发展到现在的300M的高速单片机。STC公司的单片机主要是基于8051内核,是新一代增强型单片机,指令代码完全兼容传统8051,速度快8~12倍,带ADC,4路PWM,双串口,有全球唯一ID号,加密性好,抗干扰强。

2.STC 实验板的组成结构

l实验板与外部连接方式:仅一根USB线与计算机相连,可完成实验板供电、下载程序、硬件仿真与调式、与计算机通信)、8位3.6寸LED数码显示、8个LED灯、3个普通按键、1个五键导航按键、1个无源蜂鸣器、1个温度测量(热敏电阻)、1个光照测量(光敏电阻)、1个步进电机驱动接口(需外接5线四相式步进电机)、一个倒置(或振动检测)传感器、DS1302实时时钟、AT24C02非易失、EEPROM存储器、1个红外发送器、1个红外接收器、1个MEMS三轴加速度传感器(ADXL345)、FM收音机(数字调台、立体声、数字调音量):外接耳机或音箱、一个UART通信口(USB转UART)、一个485接口、2个通用扩展IO接口:外接模块或电路,可用于超声波测距、称重、位置编码器、计数、脉宽测量等。

3.STC 实验板相关电路的原理图

(1)芯片引脚电路图

TC系列芯片有5组8位输入口,分别为P0到P5,其中P5口仅P5.0~P5.5用于输入输出。STC芯片的所有I/O口都可以配置为四种工作模式之一:准双向口/弱上拉、推挽/强上拉、输入/高阻和开漏模式。STC15系列单片机上电复位后为准双向口/弱上拉工作模式。

每个I/O口的工作模式由2个控制寄存器中的相应位控制(PnM0和PnM1,n=0、1、2、3、4、5)。也就是说P0口的具体工作模式由P0M0和P0M1控制。

四种工作模式的说明:

① 准双向口。真正的双向口指的是具有输入和输出两种模式的端口,在不同模式之间需要进行转换;如果从输入改为输出,需要对某些控制寄存器进行设定,才能完成。而51系列单片机的I/O口线在输入和输出之间没有明确的模式区别。相应端口在同样模式下,既可以作为输入,又可以作为输出。P3口除外,因为它需要连接外设。51单片机的I/O口如果要读必须先写1才可以,因此称为“准”双向口。需要大电流高电平输出能力的场合和高速场合不能使用该模式。

② 推挽电路输入输出(push-pull)模式。推挽电路的输出端好像有两个“臂”(两组放大元件),一个“臂”的电流增加时,另一个“臂”的电流则减小,二者的状态轮流转换。对负载而言,好象是一个“臂”在推,一个“臂”在拉,共同完成电流输出任务。该电路模式的主要作用是增强驱动能力,为外部设备提供大电流,可以直接输出高电平电压。

③ 输入/高阻模式。仅用于输入。

④ 开漏电路。I/O口的开漏就是没有连接上拉电阻。

(2)无源蜂鸣器

无源蜂鸣器,相比与有源蜂鸣器,无源蜂鸣器的优点在于价格便宜,可以通过控制其振动频率来改变发出的声音,因此,无源蜂鸣器可以用于音乐的播放。无源蜂鸣器是电磁式蜂鸣器,电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。接通电源后,接收到的音频信号电流通过电磁线圈,使电磁线圈产生磁场。振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。

无源蜂鸣器只需改变Beep端口的电平,产生一个周期性的方波即可使蜂鸣器发生声音,不同的频率发出的声音不同。其中,ULN2003是一个功放,用于放大电流。电阻R14和电容C21是用来保护电路的。若人为将Beep端口的电平一直置为高电平,在没有保护电路的情况下,容易烧毁电路,但即使有保护电路也应该注意不要将Beep端口长时间置于高电平,这对器件也是有一定损害的。

(3)数码管与发光二极管硬件电路图

LED原理:P0口的8位输出分别连接了8个发光二极管L0~L7的阳极, P2.3经过一个反相器连接到8个发光二极管L0~L7的阴极(共阴极)。根据二极管的单向导通性(当阳极为高(对应P0口位为1)、阴极为低时,二极管导通,否则不导通),若P2.3输出信号为低电平“0”,则二极管的阴极都为高电平,此时无论P0输出的是“1”还是“0”,二极管都不会导通,也就不会发光。因此想要发光二极管导通,必须先设置P2.3输出信号为“1”,再通过设置P0,点亮想要点亮的发光二极管。

数码管原理:P0口的8位输出分别控制1个LED数码管的7段和一个小数点;而P2.3经反相器U4C控制74HC138的使能信号E3,结合P2.0、P2.1、P2.2这3个位选控制信号确定8个LED数码管中的哪个被点亮;电阻R15~R22为限流电阻。当段选为高、使能信号有效时,对应的LED管将会发光。通过以一定频率扫描位选信号,修改段选信号进行数码管点亮一段时间,从而给人视觉上几个数码管几乎同时显示的效果。

(4)定时器与中断

① 中断请求:定时和外中断控制寄存器TCON;

串行控制寄存器SCON

② 中断允许控制寄存器IE

③ 中断优先级控制寄存器IP

三、设计目标与功能

由可切换电子音乐的案例得到启发,可以设计一种简易随身听,具体功能如下:

(1)通过振动传感器来实现切歌功能,即每触碰一下,振动传感器的标志位就会改变,从而达到切换歌曲的效果;

(2)通过外部中断1(key1)来控制音乐的暂停与播放;

(3)通过外部中断2(key2)来控制音乐的快进与恢复。

四、软件功能模块设计

1. 流程图设计

2.** 初始化模块**

该子程序对相应的寄存器、引脚及相关变量进行初始化。初始化程序如下:

初始化函数:void init_sys()

系统初始化,配置I/O口

void init_sys()

{

P0M0=0xff; //推挽设置

P0M1=0x00;

P2M0=0x08;

P2M1=0x00;

P3M0=0x10;

P3M1=0x00;

P4M0=0x00;

P4M1=0x00;

P5M0=0x00;

P5M1=0x00;

}

初始化2:void init()

定时器和外部终端初始化

void init()

{

TMOD=0x01; //T0定时器打开

TH0=0xD8; //定时器初值

TL0=0xEF;

IE=0x8f; // 1000 0111 EA=1,EX0=1,ET0=1,EX1=0;

IP=0x02; // 0000 0010 PT0=1;

TR0=0;

beep=0; //beep=0,保护蜂鸣器

}

3.** 延时模块**

根据需要设定延时时间

void delay(unsigned int xms)

{

uint i,j;

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

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

}

4.** 音乐转化功能模块**


每一个音符的发声频率是不同的,我们需要用计时器来精确计时,用以产生方波,这样才能发出不用的音符声音。C调各音符频率与计数值上图1所示,以下的简谱码是在晶振为12MHz的情况下计算的,换算为16进制的简谱码如程序中retool[]数组所示。

uchar code retool[] ={ //retool数组中的元素代表从低音到中音再到高音中每个音符的时间或频率重装值,每一行代表一个音符

0xf8,0x8c, //低音1

0xf9,0x5b,

0xfa,0x15, //低音3

0xfa,0x67,

0xfb,0x04, //低音5

0xfb,0x90,

0xfc,0x0c, //低音7

0xfc,0x44, //中央C

0xfc,0xac, //中音2

0xfd,0x09,

0xfd,0x34, //中音4

0xfd,0x82,

0xfd,0xc8, //中音6

0xfe,0x06,

0xfe,0x22, //高音1

0xfe,0x56,

0xfe,0x6e, //高音3

0xfe,0x9a,

0xfe,0xc1, //高音5

0xfe,0xe4,

0xff,0x03 //高音7

};

本程序中,数组music[]即是要播放的音乐,格式为音符,节拍,音符,节拍,如此循环下去。音符为要发出的音调,而节拍则是声音的持续时间。如图1,在数组music[]中,音符表示的格式为:十位代表是低八度,中八度还是高八度,1代表高八度,2代表中八度,3代表高八度,个位代表简谱的音符,例如,0x15代表低八度的S0,如图即是低5 S0,0x21代表中八度的DO,上图即是中1 D0。音符中,0x00代表结束符,表示整首歌曲演唱完毕,而0xff代表休止符,表示要休止100ms。遇到这两种情况,都应该重新执行循环中的第一步。其余情况则是正常播放。

5.** 切歌模块**

本实验板中使用的振动传感器是一种简单的器件,管内有一跟固定的导线,在这根导线的周围有另一根较细的导线以螺旋状环绕它。可以想象为一个弹簧旁边有一跟导线。在不震动时,两根导线不会相碰,一旦振动发生,两根导线就会短接。所以我们只需判断导线是否短接了,就可以知道振动是否发生。

sbit vibrate=P2^4; //振动感应器的标志位 将振动感应器的引脚接到P2.4端口通过定时器每隔一段时间检测一下振动标志位vibrate的值

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

函数:void tim1() interrupt 1

功能:每播放一个音符就检测振动传感器的值

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

void tim1() interrupt 1 //定时器0,每隔一定时间就检测是否进行了切歌操作并播放音符

{

vibrate=1; //振动标志位 置为1

if(vibrate==0) //若有振动

{

progress=0; //进度从0重新开始

if(musicnum==2) //若加到最后一首则从第一首开始

musicnum=0; //切歌播放下一首

else

musicnum++;

ledsel=0;

for(i=0;i<4;i++)

{

P0=0x00;

if(vibrate==0)

{

P2=weixuan1[i];

}

else

{

P2=weixuan2[i];

}

P0=cut[i];

delay(200);

}

delay(5);

}

TH0=timeh; //重装值赋值

TL0=timel;

if(flag1==1) //快进时不让发声

beep=0;

if(flag1==0)

beep=~beep; //中断,beep翻转产生方波

}

6.** 暂停模块**

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

函数:void ex1() interrupt 0

功能:外部中断0,ex0,对key1键进行检测

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

void ex1() interrupt 0 //外部中断0

{

delay(5);

if(key1==0) //判断key1是否被按下

{

delay(5);

if(key1==0)

{

while(!key1);

flag=~flag;

} //播放中断位取反,播放或暂停

}}

if(flag==0) //暂停时flag为0

{

P0=0x00;

ledsel=0;

ledsel0=0;

ledsel1=0;

ledsel2=0;

P0=0x73; //如果暂停就在数码管第一位显示P

}

7.** 快进模块**

通过设置flag1标志位来标记是否快进状态,flag1=1快进,flag1=0恢复。

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

函数:void ex2() interrupt 2

功能:外部中断1,ex1,对key2键进行检测

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

void ex2() interrupt 2 //外部中断1

{

delay(5);

if(key2==0) //判断key2是否被按下

{

delay(5);

if(key2==0)

****{

while(!key2);

flag1=~flag1; }}} //快进中断位取反,快进或恢复

if(flag1==1)

progress=progress+3; //快进就增加Progress的进度

if(flag1==0)

progress++;

五、综合调试

1.** 软件测试**

经过Keil Uvision4软件编译后,无错误产生。

2.** 硬件测试**

用STC-ISP软件来进行下载,下载成功,如下图所示。****

具体功能验证如下图所示:

(1)暂停功能,KEY1按下后暂停播放,屏幕显示P(即STOP)

(2)快进功能。按下key2后快进歌曲,显示A(accelerate)加速

(3)切歌功能。碰触振动感应器,会短暂显示CUT后继续播放。

五、总结

通过这个小学期对STC实验板的学习,我了解到了STC实验板的应用广泛性,小到一个简单的播放器,大到军事方面的技术应用,无论是在科技还是在生活都处处可见它的影子,这更加提高了我学习STC的积极性。通过近一个月,我学到了STC实验板的基本原理、结构以及应用方法,收获颇丰。通过几位老师的讲座,我了解了STC板的基本功能,比如:定时器、中断的使用、AD转换、串口通信等等知识,老师的讲解对后续的综合设计起到很大的帮助。这次的实验主要是实现一个简易随声听的功能,在原有案例的启发下,创新了随声听的快进功能,能够在播放时的任意时刻快进,并且不会产生嘈杂声。在整个实验的过程中,也出现了很多问题,例如:振动传感器会多次响应,导致歌曲的切换的顺序会出现错乱,这个问题在设计的最后才得到解决(通过改变标志位在中断中的位置)。在完成后,我对设计的功能方面进行了反思,我觉得可以进一步创造新的功能来达到真正意义上的随身听,比如在歌曲播放的同时,能够根据音高来让led灯跳变,跟着节奏变化,这样的功能会更加添彩。从设计方案到实现的过程中,结合几位老师的讲座知识,让我理解到了实践与理论结合的重要性,在今后的学习当中,我会更加注重实践的重要意义。

歌谱附件:

全部评论 (0)

还没有任何评论哟~