要使用的外部中断触发的方式,一方面是为了能够更加简单的完成此次设计,另一方面是为了实现发音的长短可以用按键按下的时间长短来决定,使之更加具备电子琴的功能,能够很好的完成一首曲子。
结束语
通过本次专业方向设计,我不仅加深了对单片机理论的理解,将理论很好地应用到实际当中去,而且我还学会了如何去培养我们的创新精神,从而不断地战胜自己,超越自己。创新可以是在原有的基础上进行改进,使之功能不断完善,成为真己的东西。 这个设计过程中,通过在原有的按键中断的基础上进行了改进,使之具备了电子琴的基本功能。设计结果能够符合题意,成功完成了此次实习要求,我不只在乎这一结果,更加在乎的,是这个过程。这个过程中,自己更加注重了一些基础的理知识的学习,很好的把平时课堂上的知识运用到了实际的操作中。同时,软硬件的结合调试也让自己明白了理论上的很多东西也是需要实际实验的验证的。本综合设计是让得到一次进行独立设计的工程实践锻炼,不仅培养严谨的科学态度和扎实的实践技能、良好的工程意识,并在设计中学会如何发现、分析和解决工程实践问题的技能和方法,为后续的毕业设计做好准备。同时在这里也感谢在整个设计中帮助过我的老师和同学们。
参考文献
[1]冯建华,赵亮.单片机应用系统设计与产品开发[M].北京:人民邮电出版社 2004 [2]谭浩强.C语言程序设计[M].北京:清华大学出版社 1999 [3]吴国经等 单片机应用技术 中国电力出版社, 2004.1
[4]李全利,迟荣强编著 单片机原理及接口技术 高等教育出版社,2004.1 [5]张毅刚等, MCS-51单片机应用设计,哈工大出版社,2004年第2版 [6]霍孟友等,单片机原理与应用,机械工业出版社,2004.1
[7]霍孟友等,单片机原理与应用学习概要及题解,机械工业出版社,2005.3 [8]许泳龙等,单片机原理及应用,机械工业出版社,2005.1
16
附录(程序、电路图等)
附录1:程序代码 #include%unsigned int i=0; unsigned int j=0; unsigned int mykey=0; unsignedlong
code[10]={0x7c04,0x3000,0x6c02,0x7802,0x3006,0x5806,0x5c06,0x7000,0x7c06 ,0x7806};
//数组里面的16进制正好对应着显示0-9的二进制码(数码管的位选,选择哪一位就让相关位为1,来表示选择了它) #define
D1 55042
#define D2 49037 #define D3 43687 #define D4 41235 #define D5 36735 #define D6 32728 #define D7 29157
void RCC_Configuration(void) {
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO
|RCC_APB2Periph_TIM1|RCC_APB2Periph_GPIOB,ENABLE); //APB2时钟是
72MHz的,APB1的时钟是36MHz的 }
void GPIO_Configuration(void) {
GPIO_InitTypeDef GPIO_InitStructure ; //蜂鸣器
17
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8; //选择PA8 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; //复用功能,PA8作为复
用是TIM1的PWM1的输出端口,不再作为一个普通的I/O口使用
GPIO_Init(GPIOA,&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin
=
GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_5|GPIO_Pin_4|GPIO_Pin_15;
//按键的几个输入引脚 }
void TIM_yingyue(unsigned int NoteSet) {
if(IfIsInit==0) {
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; /* Time base configuration */
TIM_TimeBaseStructure.TIM_Period = NoteSet; //设置了在下一个更新事件static unsigned char IfIsInit=0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉输入 GPIO_Init(GPIOB,&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin =0x7C07;
//数码管段选and位选
GPIO_InitStructure.GPIO_Speed =GPIO_Speed_10MHz; //
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_PP; //推挽输出 GPIO_Init(GPIOB,&GPIO_InitStructure);
//表示选择的是PB的引脚
装入活动的自动重装载// 寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler = 0; //设置了用来作为TIM1时钟频率
18
除数的预分频值
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//选择
了计数器模式为向上计数模式
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); /* PWM1 Mode configuration: Channel4 */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模
式为TIM 脉冲宽度调制模式 1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //定时器
输出比较状态使能
TIM_OCInitStructure.TIM_Pulse = NoteSet/2; //设置了待装入捕获比较寄
存器的脉冲值和TIM_Period的值一起决定占空比
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High ; //设置了输
出比较极性为高 }
void delay(unsigned int i) //延时函数 {
}
TIM_OC1Init(TIM1, &TIM_OCInitStructure);
TIM_CtrlPWMOutputs(TIM1,ENABLE); //TIM1的PWM输出使能 TIM_Cmd(TIM1,ENABLE); //Tim1定时器使能 IfIsInit=1;
else { }
TIM1->ARR=NoteSet; //改变输出的频率 TIM1->CCR1=NoteSet/2;
unsigned int j,k; for(j=0;j
for(k=0;k<100;k++);
19
}
void display(unsigned int j) //数码管显示函数 {
GPIO_SetBits(GPIOB,code[j]);
GPIO_ResetBits(GPIOB,0x001); //共阴极数码管,段选为高电平有效,位选
为低电平有效 } int main() {
RCC_Configuration(); GPIO_Configuration() ;
while(1) //按键扫描
{
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15)==0) { }
display(1); //修改显示的数据 TIM_yingyue(D1); //修改输出的频率
else if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_4)==0) { }
else if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5)==0) { }
20
display(2); TIM_yingyue(D2);
display(3); TIM_yingyue(D3);
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库基于STM32的电子琴设计(4)在线全文阅读。
相关推荐: