單片機(jī)產(chǎn)品設(shè)計與調(diào)試-基于STM32F1xx機(jī)型和HAL庫函數(shù) 項目報告3HAL-答案_第1頁
單片機(jī)產(chǎn)品設(shè)計與調(diào)試-基于STM32F1xx機(jī)型和HAL庫函數(shù) 項目報告3HAL-答案_第2頁
單片機(jī)產(chǎn)品設(shè)計與調(diào)試-基于STM32F1xx機(jī)型和HAL庫函數(shù) 項目報告3HAL-答案_第3頁
單片機(jī)產(chǎn)品設(shè)計與調(diào)試-基于STM32F1xx機(jī)型和HAL庫函數(shù) 項目報告3HAL-答案_第4頁
單片機(jī)產(chǎn)品設(shè)計與調(diào)試-基于STM32F1xx機(jī)型和HAL庫函數(shù) 項目報告3HAL-答案_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

PAGEPAGE19《單片機(jī)產(chǎn)品設(shè)計與制作》項目報告項目3、利用按鍵查詢實現(xiàn)參數(shù)設(shè)定及顯示姓名:學(xué)號:

一、任務(wù)要求理解開關(guān)量/數(shù)字量信號的沿采集方法;理解數(shù)碼管數(shù)值顯示原理;會編寫和調(diào)試按鍵查詢與去抖程序;能設(shè)計數(shù)碼管靜態(tài)和動態(tài)顯示電路并編寫和調(diào)試相應(yīng)程序;初步理解STM32內(nèi)部存儲器結(jié)構(gòu)及啟動方式。二、要點記錄及成果檢驗任務(wù)3.1方案設(shè)計姓名學(xué)號日期分?jǐn)?shù)(一)要點記錄1、請畫出系統(tǒng)方框圖。任務(wù)3.2電路設(shè)計與測試姓名學(xué)號日期分?jǐn)?shù)(一)術(shù)語記錄英文中文翻譯Segment段Direction(DIR)方向OutputEnable(OE)輸出允許LatchEnable(LE)鎖存允許Common(COM)公共(二)自主設(shè)計1、請畫出直聯(lián)的兩位數(shù)碼管靜態(tài)顯示電路,已知數(shù)碼管為共陽極。要求使用PB15~PB0連接數(shù)碼管。并寫出顯示數(shù)字“25”的操作過程。將“2”(十位)的段碼0xa4(參見表3.2.1)送到PB15~PB8;將“5”(個位)的段碼0x92(參見表3.2.1)送到PCB7~PB0。GPIO_Write(GPIOB,0xa492); //向PB15~PB0輸出“25”的段碼2、用74LVC245驅(qū)動的共陰極數(shù)碼管靜態(tài)顯示電路,要求使用PD15~PD0連接數(shù)碼管。并寫出顯示數(shù)字“25”的操作過程。將“2”(十位)的段碼0x5B(參見表3.2.2)送到PD15~PD8;將“5”(個位)的段碼0x6D(參見表3.2.2)送到PDB7~PD0。GPIO_Write(GPIOD,0x5B6D); //向PD15~PD0輸出“25”的段碼3、請上網(wǎng)查找使用三極管做驅(qū)動的數(shù)碼管靜態(tài)或動態(tài)顯示電路,并分析其工作原理。4、請上網(wǎng)查找使用7407驅(qū)動的數(shù)碼管靜態(tài)或動態(tài)顯示電路,并分析其工作原理。。靜態(tài)動態(tài)5、請畫出用74LVC573驅(qū)動的兩位數(shù)碼管動態(tài)顯示電路,如果數(shù)碼管采用共陰極,使用PB7~PB0連接數(shù)碼管,PB8和PB9做位選,請大家畫電路,寫出顯示數(shù)字“68”的操作過程。禁止兩個數(shù)碼管(PBout(8)=0;PBout(9)=0;)輸出“6”的段碼到PB7~PB0,同時輸出0xfc(11111100)到PB8~PB15(GPIO_Write(GPIOB,0xfc7d);)選通個十位數(shù)碼管(PBout(8)=1;)延時10ms禁止十位數(shù)碼管(PBout(8)=0;)輸出“8”的段碼到PB7~PB0,同時輸出0xfc(11111100)到PB8~PB15(GPIO_Write(GPIOB,0xfc7f);)選通個位數(shù)碼管(PBout(9)=1;)延時10ms禁止個位數(shù)碼管(PBout(9)=0;)重復(fù)步驟2~9。步驟1通常在初始化程序中做。步驟5和9可省略。6、請畫出用74LVC573驅(qū)動的兩位數(shù)碼管動態(tài)顯示電路,如果數(shù)碼管采用共陽極,使用PB7~PB0連接數(shù)碼管,PB8和PB9做位選,請大家寫出顯示數(shù)字“68”的操作過程。第5題電路中,將兩個數(shù)碼管的com接3.3V,其余相同。操作過程同第5題,但應(yīng)使用共陽極段碼。7、請畫出用用74LVC245驅(qū)動的兩位數(shù)碼管動態(tài)顯示電路,如果數(shù)碼管采用共陰極,請大家寫出顯示數(shù)字“68”的操作過程操作過程與題5類似,但(1)選通信號為0,禁止信號為1;(2)段碼輸出口為GPIOC,位選信號為PCout(0)和PCout(1)。任務(wù)3.3程序設(shè)計與調(diào)試姓名學(xué)號日期分?jǐn)?shù)(一)術(shù)語記錄英文中文翻譯Segment段Display顯示Set_value設(shè)定值Key_Scan按鍵掃描(二)自主設(shè)計1、用開發(fā)板上的K_UP做加1鍵,K_DOWN做減1鍵,用PD7~PD0控制十位數(shù)碼管,PC7~PC0控制個位數(shù)碼管,兩個數(shù)碼管都是共陰極,用74LVC245做驅(qū)動器,畫出電路,編寫程序。Main.c#include"seg.h" //數(shù)碼管定義頭文件#include"sys.h" #include"SysTick.h"#include"key.h" //按鍵定義頭文件intmain(){ u8Set_value; //定義變量,用于存儲設(shè)定值 HAL_Init(); KEY_Init(); //初始化按鍵 Seg_Init(); //初始化數(shù)碼管 Stm32_Clock_Init(RCC_PLL_MUL9); SysTick_Init(72); while(1) { Set_value=Key_Scan(); //進(jìn)行按鍵采集,結(jié)果存在Set_value Seg_Disp(Set_value); //將Set_value送數(shù)碼管進(jìn)行數(shù)值顯示 }}Key.c#include"key.h"staticu8Key_Up_Last; //存儲Key_Upt按鍵上一次的值staticu8Key_Down_Last; //存儲Key_Down按鍵上一次的值staticu8Key_value; //存儲設(shè)定值(范圍0~99)/****按鍵初始化函數(shù)***************************************/voidKey_Init(){ GPIO_InitTypeDefGPIO_Initure;__HAL_RCC_GPIOA_CLK_ENABLE();//開啟GPIOA時鐘__HAL_RCC_GPIOE_CLK_ENABLE();//開啟GPIOE時鐘GPIO_Initure.Pin=GPIO_PIN_0;//PA0GPIO_Initure.Mode=GPIO_MODE_INPUT;//輸入GPIO_Initure.Pull=GPIO_PULLDOWN;//下拉GPIO_Initure.Speed=GPIO_SPEED_HIGH;//高速HAL_GPIO_Init(GPIOA,&GPIO_Initure); GPIO_Initure.Pin=GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4;//PE2,3,4GPIO_Initure.Mode=GPIO_MODE_INPUT;//輸入GPIO_Initure.Pull=GPIO_PULLUP;//上拉GPIO_Initure.Speed=GPIO_SPEED_HIGH;//高速HAL_GPIO_Init(GPIOE,&GPIO_Initure); Key_Up_Last=0x01;Key_Down_Last=0x01; Key_value=0;}/***************按鍵采集程序***********************功能:采集K_Up和K_Down按鍵,每按下1次,結(jié)果+1;*每按下1次,結(jié)果-1;*輸入:無*輸出:按鍵加減1的結(jié)果,u8類型***************按鍵采集程序***********************/u8Key_Scan(void){ if(K_Up!=Key_Up_Last) //如果K_Up當(dāng)前值和上一次不相等,說明按鍵狀態(tài)發(fā)生改變 { if(K_Up==1) {Key_value+=1;}//如果是上升沿,則鍵值+1 Key_Up_Last=K_Up; //無論是下降沿還是上升沿,將Key_Up_Last刷新為當(dāng)前值 delay_ms(10); //延時去抖 } if(K_Down!=Key_Down_Last) //如果K_Downt當(dāng)前值和上一次不相等,說明按鍵狀態(tài)發(fā)生改變 { if(K_Down==0) {Key_value-=1;}//如果是下降沿,則鍵值-1 Key_Down_Last=K_Down; //無論是下降沿還是上升沿,將Key_Right_Last刷新為當(dāng)前值 delay_ms(10); //延時去抖 } if(Key_value>99)Key_value=0; //限制Key_value在0~99范圍 return(Key_value); //返回Key_value的值}Key.h#ifndef_KEY_H #define_KEY_H #include"stm32f1xx.h" #include"sys.h" #include"SysTick.h" #defineK_Up PAin(0) #defineK_Left PEin(2) #defineK_Down PEin(3) #defineK_Right PEin(4) voidKey_Init(void); u8Key_Scan(void);#endifSeg.c#include"seg.h"http://u8smg_table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0~9共陽極數(shù)碼管段碼表u8smg_table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0~9共陰極數(shù)碼管段碼表voidSeg_Init(){ GPIO_InitTypeDefGPIO_InitStructure; //定義變量,用于存儲GPIO初始化參數(shù) __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOD_CLK_ENABLE(); //開啟GPIOC和GPIOD時鐘 /**********GPIOC_Pin_0~Pin_7初始化********/ GPIO_InitStructure.Pin=GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4\|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7; //是Pin_0~Pin_7 GPIO_InitStructure.Speed=GPIO_SPEED_FREQ_HIGH;//輸出速度50MHz GPIO_InitStructure.Mode=GPIO_MODE_OUTPUT_PP; //推挽輸出Out_PP HAL_GPIO_Init(GPIOC,&GPIO_InitStructure); //按照以上設(shè)置初始化段碼線 GPIO_InitStructure.Pin=GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4\|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7; GPIO_InitStructure.Speed=GPIO_SPEED_FREQ_HIGH; //輸出速度為高 GPIO_InitStructure.Mode=GPIO_MODE_OUTPUT_PP; //推挽輸出Out_PP HAL_GPIO_Init(GPIOD,&GPIO_InitStructure); }/****************數(shù)碼管顯示程序*********************功能:00~99數(shù)碼管顯示*輸入:Data——待顯示數(shù)字,u8類型,范圍0~99*輸出:無***************************************************/voidSeg_Disp(u8Data){ u8Tens,Ones, Seg_Tens,Seg_Ones; u16Disp_Data; Tens=Data/10; //求待顯示數(shù)字的十位數(shù) Ones=Data%10; //求待顯示數(shù)字的個位數(shù) Seg_Tens=smg_table[Tens]; //求十位數(shù)的段碼 Seg_Ones=smg_table[Ones]; //求個位數(shù)的段碼 Disp_Data=0xff00+Seg_Tens; //將十位段碼整合成16位數(shù)據(jù) GPIOC->ODR=Disp_Data; //將整合后的十位數(shù)段碼送十位顯示端口 Disp_Data=0xff00+Seg_Ones; //將個位段碼整合成16位數(shù)據(jù) GPIOC->ODR=Disp_Data; //將整合后的個位數(shù)段碼送十位顯示端口}Seg.h#ifndef_SEG_H#define_SEG_H#include"stm32f10x.h" #defineSEG_Port_Tens GPIOD #defineSEG_Port_Ones GPIOC voidSeg_Init(void); voidSeg_Disp(u8data);#endif2、用開發(fā)板上的K_UP做加1鍵,K_DOWN做減1鍵,用PC7~PC0控制兩個數(shù)碼管,用PC8做十位選通信號,用PC9做個位選通信號,兩個數(shù)碼管都是共陰極,用74LVC245做驅(qū)動器,畫出電路,編寫程序。Main.c\key.c\key.h同題1Seg.c#include"seg.h"http://u8smg_table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0~9共陽極數(shù)碼管段碼表u8smg_table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0~9共陰極數(shù)碼管段碼表voidSeg_Init() //數(shù)碼管初始化函數(shù){ GPIO_InitTypeDef GPIO_InitStructure; //定義GPIO初始化變量 __HAL_RCC_GPIOC_CLK_ENABLE(); //開啟GPIOC時鐘 //__HAL_RCC_GPIOD_CLK_ENABLE(); //開啟GPIOD時鐘 GPIO_InitStructure.Pin=SEG_Pin; //段碼引腳 GPIO_InitStructure.Speed=GPIO_SPEED_FREQ_HIGH; //輸出速度為高 GPIO_InitStructure.Mode=GPIO_MODE_OUTPUT_PP; //推挽輸出Out_PP HAL_GPIO_Init(SEG_Port,&GPIO_InitStructure); //按照以上設(shè)置初始化段碼線 HAL_GPIO_WritePin(SEG_Port,SEG_Pin,GPIO_PIN_SET); //段碼線全部輸出1 GPIO_InitStructure.Pin=BS_Pin; //位選引腳 GPIO_InitStructure.Speed=GPIO_SPEED_FREQ_HIGH; //輸出速度為高 GPIO_InitStructure.Mode=GPIO_MODE_OUTPUT_PP; //推挽輸出Out_PP HAL_GPIO_Init(BS_Port,&GPIO_InitStructure); //按照以上設(shè)置初始化位選線 Tens_S=1;Ones_S=1;//禁止十位和個位數(shù)碼管}/****************數(shù)碼管顯示程序*********************功能:00~99數(shù)碼管顯示*輸入:Data——待顯示數(shù)字,u8類型,范圍0~99*輸出:無***************************************************/voidSeg_Disp(u8Data){ u8Tens,Ones, Seg_Tens,Seg_Ones; u16Disp_Data; Tens=Data/10; //求待顯示數(shù)字的十位數(shù) Ones=Data%10; //求待顯示數(shù)字的個位數(shù) Seg_Tens=smg_table[Tens]; //求十位數(shù)的段碼 Seg_Ones=smg_table[Ones]; //求個位數(shù)的段碼 Disp_Data=0xff00+Seg_Tens; //將十位段碼整合成16位數(shù)據(jù) GPIOC->ODR=Disp_Data; //將整合后的十位數(shù)段碼送顯示端口Tens_S=0;//選通十位,十位數(shù)碼管顯示delay_ms(20);//延時Tens_S=1;//禁止十位Disp_Data=0xff00+Seg_Ones; //將個位段碼整合成16位數(shù)據(jù) GPIOC->ODR=Disp_Data;; //將整合后的個位數(shù)段碼送顯示端口Ones_S=0;//選通個位,個位數(shù)碼管顯示delay_ms(20);//延時Ones_S=1;//禁止個位,個位數(shù)碼管顯示}Seg.h#ifndef_SEG_H#define_SEG_H#include"stm32f10x.h" #defineSEG_Port GPIOC #defineOnes_S PCout(8)#defineTens_S PCout(9) voidSeg_Init(void); voidSeg_Disp(u8data);#endif任務(wù)3.4S

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論