嵌入式电子琴设计

合集下载

嵌入式简易电子琴系统设计.

嵌入式简易电子琴系统设计.

嵌入式开发试验嵌入式简易电子琴系统设计ARM2110实验开发板,外接矩阵键盘、蜂鸣器、LED显示屏、LED灯模块(带4.7K电阻)主程序#include "systemInit.h"#include "buzzer.h"#include "music.h"#include "systemInit.h"#define lcden GPIO_PIN_0 //PB0;#define lcdrs GPIO_PIN_2// 定义LED#define LED1_PERIPH#define LED1_PORT#define LED1_PIN#define LED2_PERIPH#define LED2_PORT#define LED2_PIN#define LED3_PERIPH#define LED3_PORT#define LED3_PIN#define LED4_PERIPH#define LED4_PORT#define LED4_PIN#define LED5_PERIPH#define LED5_PORT#define LED5_PIN#define LED6_PERIPH#define LED6_PORT#define LED6_PIN#define LED7_PERIPH#define LED7_PORT#define LED7_PIN#define LED8_PERIPH#define LED8_PORT#define LED8_PIN// 定义KEY#define KEY_PERIPH2#define KEY_PORT2#define KEY_PIN2//PB2; SYSCTL_PERIPH_GPIOA GPIO_PORTA_BASE GPIO_PIN_4SYSCTL_PERIPH_GPIOA GPIO_PORTA_BASE GPIO_PIN_5SYSCTL_PERIPH_GPIOA GPIO_PORTA_BASE GPIO_PIN_6SYSCTL_PERIPH_GPIOG GPIO_PORTG_BASE GPIO_PIN_0SYSCTL_PERIPH_GPIOF GPIO_PORTF_BASE GPIO_PIN_2SYSCTL_PERIPH_GPIOG GPIO_PORTG_BASE GPIO_PIN_1SYSCTL_PERIPH_GPIOE GPIO_PORTE_BASE GPIO_PIN_0SYSCTL_PERIPH_GPIOE GPIO_PORTE_BASE GPIO_PIN_1SYSCTL_PERIPH_GPIOB GPIO_PORTB_BASEGPIO_PIN_6|GPIO_PIN_5|GPIO_PIN_4//连接方式矩阵键盘的行线接PC4~7 列线接PA0~3unsigned char data; //PD0-PD7;unsigned char num;int guan;int jian;int numm;//lcd显示模块技术//lcd模块void write_com(unsigned char com) //写命令{GPIOPinWrite(GPIO_PORTB_BASE,lcdrs,0x00); // lcdrs=0;GPIOPinWrite(GPIO_PORTD_BASE,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2| GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7,com);//PD=com; SysCtlDelay(5 * (TheSysClock / 4000)); // 延时 5ms}void write_data(unsigned char date){GPIOPinWrite(GPIO_PORTB_BASE,lcdrs,0xFF); // lcdrs=1;GPIOPinWrite(GPIO_PORTD_BASE,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2| GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7,date);//PD=date; SysCtlDelay(5 * (TheSysClock / 4000));GPIOPinWrite(GPIO_PORTB_BASE,lcden,0xFF); // lcden=1;SysCtlDelay(5 * (TheSysClock / 4000));GPIOPinWrite(GPIO_PORTB_BASE,lcden,0x00); // lcden=0;GPIOPinWrite(GPIO_PORTB_BASE,lcden,0xFF); // lcden=1; SysCtlDelay(5 * (TheSysClock / 4000)); GPIOPinWrite(GPIO_PORTB_BASE,lcden,0x00); // lcden=0; }void init(){SysCtlPeriEnable(SYSCTL_PERIPH_GPIOD); //使能A端口GPIOPinTypeOut(GPIO_PORTD_BASE, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2| GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7); SysCtlPeriEnable(SYSCTL_PERIPH_GPIOB);GPIOPinTypeOut(GPIO_PORTB_BASE, GPIO_PIN_0|GPIO_PIN_2); GPIOPinWrite(GPIO_PORTB_BASE,lcden,0x00); // lcden=0;}write_com(0x38);write_com(0x0c); write_com(0x06);write_com(0x01); // 在开始清屏 write_com(0x80+0x10); //数据指针地址//lcd模块结束,矩阵键盘模块开始 unsigned char KeyScan(void){ if (GPIOPinRead(KEY_PORT2, KEY_PIN2) == 0x30) // 如果按下KEY2 { num=17; return num; }else if (GPIOPinRead(KEY_PORT2, KEY_PIN2) == 0x50) // 如果按下KEY3{ num=18;return num; }else if (GPIOPinRead(KEY_PORT2, KEY_PIN2) == 0x60) // 如果按下KEY4{ num=16; return num;}GPIOPinTypeOut(GPIO_PORTC_BASE,GPIO_PIN_4| GPIO_PIN_7); GPIOPinTypeOut(GPIO_PORTA_BASE,GPIO_PIN_0| GPIO_PIN_3); GPIOPinWrite(GPIO_PORTC_BASE,GPIO_PIN_4| GPIO_PIN_7,0Xf0); GPIOPinWrite(GPIO_PORTA_BASE,GPIO_PIN_0| GPIO_PIN_3,0X00); GPIOPinTypeIn(GPIO_PORTC_BASE,GPIO_PIN_4| GPIO_PIN_7);guan=GPIOPinRead(GPIO_PORTC_BASE, 0xff)&0xf0;jian=GPIOPinRead(GPIO_PORTA_BASE,0xff)&0x0f; guan=jian|guan; if(guan!=0xf0) { SysCtlDelay(5 * (TheSysClock / 4000));if(guan!=0xf0){ GPIOPinTypeOut(GPIO_PORTC_BASE,GPIO_PIN_4| GPIO_PIN_5| GPIO_PIN_6| GPIO_PIN_7);GPIOPinTypeOut(GPIO_PORTA_BASE,GPIO_PIN_0| GPIO_PIN_3); GPIOPinWrite(GPIO_PORTC_BASE,GPIO_PIN_4| GPIO_PIN_7,0Xf0);GPIO_PIN_1| GPIO_PIN_5|GPIO_PIN_2| GPIO_PIN_6|GPIO_PIN_5| GPIO_PIN_1| GPIO_PIN_5| GPIO_PIN_1| GPIO_PIN_5|GPIO_PIN_6| GPIO_PIN_2| GPIO_PIN_6| GPIO_PIN_2| GPIO_PIN_6| GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_0| GPIO_PIN_1| GPIO_PIN_2| GPIO_PIN_3,0X07);GPIOPinTypeIn(GPIO_PORTC_BASE,GPIO_PIN_4| GPIO_PIN_5| GPIO_PIN_6| GPIO_PIN_7);guan=GPIOPinRead(GPIO_PORTC_BASE, GPIO_PIN_4| GPIO_PIN_5|GPIO_PIN_6| GPIO_PIN_7)&0xf0;jian=GPIOPinRead(GPIO_PORTA_BASE,GPIO_PIN_0| GPIO_PIN_1| GPIO_PIN_2| GPIO_PIN_3)&0x0f;guan=jian|guan;if(guan==0x77){ SysCtlDelay(5 * (TheSysClock / 4000));if(guan==0x77){num=11;return num;}}if(guan==0xb7){ SysCtlDelay(5 * (TheSysClock / 4000));if(guan==0xb7){num=7;return num;}}if(guan==0xd7){ SysCtlDelay(5 * (TheSysClock / 4000));if(guan==0xd7){ num=4;return num;}}if(guan==0xe7){ SysCtlDelay(5 * (TheSysClock / 4000));if(guan==0xe7){ num=0;return num;}}GPIOPinTypeOut(GPIO_PORTC_BASE,GPIO_PIN_4| GPIO_PIN_5|GPIO_PIN_7);GPIOPinWrite(GPIO_PORTA_BASE,GPIO_PIN_0| GPIO_PIN_1|GPIO_PIN_3,0X0b);GPIOPinTypeIn(GPIO_PORTC_BASE,GPIO_PIN_4| GPIO_PIN_5| GPIO_PIN_6| GPIO_PIN_2| GPIO_PIN_6|GPIO_PIN_7);GPIOPinTypeOut(GPIO_PORTA_BASE,GPIO_PIN_0| GPIO_PIN_1| GPIO_PIN_3); GPIOPinWrite(GPIO_PORTC_BASE,GPIO_PIN_4| GPIO_PIN_5|GPIO_PIN_7,0Xf0);guan=GPIOPinRead(GPIO_PORTC_BASE, 0xff)&0xf0;jian=GPIOPinRead(GPIO_PORTA_BASE,0xff)&0x0f;guan=jian|guan;if(guan==0x7b){ SysCtlDelay(5 * (TheSysClock / 4000));if(guan==0x7b){ num=13;return num;}}if(guan==0xbb){ SysCtlDelay(5 * (TheSysClock / 4000));if(guan==0xbb){ num=9;return num;}}if(guan==0xdb){ SysCtlDelay(5 * (TheSysClock / 4000));if(guan==0xdb){ num=6;return num;}}if(guan==0xeb){ SysCtlDelay(5 * (TheSysClock / 4000));if(guan==0xeb){ num=2;return num;}}GPIOPinTypeOut(GPIO_PORTC_BASE,GPIO_PIN_4| GPIO_PIN_5| GPIO_PIN_7); GPIOPinTypeOut(GPIO_PORTA_BASE,GPIO_PIN_0| GPIO_PIN_1| GPIO_PIN_3); GPIOPinWrite(GPIO_PORTC_BASE,GPIO_PIN_4| GPIO_PIN_5|GPIO_PIN_7,0Xf0);GPIOPinWrite(GPIO_PORTA_BASE,GPIO_PIN_0| GPIO_PIN_1| GPIO_PIN_2| GPIO_PIN_6| GPIO_PIN_6| GPIO_PIN_2| GPIO_PIN_6| GPIO_PIN_2|GPIO_PIN_3,0X0d);GPIOPinTypeIn(GPIO_PORTC_BASE,GPIO_PIN_4| GPIO_PIN_5| GPIO_PIN_7); guan=GPIOPinRead(GPIO_PORTC_BASE, 0xff)&0xf0;jian=GPIOPinRead(GPIO_PORTA_BASE,0xff)&0x0f;guan=jian|guan;if(guan==0x7d){ SysCtlDelay(5 * (TheSysClock / 4000));if(guan==0x7d){ num=14;return num;}}if(guan==0xbd){ SysCtlDelay(5 * (TheSysClock / 4000));if(guan==0xbd){ num=10;return num;}}if(guan==0xdd){ SysCtlDelay(5 * (TheSysClock / 4000));if(guan==0xdd){ num=15;return num;}}if(guan==0xed){ SysCtlDelay(5 * (TheSysClock / 4000));if(guan==0xed){ num=3;return num;}}GPIOPinTypeOut(GPIO_PORTC_BASE,GPIO_PIN_4| GPIO_PIN_5| GPIO_PIN_7); GPIOPinTypeOut(GPIO_PORTA_BASE,GPIO_PIN_0| GPIO_PIN_1| GPIO_PIN_3); GPIOPinWrite(GPIO_PORTC_BASE,GPIO_PIN_4| GPIO_PIN_5|GPIO_PIN_7,0Xf0);GPIOPinWrite(GPIO_PORTA_BASE,GPIO_PIN_0| GPIO_PIN_1|GPIO_PIN_3,0X0e);GPIOPinTypeIn(GPIO_PORTC_BASE,GPIO_PIN_4| GPIO_PIN_5| GPIO_PIN_6| GPIO_PIN_6| GPIO_PIN_2| GPIO_PIN_6| GPIO_PIN_2| GPIO_PIN_6|GPIO_PIN_7);guan=GPIOPinRead(GPIO_PORTC_BASE, 0xff)&0xf0;jian=GPIOPinRead(GPIO_PORTA_BASE,0xff)&0x0f; guan=jian|guan;if(guan==0x7e){ SysCtlDelay(5 * (TheSysClock / 4000));if(guan==0x7e){ num=12;return num;}}if(guan==0xbe){ SysCtlDelay(5 * (TheSysClock / 4000));if(guan==0xbe){ num=8;return num;}}if(guan==0xde){ SysCtlDelay(5 * (TheSysClock / 4000));if(guan==0xde){ num=5;return num;}}if(guan==0xee){ SysCtlDelay(5 * (TheSysClock / 4000));if(guan==0xee){ num=1;return num;}}}}}// 主函数(程序入口)int main(void){SysCtlPeriEnable(LED1_PERIPH); // 使能LED所在的GPIO端口GPIOPinTypeOut(LED1_PORT, LED1_PIN); // 设置LED所在的管脚为输出SysCtlPeriEnable(LED2_PERIPH); // 使能LED所在的GPIO端口GPIOPinTypeOut(LED2_PORT, LED2_PIN); // 设置LED所在的管脚为输出SysCtlPeriEnable(LED3_PERIPH); GPIO端口GPIOPinTypeOut(LED3_PORT, LED3_PIN); 的管脚为输出SysCtlPeriEnable(LED4_PERIPH); GPIO端口GPIOPinTypeOut(LED4_PORT, LED4_PIN); 的管脚为输出SysCtlPeriEnable(LED5_PERIPH); GPIO端口GPIOPinTypeOut(LED5_PORT, LED5_PIN); 的管脚为输出SysCtlPeriEnable(LED6_PERIPH); GPIO端口GPIOPinTypeOut(LED6_PORT, LED6_PIN); 的管脚为输出SysCtlPeriEnable(LED7_PERIPH); GPIO端口GPIOPinTypeOut(LED7_PORT, LED7_PIN); 的管脚为输出SysCtlPeriEnable(LED8_PERIPH); GPIO端口GPIOPinTypeOut(LED8_PORT, LED8_PIN); 的管脚为输出clockInit(); 6MHzbuzzerInit(); init();SysCtlPeriEnable(SYSCTL_PERIPH_GPIOA); // 使能LED所在的 // 设置LED所在// 使能LED所在的 // 设置LED所在 // 使能LED所在的 // 设置LED所在 // 使能LED所在的 // 设置LED所在 // 使能LED所在的 // 设置LED所在 // 使能LED所在的 // 设置LED所在// 时钟初始化:晶振, // 使能LED所在的GPIO端口SysCtlPeriEnable(SYSCTL_PERIPH_GPIOC);GPIOPinTypeIn(GPIO_PORTA_BASE, GPIO_PIN_0| GPIO_PIN_3); GPIOPinTypeIn(GPIO_PORTC_BASE, GPIO_PIN_4| GPIO_PIN_7); SysCtlPeriEnable(KEY_PERIPH2); // 使能KEY所在的GPIO_PIN_1| GPIO_PIN_5| GPIO_PIN_2| GPIO_PIN_6|GPIO端口GPIOPinTypeIn(KEY_PORT2, KEY_PIN2); 管脚为输入for (;;) {switch( KeyScan()) {case 14:GPIOPinWrite(LED1_PORT, LED1_PIN, 0x00); GPIOPinWrite(LED2_PORT,LED2_PIN, 0xFF); GPIOPinWrite(LED3_PORT, LED3_PIN, 0xFF); GPIOPinWrite(LED4_PORT, LED4_PIN, 0xFF); GPIOPinWrite(LED5_PORT,LED5_PIN, 0xFF); GPIOPinWrite(LED6_PORT, LED6_PIN, 0xFF); GPIOPinWrite(LED7_PORT, LED7_PIN, 0xFF);GPIOPinWrite(LED8_PORT, LED8_PIN, 0xFF); //lcd滚动显示musicPlay(0);//调用电子琴音频write_com(0x82); //设定上排的显示位置 write_data(32); // 空格 write_data(32); // 空格 write_data(32); // 空格 write_data(32); // 空格write_data(32); // 空格write_data(76); //整型数据转换为ASC2//l write_data(53); //整型数据转换为ASC2 //5 write_data(32); // 空格 write_data(32); // 空格 write_data(32); // 空格write_data(32); // 空格 write_data(32); // 空格 write_data(32); // 空格 //lcd显示结束buzzerQuiet(); break;// 设置KEY所在 // 点亮LED // 熄灭LED // 熄灭LED // 熄灭LED // 熄灭LED // 熄灭LED // 熄灭LED //熄灭LEDcase 7:GPIOPinWrite(LED1_PORT, LED1_PIN, 0x00); // 点亮LEDGPIOPinWrite(LED2_PORT, LED2_PIN, 0xFF); // 熄灭LEDGPIOPinWrite(LED3_PORT, LED3_PIN, 0xFF); // 熄灭LEDGPIOPinWrite(LED4_PORT, LED4_PIN, 0xFF); // 熄灭LEDGPIOPinWrite(LED5_PORT, LED5_PIN, 0xFF); // 熄灭LEDGPIOPinWrite(LED6_PORT, LED6_PIN, 0xFF); // 熄灭LEDGPIOPinWrite(LED7_PORT, LED7_PIN, 0xFF); // 熄灭LEDGPIOPinWrite(LED8_PORT, LED8_PIN, 0xFF); musicPlay(2);//调用电子琴音频write_com(0x82); //设定上排的显示位置 write_data(32); // 空格 write_data(32); // 空格 write_data(32); // 空格 write_data(32); // 空格write_data(32); // 空格write_data(76); //整型数据转换为ASC2//l write_data(54); //整型数据转换为ASC2 //6 write_data(32); // 空格 write_data(32); // 空格 write_data(32); // 空格write_data(32); // 空格 write_data(32); // 空格 write_data(32); // 空格SysCtlDelay(100 * (TheSysClock / 4000)); buzzerQuiet();break;case 11:GPIOPinWrite(LED1_PORT, LED1_PIN, 0x00); GPIOPinWrite(LED2_PORT,LED2_PIN, 0x00); GPIOPinWrite(LED3_PORT, LED3_PIN, 0xFF); GPIOPinWrite(LED4_PORT, LED4_PIN, 0xFF); GPIOPinWrite(LED5_PORT, LED5_PIN, 0xFF); GPIOPinWrite(LED6_PORT, LED6_PIN, 0xFF); GPIOPinWrite(LED7_PORT, LED7_PIN, 0xFF); GPIOPinWrite(LED8_PORT, LED8_PIN, 0xFF);musicPlay(1);//调用电子琴音频write_com(0x82); //设定上排的显示位置 write_data(32); // 空格 write_data(32); // 空格 write_data(32); // 空格// 熄灭LED // 点亮LED // 点亮LED // 熄灭LED // 熄灭LED // 熄灭LED // 熄灭LED // 熄灭LED // 熄灭LEDwrite_data(32); // 空格write_data(32); // 空格write_data(76); //整型数据转换为ASC2//l write_data(55); //整型数据转换为ASC2 //6 write_data(32); // 空格 write_data(32); // 空格 write_data(32); // 空格write_data(32); // 空格 write_data(32); // 空格 write_data(32); // 空格SysCtlDelay(100 * (TheSysClock / 4000)); buzzerQuiet(); break;case 1:GPIOPinWrite(LED1_PORT, LED1_PIN, 0x00); GPIOPinWrite(LED2_PORT,LED2_PIN, 0x00); GPIOPinWrite(LED3_PORT, LED3_PIN, 0xFF); GPIOPinWrite(LED4_PORT, LED4_PIN, 0xFF); GPIOPinWrite(LED5_PORT, LED5_PIN, 0xFF); GPIOPinWrite(LED6_PORT, LED6_PIN, 0xFF); GPIOPinWrite(LED7_PORT, LED7_PIN, 0xFF); GPIOPinWrite(LED8_PORT, LED8_PIN, 0xFF); musicPlay(2);write_com(0x82); //设定上排的显示位置 write_data(32); // 空格write_data(32); // 空格 write_data(32); // 空格 write_data(32); // 空格 write_data(32); // 空格write_data(77); //整型数据转换为ASC2//l write_data(49); //整型数据转换为ASC2 //6 write_data(32); // 空格 write_data(32); // 空格 write_data(32); // 空格write_data(32); // 空格 write_data(32); // 空格write_data(32); // 空格SysCtlDelay(100 * (TheSysClock / 4000)); buzzerQuiet(); break;case 5:GPIOPinWrite(LED1_PORT, LED1_PIN, 0x00); // 点亮LED // 点亮LED // 熄灭LED // 熄灭LED // 熄灭LED // 熄灭LED // 熄灭LED // 熄灭LED // 点亮LED GPIOPinWrite(LED2_PORT, LED2_PIN, 0x00); // 点亮LEDGPIOPinWrite(LED3_PORT, LED3_PIN, 0x00); // 点亮LEDGPIOPinWrite(LED4_PORT, LED4_PIN, 0xFF); // 熄灭LEDGPIOPinWrite(LED5_PORT, LED5_PIN, 0xFF); // 熄灭LEDGPIOPinWrite(LED6_PORT, LED6_PIN, 0xFF); // 熄灭LEDGPIOPinWrite(LED7_PORT, LED7_PIN, 0xFF); // 熄灭LEDGPIOPinWrite(LED8_PORT, LED8_PIN, 0xFF); // 熄灭LED musicPlay(3); SysCtlDelay(40 * (TheSysClock / 3000));write_com(0x82); //设定上排的显示位置 write_data(32); // 空格 write_data(32); // 空格 write_data(32); // 空格 write_data(32); // 空格write_data(32); // 空格write_data(77); //整型数据转换为ASC2//l write_data(50); //整型数据转换为ASC2 //6 write_data(32); // 空格 write_data(32); // 空格 write_data(32); // 空格write_data(32); // 空格 write_data(32); // 空格 write_data(32); // 空格SysCtlDelay(100 * (TheSysClock / 4000)); buzzerQuiet(); break;case 8:GPIOPinWrite(LED1_PORT, LED1_PIN, 0x00); GPIOPinWrite(LED2_PORT,LED2_PIN, 0x00); GPIOPinWrite(LED3_PORT, LED3_PIN, 0x00); GPIOPinWrite(LED4_PORT, LED4_PIN, 0xFF); GPIOPinWrite(LED5_PORT, LED5_PIN, 0xFF); GPIOPinWrite(LED6_PORT, LED6_PIN, 0xFF); GPIOPinWrite(LED7_PORT, LED7_PIN, 0xFF); GPIOPinWrite(LED8_PORT, LED8_PIN, 0xFF); musicPlay(4);SysCtlDelay(40 * (TheSysClock / 3000));write_com(0x82); //设定上排的显示位置 write_data(32); // 空格 write_data(32); // 空格 write_data(32); // 空格 write_data(32); // 空格 write_data(32); // 空格// 点亮LED // 点亮LED // 点亮LED // 熄灭LED // 熄灭LED // 熄灭LED // 熄灭LED // 熄灭LEDwrite_data(77); //整型数据转换为ASC2//l write_data(51); //整型数据转换为ASC2 //6 write_data(32); // 空格 write_data(32); // 空格 write_data(32);// 空格write_data(32); // 空格 write_data(32); // 空格write_data(32); // 空格SysCtlDelay(100 * (TheSysClock / 4000)); buzzerQuiet(); break;case 12:GPIOPinWrite(LED1_PORT, LED1_PIN, 0x00); GPIOPinWrite(LED2_PORT,LED2_PIN, 0x00); GPIOPinWrite(LED3_PORT, LED3_PIN, 0x00); GPIOPinWrite(LED4_PORT, LED4_PIN, 0x00); GPIOPinWrite(LED5_PORT,LED5_PIN, 0xFF); GPIOPinWrite(LED6_PORT, LED6_PIN, 0xFF); GPIOPinWrite(LED7_PORT, LED7_PIN, 0xFF); GPIOPinWrite(LED8_PORT, LED8_PIN, 0xFF); musicPlay(5);SysCtlDelay(40 * (TheSysClock / 3000));write_com(0x82); //设定上排的显示位置 write_data(32); // 空格 write_data(32); // 空格 write_data(32); // 空格write_data(32); // 空格 write_data(32); // 空格write_data(77); //整型数据转换为ASC2//l write_data(52); //整型数据转换为ASC2 //6 write_data(32); // 空格 write_data(32); // 空格 write_data(32); // 空格write_data(32); // 空格 write_data(32); // 空格 write_data(32); // 空格SysCtlDelay(100 * (TheSysClock / 4000)); buzzerQuiet(); break;case 3:GPIOPinWrite(LED1_PORT, LED1_PIN, 0x00); GPIOPinWrite(LED2_PORT,LED2_PIN, 0x00); // 点亮LED // 点亮LED // 点亮LED // 点亮LED // 熄灭LED // 熄灭LED // 熄灭LED // 熄灭LED // 点亮LED // 点亮LEDGPIOPinWrite(LED3_PORT, LED3_PIN, 0x00); // 点亮LEDGPIOPinWrite(LED4_PORT, LED4_PIN, 0x00); // 点亮LEDGPIOPinWrite(LED5_PORT, LED5_PIN, 0xFF); // 熄灭LEDGPIOPinWrite(LED6_PORT, LED6_PIN, 0xFF); // 熄灭LEDGPIOPinWrite(LED7_PORT, LED7_PIN, 0xFF); // 熄灭LEDGPIOPinWrite(LED8_PORT, LED8_PIN, 0xFF); // 熄灭LED musicPlay(6); SysCtlDelay(40 * (TheSysClock / 3000));write_com(0x82); //设定上排的显示位置 write_data(32); // 空格 write_data(32); // 空格 write_data(32); // 空格 write_data(32); // 空格 write_data(32); // 空格write_data(77); //整型数据转换为ASC2//l write_data(53); //整型数据转换为ASC2 //6 write_data(32); // 空格 write_data(32); // 空格 write_data(32); // 空格write_data(32); // 空格 write_data(32); // 空格 write_data(32); // 空格SysCtlDelay(100 * (TheSysClock / 4000)); buzzerQuiet(); break;case 15:GPIOPinWrite(LED1_PORT, LED1_PIN, 0x00); GPIOPinWrite(LED2_PORT,LED2_PIN, 0x00); GPIOPinWrite(LED3_PORT, LED3_PIN, 0x00); GPIOPinWrite(LED4_PORT, LED4_PIN, 0x00); GPIOPinWrite(LED5_PORT,LED5_PIN, 0x00); GPIOPinWrite(LED6_PORT, LED6_PIN, 0xFF); GPIOPinWrite(LED7_PORT, LED7_PIN, 0xFF); GPIOPinWrite(LED8_PORT, LED8_PIN, 0xFF); musicPlay(7);SysCtlDelay(40 * (TheSysClock / 3000));//lcd显示write_com(0x82); //设定上排的显示位置 write_data(32); // 空格 write_data(32); // 空格 write_data(32); // 空格 write_data(32); // 空格// 点亮LED // 点亮LED // 点亮LED // 点亮LED // 点亮LED // 熄灭LED // 熄灭LED // 熄灭LEDwrite_data(32); // 空格write_data(77); //整型数据转换为ASC2//l write_data(54); //整型数据转换为ASC2 //6 write_data(32); // 空格 write_data(32); // 空格 write_data(32); // 空格write_data(32); // 空格 write_data(32); // 空格 write_data(32); // 空格SysCtlDelay(100 * (TheSysClock / 4000)); buzzerQuiet(); //lcd显示结束 break; case 10:GPIOPinWrite(LED1_PORT, LED1_PIN, 0x00); GPIOPinWrite(LED2_PORT,LED2_PIN, 0x00); GPIOPinWrite(LED3_PORT, LED3_PIN, 0x00); GPIOPinWrite(LED4_PORT, LED4_PIN, 0x00); GPIOPinWrite(LED5_PORT,LED5_PIN, 0x00); GPIOPinWrite(LED6_PORT, LED6_PIN, 0xFF); GPIOPinWrite(LED7_PORT, LED7_PIN, 0xFF); GPIOPinWrite(LED8_PORT, LED8_PIN, 0xFF); musicPlay(8);SysCtlDelay(40 * (TheSysClock / 3000));write_com(0x82); //设定上排的显示位置 write_data(32); // 空格 write_data(32); // 空格 write_data(32); // 空格 write_data(32); // 空格write_data(32); // 空格write_data(77); //整型数据转换为ASC2//l write_data(55); //整型数据转换为ASC2 //6 write_data(32); // 空格 write_data(32); // 空格 write_data(32); // 空格write_data(32); // 空格 write_data(32); // 空格 write_data(32); // 空格SysCtlDelay(100 * (TheSysClock / 4000)); buzzerQuiet(); break;case 2:// 点亮LED // 点亮LED // 点亮LED // 点亮LED // 点亮LED // 熄灭LED // 熄灭LED // 熄灭LEDGPIOPinWrite(LED1_PORT, LED1_PIN, 0x00); // 点亮LEDGPIOPinWrite(LED2_PORT, LED2_PIN, 0x00); // 点亮LEDGPIOPinWrite(LED3_PORT, LED3_PIN, 0x00); // 点亮LEDGPIOPinWrite(LED4_PORT, LED4_PIN, 0x00); // 点亮LEDGPIOPinWrite(LED5_PORT, LED5_PIN, 0x00); // 点亮LEDGPIOPinWrite(LED6_PORT, LED6_PIN, 0x00); // 点亮LEDGPIOPinWrite(LED7_PORT, LED7_PIN, 0xFF); // 熄灭LEDGPIOPinWrite(LED8_PORT, LED8_PIN, 0xFF); // 熄灭LED musicPlay(9);SysCtlDelay(40 * (TheSysClock / 3000));write_com(0x82); //设定上排的显示位置 write_data(32); // 空格 write_data(32); // 空格 write_data(32); // 空格 write_data(32); // 空格 write_data(32); // 空格write_data(72); //整型数据转换为ASC2//l write_data(49); //整型数据转换为ASC2 //6 write_data(32); // 空格 write_data(32); // 空格 write_data(32); // 空格write_data(32); // 空格 write_data(32); // 空格 write_data(32); // 空格SysCtlDelay(100 * (TheSysClock / 4000)); buzzerQuiet(); break;case 6:GPIOPinWrite(LED1_PORT, LED1_PIN, 0x00); GPIOPinWrite(LED2_PORT,LED2_PIN, 0x00); GPIOPinWrite(LED3_PORT, LED3_PIN, 0x00); GPIOPinWrite(LED4_PORT, LED4_PIN, 0x00); GPIOPinWrite(LED5_PORT,LED5_PIN, 0x00); GPIOPinWrite(LED6_PORT, LED6_PIN, 0x00); GPIOPinWrite(LED7_PORT, LED7_PIN, 0xFF); GPIOPinWrite(LED8_PORT, LED8_PIN, 0xFF); musicPlay(10);SysCtlDelay(40 * (TheSysClock / 3000));write_com(0x82); //设定上排的显示位置 write_data(32); // 空格 write_data(32); // 空格 write_data(32); // 空格 write_data(32); // 空格// 点亮LED // 点亮LED // 点亮LED // 点亮LED // 点亮LED // 点亮LED // 熄灭LED // 熄灭LEDwrite_data(32); // 空格write_data(72); //整型数据转换为ASC2//l write_data(50); //整型数据转换为ASC2 //6 write_data(32); // 空格 write_data(32); // 空格 write_data(32); // 空格write_data(32); // 空格 write_data(32); // 空格 write_data(32); // 空格SysCtlDelay(100 * (TheSysClock / 4000)); buzzerQuiet(); break;case 9:GPIOPinWrite(LED1_PORT, LED1_PIN, 0x00); GPIOPinWrite(LED2_PORT,LED2_PIN, 0x00); GPIOPinWrite(LED3_PORT, LED3_PIN, 0x00); GPIOPinWrite(LED4_PORT, LED4_PIN, 0x00); GPIOPinWrite(LED5_PORT,LED5_PIN, 0x00); GPIOPinWrite(LED6_PORT, LED6_PIN, 0x00); GPIOPinWrite(LED7_PORT, LED7_PIN, 0x00); GPIOPinWrite(LED8_PORT,LED8_PIN, 0xFF); musicPlay(11);SysCtlDelay(40 * (TheSysClock / 3000));write_com(0x82); //设定上排的显示位置 write_data(32); // 空格 write_data(32); // 空格 write_data(32); // 空格 write_data(32); // 空格 write_data(32); // 空格write_data(72); //整型数据转换为ASC2//l write_data(51); //整型数据转换为ASC2 //6 write_data(32); // 空格 write_data(32); // 空格 write_data(32); // 空格write_data(32); // 空格 write_data(32); // 空格write_data(32); // 空格SysCtlDelay(100 * (TheSysClock / 4000)); buzzerQuiet(); break;case 13:GPIOPinWrite(LED1_PORT, LED1_PIN, 0x00); // 点亮LED // 点亮LED // 点亮LED // 点亮LED // 点亮LED // 点亮LED // 点亮LED // 熄灭LED // 点亮LED GPIOPinWrite(LED2_PORT, LED2_PIN, 0x00); // 点亮LEDGPIOPinWrite(LED3_PORT, LED3_PIN, 0x00); GPIOPinWrite(LED4_PORT,LED4_PIN, 0x00); GPIOPinWrite(LED5_PORT, LED5_PIN, 0x00); GPIOPinWrite(LED6_PORT, LED6_PIN, 0x00);// 点亮LED // 点亮LED // 点亮LED // 点亮LEDGPIOPinWrite(LED7_PORT, LED7_PIN, 0x00); // 点亮LEDGPIOPinWrite(LED8_PORT, LED8_PIN, 0xFF); // 熄灭LED musicPlay(12); SysCtlDelay(40 * (TheSysClock / 3000));write_com(0x82); //设定上排的显示位置 write_data(32); // 空格 write_data(32); // 空格 write_data(32); // 空格 write_data(32); // 空格write_data(32); // 空格write_data(72); //整型数据转换为ASC2//l write_data(52); //整型数据转换为ASC2 //6 write_data(32); // 空格 write_data(32); // 空格 write_data(32); // 空格write_data(32); // 空格 write_data(32); // 空格 write_data(32); // 空格SysCtlDelay(100 * (TheSysClock / 4000)); buzzerQuiet(); break;case 0:GPIOPinWrite(LED1_PORT, LED1_PIN, 0x00); GPIOPinWrite(LED2_PORT,LED2_PIN, 0x00); GPIOPinWrite(LED3_PORT, LED3_PIN, 0x00); GPIOPinWrite(LED4_PORT, LED4_PIN, 0x00); GPIOPinWrite(LED5_PORT,LED5_PIN, 0x00); GPIOPinWrite(LED6_PORT, LED6_PIN, 0x00); GPIOPinWrite(LED7_PORT, LED7_PIN, 0x00); GPIOPinWrite(LED8_PORT,LED8_PIN, 0x00); musicPlay(13);SysCtlDelay(40 * (TheSysClock / 3000));write_com(0x82); //设定上排的显示位置 write_data(32); // 空格 write_data(32); // 空格 write_data(32); // 空格 write_data(32); // 空格 write_data(32); // 空格// 点亮LED // 点亮LED // 点亮LED // 点亮LED // 点亮LED // 点亮LED // 点亮LED // 点亮LEDwrite_data(72); //整型数据转换为ASC2//l write_data(53); //整型数据转换为ASC2 //6 write_data(32); // 空格 write_data(32); // 空格 write_data(32);// 空格write_data(32); // 空格 write_data(32); // 空格write_data(32); // 空格SysCtlDelay(100 * (TheSysClock / 4000)); buzzerQuiet(); break;case 4:GPIOPinWrite(LED1_PORT, LED1_PIN, 0x00); GPIOPinWrite(LED2_PORT, LED2_PIN, 0x00); GPIOPinWrite(LED3_PORT, LED3_PIN, 0x00); GPIOPinWrite(LED4_PORT, LED4_PIN, 0x00); GPIOPinWrite(LED5_PORT, LED5_PIN, 0x00); GPIOPinWrite(LED6_PORT, LED6_PIN, 0x00); GPIOPinWrite(LED7_PORT, LED7_PIN, 0x00); GPIOPinWrite(LED8_PORT, LED8_PIN, 0x00); musicPlay(14);SysCtlDelay(40 * (TheSysClock / 3000)); write_com(0x82); //设定上排的显示位置write_data(32); // 空格 write_data(32); // 空格 write_data(32); // 空格write_data(32); // 空格 write_data(32); // 空格write_data(72); //整型数据转换为ASC2//l write_data(54); //整型数据转换为ASC2 //6 write_data(32); // 空格 write_data(32); // 空格 write_data(32); // 空格write_data(32); // 空格 write_data(32); // 空格 write_data(32); // 空格SysCtlDelay(100 * (TheSysClock / 4000)); buzzerQuiet(); break;//barbers 理发师case 18:write_com(0x82); //设定上排的显示位置// 点亮LED // 点亮LED // 点亮LED // 点亮LED // 点亮LED // 点亮LED // 点亮LED // 点亮LEDwrite_data(32); // 空格write_data(32); // 空格write_data(32); // 空格write_data(66); // Bwrite_data(97); // awrite_data(114); // rwrite_data(66); // bwrite_data(101); // ewrite_data(114); // rwrite_data(115); // swrite_data(32); // 空格write_data(32); // 空格write_data(32); // 空格SysCtlDelay(100 * (TheSysClock / 4000)); musicPlayyyy();SysCtlDelay(40 * (TheSysClock / 3000)); buzzerQuiet();break;//The Butterfly 化蝶case 16:write_com(0x82); //设定上排的显示位置 write_data(84); // Twrite_data(104); // hwrite_data(101); // ewrite_data(32); // 空格write_data(66); // Bwrite_data(117); // uwrite_data(116); // twrite_data(116); // twrite_data(101); // ewrite_data(114); // rwrite_data(102); // fwrite_data(108); // lwrite_data(121); // ySysCtlDelay(100 * (TheSysClock / 4000)); //SysCtlDelay(800 * (TheSysClock / 4000)); musicPlayy();SysCtlDelay(40 * (TheSysClock / 3000)); buzzerQuiet();break;//A penny 一分钱case 17:write_com(0x82); //设定上排的显示位置 write_data(32); // 空格write_data(32); // 空格write_data(32); // 空格write_data(65); // Awrite_data(32); // 空格write_data(112); // pwrite_data(101); // ewrite_data(110); // n}}}write_data(110); // n write_data(121); // y write_data(32); // 空格 write_data(32); // 空格 write_data(32); // 空格 SysCtlDelay(100 * (TheSysClock / 4000)); musicPlayyy(); SysCtlDelay(40 * (TheSysClock / 3000)); buzzerQuiet(); break;。

