当前位置:文档之家› 基于51单片机的吉他调音器系统设计实物制作

基于51单片机的吉他调音器系统设计实物制作

课程设计报告课程名称:吉他调音器控制系统设计--实物制作专业班级:姓名:学号:课设时间:指导教师:批阅时间:成绩:目录绪论 (1)1、总体设计方案 (1)2、核心芯片结构原理介绍 (2)2.1、中央控制器--------S T C90C516R D+ (3)2.2、电机驱动芯片——ULN2003 (5)3、模拟部分介绍 (6)3.1、输入电路 (6)3.2、放大电路 (6)3.3、滤波电路 (8)3.4、整形输出电路 (9)3.5、模拟部分输出波形 (10)3.6、模拟部分实物图 (10)4、软件程序编程语言及开发环境选择 (11)5、琴弦频率测量模块设计 (11)5.1、频率测量方法的选取 (11)5.2、频率测量程序设计说明 (12)5.3、单片机程序流程图 (13)5.4、单片机程序 (13)5.5、单电机实物图 (13)5.6、原件清单 (13)5.7、整体电路图 (13)结论 (14)附录一 (15)附录二 (16)附录三 (21)附录四 (22)拉(普通8051 传统I/O 口)P0口是开漏输出,作为总线扩展用时,不用加上拉电阻,作为I/O 口用时,需加上拉电阻。

7.ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器 / 仿真器可通过串口(P3.0/P3.1)直接下载用户程序,8K 程序3 - 5 秒即可完成一片8.EEPROM 功能9.看门狗10.部集成MAX810专用复位电路,外部晶体12M以下时,可省外部复位电路,复位脚可直接接地。

11.共3个16位定时器/计数器,其中定时器0还可以当成2个8位定时器使用12.外部中断4路,下降沿中断或低电平触发中断,Power Down模式可由外部中断低电平触发中断方式唤醒13.通用异步串行口(UART),还可用定时器软件实现多个UART14.工作温度围:0-75℃/-40-+85℃15.封装:LQFP-44,PDIP-40,PLCC-44单片机各引脚功能:(引脚图如图三)XTAL1(19脚):接外部晶体振荡器的一端。

当使用芯片部时钟时,此脚用于外接石英晶体振荡器和微调电容;当使用外部时钟图三时,对于HMOS单片机,此引脚接地;对于CMOS单片机,此引脚作为外部振荡信号的输入端。

XTAL2(18脚):接外部晶体振荡器的另一端,当使用芯片部时钟时,此脚用于外接石英晶体振荡器和微调电只读取外部的程序存储器中的容,读取的地址围为0000H~FFFFH(64KB),片的4KB Flash 程序存储器不起作用。

EA VPP=“1”时,表示对程序存储器的读操作是从部程序存储器开始,当/并可延至外部程序存储器。

在PC值不超出0FFFH(即不超出片4KB Flash存储器的地址围)时,单片机读片程序存储器(4KB)中的程序,但当PC值超出0FFFH (即超出片4KB Flash 地址围)时,将自动转向读取片外60KB(1000H-FFFFH)程序存储器空间中的程序。

对于EPROM(或FLASH)型单片机,在EPROM编程期间,此引脚需加12.75V 或21V的编程电压。

2.2、电机驱动芯片——ULN2003引脚如图四所示,ULN是集成达林顿管IC,部还集成了一个消线圈反电动势的二极管,可用来驱动继电器。

它是双列16脚封装,NPN晶体管矩阵,最大驱动电压=50V,电流=500mA,输入电压=5V,适用于TTLCOMS,由达林顿管组成驱动电路。

图四ULN是集成达林顿管IC,部还集成了一个消线圈反电动势的二极管,它的输出端允许通过电流为200mA,饱和压降VCE 约1V左右,耐压BVCEO 约为36V。

用户输出口的外接负载可根据以上参数估算。

采用集电极开路输出,输出电流大,故可直接驱动继电器或固体继电器,也可直接驱动低压灯泡。

通常单片机驱动ULN2003时,上拉2K的电阻较为合适,同时,COM引脚应该悬空或接电源。

ULN2003是一个非门电路,包含7个单元,但独每个单元驱动电流最大可达350mA.资料的最后有引用电路,9脚可以悬空。

比如1脚输入,16脚输出,负载接在VCC与16脚之间,不用9脚。

uln2003的作用:ULN2003是大电流驱动阵列,多用于单片机、智能仪表、PLC、数字量输出卡等控制电路中。

可直接驱动继电器等负载。

输入5VTTL电平,输出可达500mA/50V。

ULN2003是高耐压、大电流达林顿列,由七个硅NPN达林顿管组成。

该电路的特点如下: ULN2003的每一对达林顿都串联一个2.7K的基极电阻,在5V的工作电压下它能与TTL和CMOS电路直接相连,可以直接处理原先需要标准逻辑缓冲器。

