嵌入式电子琴设计
嵌入式简易电子琴系统设计.
嵌入式开发试验嵌入式简易电子琴系统设计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的模拟电子琴设计作者:胡淼元何文德杨凤年来源:《电脑知识与技术》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单片机的电子琴设计
学生毕业设计(论文)报告系别:电子与电气工程学院专业:应用电子技术班号:应电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的高级电子琴设计院(系):信息与通信学院专业:电子信息工程学生姓名:学号:指导教师: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,降低了设计难度和应用障碍。
基于51单片机的电子琴设计课程设计
基于51单片机的电子琴设计课程设计单片机原理》课程设计前言本课程设计旨在通过基于51单片机的电子琴设计,加深学生对单片机原理的理解和应用。
在本设计中,我们将介绍电子琴的设计要求、所用设备及软件以及总体设计方案。
随后,我们将详细介绍系统硬件设计中琴键控制电路、音频功放电路、时钟-复位电路和LED显示电路的设计。
第1章基于51单片机的电子琴设计1.1 电子琴的设计要求在电子琴的设计中,我们需要考虑琴键数量、音频输出质量、电源电压和外部接口等因素。
在本设计中,我们将采用25个琴键,保证音频输出质量和电源电压稳定,并提供外部接口以便于扩展和调试。
1.2 电子琴设计所用设备及软件在本设计中,我们将使用51单片机、琴键、音频功放、时钟、LED显示器等设备,并使用Keil C51编译器进行软件开发。
1.3 总体设计方案在总体设计方案中,我们将采用按键扫描方式实现琴键控制,使用PWM技术实现音频输出,使用外部晶振提供时钟信号,并使用LED显示器显示琴键状态。
第2章系统硬件设计2.1 琴键控制电路在琴键控制电路中,我们将采用矩阵按键扫描方式,通过51单片机的IO口进行扫描和检测。
同时,我们还将使用电容式触摸开关来实现琴键的触发。
2.2 音频功放电路在音频功放电路中,我们将采用TDA7297芯片作为功放,通过PWM技术实现音频输出,并通过滤波电路滤除杂音和谐波。
2.3 时钟-复位电路在时钟-复位电路中,我们将采用12MHz晶振作为时钟源,并使用复位电路确保系统在上电时能够正确运行。
2.4 LED显示电路在LED显示电路中,我们将采用MAX7219芯片实现LED点阵显示,并通过SPI接口与51单片机进行通信。
同时,我们还将使用CD4511芯片实现数码管显示琴键状态。
通过本课程设计,我们可以深入理解单片机原理的应用,掌握电子琴的设计和制作技术,提高自身的实践能力和创新能力。
2.5 整体电路本章将介绍电子琴的整体电路设计。
粤嵌电子钢琴课程设计
粤嵌电子钢琴课程设计一、课程目标知识目标:1. 学生能理解电子钢琴的基本结构、工作原理及其与普通钢琴的区别。
2. 学生能掌握电子钢琴的基本演奏技巧,如音阶、琶音、和弦等。
3. 学生能了解并描述不同音乐风格的特点,如古典、流行、爵士等。
技能目标:1. 学生能熟练操作电子钢琴,进行简单的乐曲演奏。
2. 学生能运用所学的演奏技巧,独立完成指定曲目的演奏。
3. 学生能通过合作、讨论等方式,与他人共同完成音乐创作。
情感态度价值观目标:1. 学生培养对音乐的热爱,提高音乐素养,树立正确的审美观念。
2. 学生在学习和演奏过程中,培养耐心、自信、团结协作的品质。
3. 学生通过接触不同音乐风格,拓宽视野,增强对多元文化的理解和尊重。
分析课程性质、学生特点和教学要求:本课程为粤嵌电子钢琴课程,结合电子技术与音乐艺术,注重实践性与创造性。
学生为初中年级,具有好奇心强、动手能力较强等特点。
教学要求注重培养学生的实践能力、创新意识和团队协作精神。
课程目标分解:1. 知识目标:通过讲解、示范、实践等方式,使学生掌握电子钢琴的基本知识和演奏技巧。
2. 技能目标:通过分组练习、个别指导、作品展示等环节,提高学生的演奏技能和创作能力。
3. 情感态度价值观目标:通过音乐欣赏、实践活动、团队协作等途径,培养学生正确的审美观念和积极向上的人生态度。
二、教学内容1. 电子钢琴基础知识:- 电子钢琴结构及工作原理- 电子钢琴与普通钢琴的对比2. 演奏技巧:- 音阶、琶音、和弦的基本演奏方法- 不同音乐风格的演奏技巧3. 实践演奏:- 简单乐曲的演奏- 指定曲目的独立演奏- 与他人合作完成音乐作品4. 音乐欣赏与创作:- 不同音乐风格的欣赏- 音乐创作的基本方法- 团队合作完成音乐作品教学大纲安排:第一周:电子钢琴基础知识学习第二周:音阶、琶音、和弦的演奏技巧第三周:简单乐曲的演奏实践第四周:不同音乐风格的演奏与欣赏第五周:音乐创作方法及团队合作第六周:课程总结与作品展示教学内容关联教材:《音乐课程标准》中关于电子乐器演奏的教学要求,以及《电子钢琴演奏技巧》等相关教材,结合学生实际情况,选取适合初中年级学生的教学内容,确保教学内容的科学性和系统性。
基于51单片机的电子琴设计
基于51单片机的电子琴设计随着科技的不断发展,单片机技术已经成为了现代电子设备中的重要组成部分。
51单片机作为一种广泛应用的单片机系列,具有高性能、低功耗、高集成度等特点,被广泛应用于各种嵌入式系统开发中。
本文将介绍一种基于51单片机的电子琴设计。
一、系统硬件设计1、单片机选择本设计选用AT89C51单片机作为主控制器,AT89C51是一种低功耗、高性能的8位单片机,具有4K字节的可编程存储器和128字节的RAM,同时具有丰富的外设接口,如UART、SPI、I2C等。
2、电子琴设计电子琴采用8×8 LED点阵作为输出设备,通过单片机控制点阵的亮灭状态来展示音乐波形。
具体实现方式是将音频信号通过一个运放放大器放大,然后将其输入到LED点阵中,通过控制点阵的亮灭状态来展示音乐的波形。
3、存储模块设计为了实现电子琴曲目的存储和播放,本设计选用了一块AT24C02 EEPROM芯片作为存储设备。
AT24C02是一种串行E2PROM存储器,容量为256字节,可以通过I2C总线与单片机进行通信。
将曲目信息存储在AT24C02中,可以实现曲目的存储和播放功能。
4、按键模块设计本设计采用4×4矩阵键盘作为输入设备,通过扫描按键状态来实现音符的选择和节奏控制。
矩阵键盘的行线连接到单片机的P1口,列线连接到P2口,通过检测行列组合的变化来确定按下的键位。
二、系统软件设计1、音符解码本设计采用MIDI音符编码方式来存储和播放曲目信息。
在解码过程中,根据音符的频率和持续时间计算出对应的音高和节奏信息,然后将其用于驱动电子琴的输出设备展示音乐的波形。
2、演奏控制为了实现节奏控制,本设计采用了一种基于时间间隔的演奏方式。
在演奏过程中,单片机根据设定的节奏间隔时间来触发音符输出,从而实现对节奏的控制。
同时,为了实现曲目的停止和播放功能,我们需要在软件中加入相应的控制逻辑。
3、存储和播放在软件设计中,我们需要实现将曲目信息存储到AT24C02中以及从AT24C02中读取曲目信息的功能。
可存储式电子琴具体的方案设计
一、设计思路1. 从系统实现的功能上来看,电子琴的设计主要分为手动弹奏乐曲和自动播放音乐两大部分组成。
手动弹奏乐曲是根据具体的硬件键盘设置了14个音符按键和1个功能转换键,自动播放音乐是在单片机的存储器中通过软件编程的方法放置音乐代码和相关播放程序来实现。
2. 从系统硬件结构上来看,主要使用到52系列单片机、矩阵4×4键输入电路、LED数码管显示电路、扬声器以及电源电路等等。
将这些硬件电路有机地结合起来使之满足电子琴设计的基本硬件要求。
3. 从系统软件设计角度来看,将电子琴的设计采用程序模块化设计方法,将程序分为主程序、键盘扫描程序模块、数码显示模块、转换控制模块、音乐产生模块等等。
此外,采用程序设计思想,将中断定时方式与外部按键查询方式相结合,实现手动弹奏乐曲到自动播放音乐的切换。
4. 从音乐产生原理方面来看,通过控制单片机的定时器的定时时间产生不同频率的音频脉冲,经放大后驱动扬声器发出不同音乐的声音。
用软件延时来控制发音时间的长短,控制节拍。
把音乐的音符和相应的节拍变换为定时常数和延时常数,作为数据表格存放在程序存储器中,由程序查表得到定时常数和延时常数,分别用来控制定时器产生的脉冲频率和发出音频脉冲的持续时间。
因此,我们可以综合上述的不同角度的方案设计原理,主要从软件和硬件两部分进行有计划有步骤的系统分析与设计,最终确立总体的设计方案。
方案确立(1)手动弹奏乐曲和自动播放音乐用非编码的矩阵键盘来实现,其中包括数字键和功能键,功能键主要是将手动弹奏模块转换到自动播放乐曲模块。
手动弹奏乐曲中14个键分别设置不同的14个音符,然后通过功能键可实现手动弹奏乐曲到播放乐曲之间的切换。
(2)一位LED数码管显示当前工作状态,将按下的键值送入显示,并一一对应各个音符。
采用动态扫描输出。
(3)软件的设计主要包括矩形键盘键值的读取、LED动态扫描输出程序、手动弹奏乐曲程序和音乐自动播放程序。
(4)此次程序设计主要分为两大块:手动弹奏乐曲程序和自动播放程序。
毕业论文基于单片机STC52的电子琴设计
毕业论文基于单片机STC52的电子琴设计电子琴是一种能够模拟真实乐器声音的电子音乐乐器,它使用数字信号处理技术来模拟不同音调和音色的声音。
在这篇毕业论文中,我们将基于STC52单片机设计一个电子琴。
首先,我们需要了解电子琴的基本原理和工作方式。
电子琴主要由白键和黑键组成,每个键对应一个音调。
当用户按下一些键时,电子琴会发出相应音调的声音。
为了模拟各种音调和音色,电子琴还需要使用合成器来生成声音波形。
在本设计中,我们将使用STC52单片机作为主控芯片。
这款单片机具有强大的计算和处理能力,并且易于编程和控制。
我们将使用C语言编程来实现电子琴的功能。
首先,我们需要设计一个按键矩阵来接收用户的按键输入。
按键矩阵将通过电子琴的键盘连接到STC52单片机的I/O口。
当用户按下一些键时,相应的I/O口将被触发,并且可以通过编程来检测并响应按键动作。
接下来,我们将设计一个音频输出电路来输出电子琴的声音。
音频输出电路将连接到STC52单片机的PWM输出口。
通过调节PWM输出的频率和占空比,我们可以生成不同频率和音量的声音波形。
然后,我们需要设计一个合成器来生成不同音调和音色的声音波形。
合成器可以通过不同的算法和参数来模拟不同乐器的声音。
我们可以使用数字信号处理技术,如傅里叶变换和滤波器设计,来实现合成器的功能。
最后,我们需要编写软件程序来控制和管理电子琴的功能。
我们可以使用STC52单片机的开发环境和编程工具来编写程序。
程序需要实现按键检测、声音生成和处理等功能。
通过编程,我们可以实现不同音调、音色和演奏效果的电子琴。
在设计实现过程中,我们还需要考虑到电子琴的硬件和电路布局、电源供应、按键和音频接口等方面的问题。
同时,我们还需要进行测试和调试,以保证电子琴的正常工作和良好的声音质量。
通过以上的设计和实现,我们可以制作一个基于STC52单片机的电子琴。
这款电子琴具有丰富的音调和音色选择,可以模拟不同乐器的声音,同时具有简单易用的操作和良好的音质。
嵌入式电子琴
ARM7的设计精髓是结构简单。
ARM7内核采用了精简指令集计算机(RISC)设计思想,所用逻辑门数较少,硅片面积小,但具有高性能、低功耗的特点,这使得ARM7 成为嵌入式系统的理想选择。
ARM7内核包括ARM7TDMI(-S)、ARM720T 等,ARM7TDMI 处理器内核已经许可给许多世界顶级半导体公司,它是第一个包括Thumb 指令集、快速乘法指令和嵌入式ICE 调试技术的内核。
本论文主要介绍利用213X系列最小系统板,完成一个高级电子琴的设计,需要设置琴键输入以及LM386的功率放大驱动喇叭,主要功能通过程序编译来完成。
引言......................................... 错误!未定义书签。
1 213X系列最小系统板介绍 (1)1.1 最小系统板结构 (1)1.2 片内FLASH程序储存器 (1)1.3 片内静态RAM (2)1.4 存储器映射概念和操作方式 (2)1.5 系统控制模块 (3)2 琴键键盘 (4)2.1 行列式键盘工作原理 (4)2.2 键盘识别原理 (5)2.3 键盘电路介绍 (5)3 LM386与蜂鸣器介绍.......................... 错误!未定义书签。
3.1 LM386介绍 (6)3.2 特性介绍 (6)3.3 蜂鸣器简介 ..........................................错误!未定义书签。
3.4 蜂鸣器驱动电路分析 (7)4 电路板的制作及调试......................... 错误!未定义书签。
4.1电路图的绘画 ........................................错误!未定义书签。
4.2 电路板的制作 ........................................错误!未定义书签。
1 213X系列最小系统板介绍LPC2131/2132/2138 是基于一个支持实时仿真和嵌入式跟踪的32/16ARM7TDMI-STM CPU 的微控制器,并带有32kB、64kB、512 kB 的嵌入的高速Flash 存储器。
基于ARM9的电子琴程序设计
华南师范大学增城学院课程论文题目:基于ARM9的电子琴设计课程名称嵌入式系统原理与应用技术考查学期2013-2014学年第2学期考查方式课程论文姓名学号专业成绩指导教师目录 ................................................................................................................ 错误!未定义书签。
一、设计目的和要求 (3)1.1 程序设计目的 (3)1.2 程序设计要求 (3)二、硬件总体设计 (3)2.1 S3C2440A芯片 (3)2.2 蜂鸣器设计 (4)三、软件总体设计 (5)3.1 软件流程图 (5)3.2 程序设计 (6)四、实验调试 (14)五、心得与体会 (15)六、参考文献 (16)一、设计目的和要求1.1 程序设计目的大作业是《嵌入式系统基础》课程教学的一个实践环节,是对学生进行全面的系统的训练。
进行大作业可以让学生把学过的比较零碎的知识系统化,真正的能够把学过的知识落到实处,能够开发简单的系统,也进一步激发了学生再深入学习的热情,也能考查学生对此门课程掌握的程度。
1.2 程序设计要求对微控制器S3C2440进行裸机程序开发,利用实验箱上的蜂鸣器和软件上的设计,设计出来一个简易的电子琴,在电子琴上具备简单的音符播放,分别按键盘上的1到8键,依次播放音乐上的不同音节。
所设计的电子琴上还有音乐播放的功能。
二、硬件总体设计2.1 S3C2440A芯片S3C2440A是由三星公司生产的一种性价比很高的CPU芯片,由于该芯片价格低、功耗低和体积小等显著的特点,主要用于手持设备和一般类型应用的设备。
S3C2440A是Samsung公司设计的一款高性价比16/32位ARM9系列微处理器,内含一个由ARM公司设计的16/32位ARM920T RISC处理器核,采用五级流水线和哈佛体系结构,工作频率最高可达533MHz;同时还具备体积小、成本低、功耗低、资源众多等诸多特点。
基于AT89C51单片机的电子琴设计
Computer Knowledge and Technology 电脑知识与技术计算机工程应用技术本栏目责任编辑:梁书第6卷第20期(2010年7月)基于AT89C51单片机的电子琴设计孙万麟(昌吉学院物理系,新疆昌吉831100)摘要:文章设计了一个以AT89C51单片机作为主控制器、利用单声道功放电路来驱动扬声器发音的简易电子琴系统。
通过硬件电路的设计和软件的调试运行表明,该系统不仅实现弹奏乐曲的基本功能,而且设计思路简单、清晰、易懂、成本低,具有一定的实用和参考价值,非常适合电子爱好者制作。
关键词:电子琴;AT89C51中图分类号:TN709文献标识码:A 文章编号:1009-3044(2010)20-5626-02Design Simple Electronic Organ Based on AT89C51Single ComputerSUN Wan-lin(The Department of Physics,Changji College,Changji 831100,China)Abstract:This paper designs a simple electronic organ system,which is mainly controlled by AT89C51single computer and used one-tone electric circuit to prompt loudspeaker to pronounce.Through software design and hardware debug show that this system not only brings out playing musical composition basic function,but also its design is concise and is apt to understand.Thus,it has certain practical and reference value and very fits electronic amateur to make.Key words:electronic organ;AT89C51电子琴已为人们所熟知,她可以演奏出非常动听的乐曲。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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. 设计结果根据以上设计过程和原理可设计得到一个简易的电子琴,该电子琴可以在两个功能之间进行切换,一个是播放音乐梁祝,另一个是通过按键进行单音节播放,并且显示对应的音节,任何时刻都能进行复位操作。