第一篇:嵌入式實(shí)驗(yàn)1 流水燈實(shí)驗(yàn)
河南機(jī)電高等專(zhuān)科學(xué)校
《嵌入式系統(tǒng)開(kāi)發(fā)》課程實(shí)驗(yàn)報(bào)告
系部: 電子通信工程系
班級(jí): 電信####
姓名: ######
學(xué)號(hào):
## 實(shí)驗(yàn)一搭建實(shí)驗(yàn)環(huán)境
一.實(shí)驗(yàn)簡(jiǎn)介
搭建嵌入式系統(tǒng)開(kāi)發(fā)環(huán)境,建立第一個(gè)工程,流水燈實(shí)驗(yàn)
二.實(shí)驗(yàn)?zāi)康?/p>
掌握STM32開(kāi)發(fā)環(huán)境,掌握從無(wú)到有的構(gòu)建工程。
三.實(shí)驗(yàn)內(nèi)容
熟悉MDK KEIL開(kāi)發(fā)環(huán)境,構(gòu)建基于固件庫(kù)的工程,編寫(xiě)代碼實(shí)現(xiàn)流水燈工程。通過(guò)ISP下載代碼到實(shí)驗(yàn)板,查看運(yùn)行結(jié)果。下載代碼到目標(biāo)板,查看運(yùn)行結(jié)果。
四.實(shí)驗(yàn)設(shè)備
硬件部分:PC計(jì)算機(jī)(宿主機(jī))、STM32實(shí)驗(yàn)板。
軟件部分:PC機(jī)WINDOWS系統(tǒng)、MDK KEIL軟件、ISP軟件。
五.實(shí)驗(yàn)步驟
1.熟悉MDK KEIL開(kāi)發(fā)環(huán)境 2.熟悉串口編程軟件ISP 3.查看固件庫(kù)結(jié)構(gòu)和文件
4.建立工程目錄,復(fù)制庫(kù)文件 5.建立和配置工程 6.編寫(xiě)代碼 7.編譯代碼
8.使用ISP下載到實(shí)驗(yàn)板 9.測(cè)試運(yùn)行結(jié)果
10.記錄實(shí)驗(yàn)過(guò)程,撰寫(xiě)實(shí)驗(yàn)報(bào)告
六.實(shí)驗(yàn)結(jié)果及測(cè)試
程序代碼主要有兩部分,第一部分是GPIO端口的配置,打開(kāi)端口時(shí)鐘,配置為推挽輸出模式,并使能端口。代碼如下:
void LED_GPIO_Config(void){
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_SetBits(GPIOB, GPIO_Pin_0);
GPIO_SetBits(GPIOC, GPIO_Pin_4|GPIO_Pin_3);
} 第二部分是主函數(shù),主要實(shí)現(xiàn)LED燈的亮滅的功能。要在主函數(shù)中調(diào)用GPIO端口的初始化
int main(void){
LED_GPIO_Config();
while(1){
LED1(ON);
Delay(0x0FFFFF);
LED1(OFF);
LED2(ON);
Delay(0x0FFFFF);
LED2(OFF);
LED3(ON);
Delay(0x0FFFFF);
LED3(OFF);
} } 七.實(shí)驗(yàn)總結(jié)
這次實(shí)驗(yàn)讓我們受益匪淺,學(xué)會(huì)了利用軟件編程,完成教學(xué)任務(wù),學(xué)得了知識(shí),而且提高了實(shí)踐能力,動(dòng)手能力。使我學(xué)到了不少實(shí)用的知識(shí),更重要的是,做實(shí)驗(yàn)的過(guò)程,思考問(wèn)題的方法,這與做其他的實(shí)驗(yàn)是通用的,真正使我們受益匪淺。
第二篇:嵌入式系統(tǒng) 流水燈、按鍵、定時(shí)器實(shí)驗(yàn)報(bào)告
嵌入式系統(tǒng)應(yīng)用
實(shí)驗(yàn)報(bào)告
姓
名: 學(xué)
號(hào): 學(xué)
院: 專(zhuān)
業(yè): 班
級(jí): 指導(dǎo)教師:
實(shí)驗(yàn)
1、流水燈實(shí)驗(yàn)
1.1實(shí)驗(yàn)要求
編程控制實(shí)驗(yàn)板上LED燈輪流點(diǎn)亮、熄滅,中間間隔一定時(shí)間。
1.2原理分析
實(shí)驗(yàn)主要考察對(duì)STM32F10X系列單片機(jī)GPIO的輸出操作。
參閱數(shù)據(jù)手冊(cè)可知,通過(guò)軟件編程,GPIO可以配置成以下幾種模式: ◇輸入浮空 ◇輸入上拉 ◇輸入下拉 ◇模擬輸入 ◇開(kāi)漏輸出 ◇推挽式輸出
◇推挽式復(fù)用功能 ◇開(kāi)漏式復(fù)用功能
根據(jù)實(shí)驗(yàn)要求,應(yīng)該首先將GPIO配置為推挽輸出模式。
由原理圖可知,單片機(jī)GPIO輸出信號(hào)經(jīng)過(guò)74HC244緩沖器,連接LED燈。由于74HC244的OE1和OE2都接地,為相同電平,故A端電平與Y端電平相同且LED燈共陽(yáng),所以,如果要點(diǎn)亮LED,GPIO應(yīng)輸出低電平。反之,LED燈熄滅。
1.3程序分析
軟件方面,在程序啟動(dòng)時(shí),調(diào)用SystemInit()函數(shù)(見(jiàn)附錄1),對(duì)系統(tǒng)時(shí)鐘等關(guān)鍵部分進(jìn)行初始化,然后再對(duì)GPIO進(jìn)行配置。
GPIO配置函數(shù)為SZ_STM32_LEDInit()(見(jiàn)附錄2),函數(shù)中首先使能GPIO時(shí)鐘:
RCC_APB2PeriphClockCmd(GPIO_CLK[Led], ENABLE);然后配置GPIO輸入輸出模式:
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 再配置GPIO端口翻轉(zhuǎn)速度: GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 最后將配置好的參數(shù)寫(xiě)入寄存器,初始化完成: GPIO_Init(GPIO_PORT[Led], &GPIO_InitStructure)。
初始化完成后,程序循環(huán)點(diǎn)亮一個(gè)LED并熄滅其他LED,中間通過(guò)Delay()函數(shù)進(jìn)行延時(shí),達(dá)到流水燈的效果(程序完整代碼見(jiàn)附錄3)。
實(shí)驗(yàn)程序流程圖如下:
硬件方面,根據(jù)實(shí)驗(yàn)指南,將實(shí)驗(yàn)板做如下連接:
1.3實(shí)驗(yàn)結(jié)果
實(shí)驗(yàn)
二、按鍵實(shí)驗(yàn)
2.1實(shí)驗(yàn)要求
利用STM32讀取外部按鍵狀態(tài),按鍵按下一次產(chǎn)生一次外部中斷在中斷處理函數(shù)中使按鍵所對(duì)應(yīng)的燈亮起。
2.2原理分析
實(shí)驗(yàn)主要考察對(duì)STM32F10X系列單片機(jī)GPIO外部中斷功能的使用。
STM32F107VCT一共有5組GPIO,分別是PA[15:0]、PB[15:0]、PC[15:0]、PD[15:0]、PE[15:0]。STM32的所有GPIO都可以作為中斷輸入源,單片機(jī)通過(guò)復(fù)用的方式使其對(duì)處理器來(lái)說(shuō)來(lái)自 GPIO 的一共有 16 個(gè)中斷Px[15:0]。具體實(shí)現(xiàn)是PA[0]、PB[0]、PC[0]、PD[0]和PE[0]共享一個(gè)GPIO中斷;PA[1]、PB[1]、PC[1]、PD[1]和PE[1]共享一個(gè)GPIO中斷;……PA[15]、PB[15]、PC[15]、PD[15]和PE[15]共享一個(gè)GPIO中斷。以下圖片為以EXTI0為例的外部中斷/事件線路映像:
要產(chǎn)生中斷,必須先配置好并使能中斷線。根據(jù)需要的邊沿檢測(cè)設(shè)置2個(gè)觸發(fā)寄存器,同時(shí)在中斷屏蔽寄存器的相應(yīng)位寫(xiě)‘1’允許中斷請(qǐng)求。當(dāng)外部中斷線上發(fā)生了期待的邊沿時(shí),將產(chǎn)生一個(gè)中斷請(qǐng)求,對(duì)應(yīng)的掛起位也隨之被置‘1’。在掛起寄存器的對(duì)應(yīng)位寫(xiě)’1’,將清除該中斷請(qǐng)求。
要把IO口作為外部中斷輸入,有以下幾個(gè)步驟:
(1)初始化 IO 口為輸入。這一步設(shè)置要作為外部中斷輸入的IO口的狀態(tài),可以設(shè)置為上拉/下拉輸入,也可以設(shè)置為浮空輸入,但浮空的時(shí)候外部一定要帶上拉,或者下拉電阻。否則可能導(dǎo)致中斷不停的觸發(fā)。在干擾較大的地方,就算使用了上拉/下拉,也建議使用外部上拉/下拉電阻,這樣可以一定程度防止外部干擾帶來(lái)的影響。
(2)開(kāi)啟IO口復(fù)用時(shí)鐘,設(shè)置IO口與中斷線的映射關(guān)系。STM32的IO口與中斷線的對(duì)應(yīng)關(guān)系需要配置外部中斷配置寄存器EXTICR,這樣我們要先開(kāi)啟復(fù)用時(shí)鐘,然后配置IO口與中斷線的對(duì)應(yīng)關(guān)系。才能把外部中斷與中斷線連接起來(lái)。
(3)開(kāi)啟與該IO口相對(duì)的線上中斷/事件,設(shè)置觸發(fā)條件。這一步,我們要配置中斷產(chǎn)生的條件,STM32可以配置成上升沿觸發(fā),下降沿觸發(fā),或者任意電平變化觸發(fā),但是不能配置成高電平觸發(fā)和低電平觸發(fā)。這里根據(jù)自己的實(shí)際情況來(lái)配置。同時(shí)要開(kāi)啟中斷線上的中斷,這里需要注意的是:如果使用外部中斷,并設(shè)置該中斷的EMR位的話,會(huì)引起軟件仿真不能跳到中斷,而硬件上是可以的。而不設(shè)置EMR,軟件仿真就可以進(jìn)入中斷服務(wù)函數(shù),并且硬件上也是可以的。建議不要配置EMR位。
(4)配置中斷分組(NVIC),并使能中斷。這一步,我們就是配置中斷的分組以及使能,對(duì)STM32的中斷來(lái)說(shuō),只有配置了 NVIC 的設(shè)置,并開(kāi)啟才能被執(zhí)行,否則是不會(huì)執(zhí)行到中斷服務(wù)函數(shù)里面去的。
(5)編寫(xiě)中斷服務(wù)函數(shù)。這是中斷設(shè)置的最后一步,中斷服務(wù)函數(shù),是必不可少的,如果在代碼里面開(kāi)啟了中斷,但是沒(méi)編寫(xiě)中斷服務(wù)函數(shù),就可能引起硬件錯(cuò)誤,從而導(dǎo)致程序崩潰。所以在開(kāi)啟了某個(gè)中斷后,應(yīng)為該中斷編寫(xiě)服務(wù)函數(shù)。在中斷服務(wù)函數(shù)里面編寫(xiě)要執(zhí)行的中斷后的操作,并很據(jù)情況判斷是否要對(duì)中斷產(chǎn)生的標(biāo)志位進(jìn)行清零。
由原理圖可知,按鍵未按下時(shí),GPIO讀到的為高電平,按鍵按下后,IO口接地,產(chǎn)生一個(gè)電平跳變,所以外部中斷觸發(fā)方式應(yīng)該設(shè)置為下降沿觸發(fā)。
2.3程序分析
LED燈的點(diǎn)亮與實(shí)驗(yàn)一中相同,不過(guò)多贅述。程序首先對(duì)按鍵進(jìn)行初始化,初始化函數(shù)為GPIO_KEY_Config()(見(jiàn)附錄4),配置過(guò)程與實(shí)驗(yàn)一中GPIO配置基本一致。由于此處GPIO需要采集外界按鍵信號(hào),故GPIO模式應(yīng)該為調(diào)整為內(nèi)部上拉電阻輸入
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU。
然后執(zhí)行GPIO中斷初始化函數(shù)KEY_EXIT_Init()(見(jiàn)附錄5),首先將連接按鍵的IO口與EXTI線鏈接到一起:
GPIO_EXTILineConfig(GPIO_KEY1_EXTI_PORT_SOURCE,GPIO_KEY1_EXTI_PIN_SOURCE);
然后將觸發(fā)方式設(shè)置為下降沿觸發(fā)并寫(xiě)入中斷配置寄存器,并使能中斷: EXTI_InitStructure.EXTI_Line = GPIO_KEY1_EXTI_LINE;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure)。
之后進(jìn)行中斷分組配置及中斷優(yōu)先級(jí)配置,函數(shù)為InterruptConfig()(見(jiàn)附錄6)。配置過(guò)程較為復(fù)雜,涉及到搶占優(yōu)先級(jí)和響應(yīng)優(yōu)先級(jí)的概念。程序首先將所有外部中斷歸為NVIC_PriorityGroup_2,即2位搶占優(yōu)先級(jí)和2位響應(yīng)優(yōu)先級(jí):
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
然后將所有外部中斷信號(hào)的搶占優(yōu)先級(jí)規(guī)定為0、1、2,使其可以相互區(qū)別,并將配置好的參數(shù)寫(xiě)入對(duì)應(yīng)寄存器中,完成配置:
NVIC_InitStructure.NVIC_IRQChannel = GPIO_KEY1_EXTI_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);NVIC_InitStructure.NVIC_IRQChannel = GPIO_KEY2_EXTI_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;NVIC_Init(&NVIC_InitStructure);NVIC_InitStructure.NVIC_IRQChannel = GPIO_KEY3_EXTI_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;NVIC_Init(&NVIC_InitStructure)。
初始化完成后,程序進(jìn)入等待按鍵中斷觸發(fā)狀態(tài),一旦按鍵按下,則進(jìn)入中斷服務(wù)函數(shù)EXTI9_5_IRQHandler()(見(jiàn)附錄7)中。在函數(shù)中對(duì)LED燈進(jìn)行點(diǎn)亮、熄滅操作,并重置中斷產(chǎn)生標(biāo)志位。
實(shí)驗(yàn)流程圖如下(主函數(shù)代碼見(jiàn)附錄8):
硬件連接方式如下圖所示:
2.3實(shí)驗(yàn)結(jié)果
實(shí)驗(yàn)
三、定時(shí)器實(shí)驗(yàn)
3.1實(shí)驗(yàn)要求
利用STM32的通用定時(shí)器 TIM5 產(chǎn)生一個(gè)1S的中斷,在中斷函數(shù)中實(shí)現(xiàn) LED1、LED2、LED3、LED4同時(shí)翻轉(zhuǎn)的效果。
3.2原理分析
實(shí)驗(yàn)主要考察對(duì)STM32F10X系列單片機(jī)定時(shí)器的使用。
實(shí)驗(yàn)中使用的STM32F107單片機(jī)有多達(dá)10個(gè)定時(shí)器,包括:
◇多達(dá)4個(gè)16位定時(shí)器,每個(gè)定時(shí)器有多達(dá)4個(gè)用于輸入捕獲/輸出比較/PWM 或脈沖計(jì)數(shù)的通道和增量編碼器輸入
◇1個(gè)16位帶死區(qū)控制和緊急剎車(chē),用于電機(jī)控制的 PWM 高級(jí)控制定時(shí)器
◇2個(gè)獨(dú)立的看門(mén)狗定時(shí)器(獨(dú)立的和窗口型的)
◇系統(tǒng)時(shí)間定時(shí)器:24 位自減型計(jì)數(shù)器
◇2個(gè) 16 位基本定時(shí)器用于驅(qū)動(dòng)DAC
根據(jù)時(shí)鐘樹(shù)可知,系統(tǒng)時(shí)鐘經(jīng)過(guò)分頻之后,進(jìn)入TIM5的時(shí)鐘模塊入口,在經(jīng)過(guò)預(yù)分頻處理,才供給TIM5作時(shí)鐘使用。預(yù)分頻器的系數(shù)為:TIMx_PSC,當(dāng)TIMx_PSC = 0時(shí)表示不分頻,則TIM5定時(shí)器的時(shí)鐘
用CK_CNT =模塊入口時(shí)鐘72MHz;當(dāng)TIMx_PSC = 1時(shí)表示不分頻,則TIM5定時(shí)器的時(shí)鐘用CK_CNT=模塊入口時(shí)鐘36MHz;以此類(lèi)推。公式為:CK_CNT =fCK_PSC/(PSC[15:0]+1),其中PSC最大為65535。
其次是TIM5計(jì)數(shù)器計(jì)數(shù)值的設(shè)置,TIM5計(jì)數(shù)器以CK_CNT為時(shí)鐘計(jì)數(shù),向下計(jì)數(shù)到0或向上計(jì)數(shù)到設(shè)定值(TIMx_ARR)則產(chǎn)生中斷。以向上計(jì)數(shù)為例,從 0 開(kāi)始計(jì)數(shù)到設(shè)定值TIMx_ARR 時(shí)產(chǎn)生中斷。要產(chǎn)生一秒一次中斷則要使計(jì)數(shù)器的值乘以預(yù)分頻的值=系統(tǒng)時(shí)鐘72MHz,其中計(jì)數(shù)器的值和預(yù)分頻值都必須小于65535。我們使預(yù)分頻值為7200,計(jì)數(shù)器值為10000,則7200 * 10000 = 72,000,000即72M。其中拆分方法很多35000*2000 = 72,000,000,只要注意計(jì)數(shù)器的值和預(yù)分頻值都必須小于65535即可。當(dāng)計(jì)數(shù)值溢出后,會(huì)改變計(jì)數(shù)溢出標(biāo)志位,并產(chǎn)生定時(shí)器中斷,實(shí)驗(yàn)中使用其產(chǎn)生中斷來(lái)進(jìn)行LED燈翻轉(zhuǎn)。
3.3程序分析
LED初始化部分與實(shí)驗(yàn)一相同,完成初始化后,點(diǎn)亮所有LED燈。定時(shí)器配置函數(shù)為T(mén)IM5_Init()(見(jiàn)附錄6)。配置函數(shù)首先使能計(jì)數(shù)器時(shí)鐘:
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE); 然后自動(dòng)裝載計(jì)數(shù)值,計(jì)數(shù)從0開(kāi)始:
TIM_TimeBaseStructure.TIM_Period =(1001); 并將計(jì)數(shù)器設(shè)置為向上計(jì)數(shù):
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; 最后寫(xiě)入計(jì)時(shí)器配置寄存器,完成配置:
TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure)。
配置完成后,還要對(duì)計(jì)數(shù)器溢出標(biāo)志位進(jìn)行清零,并打開(kāi)溢出中斷,使能計(jì)數(shù)器以開(kāi)始計(jì)數(shù)。
TIM_ClearITPendingBit(TIM5, TIM_IT_Update);TIM_ITConfig(TIM5, TIM_IT_Update, ENABLE);TIM_Cmd(TIM5, ENABLE)。
定時(shí)器配置完成并使能后,計(jì)數(shù)器開(kāi)始工作,當(dāng)?shù)竭_(dá)預(yù)設(shè)的計(jì)數(shù)值之后,產(chǎn)生中斷信號(hào)。系統(tǒng)在進(jìn)行相關(guān)配置后可以響應(yīng)定時(shí)器產(chǎn)生的中斷,中斷配置函數(shù)為NVIC_Configuration()(見(jiàn)附錄7)。函數(shù)首先將中斷向量表首地址置于0x08000000:
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0000); 然后使能TIM5中斷:
NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;最后將配置參數(shù)寫(xiě)入中斷控制寄存器,完成配置: NVIC_Init(&NVIC_InitStructure)。
一旦中斷產(chǎn)生,系統(tǒng)會(huì)對(duì)中斷產(chǎn)生響應(yīng),暫停所有正在執(zhí)行的低優(yōu)先級(jí)任務(wù)且將任務(wù)信息和數(shù)據(jù)壓入對(duì)應(yīng)對(duì)戰(zhàn)區(qū),并進(jìn)入中斷服務(wù)函數(shù)TIM5_IRQHandler()(見(jiàn)附錄8)中進(jìn)行處理。
在中斷服務(wù)函數(shù)中判斷并清除了中斷標(biāo)志位,以便定時(shí)器下一次計(jì)數(shù)中斷產(chǎn)生。函數(shù)中調(diào)用了LED_Spark()函數(shù)(見(jiàn)附錄9),實(shí)現(xiàn)了LED的閃爍。
程序流程圖如下:
硬件連接方式如下圖所示:
實(shí)驗(yàn)
四、按鍵中斷控制LED燈定時(shí)閃爍
4.1實(shí)驗(yàn)要求
綜合實(shí)驗(yàn)一、二、三,利用STM32讀取外部按鍵狀態(tài),按鍵按下一次產(chǎn)生一次外部中斷在中斷處理函數(shù)中使按鍵所對(duì)應(yīng)的燈閃爍,閃爍間隔通過(guò)定時(shí)器定時(shí)控制。其中,SKEY1控制LED1以1S為間隔,閃爍3次,SKEY2控制LED2以2S為間隔閃爍3次,SKEY3控制LED3以3S為間隔,閃爍3次。
4.2原理分析
實(shí)驗(yàn)需要用到STM32的GPIO輸入輸出操作,GPIO外部中斷和內(nèi)部定時(shí)器中斷。在以上三個(gè)實(shí)驗(yàn)中,對(duì)各個(gè)部分都已經(jīng)進(jìn)行過(guò)詳盡的解釋?zhuān)@里不再贅述。此實(shí)驗(yàn)需要將以上實(shí)驗(yàn)做綜合,并對(duì)時(shí)序進(jìn)行調(diào)整。難點(diǎn)為,對(duì)GPIO外部中斷和定時(shí)器內(nèi)部中斷的處理,即如何確定兩種不同中斷的優(yōu)先級(jí)。
這里的使用的方法是,將所有按鍵外部中斷置于中斷分組2,即NVIC_PriorityGroup_2中。將所有按鍵中斷搶占優(yōu)先級(jí)置為0,即最高級(jí)別中斷,響應(yīng)優(yōu)先級(jí)置分別置為1、2、3,相互區(qū)別。將定時(shí)器中斷搶占優(yōu)先級(jí)置為1,相應(yīng)優(yōu)先級(jí)社會(huì)中低于按鍵中斷,使其可以被按鍵信號(hào)中斷計(jì)時(shí),并刷新LED閃爍狀態(tài)。
4.3程序分析
這在程序初始化階段,分別對(duì)LED、按鍵外部中斷和定時(shí)器中斷進(jìn)行初始化。主函數(shù)如下:
int main(void){ /* LED初始化 */ LED_config();/* LED閃爍? */ Led_Turn_on_all();Delay(3000000);Led_Turn_off_all();Delay(3000000);Led_Turn_on_all();Delay(3000000);Led_Turn_off_all();Delay(3000000);Led_Turn_on_all();Delay(3000000);Led_Turn_off_all();/* 按鍵初始化 */ GPIO_KEY_Config();/* 按鍵外部中斷初始化 */ KEY_EXIT_Init();/* 外部中斷向量初始化 */ InterruptConfig();/* 定時(shí)器5初始化 */ TIM5_Init();/* 定時(shí)器中斷初始化 */ NVIC_Configuration();/* 等待中斷觸發(fā) */ while(1){ } } 初始化完成后,等待中斷觸發(fā)。一旦按鍵按下,觸發(fā)外部中斷,則進(jìn)入外部中斷服務(wù)函數(shù),函數(shù)中將判斷哪一個(gè)按鍵被按下,記錄按下的按鍵,然后給定時(shí)器清零并開(kāi)始計(jì)數(shù),且清零外部中斷標(biāo)志位。
第三篇:流水燈實(shí)驗(yàn)報(bào)告
單片機(jī)流水燈實(shí)驗(yàn)
一、任務(wù)
讓8個(gè)LED燈輪流亮起來(lái),實(shí)現(xiàn)流水燈的功能。
二、思路
讓接在P0.0口的LED燈亮起來(lái),那么只要把P0.0口的電平變?yōu)榈碗娖骄涂梢粤耍幌喾矗绻釉赑0.0口的LED燈熄滅,就要把P0.0口的電平變?yōu)楦唠娖骄涂梢粤恕R獙?shí)現(xiàn)流水燈功能,只要將8個(gè)LED燈依次點(diǎn)亮、熄滅,8只LED燈便會(huì)一亮一暗的做流水燈了。
我們應(yīng)該注意一點(diǎn),由于單片機(jī)執(zhí)行每條指令的時(shí)間很短,我們?cè)诳刂贫O管亮滅的時(shí)候應(yīng)該延時(shí)一段時(shí)間,否則我們就看不到“流水”效果了。
三、步驟
1、用proteus畫(huà)電路圖。如下圖:
2、用keil建工程。
1)運(yùn)行keil C51軟件,點(diǎn)擊Project菜單新建項(xiàng)目,選擇為AT89C52的單片機(jī)型號(hào)。然后單擊File選擇New新建程序文件,保存成.c 文件,右擊Source Group1添加入程序文件。2)用C語(yǔ)言編寫(xiě)程序代碼如下:
#include
void main(void){ unsigned char i;while(1){ for(i=0;i<8;i++){
P0=tmpled[i];
delay(50);} } }
void delay(unsigned char tmp){ unsigned char i,j;i=tmp;while(i){ i--;j=255;{
j--;} } } 3)右擊Target 1打開(kāi)設(shè)置,Output菜單下勾選上create hex file。
4)調(diào)試運(yùn)行程序后,在proteus中雙擊單片機(jī),添加hex文件,運(yùn)行看到流水的的效果。
四、實(shí)驗(yàn)中遇到的問(wèn)題。
1、用proteus仿真時(shí)候,發(fā)現(xiàn)錯(cuò)誤:
error variable not found parsing property resistance of RN1-Rnvalue expected for RN1-R(n=1~8)而且led燈亮度十分微弱。可能是接入的電阻太大了。
檢查電路圖發(fā)現(xiàn)排阻的值為RX8,修改為220(自己選擇)后。錯(cuò)誤便沒(méi)有了,同時(shí),led燈的亮度也增強(qiáng)了。
2、關(guān)于延時(shí)函數(shù)。
延時(shí)的時(shí)間計(jì)算不太明白。
3、P0=0xfe;是對(duì)單片機(jī)P0口的8個(gè)I/O口同時(shí)進(jìn)行操作,0x后的數(shù)使用十六進(jìn)制表示,fe轉(zhuǎn)換為二進(jìn)制是1111 1110,則P0.0為低電平,對(duì)應(yīng)的led燈亮,其他7個(gè)led燈滅。
第四篇:流水燈實(shí)驗(yàn)報(bào)告(范文)
單片機(jī)流水燈試驗(yàn)
一、實(shí)驗(yàn)?zāi)康模?/p>
1、進(jìn)一步熟悉Keil C51集成開(kāi)發(fā)環(huán)境調(diào)試功能的使用
2、學(xué)會(huì)自己編寫(xiě)程序,進(jìn)行編譯、仿真調(diào)試
3、學(xué)會(huì)使用單片機(jī)的P0口作為I/O口去控制外圍電路,實(shí)現(xiàn)LED燈以固定的頻率進(jìn)行閃爍。
二、實(shí)驗(yàn)設(shè)備:
1、PC機(jī)
2、SW-51PROC單片機(jī)綜合實(shí)驗(yàn)平臺(tái)
三、實(shí)驗(yàn)內(nèi)容:
1、編寫(xiě)一段程序,用單片機(jī)P0口的8個(gè)輸出去控制8個(gè)LED燈,實(shí)現(xiàn)如下功能:
先使8個(gè)LED燈輪流點(diǎn)亮,從左向右移動(dòng),時(shí)間間隔0.5s。以上過(guò)程循環(huán)實(shí)現(xiàn)。
四、實(shí)驗(yàn)步驟:
1、實(shí)驗(yàn)原理:
單片機(jī)流水的實(shí)質(zhì)是單片機(jī)各引腳在規(guī)定的時(shí)間逐個(gè)上電,使LED燈能逐個(gè)亮起來(lái)但過(guò)了該引腳通電的時(shí)間后便滅燈的過(guò)程,實(shí)驗(yàn)中使用了單片機(jī)的P2端口,對(duì)8個(gè)LED燈進(jìn)行控制,要實(shí)現(xiàn)逐個(gè)亮燈即將P2的各端口逐一置零,中間使用時(shí)間間隔隔開(kāi)各燈的亮滅。使用rl或rr a實(shí)現(xiàn)位的轉(zhuǎn)換。A寄存器的位經(jīng)過(guò)rr a之后轉(zhuǎn)換如下所示:
A0A1A2A3A4A5A6A7 然后將A寄存器轉(zhuǎn)換一次便送給P2即MOV P2,A便將轉(zhuǎn)換后的數(shù)送到了P2口,不斷循環(huán)下去,便實(shí)現(xiàn)了逐位置一操作。
2、實(shí)驗(yàn)電路圖 +5v1234123412340a1a2a3a4a1a2a3a4a1a2a3a4GND0Vcc1P2.0P2.1P2.2P2.3P2.4P2.5P2.6P2.7b1b2b3b***C51
3通過(guò)仿真實(shí)驗(yàn)正確性
代碼如下:ORG 0 MOV A,#00000001B LOOP:MOV P2,A RL A ACALL DELAY SJMP LOOP
DELAY:MOV R1,#255 DEL2:MOV R2,#250 DEL1:DJNZ R2,DEL1
DJNZ R1,DEL2 RET End ORG 0000H LJMP MAIN
4、實(shí)驗(yàn)程序 :
ORG 0050H MAIN:MOV R0,#14
MOV DPTR,#TABLE L0:
MOV A,#0 L1:
MOVC A,@DPTR+A
MOV P0,A
ACALL DELAY1
INC A41 DJNZ R0,L1 SJMP L0 DELAY1:
MOV R1,#250 LOOP1:
MOV R2,#250 LOOP2:
NOP
NOP
NOP
NOP
NOP
DJNZ R0,LOOP2
DJNZ R1,LOOP1
RET TABLE: DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH,0BFH,0DFH,0EFH,0F7H,0FBH,0FDH END
5、實(shí)驗(yàn)結(jié)果:
五、實(shí)驗(yàn)總結(jié)
這次試驗(yàn)我通過(guò)Proteus仿真實(shí)現(xiàn)對(duì)流水燈功能的實(shí)現(xiàn)。受益匪淺,對(duì)80c51的功能和結(jié)構(gòu)有了深層次的了解,我深刻的明白,要想完全了解c51還有一定距離,但我會(huì)一如既往的同困難作斗爭(zhēng)。在實(shí)驗(yàn)中,我遇到了不少困難,比如不知道怎么將程序?qū)戇M(jìn)單片機(jī)中,寫(xiě)好程序的卻總出錯(cuò),不知道什么原因,原來(lái)沒(méi)有生成hex文件。這些錯(cuò)誤令我明白以后在試驗(yàn)中要步步細(xì)心,避免出錯(cuò)。
第五篇:嵌入式實(shí)驗(yàn)總結(jié)
如今,嵌入式系統(tǒng)已經(jīng)在眾多電氣電子產(chǎn)品上應(yīng)用,有人預(yù)測(cè)今后5年發(fā)展形勢(shì)看好。嵌入式是典型的交叉學(xué)科,電信、電子、電氣、計(jì)算機(jī)、通信等等都有涉及。
嵌入式理論、實(shí)踐要求多、門(mén)檻高,只有理論、實(shí)踐同步才能在積累中更好的漸次掌握,這學(xué)期我們針對(duì)嵌入式入門(mén)做了一些實(shí)驗(yàn),通過(guò)自己動(dòng)手和實(shí)驗(yàn)箱、實(shí)驗(yàn)軟件打交道,對(duì)嵌入式編程形成初步了解,為今后進(jìn)一步發(fā)展打基礎(chǔ)。
實(shí)驗(yàn)環(huán)境:
武漢創(chuàng)維特公司JXARM9-2410開(kāi)發(fā)板、PC;
Linux、windows操作平臺(tái);
DNW、VMwareWorkstation應(yīng)用軟件;
《ARM9嵌入式技術(shù)及Linux高級(jí)實(shí)踐教程》、實(shí)驗(yàn)參考資料等;
實(shí)驗(yàn)內(nèi)容及目標(biāo):
閱讀樣例程序,進(jìn)行:
1.熟悉JXARM9-2410開(kāi)發(fā)板、相關(guān)應(yīng)用軟件的使用,能成功運(yùn)行示例實(shí)驗(yàn)程序(demo-led);
2.使用VMware,修改demo-led源程序,使開(kāi)發(fā)板上數(shù)碼管按照demo-led顯示方式顯示;
3.使用VMware、DNW,修改相關(guān)源程序,實(shí)現(xiàn)開(kāi)發(fā)板鍵盤(pán)輸入的字符在DNW中顯示;
4.使用VMware、DNW,修改相關(guān)源程序,實(shí)現(xiàn)對(duì)直流電機(jī)轉(zhuǎn)動(dòng)狀態(tài)的控制;
觀看教學(xué)視頻,進(jìn)行交叉編譯:
1.加載linux內(nèi)核;
2.配置、編譯linux內(nèi)核;
3.Windows、linux跨平臺(tái)文件共享;
4.編譯、運(yùn)行l(wèi)inux程序(helloworld)
5.Linux下編譯數(shù)碼管顯示驅(qū)動(dòng)程序;
6.Linux下編譯攝像頭、GPRS驅(qū)動(dòng)程序;
學(xué)習(xí)嵌入式是一個(gè)漫長(zhǎng)的過(guò)程,學(xué)好它還是需要一番的功夫。通過(guò)嵌入式實(shí)驗(yàn)由淺入深的動(dòng)手實(shí)踐,我漸漸對(duì)嵌入式有了具體概念,也逐漸對(duì)其產(chǎn)生了興致和好奇心。
對(duì)于初學(xué)者,還有一點(diǎn)小建議,不要好高騖遠(yuǎn),要腳踏實(shí)地.