单片机应用课程设计--简易电子琴设计

单片机应用课程设计--简易电子琴设计
{
delay(5);
if (key1 == 0)
{
key_in_flag = 0;
key_value = 4;
}
}
else
{
key_in_flag = 1;
}
key8 = 1;
key7 = 0;
if (key4 == 0)
{
delay(5);
if (key4 == 0)
{
key_in_flag = 0;
参考文献
[1] 赵鑫,蒋亮,齐兆群.数字电路设计[M].北京机械工业出版社,2005年6月第一版
[2] 苏家健,曹柏荣,汪志锋.单片机原理及应用技术[M].高等教育出版社
[3] 李朝青.单片机原理及接口技术[M].北京:北京航天航空大学出版色,2001
[4] 胡汉才.单片机原理及其接口技术[M].北京:清华大学出版社,2004
{
key_in_flag = 0;
key_value = 2;
}
}
else
{
key_in_flag = 1;
}
if (key2 == 0)
{
delay(5);
if (key2 == 0)
{
key_in_flag = 0;
key_value = 3;
}
}
else
{
key_in_flag = 1;
}
if (key1 == 0)
方案二: 采用AT89C51单片机进行控制,由于AT89C51不具备ISP功能, 因此Atmel公司已经停产在市面上已经不常见,况且其ROM只有4K在系统将来升级方面没有潜力。
方案三:采用AT89S52单片机进行控制,由于其性价比高,完全满足了本作品智能化的要求,它的内部程序存储空间达到8K,使软件设计有足够的内部使用空间并且方便日后系统升级,使用方便,抗干扰性能提高。

基于ARM+Linux的模拟电子琴设计

基于ARM+Linux的模拟电子琴设计

基于ARM+Linux的模拟电子琴设计作者:胡淼元何文德杨凤年来源:《电脑知识与技术》2020年第15期摘要:采用以ARMCortex-A8架构的s5pv210处理器为核心的硬件平台,以嵌入式Linux 为软件平台,开发了一款模拟电子琴软件。

打开模拟电子琴程序后,演奏者可在液晶屏上显示的琴键通过触摸屏弹奏乐曲。

此外,模拟电子琴系统中内置了数十首中外流行的乐曲,演奏者选中某首乐曲后,可在液晶屏上显示其简谱或五线谱,电子琴还可自动演奏所选中的乐曲。

关键词:嵌入式Linux;电子琴;图片显示;音符发声中图分类号:TP319 文献标识码:A文章编号:1009-3044(2020)15-0253-02嵌人式系统的广泛应用令家电以及玩具产业日新月异,同时也极大提高了电子产品的设计效率和产品品质。

电子琴属于嵌入式系统产品范畴,其种类很多,通常适合5岁以上儿童以及成人的学习和演奏,价格一般在几千元乃至数万元。

然而,对于培养和启发儿童和青少年的音乐兴趣来说,不必拘泥于价格昂贵且不太便于携带的电子琴,一款价格亲民的具备模拟电子琴功能的平板电脑,或许就能满足普通家庭的需求。

因此,融合计算机技术和嵌入式系统技术的模拟电子琴的研究及设计开发受已受到了业界的关注。

这类模拟电子琴基于便携式的硬件平台,能通过寓教于乐的方式培养青少年的音乐兴趣、普及乐理知识,深受人们的青睐。

1系统方案设计电子琴通常采用振荡器和分频器获得音频信号,再经过运放电路放大,最后驱动扬声器发声,键盘用于控制进入扬声器信号的频率,最终实现电子琴的功能。

本文在实现模拟电子琴基本功能的基础上,还增添了自动演奏和乐谱提示等功能,使其更具有趣味性和益智性。

该设计由硬件和软件两部分组成,硬件以ARM Cortex-A8架构的s5pv210处理器为核心,结合内存和Flash存储器组成核心板,再加上液晶屏(LCD)、触摸屏、扬声器等模块构成。

模拟电子琴包含两种工作模式:(1)弹奏模式,为电子琴的基本工作模式,依次按下键盘区的1-8号按键时,扬声器就会依次发出Do、Re、Mi、Fa、So、La、Si、高音段的Do等8个音符。

基于89C51单片机的电子琴设计

基于89C51单片机的电子琴设计

学生毕业设计(论文)报告系别:电子与电气工程学院专业:应用电子技术班号:应电1毕业设计(论文)任务书专业应用电子技术班级应电1 姓名一、课题名称:基于89C51单片机的电子琴设计二、主要技术指标:1、演奏音乐,不同频率音符的播放2、可通过按键发出“5 6 7...1 2 3 4 5 6 7 1”等11个音阶3、11个音阶的频率分别为:“190HZ 220HZ 247HZ 262HZ 294HZ 330HZ 349HZ 392HZ 440HZ 494HZ 552HZ”三、工作内容和要求:内容:本课题是基于A T89C51单片机为核心控制部分,是通过制作硬件电路和软件的设计编写,最终达到乐器演奏功能。

特点是设计简单、清晰。

本次设计让我们了解令扬声器发生的方法、熟悉按键输入的处理方法,然后我们才能够设计出电子琴的设计方案,大致列出电子琴的内容和所要设计的内容,收索更多的资料来完善设计。

从而来达到我要设计的电子琴的功能,达到我所预期的效果。

要求:1、认真有耐性,要对每一个设计方案的步骤要熟悉,条理要分明清晰。

2、做好硬件电路部分和软件电路部分。

3、把做好后的电路在最后进行调试,使能正常运行。

四、主要参考文献:[1] 主编:张桂红.副主编:姚建永.单片机原理与应用.福建科学技术出版社[2] 韩志军等.单片机应用系统设计[M].机械工业出版社,2004年[3] 李广弟朱月秀冷祖祁编著.单片机基础(第3版).北京航空航天大学出版社学生(签名)年月日指导教师(签名)年月日教研室主任(签名)年月日系主任(签名)年月日毕业设计(论文)开题报告设计(论文)题目AT89C51单片机的电子琴设计一、选题的背景和意义:背景:1、电子琴是键盘乐器,采用半导体集成电路,对乐音信号进行放大,通过扬声器产生音响。

属于电子乐器,发音音量可以自由调节。

音域较宽,和声丰富,甚至可以演奏出一个管弦乐队的效果,表现力极其丰富。

2、电子琴是电声乐队的中坚力量,常用于独奏主旋律并伴以丰富的和声。

基于ARM的高级电子琴的设计

基于ARM的高级电子琴的设计

编号:(嵌入式系统设计)实训论文说明书题目:基于嵌入式ARM的高级电子琴设计院(系):信息与通信学院专业:电子信息工程学生姓名:学号:指导教师:2013年12月30日摘要ARM7的设计精髓是结构简单。

ARM7内核采用了精简指令集计算机(RISC)设计思想,所用逻辑门数较少,硅片面积小,但具有高性能、低功耗的特点,这使得ARM7 成为嵌入式系统的理想选择。

ARM7内核包括ARM7TDMI(-S)、ARM720T 等,ARM7TDMI 处理器内核已经许可给许多世界顶级半导体公司,它是第一个包括Thumb 指令集、快速乘法指令和嵌入式ICE 调试技术的内核。

本论文主要介绍利用213X系列最小系统板,完成一个高级电子琴的设计,需要设置琴键输入以及LM386的功率放大驱动喇叭,主要功能通过程序编译来完成。

关键词:A RM7;键盘;LM386;电子琴目录引言 (1)1设计要求及功能 (1)2 系统硬件的构成 (1)3 系统模块介绍 (2)3.1 LPC2132系统模块 (2)3.1.1 LPC2132 概述 (2)3.1.2 LPC2132特性 (2)3.2 4x4矩阵琴键键盘 (3)3.2.1行列式键盘工作原理 (4)3.2.2键盘识别原理 (4)3.2.3键盘电路介绍 (4)3.3 LM386与蜂鸣器介绍 (5)3.3.1 LM386 (5)3.3.2 蜂鸣器简介 (6)3.3.3蜂鸣器驱动电路分析 (7)4 电路板的制作及调试 (8)4.1 电路板的绘画及制作 (8)4.2 调试 (9)4.2.1 硬件调试 (9)4.2.2 软件调试 (9)4.2.3 综合调试 (10)5 总结 (10)参考文献 (13)附录 (14)引言随着电子技术的不断发展,嵌入式系统又进入了一个新的发展阶段。

从开始的8位发展到后来的16位机,16位又发展到了现在的32位。

嵌入式系统具有强大的控制功能和灵活的编程实现特性,它已经融入了现代人们的生活中,成为不可替代的一部分。

基于单片机的电子琴设计

基于单片机的电子琴设计

基于单片机的电子琴设计一、引言二、总体设计方案(一)设计目标设计一款基于单片机的电子琴,能够实现基本的音符演奏、音色切换、节奏控制等功能,并且具有良好的音质和稳定性。

(二)系统组成本电子琴系统主要由单片机控制模块、键盘输入模块、音频输出模块、显示模块和电源模块等部分组成。

1、单片机控制模块选用 STM32 系列单片机作为控制核心,负责处理键盘输入信号、生成音频信号、控制显示等功能。

2、键盘输入模块采用矩阵键盘,通过扫描键盘获取用户的按键操作,将其转换为对应的音符编码发送给单片机。

3、音频输出模块使用DAC 芯片将单片机生成的数字音频信号转换为模拟音频信号,再通过放大器和扬声器输出声音。

4、显示模块采用液晶显示屏,用于显示当前的演奏状态、音色选择、节奏模式等信息。

5、电源模块为整个系统提供稳定的电源供应,可采用电池供电或外接电源适配器。

三、硬件设计(一)单片机最小系统STM32 单片机的最小系统包括时钟电路、复位电路和电源电路。

时钟电路为单片机提供工作时钟,复位电路用于系统初始化,电源电路为单片机提供稳定的电源。

(二)键盘电路矩阵键盘由行线和列线组成,通过逐行扫描的方式检测按键状态。

将键盘的行线和列线分别连接到单片机的 GPIO 引脚,通过编程实现键盘扫描和按键识别。

(三)音频输出电路选用高性能的 DAC 芯片,如 PCM1794,将单片机输出的数字音频信号转换为模拟音频信号。

为了提高音频输出的质量,还需要添加放大器和滤波电路,以增强信号的功率和去除噪声。

(四)显示电路液晶显示屏通过 SPI 接口或 I2C 接口与单片机连接,单片机通过发送指令和数据来控制显示屏的显示内容。

(五)电源电路根据系统的工作电压和电流需求,选择合适的电源芯片,如LM7805 等,将输入电源转换为所需的电压,并通过滤波电容等元件提高电源的稳定性。

四、软件设计(一)主程序流程主程序首先进行系统初始化,包括单片机初始化、键盘初始化、音频输出初始化、显示初始化等。

《嵌入式系统原理与应用》综合设计—简易电子琴系统设计

《嵌入式系统原理与应用》综合设计—简易电子琴系统设计

《嵌入式系统原理与应用》综合设计简易电子琴系统设计系部:电子与信息工程系专业班级:电子信息工程09秋2班姓名:学号:小组成员:指导教师:完成日期2012年6月目录1 前言 (1)1.1电子琴介绍 (1)1.2嵌入式电子琴发展趋势 (2)1.3实现目标 (2)2 总体设计 (3)2.1利用实验资源实现简易电子琴的功能。

(3)2.2主要技术指标 (3)3 硬件设计 (4)3.1 LM3S2110芯片 (4)3.1.1 LM3S2110特性概述 (4)3.1.2 LM3S2110中断功能概述 (5)3.1.3 LM3S2110的GPIO特性 (5)3.2 键盘模块 (6)3.2.1 矩阵键盘模块 (6)3.2.2 独立按键模块 (7)3.3 LCD显示模块 (7)3.3.1 1602介绍 (7)3.3.2编辑本段管脚功能 (7)3.4蜂鸣器模块设计 (8)4 系统软件设计 (9)4.1 音乐控制 (10)4.4.1 音乐的相关知识 (10)4.4.2 如何用嵌入式实现音乐节拍 (10)4.4.3 如何用嵌入式产生音频脉冲 (10)4.2 软件初始化 (11)4.2.1 LCD初始化 (11)4.2.2 输入输出初始化 (12)4.2.3 按键、蜂鸣器、LED初始化 (13)4.2.4 定时器的初始化 (13)4.3总设计流程图 (14)5调试 (15)5.1音调调试 (15)5.2按键控制音乐停止调试 (15)5.3 LED显示音频效果调试 (15)6结束语 (15)7参考文献 (16)附录一 LM3S2110原理电路图 (17)附录二程序清单 (17)1 buzzer.c程序清单 (17)2 music.c程序 (18)3 systemInit.c程序 (20)4主程序清单 (20)1 前言1.1电子琴介绍电子琴又称作电子键盘,属于电子乐器(区别于电声乐器),发音音量可以自由调节。

音域较宽,和声丰富,甚至可以演奏出一个管弦乐队的效果,表现力极其丰富。

嵌入式电子琴设计

嵌入式电子琴设计

前言现代的流行音乐离不开电子琴,键盘手一般是现代电声乐队的中坚力量。

(单排键)电子琴、电吉他、架子鼓是流行音乐的三项主流乐器。

电子琴的发明使人们可以演奏出未曾拥有的音色,丰富了人们情感的表现;电子琴创造出了许多其他乐器无法演奏出的音色,甚至自然不存在的音色,这些音色帮助了人们通过音乐表现自己的情感,在很多电视节目或者音乐作品中都有运用。

电子琴的发明推动了音乐的普及,它让音乐真正成为了大众的音乐,成为了人类社会不可缺少的东西。

电子琴是目前用于音乐普及教育和音乐素质培养最多的乐器,它的经济性为他在普通家庭中的普及带来了可能。

本文主要介绍的是使用LM3S8962来实现基于Cortex-M3简易电子琴系统设计的方法,本设计由嵌入式芯片LM3S8962、音乐播放、单音节按键和数码管显示为核心,辅以必要的电路,构成了一个简易的电子琴。

当程序开始执行后,播放梁祝音乐,按下功能键后,切换至单音节演奏。

本设计的主要内容:了解嵌入式技术的发展现状,熟悉电子琴各模块的工作原理;选择适当的芯片和元器件,确定系统电路,绘制电路原理图,尤其是各接口电路;熟悉嵌入式使用方法和编程规则,编写出相应模块的应用程序;分别在各自的模块中调试出对应的功能,并使用真实器件播放音乐,实现功能切换,验证程序的正确性。

1.课题知识介绍1.1 Cortex-M3概述ARM Cortex-M3处理器结合了多种突破性技术,令芯片供应商提供超低费用的芯片,仅33000门的内核性能可达1.2DMIPS/MHz。

该处理器还集成了许多紧耦合系统外设,令系统能满足下一代产品的控制需求。

Cortex-M3内核主要是应用于小管脚数、低成本和低功耗的场合,并且具有极高的运算能力和极强的中断响应能力。

Cortex-M3采用了新型的单线调试(Single Wire)技术,专门拿出一个引脚来做调试,从而节约了大笔的调试工具费用。

同时,Cortex-M3中还集成了大部分存储器控制器,这样工程师可以直接在MCU外连接Flash,降低了设计难度和应用障碍。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

前言现代的流行音乐离不开电子琴,键盘手一般是现代电声乐队的中坚力量。

(单排键)电子琴、电吉他、架子鼓是流行音乐的三项主流乐器。

电子琴的发明使人们可以演奏出未曾拥有的音色,丰富了人们情感的表现;电子琴创造出了许多其他乐器无法演奏出的音色,甚至自然不存在的音色,这些音色帮助了人们通过音乐表现自己的情感,在很多电视节目或者音乐作品中都有运用。

电子琴的发明推动了音乐的普及,它让音乐真正成为了大众的音乐,成为了人类社会不可缺少的东西。

电子琴是目前用于音乐普及教育和音乐素质培养最多的乐器,它的经济性为他在普通家庭中的普及带来了可能。

本文主要介绍的是使用LM3S8962来实现基于Cortex-M3简易电子琴系统设计的方法,本设计由嵌入式芯片LM3S8962、音乐播放、单音节按键和数码管显示为核心,辅以必要的电路,构成了一个简易的电子琴。

当程序开始执行后,播放梁祝音乐,按下功能键后,切换至单音节演奏。

本设计的主要内容:了解嵌入式技术的发展现状,熟悉电子琴各模块的工作原理;选择适当的芯片和元器件,确定系统电路,绘制电路原理图,尤其是各接口电路;熟悉嵌入式使用方法和编程规则,编写出相应模块的应用程序;分别在各自的模块中调试出对应的功能,并使用真实器件播放音乐,实现功能切换,验证程序的正确性。

1.课题知识介绍1.1 Cortex-M3概述ARM Cortex-M3处理器结合了多种突破性技术,令芯片供应商提供超低费用的芯片,仅33000门的内核性能可达1.2DMIPS/MHz。

该处理器还集成了许多紧耦合系统外设,令系统能满足下一代产品的控制需求。

Cortex-M3内核主要是应用于小管脚数、低成本和低功耗的场合,并且具有极高的运算能力和极强的中断响应能力。

Cortex-M3采用了新型的单线调试(Single Wire)技术,专门拿出一个引脚来做调试,从而节约了大笔的调试工具费用。

同时,Cortex-M3中还集成了大部分存储器控制器,这样工程师可以直接在MCU外连接Flash,降低了设计难度和应用障碍。

CM3是一个32位处理器内核,内部数据路径是32位,寄存器是32位,存储器接口也是32位。

CM3采用哈佛结构,拥有独立的指令总线和数据总线,可以让取指与数据访问并行不悖。

这样一来,数据访问不再占用指令总线,从而提升了性能。

为了实现这个特性,CM3内部含有好几条总线接口,每条都为自己的应用场合优化过,并且可以并行工作。

但是,指令总线和数据总线共享同一个存储器空间,一个统一的存储器系统。

也就是说,不是因为有两条总线,可寻址空间就变成了8G。

1.2 LM3S8962概述LM3S8962微控制器的优势还在于能够方便的运用多种微控制器的优势还在于能够方便的运用多种ARM的开发工具和片上系统(SoC)的底层IP应用方案,以及广大的用户群体。

另外,该微控制器使用了兼容ARM Thumb®的Thumb2指令集来减少存储容量的需求,并以此达到降低成本的目的。

最后,LM3S8962微控制器与tellaris®系列的所有成员是代码系列兼容的,这为用户提供了灵活性,能够适应各种精确的需求。

图1 LM3S89621.3 keil软件Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。

Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部分组合在一起。

运行Keil软件需要WIN98、NT、WIN2000、WINXP等操作系统。

2009年2月发布Keil μVision4,Keil μVision4引入灵活的窗口管理系统,使开发人员能够使用多台监视器,并提供了视觉上的表面对窗口位置的完全控制的任何地方。

新的用户界面可以更好地利用屏幕空间和更有效地组织多个窗口,提供一个整洁,高效的环境来发应用程序。

新版本支持更多最新的ARM芯片,还添加了一些其他新功能。

2011年3月ARM公司发布最新集成开发环境RealView MDK开发工具中集成了最新版本的Keil uVision4,其编译器、调试工具实现与ARM器件的最完美匹配。

最新的Keil μVision4 IDE旨在提高开发人员的生产力,实现更快,更有效的程序开发。

Keil μVision4引入了灵活的窗口管理系统,能够拖放到视图内的任何地方,包括支持多显示器窗口。

Keil uVision4在Keil μVision3 IDE的基础上,增加了更多大众化的功能。

2.总体设计方案2.1 设计任务本次课程设计的主要设计任务是设计一个简易的电子琴,其中设有功能切换键,一个功能是播放梁祝音乐,另一个功能是在做好的矩阵键盘上通过按键播放DO、RE、MI 等8个单音节。

2.2 总体方案设计图2 电子琴总体设计框图本次方案设计按照系统设计的要求和功能,将系统分为主控制器模块、显示模块、按键模块、蜂鸣器电路模块。

系统框图如图2所示,主控制模块采用图1的芯片LM3S8962为控制中心,显示模块采用数码管显示,播放时使用蜂鸣器电路模块,设置功能切换键,实现对音乐播放和单音节演奏的功能切换。

3.硬件设计3.1显示模块概述3.1.1 数码管显示数码管是一种半导体发光器件,其基本单元是发光二极管。

数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二级管单元(多一个小数点显示);按能显示多少个“8”可分为1位、2位、4位等等数码管;按发光二极管单元连接方式分为共阳数码管和共阴极数码管。

共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管,共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮,当某一字段的阴极为高电平时,相应字段就不亮。

共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管,共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮,当某一字段的阳极为低电平时,相应字段就不亮。

其图如图3所示。

图3 数码管引脚图3.1.2 数码管引脚说明动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。

通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动。

在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。

3.1.3 数码管注意事项使用数码管时应注意以下几点:(1)检查时若发光暗淡,说明器件已老化,发光效率太低。

假如显示的笔段残缺不全,说明数码管已局部损坏。

(2)对于型号不明、又无管脚排列图的led数码管,用数字万用表的h距挡可完成下述测试工作:①判定数码管的结构形式(共阴或共阳);②识别管脚;③检查全亮笔段。

预先可假定某个电极为公共极,然后根据笔段发光或不发光加以验证。

当笔段电极接反或公共极判定错误时,该笔段就不能发光。

3.2 复位电路复位电路由电阻和极性电容组成,如图4所示,通过高电平时单片机复位,在时钟电路开始工作后,当高电平的时间超过大约5ms的时候,即可实现复位。

此复位电路同时具备了上电自动复位和按键人工复位的功能,上电复位发生在开机加电时,由系统自动完成,按键人工复位通过一个按键来实现在程序运行时,若遇到死机或死循环等情况时,通过手动复位就可以实现重新启动的操作。

按键人工复位需要认为在复位输入端RST 上加入高电平。

图4 复位电路3.3 蜂鸣器电路蜂鸣器电路由一个220欧的电阻,三极管及蜂鸣器组成,如图5所示。

通过控制三极管的导通和截止来实现蜂鸣器的响与不响。

图5 蜂鸣器原理图3.4 矩阵键盘在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式,如图6所示。

在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。

这样,一个端口(如P1口)就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显。

由此可见,在需要的键数比较多时,采用矩阵法来做键盘是合理的。

矩阵式结构的键盘显然比直接法要复杂一些,识别也要复杂一些,下图中,行线通过电阻接正电源,并将列线所接的单片机的I/O口作为输出端,而行线所接的I/O口则作为输入。

这样,当按键没有按下时,所有的输出端都是高电平,代表无键按下。

列线输出是低电平,一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了。

图6 4×4矩阵键盘电路图4.软件设计4.1 流程图图7 流程图根据以上流程图设计的程序见附录3。

4.2 Keil详细过程在图8界面下单“Project”中的“New uVision Project…”命令,弹出图9所示的创建新工程界面。

这时要设定该工程的路径和名称,要将存储工程的文件夹名称与工程项目的名称设为同一名字。

图8 创建工程图9 设置工程保存路径和名称点击保存按钮,弹出图10 对话框。

该对话框要求选择芯片型号,找到LM3S8962,并且点击选择。

图10 选择芯片选择好芯片后,需要新建一个空白文件,用来放置程序代码。

图11新建文件在Source Group上点右键,弹出快捷菜单。

如图12所示。

点击“Add Files to Group”选项,弹出添加源文件对话框,选择相应的需添加的文件即可。

图12 添加源文件快捷菜单这里仅对基本选项进行设置,以满足工程可编译、仿真、下载的要求。

在图13中,首先要设置晶振的频率。

由于开发板上使用的是6MHz的晶振,因此,这里需要将晶振频率设置为6MHz。

图13 晶振及程序下载地址设置完成相关设置后,即可进行编译,如图14所示。

图14 编译程序点击debug按钮,即可进入到软件仿真界面,课通过看到的结果进行调试,若不对可返回原界面进行修改。

图15 仿真界面5. 设计结果根据以上设计过程和原理可设计得到一个简易的电子琴,该电子琴可以在两个功能之间进行切换,一个是播放音乐梁祝,另一个是通过按键进行单音节播放,并且显示对应的音节,任何时刻都能进行复位操作。

相关文档
最新文档