ULN2003 是高压大电流达林顿晶体管阵列系列产品,具有电流增益高、工作电压高、温度围宽、带负载能力强等特点,适应于各类要求高速大功率驱动的系统。

3、模拟部分介绍3.1、输入电路电容话筒是根据电容与两极板间距离成反比,当振动时,电容话筒的两极间距离变化,距离变大时,因为电容变小,所以电压扁高,这时就产生了电信号。

电容话筒大多需要用电极化,也有不用极化的,称为驻极体电容话筒,就是一般里面使用的,非常廉价。

压电瓷是一种特殊的材料,它受到点的作用时,会发生变型,相反,它发生变形时,也会产生电。

图五这里我们选用驻极体话筒完成设计(电路如图五所示)。

3.2、放大电路TLC2252是用仪器公司先进的LinCMOS TM工艺制造的双路运算放大器,具有满电源电压幅度输出性能,同时比现有的CMOS运放具有更好的输入失调电压和更低的功耗。

另外,对于这类低功耗CMOS运放,噪声性能得到了惊人的改进,每一级放大仅需35uA(典型值)的电源电流。

而且,共模输入电压围比通常标准CMOS类型放大器更宽。

为了利用这种性能上的改进并使此器件可以适用于更宽围的应用,用比±5mV更大的最大输入失调电压测试极限来规定V。

先进的ICRLinCMOS TM工艺使用硅栅技术获得输入失调电压的温度和时间稳定性,这种稳定性远远超过了用金属栅技术所能获得的稳定性。

这种技术也使输入阻抗有可能符合或超过顶栅JFET和昂贵的介质绝缘器件的输入阻抗;TLC2252呈现高输入阻抗和低噪声,能很好地适用于高阻抗源,例如电压传感器的小信号状况。

由于这些器件功耗低,所以它们在手持监视和遥感原始传感器应用中工作良好。

此外,满电源电压幅度输出特性以及单独或分离电源工作使得这些器件在直图六接与模拟数字转换器(ADC)接口时成为主要的选择对象。

所有这些特性,再结合它们的温度性能,使得TLC2252系列能理想的适用于声纳、远程传感器、温度控制、有源压阻传感器、加速计、便携式医学应用、手持仪表以及许多其他应用(引脚图如图六所示)。

LM358部包括有两个独立的、高增益、部频率补偿的双运算放大器,适合于电源电压围很宽的单电源使用,也适用于双电源工作模式,在推荐的工作条件下,电源电流与电源电压无关。

它的使用围包括传感放大器、直流增益模组,音频放大器、工业控制、DC增益部件和其他所有可用单电图七源供电的使用运算放大器的场合(引脚图如图七所示)。

由以上两种放大器和适当参数的电阻电容构成两级放大电路(电路图如图八所示)。

图八3.3、滤波电路设计中运放选择TI产品典型的通用四运放LM324,LM324部包括有两个独立的、高增益、部频率补偿的运算放大器,适合于电源电压围很宽的单电源使用, 也适用于双电源工作模式,在推荐的工作条件下,电源电流与电源电压无关。

它的使用围包括传感放大器、直流增益模块和其他所有可用单电源供电的使用运算放大器的场合。

适用于一般的带通滤波器的设计,同时具有低功耗的功能,可设计阶数相对高一些的带通滤波器,应用起来节省空间。

巴特沃斯带通滤波器幅频响应在通带中具有最平幅度特性,但是从通带到阻带衰减较慢,这里采用四阶巴特沃斯带通滤波器来对采集进来的音频信号进行滤波(引脚图如图九所示)。

LM324主要参数:电压增益 100dB单位增益带宽 1MHz单电源工作围 3V~30VDC每个运放功耗(V=+5V) 1mV/op.Amp输入失调电压 2mV(最大7mV) 图九输入偏置电流 50~150nA输入失调电流 5~50nA共模抑制比 70~90dB输出电压幅度 0~1.5VDC(单电源时)输出电流 40mA放大器间隔离度 120dB(fo:1~20KHz)参数选择与计算:对于低通滤波器的设计,电容一般选取10000pF,对于高通滤波器的设计,电容一般选取0.1uF,然后根据公式R=1/2Πfc 计算得出与电容相组合的电阻值,即得到此图中R9、R4和R17,为了消除运放的失调电流造成的误差,尽量是运放同相输入端与反向输入端对地的直流电阻基本相等,同时巴特沃斯滤波器阶数与增益有一定的关系,根据这两个条件可以列出两个等式:30=R15*R21/(R15+R21),R15=R21(A-1),36=R14*R19/(R14+R19),R19=R14(A-1)由此可以解出R14、R15、R19、R21,原则是根据现实情况稍调整电阻值保持在一定限度即可,不要相差太大,注意频率不要超过运放的标定频率(电路图如图十所示)。

