1、 硬件实训设计报告 湖 南 大 学 课设题目: 振动传感警报装置 学生姓名: 邹 雄 专业班级: 信 息 安 全 一 班 学号: 201208060128 学院: 信息科学与工程学院 “振动传感警报装置”设计报告说明 (一) :设计思路和方法 “警报器
2、是利用流水灯、振动传感器、无源蜂鸣器组成的一种装置,当振动传感器受到振动时,流水灯和蜂鸣器会同时工作,以此来提醒客户;而客户可通过按钮Key1能够停止其工作或等待歌曲播放完为止,而按下复位键后再次振动其又会工作。 (二) :“警报器”电路原理图 (三) :电路工作原理 振动传感器是一种简单的器件,管内有一跟固定的导线,在这根导线的周围有另一根较细的导线以螺旋状环绕它。可以想象为一个弹簧中间有一跟导线。在不震动时,两根导线不会相碰,一旦振动发生,两根导线就会短接。所以我们只需判断导线是否短接了,就可以知道振动是否发生。 P0口的8位输出分别控制8个发光二极管L0
3、~L7的阳极;而P2.3经反相器U4C控制8个发光管阴极E3;电阻R15~R22为限流电阻。当振动传感器短接时,对应的二极管将会发光。 只需改变Beep端口的电平,产生一个周期性的方波即可使蜂鸣器发生声音,不同的频率发出的声音不同。其中,ULN2003是一个功放,用于放大电流。电阻R14和电容C21是用来保护电路的。若人为将Beep端口的电平一直置为高电平,在没有保护电路的情况下,容易烧毁电路,但即使有保护电路也应该注意不要讲Beep端口长时间之余高电平,这对器件也是有一定损害的。 每一个音符的发声频率是不同的,我们需要用计时器来精确计时,用以产生方波,这样才能发出不用的音符声音。C调各音
4、符频率与计数值如下图所示,以下的简谱码是在晶振为12MHz的情况下计算的,换算为16进制的简谱码如程序中quzi[]数组所示。 本程序中,数组music[]即是要播放的音乐,格式为音符,节拍,音符,节拍,如此循环下去。音符为要发出的音调,而节拍则是声音的持续时间。如图,在数组music[]中,音符表示的格式为:十位代表是低八度,中八度还是高八度,1代表高八度,2代表中八度,3代表高八度,个位代表简谱的音符,例如,0x15代表低八度的S0,如图即是低5 S0,0x21代表中八度的DO,如图即是中1 D0。音符中,0x00代表结束符,表示整首歌曲演唱完毕,而0xff代表休止符,表示要休止10
5、0ms。遇到这两种情况,都应该重新执行循环中的第一步。其余情况则是正常播放。程序烧入单片机后,需要振动传感器振动才会进行演奏。 (四) :程序总框图设计流程 (五) :相关寄存器及IO引脚的配置 1. P0(8位)和P2.3需要设置成推挽输出,以驱动电路正常发光。涉及寄存器及配置值如下: P2M1=0x00; P2M0=0xff; P0M1=0x00; P0M0=0xff; 2.蜂鸣器引脚: sbit beep
6、P3^4; //蜂鸣器
3.按键1引脚:
sbit key1=P3^2; //定义按键1
4.振动传感器引脚:
sbit vibrate=P2^4; //振动传感器
(六):详细设计参见后续工程代码
(七):测试方法
1. 用STC ISP默认设置,打开工程中的HEX并下载;
2. 敲动一下振动传感器,流水灯随着蜂鸣器的歌曲节奏从右至左依次闪动;
3. 按下Key1键,蜂鸣器及流水灯均都停下工作。
源代码:
#include 7、C15F2K60S2.h>
#define uint unsigned int
#define uchar unsigned char
sbit beep=P3^4; //蜂鸣器
sbit Key1=P3^2; //Key1对应触发外部中断0
sbit vibrate=P2^4; //振动传感器
/**********************
引脚别名定义
***********************/
sbit Led_sel=P2^3;
/**********************
变量定义
***********************/
8、
uchar G_value;
uchar timeh,timel,zanting=0; //定义定时器的重装值
uchar code music[] ={ //音乐代码,歌曲为《同一首歌》,格式为: 音符, 节拍, 音符, 节拍,
0x16,0x05,0x17,0x05,
0x21,0x15,0x17,0x05,
0x21,0x10,0x23,0x10,
0x17,0x30,0x23,0x10,
0x16,0x15,0x15,0x05,
0x16,0x10,0x21,0x10,
0x15,0x30,0x13,0x10,
0x14,0x15,0x13,0 9、x05,
0x14,0x05,0x21,0x05,
0x21,0x10,0x13,0x30,
0x21,0x10,0x17,0x10,
0x14,0x05,0x14,0x10,
0x17,0x10,0x17,0x20,
0xff,
0x16,0x05,0x17,0x05,
0x21,0x15,0x17,0x05,
0x21,0x10,0x23,0x10,
0x17,0x30,0x13,0x05,
0x13,0x05,0x16,0x15,
0x15,0x05,0x16,0x10,
0x21,0x10,0x15,0x30,
0x13,0x10,0x14,0x10,
0 10、x21,0x05,0x17,0x05,
0x17,0x10,0x21,0x10,
0x22,0x10,0x23,0x05,
0x21,0x20,0xff,
0x21,0x05,0x17,0x05,
0x16,0x10,0x17,0x10,
0x15,0x10,0x16,0x20,
0xff,
0x21,0x05,0x22,0x05,
0x23,0x15,0x22,0x10,
0x23,0x10,0x24,0x10,
0x25,0x05,0x22,0x30,
0x15,0x10,0x22,0x03,
0x21,0x03,0x17,0x03,
0x21,0x03,0x2 11、1,0x10,
0x21,0x05,0x22,0x10,
0x23,0x05,0x23,0x40,
0x16,0x05,0x17,0x05,
0x21,0x10,0x17,0x05,
0x21,0x05,0x22,0x10,
0x21,0x15,0x15,0x05,
0x15,0x20,0x24,0x10,
0x23,0x10,0x22,0x10,
0x21,0x10,0x23,0x30,
0x16,0x05,0x17,0x05,
0x21,0x15,0x17,0x05,
0x21,0x10,0x23,0x10,
0x17,0x30,0x13,0x10,
0x16, 12、0x15,0x15,0x05,
0x16,0x10,0x21,0x10,
0x15,0x30,0x13,0x10,
0x14,0x10,0x21,0x05,
0x17,0x05,0x17,0x10,
0x21,0x10,0x22,0x10,
0x23,0x05,0x21,0x05,
0x21,0x20,0x21,0x05,
0x17,0x05,0x16,0x10,
0x17,0x10,0x15,0x10,
0x16,0x40,0x00,0x00
};
uchar code quzi[] ={ //此数组数据为各个音符在定时器中的重装值,第一列是高位,第二列是低位
13、
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, 14、
0xfe,0xc1, //高5
0xfe,0xe4,
0xff,0x03 //高7
};
/**********************
函数名称:void delay(unsigned int xms)
功能描述:延时
入口参数:xms:输入需要延时的毫秒值
出口参数:无
备注:
***********************/
void delay(unsigned int xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=124;j>0;j--);
}
/********** 15、
函数名称:uchar quyin(uchar tem)
功能描述:在quzi数组中,找到music数组定义的简谱音符的重装值,并返回其在quzi数组中的位置
入口参数:tem:music数组中定义的简谱音符
出口参数:返回的是tem音符在quzi数组中的位置值
备注:
***********************/
uchar quyin(uchar tem)
{
uchar qudiao,jp,weizhi; //定义曲调,音符和位置
qudiao=tem/16; //高4位是曲调值
jp=tem%16; / 16、/低4位是音符
if(qudiao==1) //当曲调值为1时,即是低八度,低八度在quzi数组中基址为0
qudiao=0;
else if(qudiao==2) //当曲调值为2时,即是中八度,中八度在quzi数组中基址为14
qudiao=14;
else if(qudiao==3) //当曲调值为3时,即是高八度,高八度在quzi数组中,基址为28
qudiao=28;
weizhi=qudiao+(jp-1)*2; //通过基址加上音符作为偏移量,即可定位此音符在quzi数组中的位置
return weizhi; 17、 //返回这一个位置值
}
/**********************
函数名称:void playmusic()
功能描述:播放音乐
入口参数:无
出口参数:无
备注:
***********************/
void playmusic()
{
uchar p,m,tem; //m为节拍
uchar i=0;
while(1)
{
while(zanting)
beep=0;
p=music[i]; //如果碰到结束符,延时1秒,回到开始再来一遍
if(p= 18、0x00)
{
i=0;
delay(100);
break;
}
else if(p==0xff) //若碰到休止符,延时100ms,继续取下一音符
{
i=i+1;
delay(100);
TR0=0;
}
else //正常情况下取音符和节拍
{
tem=quyin(music[i]); //取出当前音符在quzi数组中的位置值
timeh=quzi[tem]; //把音符相应的计时器重装载值赋予timeh和timel
ti 19、mel=quzi[tem+1];
i++;
TH0=timeh; //把timeh和timel赋予计时器
TL0=timel;
m=music[i]; //取得节拍
i++;
}
TR0=1; //开定时器1
delay(m*180); //等待节拍完成, 通过P3^4口输出音频
TR0=0; 20、 //关定时器1
P0=G_value;
delay(100);
G_value=G_value<<1;
if(G_value==0x00)
{
P0=G_value;
delay(100);
G_value=0x01;
}
if(Key1==0)
{
if(Key1==0)
{
delay(10); //延时消抖
if(Key1==0)
zanting=~zanting; //zanti 21、ng==1 暂停播放
vibrate=1;
}
}
}
}
/**********************
函数名称:void init_sys()
功能描述:系统初始化,功能是配置IO口
入口参数:无
出口参数:无
备注:
***********************/
void init_sys()
{
P0M0=0xff;
P0M1=0x00;
P2M0=0x08;
P2M1=0x00;
P3M0=0x10;
P3M1=0x00;
P4M0=0x00;
P4M1=0x00;
P5M0=0x 22、00;
P5M1=0x00;
}
/**********************
函数名称:void init()
功能描述:定时器的初始化
入口参数:无
出口参数:无
备注:
***********************/
void init()
{
TMOD=0x01;
TH0=0xD8;
TL0=0xEF;
EA=1;
ET0=1;
TR0=0;
//设置推挽输出//
P2M1=0x00;
P2M0=0xff;
P0M1=0x00;
P0M0=0xff;
Led_sel=1;
}
vo 23、id main()
{
init_sys();
init();
P0=0x00;
vibrate=1;
while(1)
{
if(vibrate==0)
{
playmusic();
}
}
}
/**********************
函数名称:void tim1() interrupt 1
功能描述:定时器0中断处理,重新装值,并把beep值取反,产生方波
入口参数:无
出口参数:无
备注:
***********************/
void tim1() interrupt 1 //计时器控制频率
{
TH0=timeh;
TL0=timel;
if(zanting==1)
beep=0;
else
{
beep=~beep;
}
}






