摘要: 本次設(shè)計(jì)是課程設(shè)計(jì),利用單片機(jī)設(shè)計(jì)簡(jiǎn)易電子琴。 其主要功能為:按下不同按鍵,發(fā)出不同1 、2 、3、4 、5 、6 、7 七個(gè)音符并且用LED 或LCD顯示當(dāng)前按鍵。選用stm32f103C8T6,它有8個(gè)定時(shí)器,部分定時(shí)器有多達(dá)4個(gè)用于輸入捕獲/輸出比較/PWM或脈沖計(jì)數(shù)的通道和增量編碼器輸入。利用芯片內(nèi)部相關(guān)定時(shí)器來(lái)輸出PWM,從而來(lái)驅(qū)動(dòng)蜂鳴器。通過(guò)讀取外部按鍵輸入的值來(lái)相應(yīng)改變定時(shí)器相關(guān)寄存器的值,從而來(lái)改變PWM的輸出頻率來(lái)達(dá)到發(fā)出不同音調(diào)。
一、設(shè)計(jì)目的和意義
本綜合設(shè)計(jì)是為本科生開設(shè)的必修課,是對(duì)學(xué)生運(yùn)用所學(xué)知識(shí)的一次綜合訓(xùn)練。其目的是讓學(xué)生得到一次進(jìn)行獨(dú)立設(shè)計(jì)的工程實(shí)踐鍛煉,不僅培養(yǎng)嚴(yán)謹(jǐn)?shù)目茖W(xué)態(tài)度和扎實(shí)的實(shí)踐技能、良好的工程意識(shí),并在設(shè)計(jì)中學(xué)會(huì)如何發(fā)現(xiàn)、分析和解決工程實(shí)踐問題的技能和方法,將所學(xué)知識(shí)綜合應(yīng)用于工程實(shí)踐中,為后續(xù)的畢業(yè)設(shè)計(jì)做好準(zhǔn)備。
二、控制要求
利用單片機(jī)設(shè)計(jì)簡(jiǎn)易電子琴。
功能要求:
(1) 按下不同按鍵,發(fā)出不同1 、2 、3、4 、5 、6 、7 七個(gè)音符;
(2) 用LED 或LCD顯示當(dāng)前按鍵。
總體要求:給出電路原理圖、電路調(diào)試結(jié)果、程序源代碼;提交設(shè)計(jì)報(bào)告。
三、設(shè)計(jì)方案論證
3.1 設(shè)計(jì)方案:
方案一:采用MCS-51系列單片機(jī)來(lái)實(shí)現(xiàn)設(shè)計(jì)要求的功能。 MCS-51系列單片機(jī)中的基本型產(chǎn)品是8051,8031和8751,這三個(gè)產(chǎn)品只是片內(nèi)程序存儲(chǔ)器制造工藝不同。8051的片內(nèi)程序存儲(chǔ)器ROM為掩膜型的在制造芯片時(shí)已將應(yīng)用程序固化進(jìn)去,使它具有了某種專用功能。8位CPU擁有片內(nèi)震蕩器及時(shí)鐘電路;32根IO線;外部存儲(chǔ)器ROM和RAM尋址范圍各64KB;2個(gè)16位的定時(shí)器/計(jì)數(shù)器;5個(gè)中斷源,2個(gè)中斷優(yōu)先級(jí);全雙工串行口;8051的中央處理器CPU由運(yùn)算器和控制邏輯構(gòu)成51單片機(jī)是一款比較基礎(chǔ)的單片機(jī)。I/O(輸入/輸出)引腳系統(tǒng)結(jié)構(gòu)緊湊,功能簡(jiǎn)單,低成本??梢詫?shí)現(xiàn)各種豐富的應(yīng)用。通過(guò)控制I/O口的輸出電平的翻轉(zhuǎn)頻率來(lái)實(shí)現(xiàn)對(duì)蜂鳴器發(fā)音音調(diào)的控制。
方案二:采用STM32f03C8T6來(lái)實(shí)現(xiàn)此次設(shè)計(jì),最高72MHz工作頻率。它有多個(gè)外部中斷,八個(gè)定時(shí)器,有PWM輸出模式,其中2個(gè)高級(jí)定時(shí)器,兩個(gè)基本定時(shí)器,其他的是通用定時(shí)器,共48個(gè)引腳,除基本的I/O功能之外還包含有復(fù)用功能,其外設(shè)功能強(qiáng)大,是一款能夠很方便使用的功能強(qiáng)大的芯片,同時(shí)可以直接對(duì)相關(guān)寄存器進(jìn)行操作,。
3.2 方案選擇
上述兩種方案相比,51單片機(jī)雖然價(jià)格便宜,但是其功能簡(jiǎn)單,I/O口少,并且僅僅只有5個(gè)中斷源,而STM32f03C8T6共48個(gè)引腳,并且其定時(shí)器有PWM輸出模式,可以更加方便的控制蜂鳴器的發(fā)音。本次設(shè)計(jì)包括了七個(gè)按鍵,數(shù)碼管,蜂鳴器,因此至少需要17個(gè)I/O口。因此先比較而言選用I/O口較多的STM32f03C8T6來(lái)作為控制芯片。
四、系統(tǒng)設(shè)計(jì)
4.1 硬件結(jié)構(gòu)設(shè)計(jì)
如圖4-1所示,硬件系統(tǒng)主要由數(shù)碼管顯示電路、蜂鳴器驅(qū)動(dòng)電路、按鍵電路、晶振、復(fù)位、電源指示、轉(zhuǎn)壓電路、控制芯片等組成。
圖4-1 硬件系統(tǒng)圖
4.1.1 核心控制器硬件電路
核心控制芯片的各個(gè)輸出引腳如圖4-2所示:
圖4-2 STM32f103C8T6引腳圖
核心控制器是由核心控制芯片以及相關(guān)的外圍電路組成,包括了專業(yè)電路、外部晶振、濾波電路、按鍵復(fù)位電路、電源指示電路等,如圖4-3所示。
圖4-3核心控制器外圍電路
4.1.2 蜂鳴器驅(qū)動(dòng)電路
此次設(shè)計(jì)選用有源蜂鳴器。有源蜂鳴器的發(fā)聲原理是電流通過(guò)電磁線圈,使電磁線圈產(chǎn)生磁場(chǎng)來(lái)驅(qū)動(dòng)振動(dòng)膜發(fā)音,因此需要一定的電流才能驅(qū)動(dòng)它。單片機(jī)的I/O引腳的輸出電流比較小輸出的TTL電平基本上驅(qū)動(dòng)不了蜂鳴器,因此需要增加一個(gè)電流放大的電路,如圖4-4所示,選用NPN的三極管來(lái)達(dá)到電流放大的作用。
圖4-4 蜂鳴器驅(qū)動(dòng)電路
4.1.3 數(shù)碼管電路:
設(shè)計(jì)中需要使用一位數(shù)碼管,如圖4-5所示,為四位數(shù)碼管的驅(qū)動(dòng)電路,在實(shí)際的運(yùn)用中僅僅選用了com4位選端口以及5、6、7、8、9、10、11、接口作為段選。
圖4-5 數(shù)碼管顯示電路
4.1.4按鍵電路:
按鍵都采用了上拉電阻,當(dāng)按鍵處于不被按下的狀態(tài)時(shí),連接到單片機(jī)的一端的輸入信號(hào)為高電平,當(dāng)按鍵按下時(shí),輸入為低電平,如圖4-6所示。
圖4-6 按鍵電路
4.2 軟件系統(tǒng)設(shè)計(jì)
4.2.1 軟件系統(tǒng)框圖
設(shè)計(jì)選用STM32F103C8T6芯片,相關(guān)的配置主要包括:,時(shí)鐘配置、I/O口配置、定時(shí)器配置。主函數(shù)中進(jìn)行顯示參數(shù)以及PWM輸出頻率的改變,具體流程圖如圖4-7所示。
圖4-7 軟件流程圖
4.2.2 數(shù)碼管顯示相關(guān)段選計(jì)算:
在此次設(shè)計(jì)中選用的是共陰極的數(shù)碼管,段選為高電平有效,位選為低電平有效。選用STM32f103C8T6的PB0、1、2、.10、11、12、13、14作為段選位,分別對(duì)應(yīng)數(shù)碼管的h、g、f、e、d、c、b、a段,PB15對(duì)應(yīng)數(shù)碼管的位選。
圖4-8 一位數(shù)碼管
當(dāng)數(shù)碼管顯示0時(shí),選用a、b、c、d、e、f、.段,對(duì)應(yīng)的十六進(jìn)制為:0x7c04;
當(dāng)數(shù)碼管顯示1時(shí),選用b.、c.段,對(duì)應(yīng)的十六進(jìn)制為:0x7c04;
當(dāng)數(shù)碼管顯示2時(shí),選用a、b、g、e、d.段,對(duì)應(yīng)的十六進(jìn)制為:0x7c04;
當(dāng)數(shù)碼管顯示3時(shí),選用a、b、g、c、d.段,對(duì)應(yīng)的十六進(jìn)制為:0x7c04;
當(dāng)數(shù)碼管顯示4時(shí),選用f、g、b、c.段,對(duì)應(yīng)的十六進(jìn)制為:0x7c04;
當(dāng)數(shù)碼管顯示5時(shí),選用a、f、g、c、d段,對(duì)應(yīng)的十六進(jìn)制為:0x7c04;
當(dāng)數(shù)碼管顯示6時(shí),選a、f、e、g、d、c.段,對(duì)應(yīng)的十六進(jìn)制為:0x7c04;
當(dāng)數(shù)碼管顯示7時(shí),選用a、b、c.段,對(duì)應(yīng)的十六進(jìn)制為:0x7c04;
4.2.3 蜂鳴器發(fā)音音調(diào)改變?cè)?/p>
蜂鳴器分為有源蜂鳴器合無(wú)源蜂鳴器。有源蜂鳴器內(nèi)部帶震蕩源,所以只要一通電就會(huì)叫,價(jià)格比無(wú)源貴。無(wú)源蜂鳴器必須用2K-5K的方波去驅(qū)動(dòng)它。此次設(shè)計(jì)選用有源蜂鳴器。有源蜂鳴器的發(fā)聲原理是電流通過(guò)電磁線圈,使電磁線圈產(chǎn)生磁場(chǎng)來(lái)驅(qū)動(dòng)振動(dòng)膜發(fā)音,因此需要一定的電流才能驅(qū)動(dòng)它。單片機(jī)的I/O引腳的輸出電流比較小輸出的TTL電平基本上驅(qū)動(dòng)不了蜂鳴器,因此需要增加一個(gè)電流放大的電路。如圖4-4所示蜂鳴器的正極接到VCC(+5V)電源上面,蜂鳴器的負(fù)極接到三極管的發(fā)射極E,三極管的基級(jí)B經(jīng)過(guò)限流電阻R1后由單片機(jī)引腳控制,當(dāng)單片機(jī)引腳輸出高電平時(shí),三極管T1截止,沒有電流流過(guò)線圈,蜂鳴器不發(fā)聲;當(dāng)單片機(jī)引腳輸出低電平時(shí),三極管導(dǎo)通,這樣蜂鳴器的電流形成回路,發(fā)出聲音。因此,我們可以通過(guò)程序控制引腳的電平來(lái)使蜂鳴器發(fā)出聲音和關(guān)閉。
蜂鳴器是的音調(diào)改變實(shí)際上是通過(guò)改變驅(qū)動(dòng)蜂鳴的高低電平的翻轉(zhuǎn)頻率來(lái)決定,高低電平的變化的頻率不同,音調(diào)不同,在此次設(shè)計(jì)中采用TIM1的PWM的頻率變化來(lái)控制。
4.2.4 PWM輸出頻率計(jì)算:
TIM定時(shí)器相關(guān)配置:
void TIM_yingyue(unsigned int NoteSet)
{
static unsigned char IfIsInit=0;
if(IfIsInit==0)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_TimeBaseStructure.TIM_Period = NoteSet;
TIM_TimeBaseStructure.TIM_Prescaler = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
/* PWM1 Mode configuration: Channel4 */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = NoteSet/2;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High ;
TIM_OC1Init(TIM1, &TIM_OCInitStructure);
TIM_CtrlPWMOutputs(TIM1,ENABLE);
TIM_Cmd(TIM1,ENABLE);
IfIsInit=1;
}
else
{
TIM1- >ARR=NoteSet;
TIM1- >CCR1=NoteSet/2;
}
}
TIM_Period 設(shè)置了在下一個(gè)更新事件裝入活動(dòng)的自動(dòng)重裝載寄存器周期的值。
TIM_Prescaler:設(shè)置了用來(lái)作為TIM1時(shí)鐘頻率除數(shù)的預(yù)分頻值。
TIM_CounterMode 選擇了計(jì)數(shù)器模式為向上計(jì)數(shù)模式。
TIM_OCMode選擇定時(shí)器模式為TIM 脈沖寬度調(diào)制模式 1。
.TIM_OutputState = TIM_OutputState_Enable定時(shí)器輸出比較狀態(tài)使能。
TIM_Pulse 設(shè)置了待裝入捕獲比較寄存器的脈沖值和TIM_Period的值一起決定占空比。
TIM_OCPolarity 設(shè)置了輸出比較極性為高。
根據(jù)以上設(shè)置
(4-1)
(4-2)
在主函數(shù)中,通過(guò)掃描按鍵的狀態(tài)來(lái)執(zhí)行相關(guān)操作:
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15)==0)
{
display(1); //數(shù)碼管顯示函數(shù)
TIM_yingyue(D1); //調(diào)用定時(shí)器函數(shù)
}
注: 每次調(diào)用TIM_yingyue()函數(shù),通過(guò)判斷IfIsInit的狀態(tài),直接通過(guò)修改ARR(自動(dòng)重裝載寄存器),CCR1(TIM1捕獲/比較寄存器1)來(lái)修改頻率,提高了程序的效率,避免其他相關(guān)值重復(fù)定義。
五、設(shè)計(jì)結(jié)果及分析
5.1設(shè)計(jì)結(jié)果:
實(shí)現(xiàn)了簡(jiǎn)易電子琴功能。 按下不同按鍵,發(fā)出不同1 、2 、3、4 、5 、6 、7 七個(gè)音符并用LED顯示當(dāng)前的鍵值。每個(gè)音符發(fā)音的長(zhǎng)短由按鍵按下的時(shí)間長(zhǎng)短來(lái)控制,能夠更好的完成一首歌曲。
PWM輸出波形下列各圖所示:
DO:
圖5-1 Do PWM輸出波形
Rai:
圖5-2 Rai PWM輸出波形
Mi:
圖5-3 Mi PWM輸出波形
Fa:
圖5-4 Fa PWM輸出波形
So:
圖5-5 So PWM輸出波形
La:
圖5-6 La PWM輸出波形
Xi:
圖5-7 Xi PWM輸出波形
5.2結(jié)果分析:
初次軟硬件聯(lián)調(diào)的時(shí)候,蜂鳴器發(fā)出的音符雖然也是七個(gè)調(diào),但是聲音明顯不清脆。結(jié)合軟件分析,當(dāng)時(shí)的TIM_yingyue()函數(shù)里面有很多關(guān)于定時(shí)器和PWM的參數(shù)的定義,改變頻率只與其中兩個(gè)寄存器有關(guān)系,而每次調(diào)用這個(gè)函數(shù)的時(shí)候會(huì)把整個(gè)函數(shù)中德參數(shù)全部重新賦值,導(dǎo)致了執(zhí)行效率不高,對(duì)TIM_yingyue()函數(shù)進(jìn)行修改,通過(guò)判斷IfIsInit的狀態(tài),直接修改ARR(自動(dòng)重裝載寄存器),CCR1(TIM1捕獲/比較寄存器1)來(lái)到到改變頻率的效果,提高了程序的效率,避免其他相關(guān)值重復(fù)定義。再次進(jìn)行聯(lián)調(diào)時(shí),整個(gè)聲音也就清楚了很多。在按鍵的掃描方面放棄最初開始想要使用的外部中斷觸發(fā)的方式,一方面是為了能夠更加簡(jiǎn)單的完成此次設(shè)計(jì),另一方面是為了實(shí)現(xiàn)發(fā)音的長(zhǎng)短可以用按鍵按下的時(shí)間長(zhǎng)短來(lái)決定,使之更加具備電子琴的功能,能夠很好的完成一首曲子。
結(jié)束語(yǔ)
通過(guò)本次專業(yè)方向設(shè)計(jì),我不僅加深了對(duì)單片機(jī)理論的理解,將理論很好地應(yīng)用到實(shí)際當(dāng)中去,而且我還學(xué)會(huì)了如何去培養(yǎng)我們的創(chuàng)新精神,從而不斷地戰(zhàn)勝自己,超越自己。創(chuàng)新可以是在原有的基礎(chǔ)上進(jìn)行改進(jìn),使之功能不斷完善,成為真己的東西。 這個(gè)設(shè)計(jì)過(guò)程中,通過(guò)在原有的按鍵中斷的基礎(chǔ)上進(jìn)行了改進(jìn),使之具備了電子琴的基本功能。設(shè)計(jì)結(jié)果能夠符合題意,成功完成了此次實(shí)習(xí)要求,我不只在乎這一結(jié)果,更加在乎的,是這個(gè)過(guò)程。這個(gè)過(guò)程中,自己更加注重了一些基礎(chǔ)的理知識(shí)的學(xué)習(xí),很好的把平時(shí)課堂上的知識(shí)運(yùn)用到了實(shí)際的操作中。同時(shí),軟硬件的結(jié)合調(diào)試也讓自己明白了理論上的很多東西也是需要實(shí)際實(shí)驗(yàn)的驗(yàn)證的。本綜合設(shè)計(jì)是讓得到一次進(jìn)行獨(dú)立設(shè)計(jì)的工程實(shí)踐鍛煉,不僅培養(yǎng)嚴(yán)謹(jǐn)?shù)目茖W(xué)態(tài)度和扎實(shí)的實(shí)踐技能、良好的工程意識(shí),并在設(shè)計(jì)中學(xué)會(huì)如何發(fā)現(xiàn)、分析和解決工程實(shí)踐問題的技能和方法,為后續(xù)的畢業(yè)設(shè)計(jì)做好準(zhǔn)備。同時(shí)在這里也感謝在整個(gè)設(shè)計(jì)中幫助過(guò)我的老師和同學(xué)們。
附錄1:程序代碼
#include"stm32f10x.h"
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};
//數(shù)組里面的16進(jìn)制正好對(duì)應(yīng)著顯示0-9的二進(jìn)制碼(數(shù)碼管的位選,選擇哪一位就讓相關(guān)位為1,來(lái)表示選擇了它)
#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時(shí)鐘是72MHz的,APB1的時(shí)鐘是36MHz的
}
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure ; //蜂鳴器
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8; //選擇PA8
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; //復(fù)用功能,PA8作為復(fù)用是TIM1的PWM1的輸出端口,不再作為一個(gè)普通的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;
//按鍵的幾個(gè)輸入引腳
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉輸入
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin =0x7C07; //數(shù)碼管段選and位選
GPIO_InitStructure.GPIO_Speed =GPIO_Speed_10MHz; //
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_PP; //推挽輸出
GPIO_Init(GPIOB,&GPIO_InitStructure); //表示選擇的是PB的引腳
}
void TIM_yingyue(unsigned int NoteSet)
{
static unsigned char IfIsInit=0;
if(IfIsInit==0)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
/* Time base configuration */
TIM_TimeBaseStructure.TIM_Period = NoteSet; //設(shè)置了在下一個(gè)更新事件裝入活動(dòng)的自動(dòng)重裝載// 寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler = 0; //設(shè)置了用來(lái)作為TIM1時(shí)鐘頻率除數(shù)的預(yù)分頻值
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//選擇了計(jì)數(shù)器模式為向上計(jì)數(shù)模式
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
/* PWM1 Mode configuration: Channel4 */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //選擇定時(shí)器模式為TIM 脈沖寬度調(diào)制模式 1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //定時(shí)器輸出比較狀態(tài)使能
TIM_OCInitStructure.TIM_Pulse = NoteSet/2; //設(shè)置了待裝入捕獲比較寄存器的脈沖值和TIM_Period的值一起決定占空比
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High ; //設(shè)置了輸出比較極性為高
TIM_OC1Init(TIM1, &TIM_OCInitStructure);
TIM_CtrlPWMOutputs(TIM1,ENABLE); //TIM1的PWM輸出使能
TIM_Cmd(TIM1,ENABLE); //Tim1定時(shí)器使能
IfIsInit=1;
}
else
{
TIM1- >ARR=NoteSet; //改變輸出的頻率
TIM1- >CCR1=NoteSet/2;
}
}
void delay(unsigned int i) //延時(shí)函數(shù)
{
unsigned int j,k;
for(j=0;j < i;j++)< span > < /i;j++)< >
for(k=0;k< 100;k++);
}
void display(unsigned int j) //數(shù)碼管顯示函數(shù)
{
GPIO_SetBits(GPIOB,code[j]);
GPIO_ResetBits(GPIOB,0x001); //共陰極數(shù)碼管,段選為高電平有效,位選為低電平有效
}
int main()
{
RCC_Configuration();
GPIO_Configuration() ;
while(1) //按鍵掃描
{
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15)==0)
{
display(1); //修改顯示的數(shù)據(jù)
TIM_yingyue(D1); //修改輸出的頻率
}
else if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_4)==0)
{
display(2);
TIM_yingyue(D2);
}
else if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5)==0)
{
display(3);
TIM_yingyue(D3);
}
else if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_6)==0)
{
display(4);
TIM_yingyue(D4);
}
else if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7)==0)
{
display(5);
TIM_yingyue(D5);
}
else if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_8)==0)
{
display(6);
TIM_yingyue(D6);
}
else if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)==0)
{
display(7);
TIM_yingyue(D7);
}
else
{
TIM_yingyue(0); //無(wú)按鍵按下的時(shí)候不顯示,不發(fā)音
GPIO_SetBits(GPIOB,0x0001);
GPIO_ResetBits(GPIOB,0x7C06);
}
}
}
附錄2:核心版原理圖及PCB
小系統(tǒng)原理圖:
核心版原理圖:
-
單片機(jī)
+關(guān)注
關(guān)注
6037文章
44558瀏覽量
635295 -
lcd
+關(guān)注
關(guān)注
34文章
4426瀏覽量
167494 -
STM32
+關(guān)注
關(guān)注
2270文章
10900瀏覽量
356005 -
蜂鳴器
+關(guān)注
關(guān)注
12文章
891瀏覽量
45948 -
電子琴
+關(guān)注
關(guān)注
4文章
152瀏覽量
30517
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論