用51单片机实现电脑音频信号的频谱显示(在LCD上显示)
基于51单片机的lcd多功能数字音乐盒设计(毕业设计)[管理资料]
毕业设计论文题目:基于51单片机的LCD多功能数字音乐盒设计学校:西北民族大学学院:电气工程学院专业班级:08电气工程及其自动化(1)班学号:P 0 8 1 6 1 3 3 1 6姓名:苏军指导老师:马慧兰基于51单片机的LCD多功能数字音乐盒设计摘要:本设计是应用MCS-51单片机原理和控制理论设计音乐盒演奏控制器的硬件电路,并利用汇编语言进行程序设计。
利用控制单片机内部的定时器来产生不同的频率的方波,驱动喇叭发出不一样的音乐,再通过延迟来控制发音时间的长短。
把乐谱变成相应的定时常数就可以从发音设备中演奏出动听的音乐。
这种控制电路结构简单,可用性高,应运性强,软件程序适应范围广,对于不同的音乐只需要改变相应的定时常数即可。
对单片机和音乐爱好者有不一样的借鉴价值。
关键词:单片机,汇编语言,音乐盒Based on 51 single-chip LCD multifunctiondigital music box designAbstract: This design is the application of MCS-51 single-chip microcomputer principle and control theory design music box play hardware circuit, and use assembly languages program design. Using single chip microcomputer control internal timer to produce a different frequency of square wave, drive speaker different music, again through the delay to control the length of time the pronunciation. The score into the corresponding time constant can play out in pronunciation equipment from beautiful music. This control circuit structure is simple, usability is high, The Times the gender is strong, software program to adapt to the wide, for different music only need to change the timing of corresponding constant can. The SCM and music lovers have different reference value.Key words: a single-chip microcomputer, assembly language, music box目录摘要 (2)关键词 (2)Abstract (2)Key words (2)前言 (3)第一章原理及硬件介绍 (5)1.1 基本原理简述 (5)1.2 STC89C52RC 介绍 (6)1.2.1主要特性 (6)1.2.2 STC89C52RC的工作模式 (6)1.2.3 STC89C52RC引脚功能说明 (6)1.3 LCD显示 (10)第二章软件仿真及测试 (11)开机第一首歌 (11)下一曲 (12)上一曲 (12)元件清单 (15)参考文献 (15)附录一源程序 (16)前言单片机是指一个集成在一块芯片上的完整计算机系统。
51-单片机和DAC0832输出方波、矩形波和正弦波由液晶1602显示的C语言程序
显示频率,幅度可调,可产生四种波形,正弦波,方波,锯齿波,三角波,希望你能喜欢,给你发了一张效果图,喜欢的话别忘了采纳我的回答啊#include<reg52.h>#define uchar unsigned char#define uint unsigned int#define DAdata P0 //DA数据端口sbit DA_S1= P2^0; // 控制DAC0832的8位输入寄存器,仅当都为0时,可以输出数据(处于直通状态),否则,输出将被锁存sbit DA_S2= P2^1; // 控制DAC0832的8位DAC寄存器,仅当都为0时,可以输出数据(处于直通状态),否则,输出将被锁存sbit key= P3^2;uchar wavecount; //'抽点'计数uchar THtemp,TLtemp;//传递频率的中间变量uchar judge=1; //在方波输出函数中用于简单判别作用uchar waveform; //当其为0、1、2时,分别代表三种波uchar code freq_unit[3]={10,50,200}; //三种波的频率单位uchar idata wavefreq[3]={1,1,1}; //给每种波定义一个数组单元,用于存放单位频率的个数uchar code lcd_hang1[]={"Sine Wave " "Triangle Wave " "Square Wave " "Select Wave: " "press No.1 key! "};uchar idata lcd_hang2[16]={"f= Hz "};uchar code waveTH[]={0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xec,0xf6,0xf9,0xfb,0xfc,0xfc,0xfd,0xfd,0xfd,0xfe};uchar code waveTL[]={0x06,0x8a,0x10,0x4e,0x78,0x93,0xa8,0xb3,0xbe,0xc6, //正弦波频率调整中间值0xac,0xde,0x48,0x7a,0x99,0xaf,0xbb,0xc8,0xd0,0xde, //三角波频率调整中间值0x88,0x50,0x90,0x32,0x34,0xbe,0x4a,0xa3,0xe5,0x2c};/**************************************************************************************** *********/uchar code triangle_tab[]={ //每隔数字8,采取一次0x00,0x08,0x10,0x18,0x20,0x28,0x30,0x38,0x40,0x48,0x50,0x58,0x 60,0x68,0x70,0x78,0x80,0x88,0x90,0x98,0xa0,0xa8,0xb0,0xb8,0xc0,0xc8,0xd0,0xd8,0x e0,0xe8,0xf0,0xf8,0xff,0xf8,0xf0,0xe8,0xe0,0xd8,0xd0,0xc8,0xc0,0xb8,0xb0,0xa8,0xa0,0x9 8,0x90,0x88,0x80,0x78,0x70,0x68,0x60,0x58,0x50,0x48,0x40,0x38,0x30,0x28,0x20,0x 18,0x10,0x08,0x00};uchar code sine_tab[256]={//输出电压从0到最大值(正弦波1/4部分)0x80,0x83,0x86,0x89,0x8d,0x90,0x93,0x96,0x99,0x9c,0x9f,0xa2,0xa 5,0xa8,0xab,0xae,0xb1,0xb4,0xb7,0xba,0xbc,0xbf,0xc2,0xc5,0xc7,0xca,0xcc,0xcf,0xd1,0xd4,0xd6,0xd8,0xda,0xdd ,0xdf,0xe1,0xe3,0xe5,0xe7,0xe9,0xea,0xec,0xee,0xef,0xf1,0xf2,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd, 0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,//输出电压从最大值到0(正弦波1/4部分)0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7 ,0xf6,0xf5,0xf4,0xf2,0xf1,0xef,0xee,0xec,0xea,0xe9,0xe7,0xe5,0xe3,0xe1,0xde,0xdd,0xda,0xd8,0x d6,0xd4,0xd1,0xcf,0xcc,0xca,0xc7,0xc5,0xc2,0xbf,0xbc,0xba,0xb7,0xb4,0xb1,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9 c,0x99 ,0x96,0x93,0x90,0x8d,0x89,0x86,0x83,0x80,//输出电压从0到最小值(正弦波1/4部分)0x80,0x7c,0x79,0x76,0x72,0x6f,0x6c,0x69,0x66,0x63,0x60,0x5d,0x5 a,0x57,0x55,0x51,0x4e,0x4c,0x48,0x45,0x43,0x40,0x3d,0x3a,0x38,0x35,0x33,0x30,0x2e,0x2b,0x29,0x27,0x25,0x 22,0x20,0x1e,0x1c,0x1a,0x18,0x16 ,0x15,0x13,0x11,0x10,0x0e,0x0d,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x 03,0x02,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,//输出电压从最小值到0(正弦波1/4部分)0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02 ,0x02,0x03,0x04,0x05,0x 06,0x07,0x08,0x09,0x0a,0x0b,0x0d,0x0e,0x10,0x11,0x13,0x15 ,0x16,0x18,0x1a,0x1c,0x1e,0x20,0x22,0x25,0x27,0x 29,0x2b,0x2e,0x30,0x33,0x35,0x38,0x3a,0x3d,0x40,0x43,0x45,0x48,0x4c,0x4e,0x51,0x55,0x57,0x5a,0x5d,0x60,0x 63,0x66 ,0x69,0x6c,0x6f,0x72,0x76,0x79,0x7c,0x80};void delay(uchar z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void triangle_out() //三角波输出{DAdata=triangle_tab[wavecount++];if(wavecount>64) wavecount=0;DA_S1=0; //打开8位输入寄存器DA_S1=1; //关闭8位输入寄存器void sine_out() //正弦波输出{DAdata=sine_tab[wavecount++];DA_S1=0; //打开8位输入寄存器DA_S1=1; //关闭8位输入寄存器}void square_out() //方波输出{judge=~judge;if(judge==1) DAdata=0xff;else DAdata=0x00;DA_S1=0; //打开8位输入寄存器DA_S1=1; //关闭8位输入寄存器}/************1602液晶的相关函数*************/#define lcd_ports P1sbit rs=P2^2;sbit rw=P2^3;sbit lcden=P2^4;void write_com(uchar com){rs=0; //置零,表示写指令lcden=0;lcd_ports=com;delay(5);lcden=1;delay(5);lcden=0;}void write_date(uchar date){rs=1; //置1,表示写数据(在指令所指的地方写数据)lcden=0;lcd_ports=date;delay(5);lcden=1;delay(5);lcden=0;void disp_lcd(uchar addr,uchar *temp1){uchar num;write_com(addr);delay(1); //延时一会儿???for(num=0;num<16;num++){write_date(temp1[num]);//或者这样写write_date(*(temp1+num));delay(1);}}void init_lcd(){//uchar num;lcden=0; //可有可无???rw=0; //初始化一定要设置为零,表示写数据write_com(0x38); //使液晶显示点阵,为下面做准备write_com(0x0c); //初始设置write_com(0x06); //初始设置write_com(0x01); //清零write_com(0x80); //使指针指向第一行第一格disp_lcd(0x80,&lcd_hang1[3*16]); //在第一行显示disp_lcd(0xc0,&lcd_hang1[4*16]); //在第二行显示}/********************1602液晶函数声明结束*********************/ void main(){uchar i=0;DA_S2=0; //使DAC寄存器处于直通状态DAdata=0;DA_S1=1; //关闭8位输入寄存器init_lcd();waveform=0;TMOD=0x01; //设置定时器0为16位工作方式IT0=1; //设置外部中断0为下降沿触发ET0=1; //开定时器中断EX0=1;EA=1;while(1){//DAout(0xff); //可输出TTL波形//DAout(0x80);//T_temp=32;}}void timer0() interrupt 1{TH0=THtemp;TL0=TLtemp;if(waveform==0) sine_out();else if(waveform==1) triangle_out();else if(waveform==2) square_out();}void key_int0() interrupt 0{uchar keytemp;uint total_freq; //总频率EA=0; TR0=0; //关总中断与定时器delay(5); //延时够吗???if(key==0) //确实有按键按下而引发中断{keytemp=P3&0xf0; //获取P3口高四位的值switch(keytemp){case 0xe0: //选择波形waveform++;if(waveform>2) waveform=0;break;case 0xd0: //频率按规定单位依次增加wavefreq[waveform]++;if(wavefreq[waveform]>10) wavefreq[waveform]=1; // /*这边要用“>10”,因为它比“=11”可靠break;case 0xb0: //频率按规定单位依次衰减wavefreq[waveform]--;if(wavefreq[waveform]<1) wavefreq[waveform]=10; //这边要用“<1”,因为它比“=0”可靠性更高break;case 0x70: //TTL输出DA_S2=1; //使DAC寄存器关闭break;}THtemp=waveTH[waveform*10+(wavefreq[waveform]-1)]; //方括号中选取第几个数后,并把该值赋给T_tempTLtemp=waveTL[waveform*10+(wavefreq[waveform]-1)];total_freq= wavefreq[waveform] * freq_unit[waveform]; //求输出频率(个数*单位)lcd_hang2[5]=total_freq%10+0x30; //在液晶中显示个位,(0x30 在液晶显示中表示数字0)total_freq/=10; lcd_hang2[4]=total_freq%10+0x30; //在液晶中显示时十位total_freq/=10; lcd_hang2[3]=total_freq%10+0x30; //在液晶中显示时百位total_freq/=10; lcd_hang2[2]=total_freq%10+0x30; //在液晶中显示时千位disp_lcd(0x80,&lcd_hang1[waveform*16]); //在第一行显示disp_lcd(0xc0,lcd_hang2); //在第二行显示}wavecount=0; //'抽点'计数清零while(!key);EA=1; TR0=1; //开启总中断与定时器}。
基于51单片机的LED点阵音乐频谱显示器
基于51单片机的LED点阵音乐频谱显示器李逸家【期刊名称】《工业控制计算机》【年(卷),期】2015(0)4【摘要】This design by using singIe-chip microcomputer and digitaI signaI processing techniques to achieve musicaI spectrum dispIay system based on MCU.The system is divided into:the voice sampIing unit,sound processing unit and the LED dot matrix dispIay consisting of ceI s.Voice capture moduIe in SCM resources incIude sound reception and a/d conversion sys-tems.Voice receiving unit receives the audio anaIogue signaI,after the a/d converted to a digitaI signaI,to the next IeveI of processing units,sound processing unit STC12C5A60S2 microcontroI er FFT processing.%通过使用单片机原理,利用数字信号理论,使音乐频谱分析在单片机上的实现。
系统包括:声音接收模块,声音转换模块和LED组成的点阵显示单元。
其中声音采集模块,是利用STC12C5A60S2单片机中的声音采集和A/D转换。
音频的模拟信号通过声音采集模块接收到,经过A/D转换系统,转换为数字信号,送给下一级处理单元处理。
声音转换模块利用STC12C5A60S2单片机内部的资源,进行FFT处理。
基于51单片机的1602LCD显示
标签:单片机LCD基于51单片机的1602LCD显示基于51单片机的1602LCD显示LCD(liquid crystal display)为液晶显示器,它一般不会单独使用,而是将LCD面板、驱动与控制电路组合成LCD模块(1iquid crystal display moulde,简称为LCM)来使用。
LCM是一种很省电的显示设备,常被应用在数字或微处理器控制的系统,做为简易的人机接口,但人们一般还是习惯称之为LCD显示器。
1 硬件设计采用51单片机控制1602LCD显示器的电路如下所示。
在桌面上双击图标,打开ISIS 7 Professional窗口(本人使用的是v7.4 SP3中文版)。
单击菜单命令“文件”→“新建设计”,选择DEFAULT 模板,保存文件名为“LCD.DSN”。
在器件选择按钮中单击“P”按钮,或执行菜单命令“库”→“拾取元件/符号”,添加如下表所示的元件。
51单片机AT89C51 一片晶体CRYSTAL 12MHz 一只瓷片电容CAP 22pF 二只电解电容CAP-ELEC 10uF 一只电阻RES 10K 一只排阻RESPAC-8 10K 一只1602液晶显示器LM016L 一只若用Proteus软件进行仿真,则上图中的晶振和复位电路以及U1的31脚,都可以不画,它们都是默认的。
在ISIS原理图编辑窗口中放置元件,再单击工具箱中元件终端图标,在对象选择器中单击POWER和GROUND放置电源和地。
放置好元件后,布好线。
左键双击各元件,设置相应元件参数,完成电路图的设计。
2 软件设计用1602LCD显示两行字符的流程图如下所示。
用1602LCD显示“Welcom to China”和“Hi!Good morning!”的详细C51程序如下。
//用LCD循环显示"Welcome to China"和"Hi!Good morning!"#include<reg51.h> //包含单片机的头文件#include<intrins.h> //包含_nop_()函数定义的头文件sbit RS="P2"^0; //寄存器选择位,将RS位定义为P2.0引脚sbit RW="P2"^1; //读写选择位,将RW位定义为P2.1引脚sbit E="P2"^2; //使能信号位,将E位定义为P2.2引脚sbit BF="P0"^7; //忙碌标志位,,将BF位定义为P0.7引脚unsigned char code string[ ]={"Welcome to China"};unsigned char code string1[ ]={"Hi!Good morning!"};/*************************************************函数功能:延时1ms(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒*************************************************/void delay1ms(){unsigned char i,j;for(i=0;i<10;i++)for(j=0;j<33;j++);}/*****************************函数功能:延时若干毫秒入口参数:n******************************/void delay(unsigned char n){unsigned char i;for(i=0;i<n;i++)delay1ms();}/*******************************************函数功能:判断液晶模块的忙碌状态返回值:result。
单片机实现音乐频谱
图二 MCU 部分的原理图
) ( 灯 吸呼 键摸触
色 : :: 颜
图三 点阵驱动电路图 (三) 编程思路
1) 在主函数中,单片机通过 AD 对音频数据采样,然后存放到数据缓存区进行预处理,完成 AD 滤波 处理,自动增益控制信息扫描以及其他信息处理。接着,将缓存区数据送入 快速傅立叶变换(FFT) 处理子函数进行运算。处理完后,从缓存区取出运算结果,根据得到幅值计算出点阵的显示数据, 并存储到显示缓存区。
a) 采用 USB 接口供电,并且对 USB 接口进行了扩展。在没有额外占用电脑主机 USB 接口情况下, 随时随地给系统供电;
b) 加入了触摸键设计,以及震动反馈。当触摸键响应时有震动反馈,及声光提示,如今很多触屏手 机也有这种时尚设计;
c) 加入 ThinkPad 笔记本上的经典呼吸灯指示设计。如夏日里的萤火虫,一闪一闪亮晶晶,不仅有趣 还能指示系统工作状态;
好的声音效果,其各段频率成分应该有一定的比例,录音的时候,录音师操作调音台就可以使各 段频率的成分得到调整。由于各种乐器的基频高低是不同的,所以,也可以使各种乐器之间的声音比 例得到调整,常见的是把频率由低至高分成 5 段或 7 段、10 段或 15 段,有经验的录音师或音乐家能听 出哪里(哪个频率段)“空”了,即这个频段弱。哪里“鼓了个包”,即这个频段过强。通过均衡器可 以把这些予以弥补。又因为每个人对音乐中频率分布的欣赏标准是不同的,因此,各位录音师掌握的 尺度也不同,显示出各自的风格。
小贴士(1): 根据 STC12A32S2 单片机的资源情况,最多只有 1280B RAM,我们取 64 点的 FFT 就可以满足要求,还
基于51单片机的音乐播放器设计
题目:音乐播放器课程设计(论文)任务书课程设计(论文)题目:音乐播发器基本内容:利用单片机的定时器产生各种频率的方波,信号经过放大后送到喇叭从而产生各种音调。
自行定义键盘,每按一键,可选择一首歌曲进行演奏,至少能够存储并播放十首歌曲,在LCD上显示演奏歌曲的名称并滚动显示歌词,单片机可连续播放这首歌曲,演奏可通过按键停止。
课程设计(论文)专题部分:题目:音乐播放器基本内容:通过单片机设计可以播放十首歌曲的音乐播放器,同步显示歌曲名称和歌词。
学生接受毕业设计(论文)题目日期第19 周指导教师签字:2009年7月摘要随着电子技术的发展和计算机越来越普遍的使用,单片机作为这两项技术的有机结合也得到了广泛的应用,在某些领域具有不可替代的作用。
音乐播放功能随处都会用到,如,在开发儿童智力的玩具中,等等。
目前,基于单片机实现音乐播放,其体积小、价格低、编程灵活等特点在这一领域独领风骚。
单片机的英文名称为single chip microcomputer,最早出现在20世纪70年代,国际上现在已逐渐被微控制器(Microcontroller Unit 或MCU)一词所取代。
它体积小,集成度高,运算速度快,运行可靠,功耗低,价格廉,因此在数据采集、智能化仪表、通讯设备等方面得到了广泛应用。
而8051单片机在小到中型应用场合很常见,已成为单片机领域的实际标准。
随着硬件的发展,8051单片机系列的软件工具也有了C级编译器和实时多任务操作系统RTOS,为单片机编程使用C语言提供了便利的条件;并针对单片机常用的接口芯片编制通用的驱动函数,可针对常用的功能模块,算法等编制相应的函数;C语言模块化程序结构特点,可以使程序模块大家共享,不断丰富,这样就使得单片机的的程序设计更简单可靠,实时性强,效率高。
作为测控技术与仪器的学生,掌握8051单片机硬件基础及其相关软件操作,将其应用于现代电子产品中是必要而且重要的,这次课程设计我们的题目是用单片机实验箱系统制作音乐播放器。
手把手教你用51单片机DIY音乐频谱显示器
手把手教你用51单片机DIY音乐频谱显示器说起。
我们知道,一切声音都是由振动产生的。
声音之所以千变万化各不相同,是因为它们的振动各不相同。
看看琵琶,吉他或者其他的弦类乐器,可以发现它的每一根琴弦的直径都是不一样的。
琴弦越细,音调也就越高。
反之则越低。
显然粗的弦就不如细的弦振动得快或者说是振动的频率高。
产生音调高低的不同,就是由于振动的频率不同。
很显然频率越高,音高也就越高。
频率的单位是赫兹(简写为Hz),赫兹(1857-1894),是德国物理学家,他发现了电磁波,为了纪念他,人们用它的名字来做为频率的单位。
所谓的一赫兹,就是一秒钟振动一次。
那么440Hz 呢,当然就是每秒振动440 次,这个声音就是音乐中的标准A 音,是乐器定音的标准。
而钢琴中央C 的频率则是261.63Hz。
我们人的耳朵能够听到的频率范围,是20Hz 到20000Hz。
低于这个频率范围的声音叫次声波,而高于这个频率范围的声音叫做超声波。
所以我们能听到的音乐的频率,即都在人耳可听到的这个范围之内,约从20Hz 到20KHz。
比如,下面的表格中是我们常见的一些人声的基频范围男低音80-320Hz男中音96-387Hz男高音122-488Hz女低音145-580Hz女高音259-1034Hz根据傅立叶分析,任何声音可以分解为数个甚至无限个正弦波,而它们往往又包含有无数多的谐波分量。
而它们又往往是时刻在变化着。
所以一个声音的构成其实是很复杂的。
将声音的频率分量绘制成曲线,就形成了频谱。
对频谱进行分析的仪器就是频谱分析仪,早期频谱仪都是模拟分析的。
tips:感谢大家的阅读,本文由我司收集整编。
仅供参阅!。
基于51单片机的LED点阵音乐频谱显示器
1 3 7
基于 5 1 单片机的 L E D点阵音乐频谱显示器
L E D Do t Ma t r i x Di s pl a y Mu s i c Sp e c t r u m B a s e d o n 51 Si n gl e Ch i p Mi c r o c o mp u t e r
pr o c e s s i n g u n i t s . s o u n d p r o c e s s i n g u n i t S T Cl 2 C 5 A 6 0 S 2 mi c r o c o n t r o l l e r F F . r p r o c e s s i n g .
实 现 音 乐频 谱 。
关键词 : S T C l 2 C 5 A 6 0 S 2 , 数 字信 号 处理 , 傅里叶变换 , 源程 序 , 仿 真 与调 试
Abs t r a c t
T h i s d e s i g n b y u s i n g s i n g l e - c h i p mi c r o c o mp u t e r a n d d i g i t a l s i g n a l p r o c e s s i n g t e c h n i q u e s t o a c h i e v e mu s i c a l s p e c t r u m
李逸 家 ( 华南农业大学珠江学院, 广东 广州 5 1 0 9 0 0 )
摘 要
.
通 过 使 用 单 片机 原 理 , 利 用数 字信 号 理 论 , 使 音 乐频 谱 分 析 在 单 片机 上 的 实现 。 系 统 包括 : 声 音 接 收模 块 , 声 音 转 换 模 块和 L E D 组 成 的点 阵显 示单 元 。 其 中声 音采 集模 块 , 是利用 S T C1 2 C5 A 6 0 S 2单 片机 中 的声 音 采 集 和 A / D转 换 。 音 频 的模 拟信号 通过声音采 集模块接 收到 , 经过 A / D转 换 系统 , 转换为数 字信号 , 送给 下一级 处理单元 处理 。声音转换模 块利 用 S T Cl 2 C5 A 6 0 S 2单 片机 内部 的 资 源 , 进行 F F T处 理 。显 示模 块接 收 AD转 换 后 的信 号 , 控 制 5组 , 总共 有 5 5个 L E D灯泡 , 分别完成显示。 L E D 灯 的 明 暗条 件 , 是 随 着 音 乐的 频 率 变化 所 决 定 的 , 随 时更 新 做 出相 应 的 变化 , 通过 视 觉 上 的 灯光 显 示 以
基于51单片机的读取ds1307在LCD1302上显示
/////////////////以下是DS1307头文件/////////////////////////#include<reg51.h>#include<intrins.h>//nop函数sbit sda=P1^6;sbit scl=P1^5;void delay()//5u秒的延时{_nop_();_nop_();_nop_();}void start()//开始{scl=1;delay();sda=1;delay();sda=0;delay();}void stop()//停止{scl=1;delay();sda=0;delay();sda=1;delay();}void write(uchar slave_write_address,uchar byte_address,uchar data_data)//写一个数据{uchar temp,temp1,i,ii;start();//开始for(ii=0;ii<3;ii++)//根据24CXX文档资料,和时序图,按顺序送:器件写地址,字节地址,数据{if(ii==0){temp=slave_write_address;//送器件写地址temp1=slave_write_address;}else if(ii==1){temp=byte_address;//送字节地址temp1=byte_address;}else if(ii==2){temp=data_data;//送数据temp1=data_data;}for(i=0;i<8;i++){scl=0;delay();//5us延时temp=temp1;temp=temp&0x80;// 相与后,把不相关的位清零if(temp==0x80)//根据前面相与后,判断temp是否等于0x80,是则该位为1sda=1;elsesda=0;delay();//5us延时scl=1;delay();//5us延时scl=0;delay();//5us延时temp1=temp1<<1;//向左移出1位}sda=1; //释放数据线delay();//5us延时scl=1;delay();//5us延时scl=0;}stop();//停止}uchar read(uchar slave_write_address,uchar byte_address,uchar slave_read_address)//读一个数据{uchar temp,temp1,i,ii,x,data_data;start();//开始for(ii=0;ii<3;ii++)//根据24CXX文档资料,和时序图,按顺序送:器件写地址,字节地址,器件读地址{if(ii==0){temp=slave_write_address;//送器件写地址temp1=slave_write_address;}else if(ii==1){temp=byte_address;//送字节地址temp1=byte_address;}else if(ii==2){start();//开始temp=slave_read_address;//送器件读地址temp1=slave_read_address;}for(i=0;i<8;i++)//开始写数据{scl=0;delay();//5us延时temp=temp1;temp=temp&0x80;// 相与后,把不相关的位清零if(temp==0x80)//根据前面相与后,判断temp是否等于0x80,是则该位为1 sda=1;elsesda=0;delay();//5us延时scl=1; //此时ds1307吸收数据delay();//5us延时scl=0;delay();//5us延时temp1=temp1<<1;//向左移出1位}sda=1; //释放数据线delay();//5us延时scl=1;delay();//5us延时scl=0;//ds1307应答成功与否信号}for(x=0;x<8;x++){data_data=data_data<<1;//向左移入1位sda=1; //非必要delay();//5us延时scl=0;//此时ds1307弹出数据delay();//5us延时scl=1;delay();//5us延时if(sda==1)//判断数据线是否是高电平data_data|=0x01;//把读到的数据或0X01 }scl=0; //单片机应答非应答信号delay();//5us延时sda=1;delay();//5us延时scl=1;delay();//5us延时stop();//停止return data_data;//返回读到的数据}void ds1307init(){write(0xd0,0x00,0x40);write(0xd0,0x01,0x45);write(0xd0,0x02,0x22);write(0xd0,0x03,0x02);write(0xd0,0x04,0x24);write(0xd0,0x05,0x10);write(0xd0,0x06,0x17);}/////////////////以下是LCD1302头文件/////////////////////////#include<reg51.h>#define uchar unsigned char#define uint unsigned int#define LCD1602_DATAPINS P0sbit LCD1602_E=P2^7;sbit LCD1602_RW=P2^5;sbit LCD1602_RS=P2^6;void Lcd1602_Delay1ms(uint c) //误差0us{uchar a,b;for (; c>0; c--){for (b=199;b>0;b--){for(a=1;a>0;a--);}}}void LcdWriteCom(uchar com)//写入命令{LCD1602_E = 0; //使能LCD1602_RS = 0;//选择发送命令LCD1602_RW = 0;//选择写入LCD1602_DATAPINS = com; //放入命令Lcd1602_Delay1ms(1);//等待数据稳定LCD1602_E = 1;//写入时序Lcd1602_Delay1ms(5);//保持时间LCD1602_E = 0;}void LcdWriteData(uchar dat)//写入数据{LCD1602_E = 0;//使能清零LCD1602_RS = 1;//选择输入数据LCD1602_RW = 0;//选择写入LCD1602_DATAPINS = dat; //写入数据Lcd1602_Delay1ms(1);LCD1602_E = 1; //写入时序Lcd1602_Delay1ms(5); //保持时间LCD1602_E = 0;}void LcdInit()//LCD初始化子程序{LcdWriteCom(0x38); //开显示LcdWriteCom(0x0c); //开显示不显示光标LcdWriteCom(0x06); //写一个指针加1LcdWriteCom(0x01); //清屏LcdWriteCom(0x80); //设置数据指针起点}/////////////////以下是主函数/////////////////////////#include<reg51.h>#include"lcd.h"#include"ds1307.h"#define uchar unsigned char#define uint unsigned intuint aa=0,bb=0,cc=0,dd=0,ee=0,ff=0,gg=0,hh=0,jj=0,kk=0,ll=0,mm=0,nn=0;uchar nian=0,yue=0,ri=0,shi=0,fen=0,miao=0,xingqi=0;void LcdDisplay(){aa=miao/10;bb=miao%10;cc=fen/10; dd=fen%10;ee=shi/10; ff=shi%10;gg=ri/10; hh=ri%10;jj=yue/10; kk=yue%10;ll=nian/10;mm=nian%10;nn=xingqi;LcdWriteCom(0x80+0X40);LcdWriteData('0'+ee);//时LcdWriteData('0'+ff);LcdWriteData('-');LcdWriteData('0'+cc);//分LcdWriteData('0'+dd);LcdWriteData('-');LcdWriteData('0'+aa);//秒LcdWriteData('0'+bb);LcdWriteCom(0x80);LcdWriteData('2');LcdWriteData('0');LcdWriteData('0'+ll);//年LcdWriteData('0'+mm);LcdWriteData('-');LcdWriteData('0'+jj);//月LcdWriteData('0'+kk);LcdWriteData('-');LcdWriteData('0'+gg);//日LcdWriteData('0'+hh);LcdWriteCom(0x8D);LcdWriteData('0'+xingqi);//星期}void main(){ LcdInit();ds1307init();while(1){miao=read(0xd0,0x00,0xd1);//读出秒的BCD码miao=((miao&0x70)>>4)*10+(miao&0x0f);//将BCD码转换成10进制数fen=read(0xd0,0x01,0xd1);//以下同理fen=((fen&0x70)>>4)*10+(fen&0x0f);shi=read(0xd0,0x02,0xd1);shi=((shi&0x70)>>4)*10+(shi&0x0f);xingqi=read(0xd0,0x03,0xd1);//星期最多是7所以不需转换ri=read(0xd0,0x04,0xd1);ri=((ri&0x70)>>4)*10+(ri&0x0f);yue=read(0xd0,0x05,0xd1);yue=((yue&0x70)>>4)*10+(yue&0x0f);nian=read(0xd0,0x06,0xd1);nian=((nian&0xf0)>>4)*10+(nian&0x0f);LcdDisplay();}}。
用51单片机实现电脑音频信号的频谱显示(在LCD上显示)
如何用51单片机实现音频信号的频谱显示(在LCD上显示)思路:外来音频信号经过51单片机,在单片机中进行频谱分析,并将结果显示在LCD(12864或1602)上要求:频谱显示如同千千静听播放音乐时的频谱显示希望各位高手能给出详细的解决方案,感激。
51做FFT有些困难,可以使用增强型(RAM)的51机子进行参考程序:#include<STC12C5A.H>#define uchar unsigned char#define uint unsigned int#define channel 0x01 //设置AD通道为 P1.1//---------------------------------------------------------------------sbit SDA_R=P1^2;sbit SDA_R_TOP=P1^3;sbit SDA_G=P1^4;sbit SDA_G_TOP=P1^5;sbit STCP=P1^6;sbit SHCP=P1^7;//---------------------------------------------------------------------//----------------------------------------------------------------------------------------------------------------------//放大128倍后的sin整数表(128)code char SIN_TAB[128] = { 0, 6, 12, 18, 24, 30, 36, 42, 48, 54, 59, 65, 70, 75, 80, 85, 89, 94, 98, 102,105, 108, 112, 114, 117, 119, 121, 123, 124, 125, 126, 126, 126, 126, 126, 125, 124, 123, 121, 119, 117, 114, 112,108, 105, 102, 98, 94, 89, 85, 80, 75, 70, 65, 59, 54, 48, 42, 36, 30, 24, 18, 12, 6, 0, -6, -12, -18, -24, -30,-36, -42, -48, -54, -59, -65, -70, -75, -80, -85, -89, -94, -98, -102, -105, -108, -112, -114, -117, -119, -121,-123, -124, -125, -126, -126, -126, -126, -126, -125, -124, -123, -121, -119, -117, -114, -112, -108, -105, -102,-98, -94, -89, -85, -80, -75, -70, -65, -59, -54, -48, -42, -36, -30, -24, -18, -12, -6 };//放大128倍后的cos整数表(128)code char COS_TAB[128] = { 127, 126, 126, 125, 124, 123, 121, 119, 117, 114, 112, 108, 105, 102, 98, 94,89, 85, 80, 75, 70, 65, 59, 54, 48, 42, 36, 30, 24, 18, 12, 6, 0, -6, -12, -18, -24, -30, -36, -42, -48, -54, -59,-65, -70, -75, -80, -85, -89, -94, -98, -102, -105, -108, -112, -114, -117, -119, -121, -123, -124, -125, -126, -126, -126, -126, -126, -125, -124, -123, -121, -119, -117, -114, -112, -108, -105, -102, -98, -94, -89, -85, -80,-75, -70, -65, -59, -54, -48, -42, -36, -30, -24, -18, -12, -6, 0, 6, 12, 18, 24, 30, 36, 42, 48, 54, 59, 65, 70,75, 80, 85, 89, 94, 98, 102, 105, 108, 112, 114, 117, 119, 121, 123, 124, 125, 126, 126 };//采样存储序列表code char LIST_TAB[128] = { 0, 64, 32, 96, 16, 80, 48, 112,8, 72, 40, 104, 24, 88, 56, 120,4, 68, 36, 100, 20, 84, 52, 116,12, 76, 44, 108, 28, 92, 60, 124,2, 66, 34, 98, 18, 82, 50, 114,10, 74, 42, 106, 26, 90, 58, 122,6, 70, 38, 102, 22, 86, 54, 118,14, 78, 46, 110, 30, 94, 62, 126,1, 65, 33, 97, 17, 81, 49, 113,9, 73, 41, 105, 25, 89, 57, 121,5, 69, 37, 101, 21, 85, 53, 117,13, 77, 45, 109, 29, 93, 61, 125,3, 67, 35, 99, 19, 83, 51, 115,11, 75, 43, 107, 27, 91, 59, 123,7, 71, 39, 103, 23, 87, 55, 119,15, 79, 47, 111, 31, 95, 63, 127};uchar COUNT=0,COUNT1=0,ADC_Count=0,LINE=15,G,T;uchar i,j,k,b,p;int Temp_Real,Temp_Imag,temp; // 中间临时变量uint TEMP1;int xdata Fft_Real[128];int xdata Fft_Image[128]; // fft的虚部uchar xdata LED_TAB2[64]; //记录漂浮物是否需要停顿一下uchar xdata LED_TAB[64]; //记录红色柱状uchar xdata LED_TAB1[64]; //记录漂浮点void Delay(uint a){while(a--);}void FFT(){ //uchar X;for( i=1; i<=7; i++) /* for(1) */{b=1;b <<=(i-1); //碟式运算,用于计算隔多少行计算例如第一极 1和2行计算,,第二级for( j=0; j<=b-1; j++) /* for (2) */{p=1;p <<= (7-i);p = p*j;for( k=j; k<128; k=k+2*b) /* for (3) 基二fft */{Temp_Real = Fft_Real[k]; Temp_Imag = Fft_Image[k]; temp = Fft_Real[k+b];Fft_Real[k] = Fft_Real[k] +((Fft_Real[k+b]*COS_TAB[p])>>7) + ((Fft_Image[k+b]*SIN_TAB[p])>>7);Fft_Image[k] = Fft_Image[k] -((Fft_Real[k+b]*SIN_TAB[p])>>7) + ((Fft_Image[k+b]*COS_TAB[p])>>7);Fft_Real[k+b] = Temp_Real -((Fft_Real[k+b]*COS_TAB[p])>>7) - ((Fft_Image[k+b]*SIN_TAB[p])>>7);Fft_Image[k+b] = Temp_Imag + ((temp*SIN_TAB[p])>>7) - ((Fft_Image[k+b]*COS_TAB[p])>>7);// 移位.防止溢出. 结果已经是本值的 1/64Fft_Real[k] >>= 1;Fft_Image[k] >>= 1;Fft_Real[k+b] >>= 1;Fft_Image[k+b] >>= 1;}}}// X=((((Fft_Real[1]*Fft_Real[1]))+((Fft_Image[1]*Fft_Image[1])))>>7);Fft_Real[0]=Fft_Image[0]=0; //去掉直流分量// Fft_Real[63]=Fft_Image[63]=0;for(j=0;j<64;j++){TEMP1=((((Fft_Real[j]*Fft_Real[j]))+((Fft_Image[j]*Fft_Image[j])))>>1);//求功率if(TEMP1>1)TEMP1--;else TEMP1=0;if(TEMP1>31)TEMP1=31;if(TEMP1>(LED_TAB[j]))LED_TAB[j]=TEMP1;if(TEMP1>(LED_TAB1[j])){ LED_TAB1[j]=TEMP1;LED_TAB2[j]=18; //提顿速度=12}}}void Init(){//-----------------------------------------------------------------------------------P1ASF = 0x02; //0000,0010, 将 P1.1 置成模拟口AUXR1 &=0xFB; //1111,1011, 令 ADRJ=0EADC=1; //AD中断打开ADC_CONTR = ADC_POWER | ADC_SPEEDHH | ADC_START | channel;//1110 1001 1打开 A/D (ADC_POWER)转换电源;11速度为70周期一次;//0中断标志清零;1启动adc(ADC_START);001AD通道打开(这里为P1.1);//-----------------------------------------------------------------------------------P2M0=1;P0M0=1;TMOD=0X12;TH0=0x30; //大约20K的采样率(要完整频段需40K以上。
音频信号频谱分析(采用LCD点阵液晶显示)
音频信号分析仪(采用LCD液晶显示)摘要本音频信号分析仪由32位MCU为主控制器,通过AD转换,对音频信号进行采样,把连续信号离散化,然后通过FFT快速傅氏变换运算,在时域和频域对音频信号各个频率分量以及功率等指标进行分析和处理,然后通过高分辨率的LCD 对信号的频谱进行显示。
该系统能够精确测量的音频信号频率范围为20Hz-10KHz,其幅度范围为5mVpp-5Vpp,分辨力分为20Hz和100Hz两档。
测量功率精确度高达1%,并且能够准确的测量周期信号的周期,是理想的音频信号分析仪的解决方案。
关键词:FFT;MCU;频谱;功率目录1 方案论证与比较 ................................................................................................. - 3 -1.1采样方法方案论证 (3)1.2处理器的选择方案论证................................................... 错误!未定义书签。
1.3周期性判别与测量方法方案论证................................... 错误!未定义书签。
2 系统设计 ............................................................................................................. - 4 -2.1总体设计. (5)2.2单元电路设计 (5)2.2.1 前级阻抗匹配和放大电路设计 (5)2.2.2 AD转换及控制模块电路设计 (6)2.2.3 功率谱测量单元电路设计 (6)3 软件设计 (7)4系统测试 (8)5 结论 (9)参考文献: (9)附录: (9)附1:元器件明细表: (9)附2:仪器设备清单 (9)附3:电路图图纸 (10)附4:程序清单 (11)1 方案论证与比较1.1 采样方法比较与选择方案一、用DDS芯片配合FIFO对信号进行采集,通过DDS集成芯片产生一个频率稳定度和精度相当高的信号作为FIFO的时钟,然后由FIFO对A/D转换的结果进行采集和存储,最后送MCU处理。
基于51单片机的电容表 电感表 频率表源程序
基于51单片机的电容表、电感表、频率表源程序1. 概述在电子领域中,电容、电感和频率是非常重要的参数,它们在电路设计和电子设备中起着至关重要的作用。
为了方便测量和监测这些参数,我们需要一种便捷、精准的工具。
基于51单片机的电容表、电感表和频率表就是这样一种工具,它能够快速、准确地测量目标电容、电感和频率的数值,最大限度地满足电子工程师的需求。
2. 原理介绍基于51单片机的电容表、电感表和频率表主要依赖于单片机的计数器和定时器功能来实现测量。
通过对待测电容或电感进行充放电或震荡来获取相应的参数数值,再通过单片机进行处理和显示,从而实现测量的功能。
3. 硬件设计基于51单片机的电容表、电感表和频率表的硬件设计主要包括外部元器件和接口电路的设计。
需要根据待测量参数的特性来选取合适的传感器和信号调理电路,同时要考虑单片机的输入输出端口及显示器的连接。
4. 源程序设计基于51单片机的电容表、电感表和频率表的源程序设计是实现功能的关键。
需要根据测量原理和硬件设计来编写单片机的程序,实现参数的测量、处理和显示功能。
程序的设计应当充分考虑准确性、稳定性和可靠性,同时要具备良好的用户交互界面。
5. 调试与优化在完成源程序设计后,需要对整个系统进行调试和优化,确保测量结果准确可靠。
通过对程序的逻辑和算法进行调试,同时进行硬件连接的验证和修正,最终实现系统的稳定运行。
6. 应用与展望基于51单片机的电容表、电感表和频率表不仅可以应用于电子工程师的日常工作中,还可以在教学和科研领域提供帮助。
随着电子技术的不断发展,基于51单片机的电容表、电感表和频率表也将不断完善和优化,为电子领域的发展贡献更多力量。
7. 结语基于51单片机的电容表、电感表和频率表无疑是电子领域中一种便捷、实用的测量工具,它的设计、实现和应用为电子工程师和科研人员提供了更多方便。
随着技术的不断进步,相信这一类型的产品会越来越完善,为电子领域的发展带来更多的便利和可能性。
基于51单片机实时控制的LCD液晶显示屏循环显示系统
本文研制一种基于51单片机实时控制的LCD液晶显示屏循环显示系统。硬件系统由单片机最小系统和液晶显示系统组成。此次课程设计采用AT89C51型单片机和12864点阵型LCD液晶显示器来实现。LCD上要显示某个图形或汉字就是将相应的点阵信息写入到相应的存储单元中。要想实现循环移动,只需不断改变图片的字模数据在液晶面板上的显示位置(RAM地址)即可。程序采用C语言编写,使用Keil编译器进行编译。
#define FIRSTROW 0xc0 //显示起始行设置,参考指令表,在0到63行选择
#define SETY 0xb8 //Y方向,8页64行,参考指令表,[2..0]在0到8页选择
#define SETX 0x40 //X方向,半屏64列,参考指令表,在0到63列选择
/*与硬件相关的编址设计*/
}
while((temp|0x7f)==0xff);//检测D7是否为1,1表示LCD忙,如果忙,继续检测,直到空闲止
}
3.1.5 命令/数据写入函数
函数lcd_cmd_wr将命令写入LCM模块;
void lcd_cmd_wr(unsigned char cmdcode, unsigned char right)
例如点亮128*64的屏中(20,30)位置上的液晶点,因列地址30小于64,该点在左半屏第29列,所以CS1有效;行地址20除以8取整得2,取余得4,该点在RAM中页地址为2,在字节中的序号为4;所以将二进制数据00010000写入Xpage=2,Yaddress=29的存储单元中即点亮(20,30)上的液晶点。
{
unsigned char i,j;
for(i=0;i<8;i++)
{
//页地址设定
单片机音乐频谱..
题目:单片机LED音乐频谱的设计院(系):专业:学生姓名:学号:指导教师:2011年07月07日摘要该系统采用增强型8051单片机STC12C5A60S2为主控制器,通过单片机内置的ADC对音频信号进行采样、量化,然后通过快速傅里叶变换运算,在频域计算出音频信号各个频率分量的功率,最后通过双基色LED单元板进行显示。
该方案具有电路结构简洁,开发、生产成本低的优点。
关键词:单片机;傅里叶;LED;目录1. 引言 (1)2. 方案设计 (2)2.1设计要求 (2)2.2总体方案设计 (3)2.3总体方案组成 (6)3. 系统电路设计 (6)3.1单片机主控电路设计主控制器 (6)3.2LED显示模块电路设计 (7)4. 软件设计 (8)4.1软件设计流程图 (8)5.系统的测试 (8)6.结论 (9)7.参考文献 (11)8. 附录 (14)1. 引言本文介绍的音乐频谱显示器可对mp3、手机、计算机输出的音乐信号进行实时的频谱显示。
系统采用增强型8051单片机STC12C5A60S2为主控制芯片,通过单片机内置的ADC对音频信号进行采样,把连续信号离散化,然后通过快速傅里叶变换(FFT)运算,在频域计算出音频信号各个频率分量的功率,最后通过双基色LED单元板进行显示。
在显示的频率点不多的情况下,本系统比采用DSP或ARM作为主控制芯片的设计方案具有电路结构简洁,开发、生产成本低的优点。
2. 方案设计2.1设计要求1. 单片机自带AD 转换,这样省去外围AD 电路。
2. 控制LED 随着音乐跳动,需要理解傅里叶原理。
2.2总体方案设计经分析,将系统分为两个部分,一个是由单片机组成的主控。
另一部分是LED 显示部分,单片机对接收到的音频进行处理经过傅里叶换算后在LED 显示,5V 稳压电源给各个部分供电。
该系统实现的方法有很多种,下面将列出大家最经常用到的实现方案。
系统框图如图1所示图1 音乐频谱总体系统框图 该系统由音频信号预处理电路、单片机STC12C5A60S2控制电路、LED 频谱显示电路等部分组成。
51单片机频率计设计(LCD显示)[1]
51单片机频率计设计(LCD显示)[1]————————————————————————————————作者:————————————————————————————————日期://单片机89C51的数字频率计C程序:#include 〈AT89x51。
h>#include 〈stdio。
h〉#include <math.h>#include 〈intrins.h〉float f;//频率float p; //周期float sj;float mk; //脉宽char idata buff[20];char xs=0;//设置闸门时间结束后是否显示结果的标志位unsigned char m=0,n=0,yichu=0,fenpin;//m定时中断次数n计数中断次数yichu判断是定时器还是sbit B153=P2^4;sbit A153=P2^3;sbit P35=P3^5;unsigned char LCD_Wait(void);void LCD_Write(bit style,unsigned char input);void LCD_SetDisplay(unsigned char DisplayMode);void LCD_SetInput(unsigned char InputMode);void LCD_Initial();void GotoXY(unsigned char x, unsigned char y);void Print(unsigned char *str);void C51_Initial();void Delay(unsigned int t);void display(float f);void cepin();void panduan();void Mkdisplay(float mk);void ccpin();/***************************************** 模块名称:LCD1602显示程序*****************************************//***********************端口定义***********************************/sbit LcdRs= P2^0;sbit LcdRw= P2^1;sbit LcdEn= P2^2;sfr DBPort= 0x80;//P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口/************************内部等待函数********************************/unsigned char LCD_Wait(void){LcdRs=0;//寄存器选择输入端1:数据0:指令LcdRw=1;_nop_(); //RW:为0:写状态;为1:读状态;LcdEn=1; _nop_();//使能输入端,读状态,高电平有效;写状态,下降沿有效LcdEn=0;return DBPort;}/***********************向LCD写入命令或数据*********************************/#define LCD_COMMAND 0 // Command#define LCD_DATA 1 // Data#define LCD_CLEAR_SCREEN 0x01 // 清屏#define LCD_HOMING 0x02 // 光标返回原点void LCD_Write(bit style,unsigned char input){LcdEn=0;LcdRs=style;LcdRw=0;_nop_();DBPort=input; _nop_();//注意顺序LcdEn=1; _nop_();//注意顺序LcdEn=0;_nop_();LCD_Wait();}/********************设置显示模式****************************************/#define LCD_SHOW 0x04 //显示开#define LCD_HIDE 0x00 //显示关#define LCD_CURSOR 0x02 //显示光标#define LCD_NO_CURSOR 0x00 //无光标#define LCD_FLASH 0x01 //光标闪动#define LCD_NO_FLASH 0x00 //光标不闪动void LCD_SetDisplay(unsigned char DisplayMode){LCD_Write(LCD_COMMAND, 0x08|DisplayMode);}/*********************设置输入模式***************************************/#define LCD_AC_UP 0x02#define LCD_AC_DOWN 0x00 // default#define LCD_MOVE 0x01 // 画面可平移#define LCD_NO_MOVE 0x00 //defaultvoid LCD_SetInput(unsigned char InputMode){LCD_Write(LCD_COMMAND, 0x04|InputMode);}/******************初始化LCD******************************************/void LCD_Initial(){LcdEn=0;LCD_Write(LCD_COMMAND,0x38); //8位数据端口,2行显示,5*7点阵LCD_Write(LCD_COMMAND,0x38);LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //开启显示,无光标LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);//清屏LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC递增,画面不动}/*****************************LCD**************************************/void GotoXY(unsigned char x, unsigned char y){if(y==0)LCD_Write(LCD_COMMAND,0x80|x);if(y==1)LCD_Write(LCD_COMMAND,0x80|(x-0x40));}void Print(unsigned char *str){while(*str!=’\0'){LCD_Write(LCD_DA TA,*str);str++;}}/***************************89c51初始化************************************/void C51_Initial(){sj=1000000.00;TMOD=0x51; // 01010001 T1为计数器,T0为定时器EA=1;ET0=1;ET1=1;EX0=1;PX0=1; //外部中断0设置为高优先级IT0=0; //电平触发方式}/**************************ms延时子程序***************************/void Delay(unsigned int t) //t随着数值越大,误差趋于平衡。
手把手教你用51单片机DIY音乐频谱显示_稿件 - V3
呼
吸
触
摸
键
灯
(
图二
)
MCU 部分的原理图
颜
:
:
:
色
图三 (三) 编程思路 1)
点阵驱动电路图
在主函数中,单片机通过 AD 对音频数据采样,然后存放到数据缓存区进行预处理,完成 AD 滤波 处理, 自动增益控制信息扫描以及其他信息处理。 接着, 将缓存区数据送入 快速傅立叶变换 (FFT) 处理子函数进行运算。 处理完后, 从缓存区取出运算结果, 根据得到幅值计算出点阵的显示数据, 并存储到显示缓存区。 在中断函数中,根据显示缓冲区的内容对点阵显示屏进行实时刷新点亮。
根据傅立叶分析,任何声音可以分解为数个甚至无限个正弦波,而它们往往又包含有无数多的谐 波分量。而它们又往往是时刻在变化着。所以一个声音的构成其实是很复杂的。将声音的频率分量绘 制成曲线,就形成了频谱。 对频谱进行分析的仪器就是频谱分析仪,早期频谱仪都是模拟分析的。频谱仪的原理就是将声音
信号通过一系列不同中心频率的模拟带通滤波器。每个带通滤波器相当于一个共振电路,其特性由中 心频率(步进的) 、频带宽度及响应时间表示。在声音信号通过滤波器后,经过平方检波器,并进行平 均之后,在每个频率上测定所传输的功率,从而得到信号的频谱。然而,传统的频谱仪受到滤波器性 能的制约,因为模拟电路本身的特性所局限,滤波器的带宽和响应时间成反比,也就是说模拟滤波器 的频率分辨力与时间分解能力之间存在矛盾。因为频谱仪所测量的往往都是非稳态声,一般来说,都 是使用若干个滤波器来覆盖整个频率范围,并将信号同时并联地输入到这些滤波器上去。或者使用中 心频率能够从低到高连续变化的滤波器。 随着科学技术的不断进步,现在我们所使用的基本不再是那些笨重而不准确的模拟仪器的频谱仪, 取而代之的是基于处理器的软件分析法。它分析的数据来源其实是经过了 ADC(模数转换器件)转换 后得出的数字信号,所以频谱仪软件所测量的信号准确度,很大程度取决于数模转换电路的性能。比 起模拟滤波器,数字滤波器应该要更加迅速和精确。 2) 你问:那什么是均衡器和音乐频谱显示?在我们欣赏音乐的过程中有什么样的作用? 我答:对于录音棚等专业级别的音乐制作来说,通常都需要对录制的音频信号进行频谱分析来辅助音 频的加工制作。当然对于我们普通的爱好者来说,不需要那么精确的频谱分析,我们更多的是用来略 显音乐节奏,美化环境,增添气氛。于是,大多数的音乐播放软件(如图一),手机,mp3,高档的音箱 设备等,都有了音乐频谱显示。
单片机音乐频谱
单片机音乐频谱一、概述在单片机应用领域中,音乐频谱的设计与实现是一项常见且有趣的任务。
音乐频谱是指将音频信号的频率内容进行可视化展示的一种方法,通过频谱图可以直观地观察到音频信号的频谱特性。
本文档将详细介绍如何利用单片机实现音乐频谱的设计与实现。
二、硬件设计1.选择合适的单片机:根据实际需求选择适用的单片机,考虑到处理速度和存储容量等因素。
2.音频输入:通过选择合适的音频输入模块,将音频信号输入到单片机中。
可以选择模拟输入或数字输入方式。
3.FFT转换器:使用FFT(Fast Fourier Transform)转换器将音频信号从时域转换为频域,并计算频谱数据。
4.LED显示屏/柱形图显示模块:使用LED显示屏或柱形图显示模块,将频谱数据转化为可视化的频谱图展示。
三、软件设计1.ADC采样:在单片机中配置ADC模块,以一定的采样频率对音频信号进行采样,将其转换为数字信号。
2.数据处理:对采样得到的音频数据进行预处理,例如进行加窗处理,以减小频谱泄漏的影响。
3.FFT计算:通过调用FFT算法库,对预处理后的音频数据进行FFT计算,得到频谱数据。
4.数据显示:将计算得到的频谱数据通过LED显示屏或柱形图模块进行可视化展示。
四、调试与优化1.验证硬件连接:确保单片机与音频输入模块、显示模块等硬件连接正确。
2.调试采样频率:根据实际需求,调整ADC采样频率,以确保采样频率能够满足音频信号的频率范围。
3.调试FFT参数:根据实际需求,调整FFT参数,例如采样点数、窗函数类型等,以优化频谱分辨率和计算速度。
4.优化显示效果:通过调整频谱数据的灵敏度、颜色映射等参数,优化频谱图的展示效果。
五、附件1.单片机音乐频谱原理图:附带单片机音乐频谱的硬件连接图,方便实际搭建与调试过程中的参考和理解。
2.单片机音乐频谱代码示例:提供一个完整的单片机音乐频谱的软件代码示例,包括初始化配置、FFT计算、数据显示等部分。
六、法律名词及注释1.单片机:也称为微控制器,是一种包含处理器核心、存储器和外设功能的集成电路芯片,用于控制电子设备的工作。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
如何用51单片机实现音频信号的频谱显示(在LCD上显示)思路:外来音频信号经过51单片机,在单片机中进行频谱分析,并将结果显示在LCD(12864或1602)上要求:频谱显示如同千千静听播放音乐时的频谱显示希望各位高手能给出详细的解决方案,感激。
51做FFT有些困难,可以使用增强型(RAM)的51机子进行参考程序:#include<STC12C5A.H>#define uchar unsigned char#define uint unsigned int#define channel 0x01 //设置AD通道为 P1.1//---------------------------------------------------------------------sbit SDA_R=P1^2;sbit SDA_R_TOP=P1^3;sbit SDA_G=P1^4;sbit SDA_G_TOP=P1^5;sbit STCP=P1^6;sbit SHCP=P1^7;//---------------------------------------------------------------------//----------------------------------------------------------------------------------------------------------------------//放大128倍后的sin整数表(128)code char SIN_TAB[128] = { 0, 6, 12, 18, 24, 30, 36, 42, 48, 54, 59, 65, 70, 75, 80, 85, 89, 94, 98, 102,105, 108, 112, 114, 117, 119, 121, 123, 124, 125, 126, 126, 126, 126, 126, 125, 124, 123, 121, 119, 117, 114, 112,108, 105, 102, 98, 94, 89, 85, 80, 75, 70, 65, 59, 54, 48, 42, 36, 30, 24, 18, 12, 6, 0, -6, -12, -18, -24, -30,-36, -42, -48, -54, -59, -65, -70, -75, -80, -85, -89, -94, -98, -102, -105, -108, -112, -114, -117, -119, -121,-123, -124, -125, -126, -126, -126, -126, -126, -125, -124, -123, -121, -119, -117, -114, -112, -108, -105, -102,-98, -94, -89, -85, -80, -75, -70, -65, -59, -54, -48, -42, -36, -30, -24, -18, -12, -6 };//放大128倍后的cos整数表(128)code char COS_TAB[128] = { 127, 126, 126, 125, 124, 123, 121, 119, 117, 114, 112, 108, 105, 102, 98, 94,89, 85, 80, 75, 70, 65, 59, 54, 48, 42, 36, 30, 24, 18, 12, 6, 0, -6, -12, -18, -24, -30, -36, -42, -48, -54, -59,-65, -70, -75, -80, -85, -89, -94, -98, -102, -105, -108, -112, -114, -117, -119, -121, -123, -124, -125, -126, -126, -126, -126, -126, -125, -124, -123, -121, -119, -117, -114, -112, -108, -105, -102, -98, -94, -89, -85, -80,-75, -70, -65, -59, -54, -48, -42, -36, -30, -24, -18, -12, -6, 0, 6, 12, 18, 24, 30, 36, 42, 48, 54, 59, 65, 70,75, 80, 85, 89, 94, 98, 102, 105, 108, 112, 114, 117, 119, 121, 123, 124, 125, 126, 126 };//采样存储序列表code char LIST_TAB[128] = { 0, 64, 32, 96, 16, 80, 48, 112,8, 72, 40, 104, 24, 88, 56, 120,4, 68, 36, 100, 20, 84, 52, 116,12, 76, 44, 108, 28, 92, 60, 124,2, 66, 34, 98, 18, 82, 50, 114,10, 74, 42, 106, 26, 90, 58, 122,6, 70, 38, 102, 22, 86, 54, 118,14, 78, 46, 110, 30, 94, 62, 126,1, 65, 33, 97, 17, 81, 49, 113,9, 73, 41, 105, 25, 89, 57, 121,5, 69, 37, 101, 21, 85, 53, 117,13, 77, 45, 109, 29, 93, 61, 125,3, 67, 35, 99, 19, 83, 51, 115,11, 75, 43, 107, 27, 91, 59, 123,7, 71, 39, 103, 23, 87, 55, 119,15, 79, 47, 111, 31, 95, 63, 127};uchar COUNT=0,COUNT1=0,ADC_Count=0,LINE=15,G,T;uchar i,j,k,b,p;int Temp_Real,Temp_Imag,temp; // 中间临时变量uint TEMP1;int xdata Fft_Real[128];int xdata Fft_Image[128]; // fft的虚部uchar xdata LED_TAB2[64]; //记录漂浮物是否需要停顿一下uchar xdata LED_TAB[64]; //记录红色柱状uchar xdata LED_TAB1[64]; //记录漂浮点void Delay(uint a){while(a--);}void FFT(){ //uchar X;for( i=1; i<=7; i++) /* for(1) */{b=1;b <<=(i-1); //碟式运算,用于计算隔多少行计算例如第一极 1和2行计算,,第二级for( j=0; j<=b-1; j++) /* for (2) */{p=1;p <<= (7-i);p = p*j;for( k=j; k<128; k=k+2*b) /* for (3) 基二fft */{Temp_Real = Fft_Real[k]; Temp_Imag = Fft_Image[k]; temp = Fft_Real[k+b];Fft_Real[k] = Fft_Real[k] +((Fft_Real[k+b]*COS_TAB[p])>>7) + ((Fft_Image[k+b]*SIN_TAB[p])>>7);Fft_Image[k] = Fft_Image[k] -((Fft_Real[k+b]*SIN_TAB[p])>>7) + ((Fft_Image[k+b]*COS_TAB[p])>>7);Fft_Real[k+b] = Temp_Real -((Fft_Real[k+b]*COS_TAB[p])>>7) - ((Fft_Image[k+b]*SIN_TAB[p])>>7);Fft_Image[k+b] = Temp_Imag + ((temp*SIN_TAB[p])>>7) - ((Fft_Image[k+b]*COS_TAB[p])>>7);// 移位.防止溢出. 结果已经是本值的 1/64Fft_Real[k] >>= 1;Fft_Image[k] >>= 1;Fft_Real[k+b] >>= 1;Fft_Image[k+b] >>= 1;}}}// X=((((Fft_Real[1]*Fft_Real[1]))+((Fft_Image[1]*Fft_Image[1])))>>7);Fft_Real[0]=Fft_Image[0]=0; //去掉直流分量// Fft_Real[63]=Fft_Image[63]=0;for(j=0;j<64;j++){TEMP1=((((Fft_Real[j]*Fft_Real[j]))+((Fft_Image[j]*Fft_Image[j])))>>1);//求功率if(TEMP1>1)TEMP1--;else TEMP1=0;if(TEMP1>31)TEMP1=31;if(TEMP1>(LED_TAB[j]))LED_TAB[j]=TEMP1;if(TEMP1>(LED_TAB1[j])){ LED_TAB1[j]=TEMP1;LED_TAB2[j]=18; //提顿速度=12}}}void Init(){//-----------------------------------------------------------------------------------P1ASF = 0x02; //0000,0010, 将 P1.1 置成模拟口AUXR1 &=0xFB; //1111,1011, 令 ADRJ=0EADC=1; //AD中断打开ADC_CONTR = ADC_POWER | ADC_SPEEDHH | ADC_START | channel;//1110 1001 1打开 A/D (ADC_POWER)转换电源;11速度为70周期一次;//0中断标志清零;1启动adc(ADC_START);001AD通道打开(这里为P1.1);//-----------------------------------------------------------------------------------P2M0=1;P0M0=1;TMOD=0X12;TH0=0x30; //大约20K的采样率(要完整频段需40K以上。