图十3.4、整形输出电路由于单片机识别的应该正弦波,所以需要将滤波之后的信号进行整形得到方波信号输入给单片机进行测频(电路图如图十一所示),R24用于调节比较电压,根据实际情况改变比较点电压。

图十一3.5、模拟部分输出波形3.6、模拟部分实物图T为计数周期,是单片机的机器周期。

当机器周期为1时,工作在模式0时,最大定时值为若工作在模式1,则最大定时值为。

先对TMOD寄存器赋值,以确定定时器的工作模式是0还是1,即确定机器周期,从而设置定时器/计数器初值。

直接将初值写入寄存器的TH0,TL0或TH1,TL1,再根据需要,对寄存器ET0,ET1置初值,开放定时器中断。

最后对TCON寄存器中的TR0或TR1置位,启动定时/计数器,置位以后,计数器T0,T1即按规定的工作模式和初值进行定时计数。

5.3、单片机程序流程图(见附录一)5.4、单片机程序(见附录二)5.5、单电机实物图如图5.6、原件清单(见附录三)5.7、整体电路图(见附录四)结论#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit pulse=P3^5; //T1,计外部脉冲数sbit led=P2^0;uint num=0,T0_num,n,yinjie,i;uchar code FFW[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9};//电机正转uchar code REV[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1};//电机反转uint code pinpu[ ]={329,247,196,147,110,82 }; // 六弦空弦音void init() //定时计数初始化{TMOD=0x51;//T1计数,T0定时TH1=0;//0; //计数初值TL1=0;//0;ET1=1; //定时器1允许TH0=(65536-50000)/256; //计时初值TL0=(65536-50000)%256;ET0=1; //定时器0允许TR1=1; //打开计数器TR0=1; //打开定时器EA=1;}void delay(uint t){uint k;while(t--){for(k=0; k<123; k++);}}void motor_ffw(uint n) //步进电机正转{uchar i;uint j;for (j=0; j<12*n; j++) //转n圈{for (i=0; i<8; i++) //一个周期转30度{P1 = FFW[i]; //取数据delay(30); //调节转速}}}void motor_rev(uint n) //步进电机反转{uchar i;uint j;for (j=0; j<12*n; j++) //一个周期转30度,转n圈 {for (i=0; i<8; i++){P1 = REV[i]; //取数据delay(30); //调节转速}}}//控制步进电机转动子程序void dianji(uint num){if(num<360&&num>300){yinjie=pinpu[0]; //yinjie=329Hzif(num==328||num==329||num==330){led=0;while(1);}else if(num>yinjie){motor_ffw(1);} //步进电机正转else if(num<yinjie){motor_rev(1);} //步进电机反转}else if(num<280&&num>220){yinjie=pinpu[1];//yinjie=247Hzif(num==246||num==247||num==248){led=0;while(1);}else if(num>yinjie){motor_ffw(1);} //步进电机正转 else if(num<yinjie){motor_rev(1);} //步进电机反转 }else if(num<220&&num>165){yinjie=pinpu[2]; //yinjie=196Hzif(num==195||num==196||num==197){led=0;while(1);}else if(num>yinjie){motor_ffw(1);} //步进电机正转else if(num<yinjie){motor_rev(1);} //步进电机反转}else if(num<165&&num>120){yinjie=pinpu[3]; //yinjie=147Hz if(num==146||num==147||num==148){led=0;while(1);}else if(num>yinjie){motor_ffw(1);} //步进电机正转else if(num<yinjie){motor_rev(1);} //步进电机反转}else if(num<120&&num>100){yinjie=pinpu[4]; //yinjie=110Hz if(num==109||num==110||num==111) {led=0;while(1);}else if(num>yinjie){motor_ffw(1);} //步进电机正转else if(num<yinjie){motor_rev(1);} //步进电机反转}else if(num<100&&num>62){yinjie=pinpu[5]; //yinjie=82Hz if(num==81||num==82||num==83){led=0;while(1);}else if(num>yinjie){motor_ffw(1);} //步进电机正转else if(num<yinjie) {motor_rev(1);} //步进电机反转}else if(num<62||num>360){}}void time0(void) interrupt 1 //定时器0,定时1s {T0_num++; //计数满一次,T0_num加1TH0=(65536-50000)/256;TL0=(65536-50000)%256;if(T0_num==20) //1s定时到{EA=0; //关总中断num=TH1*256+TL1;dianji(num);yinjie=0;num=0;T0_num=0; //定时器溢出次数,初值设为0TH1=0;//0XFF; //计数1次TL1=0;//0XFF;EA=1;}}void main(){init();while(1);}附录三:。

相关主题