STM32單片機(jī)仿真開(kāi)發(fā)實(shí)例 課件全套 徐亮 1.1 單片機(jī)與STM32單片機(jī)-6.4 數(shù)字式遠(yuǎn)程溫度傳感器的設(shè)計(jì)_第1頁(yè)
STM32單片機(jī)仿真開(kāi)發(fā)實(shí)例 課件全套 徐亮 1.1 單片機(jī)與STM32單片機(jī)-6.4 數(shù)字式遠(yuǎn)程溫度傳感器的設(shè)計(jì)_第2頁(yè)
STM32單片機(jī)仿真開(kāi)發(fā)實(shí)例 課件全套 徐亮 1.1 單片機(jī)與STM32單片機(jī)-6.4 數(shù)字式遠(yuǎn)程溫度傳感器的設(shè)計(jì)_第3頁(yè)
STM32單片機(jī)仿真開(kāi)發(fā)實(shí)例 課件全套 徐亮 1.1 單片機(jī)與STM32單片機(jī)-6.4 數(shù)字式遠(yuǎn)程溫度傳感器的設(shè)計(jì)_第4頁(yè)
STM32單片機(jī)仿真開(kāi)發(fā)實(shí)例 課件全套 徐亮 1.1 單片機(jī)與STM32單片機(jī)-6.4 數(shù)字式遠(yuǎn)程溫度傳感器的設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩405頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1.1單片機(jī)與STM32

歡迎加入“學(xué)銀在線(xiàn)課程”《C語(yǔ)言及單片機(jī)控制技術(shù)》(徐亮老師主持),可使用“學(xué)習(xí)通”APP掃描下面二維碼加入課程,或者百度搜索“學(xué)銀在線(xiàn)”進(jìn)入官網(wǎng)后搜索課程名稱(chēng)進(jìn)入課程主頁(yè)并加入課程。

本課程即將登陸“智慧職教”平臺(tái),敬請(qǐng)期待……知識(shí)目標(biāo):

了解單片機(jī)的發(fā)展史及其主要應(yīng)用領(lǐng)域、STM32的由來(lái)以及產(chǎn)品線(xiàn)簡(jiǎn)介。1.1.1什么是單片機(jī)單片機(jī)是一種集成電路芯片,是采用超大規(guī)模集成電路技術(shù)把具有數(shù)據(jù)處理能力的中央處理器CPU、隨機(jī)存儲(chǔ)器RAM、只讀存儲(chǔ)器ROM、多種I/O口和中斷系統(tǒng)、定時(shí)器/計(jì)數(shù)器等功能(可能還包括顯示驅(qū)動(dòng)電路、脈寬調(diào)制電路、模擬多路轉(zhuǎn)換器、A/D轉(zhuǎn)換器等電路)集成到一塊硅片上構(gòu)成的一個(gè)小而完善的微型計(jì)算機(jī)系統(tǒng)。1.1.2單片機(jī)發(fā)展史單片機(jī)誕生于20世紀(jì)70年代末,經(jīng)歷了SCM、MCU、SoC三大階段。

1、SCM即單片微型計(jì)算機(jī)(SingleChipMicrocomputer)階段,這一階段單片機(jī)的主要特點(diǎn)是追求如何將計(jì)算機(jī)體系單片化,即將計(jì)算機(jī)的CPU、RAM、ROM、總線(xiàn)等部件集成在一片芯片上,便于嵌入到設(shè)備之中。這一階段的代表產(chǎn)品有Intel公司的MCS-48單片機(jī)。

2、MCU即微控制器(MicroControllerUnit)階段,由于在實(shí)際項(xiàng)目中,單片機(jī)往往需要與各種外設(shè)芯片協(xié)同工作才能完成特定的控制功能,為了進(jìn)一步簡(jiǎn)化單片機(jī)應(yīng)用電路的設(shè)計(jì),單片機(jī)芯片上集成了越來(lái)越多的外設(shè),稱(chēng)為“片內(nèi)外設(shè)”。這一階段單片機(jī)的特點(diǎn)就是單片機(jī)集成的片內(nèi)外設(shè)越來(lái)越多,單片機(jī)控制板卡的獨(dú)立外設(shè)芯片越來(lái)越少。在發(fā)展MCU方面,早期最著名的廠(chǎng)家當(dāng)數(shù)Philips公司,本文介紹的STM32系列單片機(jī)也是MCU大家庭中的一員。

3、SoC單片機(jī)(SystemOnChip),與MCU相比,SoC單片機(jī)可以看做是一種專(zhuān)用型單片機(jī)。比如國(guó)產(chǎn)的樂(lè)鑫ESP8266單片機(jī),內(nèi)核是一個(gè)32位的精簡(jiǎn)指令集處理器,自帶一個(gè)WIFI模塊;再比如高通的驍龍?zhí)幚砥?,CPU只占整個(gè)芯片面積的15%,其余被GPU(GraphicsProcessingUnit,圖像處理器)、DSP(DigitalSignalProcessing,數(shù)字處理)單元、基帶/射頻前端、Modem(調(diào)制解調(diào)器)等模塊占據(jù)。1.1.3STM32的誕生與發(fā)展

STM32系列單片機(jī)是來(lái)自歐洲的意法半導(dǎo)體公司(STMicroelectronics,簡(jiǎn)稱(chēng)ST)旗下眾多半導(dǎo)體產(chǎn)品之一。2007年6月11日,STM32單片機(jī)誕生于北京,同年STM32單片機(jī)在全球通用MCU市場(chǎng)排第11名,此后一路高歌猛進(jìn),2015年上升到第3名,2018年繼續(xù)上升到第2名,2021年登頂?shù)?名。

與傳統(tǒng)單片機(jī)不同,STM32的內(nèi)核并非由ST自主研發(fā),而是采用了英國(guó)ARM公司授權(quán)的Cortex-M內(nèi)核,圍繞內(nèi)核增加了外設(shè)并進(jìn)行封裝。除了STM32之外,目前市面上還有恩智浦(NXP)、新唐(Nuvoton)等知名半導(dǎo)體公司推出了屬于自己的基于Cortex-M內(nèi)核的單片機(jī)。1.1.4STM32豐富的產(chǎn)品線(xiàn)

截止2023年9月,STM32單片機(jī)提供4大類(lèi)16個(gè)系列共計(jì)1291個(gè)型號(hào),并且還在持續(xù)更新中。

STM32產(chǎn)品廣泛應(yīng)用于工業(yè)控制、消費(fèi)電子、物聯(lián)網(wǎng)、通訊設(shè)備、醫(yī)療服務(wù)、安防監(jiān)控等應(yīng)用領(lǐng)域,其優(yōu)異的性能進(jìn)一步推動(dòng)了生活和產(chǎn)業(yè)智能化的發(fā)展。Tobecontinued...1.2STM32的引腳與封裝知識(shí)目標(biāo):

了解STM32的引腳結(jié)構(gòu),掌握簡(jiǎn)單的單片機(jī)最小系統(tǒng)的設(shè)計(jì)。1.2.1引腳結(jié)構(gòu)本課程選擇的STM32的型號(hào)是STM32F103R6,該型號(hào)芯片基于A(yíng)RMCortex-M3內(nèi)核,其主要特性為:⑴電源電壓直流2.0~3.6V;⑵封裝LQFP64(10×10mm);⑶輸入/輸出引腳數(shù)51個(gè);⑷程序存儲(chǔ)器(FlashMemory)32KB,靜態(tài)隨機(jī)存儲(chǔ)器(SRAM)6KB;⑸最高主頻72MHz;⑹片內(nèi)外設(shè)有ADC、DMA、PWM、RTC、Timers;⑺通信接口有I2C、SPI、USART、CAN、USB2.0;⑻工作溫度-40~+85℃。⑼工業(yè)級(jí)芯片。a.引腳分布圖b.芯片實(shí)物圖芯片引腳的主要功能有:⑴電源引腳:VDD_x、VSS_x(x=1~4)、VDDA、VSSA、VBAT(電池正極);⑵時(shí)鐘源輸入輸出引腳:OSC_IN、OSC_OUT、OSC32_IN、OSC32_OUT;⑶復(fù)位引腳NRST;⑷輸入輸出引腳PAx、PBx、PCx、PDx(x=0~15),共計(jì)51個(gè)引腳;⑸大部分引腳具備多重功能,比如PA9、PA10分別為串口1(USART1)的數(shù)據(jù)發(fā)送引腳與數(shù)據(jù)接收引腳。具體后續(xù)章節(jié)將會(huì)介紹。1.2.2最小系統(tǒng)

所謂單片機(jī)最小系統(tǒng),即單片機(jī)運(yùn)行所需最少的外部條件:⑴

電源●VDD_1、~VDD_4數(shù)字量電源正極,內(nèi)部連通,VSS_1~VSS_4數(shù)字量電源負(fù)極,內(nèi)部連通;●VDDA、VSSA,模擬量電源正負(fù)極,若不用ADC、DAC,或?qū)纫蟛桓邥r(shí)可以直接與數(shù)字量電源正負(fù)極相連;●VBAT作為電池正極輸入端,一般用于RTC供電,若不用RTC則直接與數(shù)字量電源正極相連。通常給定電源電壓為3.3V。⑵復(fù)位電路STM32的復(fù)位方式有系統(tǒng)復(fù)位、上電復(fù)位、備份區(qū)域復(fù)位三種,其中系統(tǒng)復(fù)位又分為外部復(fù)位、WWDG(窗口看門(mén)狗)復(fù)位、IWDG(獨(dú)立看門(mén)狗)復(fù)位、軟件復(fù)位、低功耗管理復(fù)位五種情況,這里僅介紹其中的外部復(fù)位。

外部復(fù)位電路的典型電路如下圖所示,當(dāng)系統(tǒng)上電或在運(yùn)行過(guò)程中按下圖中按鈕時(shí),STM32可按BOOT模式的設(shè)定進(jìn)行復(fù)位,關(guān)于BOOT模式的具體內(nèi)容將在1.3節(jié)中介紹。⑶時(shí)鐘電路STM32的時(shí)鐘源輸入引腳一共有四個(gè),可劃分為兩組:●OSC_IN和OSC_OUT引腳用于連接外部高速晶振(4~16MHz,典型值8MHz);●OSC32_IN、OSC32_OUT引腳用于連接外部低速晶振(32.768kHz),如果不用RTC就不用接。無(wú)論高速晶振還是低速晶振,當(dāng)設(shè)計(jì)方案對(duì)時(shí)鐘源精度要求不高時(shí),都可以選擇內(nèi)部RC振蕩器來(lái)代替外部晶振。內(nèi)部高速RC振蕩器頻率為8MHz,內(nèi)部低速RC振蕩器頻率為40kHz。專(zhuān)業(yè)術(shù)語(yǔ):HSI——內(nèi)部高速時(shí)鐘HSE——外部高速時(shí)鐘LSI——內(nèi)部低速時(shí)鐘LSE——外部低速時(shí)鐘幾種晶振外部高速晶振與外部低速晶振的電路分別如下兩圖所示。單片機(jī)最小系統(tǒng)典型電路如下圖所示,當(dāng)然可根據(jù)實(shí)際需要對(duì)電路進(jìn)行修改。Tobecontinued...1.3STM32的內(nèi)部構(gòu)造知識(shí)目標(biāo):

了解與程序開(kāi)發(fā)相關(guān)的部分單片機(jī)內(nèi)部構(gòu)造,主要包括存儲(chǔ)結(jié)構(gòu)、啟動(dòng)模式與時(shí)鐘樹(shù)三部分。1.3.1Cortex-M3的存儲(chǔ)結(jié)構(gòu)

Cortex-M3的存儲(chǔ)器(包括FlashROM、SRAM等)采用統(tǒng)一編址方式,尋址空間為4GB(32位尋址,,0x00000000~0xFFFFFFFF)。4GB尋址空間被分為8個(gè)主塊(Block0~Block7),每塊512MB。

FlashROM(用于存放程序)位于Block0中,地址范圍0x08000000~0x0801FFFF,STM32F103R6地址范圍0x08000000~0x08007FFF(共計(jì)32KB);SRAM(用于存放程序運(yùn)行中產(chǎn)生的臨時(shí)數(shù)據(jù))位于Block1中,起始地址0x20000000,STM32F103R6地址范圍0x20000000~0x200017FF(共計(jì)6KB);Peripherals(片上外設(shè)映射地址)位于Block2中,起始地址0x40000000。

由于STM32使用C語(yǔ)言開(kāi)發(fā)程序,因此程序與數(shù)據(jù)的存儲(chǔ)地址完全由編譯器自動(dòng)分配,無(wú)需人為干預(yù)。定義變量,比如:

inta=12;

編譯器為變量a自動(dòng)分配一個(gè)4字節(jié)的SRAM空間并賦予初值12。定義常量,比如:

constintb=23;

當(dāng)變量b為常量時(shí),編譯器為變量b自動(dòng)分配一個(gè)4字節(jié)的ROM空間并賦予初值23。1.3.2STM32的啟動(dòng)(BOOT)模式STM32F103系列單片機(jī)具有三種啟動(dòng)方式,如下表所示,分別為從MainFlashmemory(主閃存)啟動(dòng)、從Systemmemory(系統(tǒng)存儲(chǔ)器)啟動(dòng)和從EmbeddedSRAM(內(nèi)置靜態(tài)隨機(jī)存儲(chǔ)器)啟動(dòng)。

其中尤以前兩種啟動(dòng)方式最為常見(jiàn):①?gòu)闹鏖W存啟動(dòng)即正常運(yùn)行用戶(hù)編寫(xiě)的程序,②從系統(tǒng)存儲(chǔ)器啟動(dòng)即進(jìn)入ST公司預(yù)置的BootLoader(啟動(dòng)加載程序),一般用于從串口1下載用戶(hù)程序(具體將在1.4部分介紹)。對(duì)于STM32F103R6而言,BOOT0引腳即60號(hào)引腳,BOOT1引腳即28號(hào)引腳(PB2)。1.3.3時(shí)鐘樹(shù)STM32片內(nèi)外設(shè)較多,為了實(shí)現(xiàn)低功耗設(shè)計(jì),允許用戶(hù)對(duì)各種外設(shè)的時(shí)鐘信號(hào)進(jìn)行配置,由此構(gòu)成了如右圖所示的時(shí)鐘樹(shù)。

STM32內(nèi)部采用了PLL(Phase-LockedLoop,鎖相環(huán))技術(shù),可以將總線(xiàn)頻率最高倍頻至72MHz。Tobecontinued...1.4STM32的程序開(kāi)發(fā)方式知識(shí)目標(biāo):

了解STM32的程序開(kāi)發(fā)流程,了解與STM32程序開(kāi)發(fā)相關(guān)的軟件與硬件知識(shí)。1.4.1STM32程序開(kāi)發(fā)流程概述利用STM32CubeIDE的圖形化配置工具生成工程目錄與初始化代碼利用STM32CubeIDE的代碼編輯工具編寫(xiě)程序并生成HEX文件利用FlashLoaderDemonstrator將程序下載至單片機(jī)FlashROM利用Proteus仿真模擬硬件實(shí)物調(diào)試軟件仿真模擬1.4.2STM32CubeIDE簡(jiǎn)介STM32CubeIDE是ST官方在2019年推出的STM32專(zhuān)用IDE。

STM32CubeIDE由原先兩個(gè)工具軟件整合而成:一個(gè)是ST公司在2016年推出的圖形化配置工具STM32CubeMX,;另一個(gè)是ST公司在2017年從Atollic收購(gòu)的ARM編程工具TrueSTUDIO,其主要功能是用于編寫(xiě)STM32程序代碼。1.4.3硬件實(shí)物調(diào)試簡(jiǎn)介STM32可以通過(guò)ISP、ST-LINK、J-LINK三種途徑下載程序,本課程主要介紹第一種程序下載方式——ISP方式。該方式需要用到ST免費(fèi)提供的FlashLoaderDemonstrator工具,并且需要在IDE中設(shè)定生成HEX文件(默認(rèn)不生成HEX文件)。1.4.4軟件仿真模擬簡(jiǎn)介STM32電路仿真軟件采用了來(lái)自英國(guó)Labcenter公司出品的EDA工具Proteus,2016年末Proteus8.6中開(kāi)始增加對(duì)STM32的支持,推薦使用Proteus8.15及以上版本。Tobecontinued...2.1C語(yǔ)言入門(mén)與順序結(jié)構(gòu)能力目標(biāo):

理解并掌握C語(yǔ)言基本數(shù)據(jù)類(lèi)型,以及算術(shù)運(yùn)算符、逗號(hào)運(yùn)算符、賦值運(yùn)算符三類(lèi)運(yùn)算符的使用,能使用Dev-C++編寫(xiě)簡(jiǎn)單的順序結(jié)構(gòu)程序。任務(wù)要求:根據(jù)隨機(jī)輸入的半徑r,計(jì)算得到相應(yīng)的圓周長(zhǎng)、圓面積、球面面積、球體積。2.1.1計(jì)算機(jī)語(yǔ)言與C語(yǔ)言(1)計(jì)算機(jī)語(yǔ)言概述●機(jī)器語(yǔ)言機(jī)器碼是唯一能被計(jì)算機(jī)CPU直接識(shí)別的代碼,它由二進(jìn)制編碼按一定規(guī)律構(gòu)成。但由于不同的CPU集成的指令集不盡相同,因此即便是完成相同的功能,機(jī)器碼的編寫(xiě)方式也不一樣?!駞R編語(yǔ)言本質(zhì)上匯編語(yǔ)言與機(jī)器語(yǔ)言沒(méi)有區(qū)別,只是將晦澀難懂的二進(jìn)制編碼用英文助記符來(lái)代替,方便人們編寫(xiě)代碼。匯編代碼與機(jī)器代碼逐條對(duì)應(yīng),工作量基本相同?!窀呒?jí)語(yǔ)言如果說(shuō)機(jī)器語(yǔ)言、匯編語(yǔ)言是完全站在計(jì)算機(jī)CPU的角度考慮問(wèn)題,那么高級(jí)語(yǔ)言就是偏向于站在人類(lèi)的角度考慮問(wèn)題了。高級(jí)語(yǔ)言通過(guò)字母、符號(hào)、數(shù)字的組合,以一種簡(jiǎn)單、優(yōu)雅的方式書(shū)寫(xiě)代碼,程序更緊湊,結(jié)構(gòu)更清晰,可以有效的提高人們的工作效率。(2)C語(yǔ)言的產(chǎn)生與發(fā)展

●1972年,美國(guó)貝爾實(shí)驗(yàn)室的DennisM.Ritchie在B語(yǔ)言的基礎(chǔ)上設(shè)計(jì)出了一種全新的計(jì)算機(jī)語(yǔ)言,這就是C語(yǔ)言。

●1978年,DennisM.Ritchie與BrianW.Kernighan合著了著名的《TheCProgrammingLanguage》,但此書(shū)并沒(méi)有給出一個(gè)完整的C語(yǔ)言的標(biāo)準(zhǔn)。C語(yǔ)言之父——DennisM.Ritchie(1941年9月9日-2011年10月12日)

●1983年,美國(guó)國(guó)家標(biāo)準(zhǔn)化協(xié)會(huì)(AmericanNationalStandardsInstitute,簡(jiǎn)稱(chēng)ANSI)在《TheCProgrammingLanguage》的基礎(chǔ)上制定了第一個(gè)C語(yǔ)言標(biāo)準(zhǔn),并于1989年正式發(fā)布,稱(chēng)為“C89”標(biāo)準(zhǔn),這也是后來(lái)人們熟知的“ANSIC”標(biāo)準(zhǔn)。

●后來(lái),國(guó)際標(biāo)準(zhǔn)化組織(InternationalOrganizationforStandardization,簡(jiǎn)稱(chēng)為ISO)接納了“C89”標(biāo)準(zhǔn),并在此基礎(chǔ)上不斷修改,陸續(xù)推出了“C90”、“C99”、“C11”標(biāo)準(zhǔn),這些也被人們稱(chēng)為“ISOC”標(biāo)準(zhǔn)。(3)C語(yǔ)言的標(biāo)識(shí)符與關(guān)鍵字標(biāo)識(shí)符是構(gòu)成C語(yǔ)言代碼的重要元素之一,標(biāo)識(shí)符由英文字母、數(shù)字和下劃線(xiàn)組成,而且開(kāi)頭只能是字母或者下劃線(xiàn),比如:a、Ab、Ba1、_1a,都是合法的標(biāo)識(shí)符。值得注意的是,C語(yǔ)言區(qū)分大小寫(xiě)字母。ANSIC保留了32個(gè)標(biāo)識(shí)符作為C語(yǔ)言的關(guān)鍵字,不能重做其他定義。(表見(jiàn)下一頁(yè))關(guān)鍵字功能關(guān)鍵字功能auto聲明自動(dòng)變量short聲明短整型變量或函數(shù)int聲明整型變量或函數(shù)long聲明長(zhǎng)整型變量或函數(shù)float聲明浮點(diǎn)型變量或函數(shù)double聲明雙精度變量或函數(shù)char聲明字符型變量或函數(shù)struct聲明結(jié)構(gòu)體變量或函數(shù)union聲明共用數(shù)據(jù)類(lèi)型enum聲明枚舉類(lèi)型typedef用以給數(shù)據(jù)類(lèi)型取別名const聲明只讀變量unsigned聲明無(wú)符號(hào)類(lèi)型變量或函數(shù)signed聲明有符號(hào)類(lèi)型變量或函數(shù)extern聲明變量是在其他文件正聲明register聲明寄存器變量static聲明靜態(tài)變量volatile說(shuō)明變量在程序執(zhí)行中可被隱含地改變關(guān)鍵字功能關(guān)鍵字功能void聲明函數(shù)無(wú)返回值或無(wú)參數(shù),聲明無(wú)類(lèi)型指針if條件語(yǔ)句else條件語(yǔ)句否定分支(與if連用)switch用于開(kāi)關(guān)語(yǔ)句case開(kāi)關(guān)語(yǔ)句分支for一種循環(huán)語(yǔ)句do循環(huán)語(yǔ)句的循環(huán)體while循環(huán)語(yǔ)句的循環(huán)條件goto無(wú)條件跳轉(zhuǎn)語(yǔ)句continue結(jié)束當(dāng)前循環(huán),開(kāi)始下一輪循環(huán)break跳出當(dāng)前循環(huán)default開(kāi)關(guān)語(yǔ)句中的“其他”分支sizeof計(jì)算數(shù)據(jù)類(lèi)型長(zhǎng)度return子程序返回語(yǔ)句(可以帶參數(shù),也可不帶參數(shù))循環(huán)條件2.1.2使用Dev-C++編寫(xiě)計(jì)算機(jī)C程序Dev-C++是一種免費(fèi)的C/C++集成開(kāi)發(fā)環(huán)境(IntegratedDevelopmentEnvironment,簡(jiǎn)稱(chēng)IDE),適合用來(lái)學(xué)習(xí)C/C++語(yǔ)言。在計(jì)算機(jī)桌面上找到Dev-C++的圖標(biāo)并雙擊運(yùn)行。選擇菜單欄“文件”→“新建”→“項(xiàng)目”新建項(xiàng)目。進(jìn)入所示編程界面。

編寫(xiě)程序并按下“編譯運(yùn)行”按鈕,彈出運(yùn)行窗口。2.1.3C語(yǔ)言的基本數(shù)據(jù)類(lèi)型

本次課僅學(xué)習(xí)其中的基本數(shù)據(jù)類(lèi)型:整型、浮點(diǎn)型、字符類(lèi)型(1)整型

其中,int是一般整型,short是短整型,long是長(zhǎng)整型,unsigned表示無(wú)符號(hào),即類(lèi)似于數(shù)學(xué)的正整數(shù)。

實(shí)際上,int型數(shù)據(jù)長(zhǎng)度不定,與編譯器有很大關(guān)系,有可能長(zhǎng)度為2個(gè)字節(jié),也有可能長(zhǎng)度為4個(gè)字節(jié)。類(lèi)別數(shù)據(jù)類(lèi)型字節(jié)長(zhǎng)度取值范圍一般整型int2-3,2768~3,2767短整型short2-3,2768~3,2767長(zhǎng)整型long4-21,4748,3648~21,4748,3647無(wú)符號(hào)一般整型unsignedint20~6,5535無(wú)符號(hào)短整型unsignedshort20~6,5535無(wú)符號(hào)長(zhǎng)整型unsignedlong40~42,9496,7295

C語(yǔ)言是強(qiáng)類(lèi)型語(yǔ)言,所有變量必須先定義再使用。變量的定義格式:類(lèi)型說(shuō)明符變量名;變量的賦值格式:變量名=常量、變量或表達(dá)式;整型變量的定義與賦值:

這里的“=”不同于數(shù)學(xué)上等號(hào)的意義,屬于C語(yǔ)言的賦值運(yùn)算符,表示將“=”右邊的常量、變量或表達(dá)式的值賦給左邊的變量。inta,b,c;a=12,b=014,c=0xC;

可以一次只定義一個(gè)變量,也可以一次定義多個(gè)變量,多個(gè)變量之間用逗號(hào)運(yùn)算符“,”隔開(kāi)。變量也可以在定義的同時(shí)進(jìn)行初始化:以上,三個(gè)變量a、b、c實(shí)際上賦值的內(nèi)容是一樣的,只是分別采用十進(jìn)制、八進(jìn)制、十六進(jìn)制進(jìn)行了賦值,八進(jìn)制前綴“0”,十六進(jìn)制前綴“0x”或者“0X”,如果十六進(jìn)制數(shù)據(jù)中出現(xiàn)了字母,大小寫(xiě)皆可。inta=12,b=014,c=0xC;(2)浮點(diǎn)型

浮點(diǎn)型類(lèi)似于數(shù)學(xué)的實(shí)數(shù)類(lèi)型,有float、double兩種,float是一般浮點(diǎn)型,double是雙精度浮點(diǎn)型。浮點(diǎn)型變量的定義與賦值:以上,變量a、b分別采用了十進(jìn)制小數(shù)形式、指數(shù)形式進(jìn)行了賦值,其中指數(shù)形式“4.56e1”即為4.56×101的意思,這里“e”也可以寫(xiě)成“E”。類(lèi)別數(shù)據(jù)類(lèi)型字節(jié)長(zhǎng)度取值范圍有效位單精度浮點(diǎn)型float4±1.0e-37~±1.0e+387雙精度浮點(diǎn)型double8±1.0e-307~±1.0e+30816floata,b;a=12.3,b=4.56e1;(3)字符型字符型變量一般用來(lái)存放字符對(duì)應(yīng)的ASCII碼,比如:以上,變量a、b實(shí)際上賦值的內(nèi)容是一樣的,變量a賦予字符7,變量b賦予字符7對(duì)應(yīng)的ASCII碼。實(shí)際使用的時(shí)候,字符型變量往往也用來(lái)存放整數(shù)數(shù)據(jù)。類(lèi)別數(shù)據(jù)類(lèi)型字節(jié)長(zhǎng)度取值范圍字符型char1-128~127無(wú)符號(hào)字符型unsignedchar10~255chara,b;a=’7’,b=55;ASCII碼表(引自百度百科)2.1.4格式輸入/輸出函數(shù)格式輸入函數(shù)用于從輸入設(shè)備(比如鍵盤(pán))向計(jì)算機(jī)輸入數(shù)據(jù),格式輸出函數(shù)用于計(jì)算機(jī)向輸出設(shè)備(比如顯示器)輸出數(shù)據(jù)。格式輸入/輸出函數(shù)是由C標(biāo)準(zhǔn)庫(kù)函數(shù)提供,在使用它們的時(shí)候,必須使用預(yù)處理命令中的“包含”命令將標(biāo)準(zhǔn)輸入/輸出頭文件“stdio.h”包含到當(dāng)前項(xiàng)目中來(lái)。#include<stdio.h>main(){……}……值得注意的是,預(yù)處理命令不是C語(yǔ)言語(yǔ)句。以包含命令為例,簡(jiǎn)單的說(shuō)就是在編譯器編譯之前,將頭文件中的內(nèi)容替換該包含命令,再進(jìn)行編譯。

(1)格式輸出函數(shù)——printf()格式輸出函數(shù)的一般形式是:printf(“格式控制字符串”,輸出列表);

括號(hào)內(nèi)內(nèi)容由兩部分構(gòu)成:

①格式控制字符串作用是指定輸出格式,它又由三部分構(gòu)成:●顯示字符串,按原樣輸出?!窀袷交嘉环糜诎凑罩付ǜ袷綄?shù)據(jù)輸出,由“%”和特定的字符組成,常用格式化占位符如表所示(后頁(yè)),輸出時(shí)自動(dòng)按指定格式顯示變量或表達(dá)式的值?!褶D(zhuǎn)義字符,在輸出時(shí)會(huì)被自動(dòng)轉(zhuǎn)換為對(duì)應(yīng)的操作命令,常用的轉(zhuǎn)移字符如表所示(后頁(yè))。

●格式占位符:占位符作用占位符作用%d以十進(jìn)制整數(shù)形式輸出%s輸出字符串%x或%X以十六進(jìn)制整數(shù)形式輸出%f以小數(shù)形式輸出實(shí)數(shù)%c輸出單個(gè)字符%e或%E以指數(shù)形式輸出實(shí)數(shù)轉(zhuǎn)義字符作用轉(zhuǎn)義字符作用\n換行符,將當(dāng)前位置移到下一行開(kāi)頭\\輸出一個(gè)反斜杠“\”\r回車(chē)符,將當(dāng)前位置移到本行開(kāi)頭\’輸出一個(gè)單引號(hào)“’”\t水平制表符\”輸出一個(gè)雙引號(hào)“””\v垂直制表符\0空字符,也是字符串結(jié)束標(biāo)志

●轉(zhuǎn)義字符:

②輸出列表輸出變量或表達(dá)式的列表,用逗號(hào)運(yùn)算符“,”隔開(kāi),輸出列表中變量或表達(dá)式的個(gè)數(shù)必須與格式控制字符串的個(gè)數(shù)一一對(duì)應(yīng)。例如:運(yùn)行結(jié)果:chara=’7’;printf("字符%c的ASCII碼是%d\n",a,a);(2)格式輸入函數(shù)——scanf()格式輸入函數(shù)的一般形式是:scanf(“格式控制字符串”,地址列表);變量的地址是由取地址運(yùn)算符“&”后跟變量名構(gòu)成,比如“&a”表示變量a在計(jì)算機(jī)內(nèi)存中的地址。

比如:運(yùn)行結(jié)果:inta,b,c;scanf("%d%d%d",&a,&b,&c);printf("變量a,b,c的值分別是:%d,%d,%d\n",a,b,c);2.1.5C語(yǔ)言的運(yùn)算符(一)

(1)算術(shù)運(yùn)算符首先演示整數(shù)的運(yùn)算:運(yùn)算符功能應(yīng)用舉例+加法運(yùn)算符x+y-減法運(yùn)算符x-y*乘法運(yùn)算符x*y/除法運(yùn)算符x/y%取模(求余數(shù))運(yùn)算符x%y++自增運(yùn)算符x++或者++x--自減運(yùn)算符x--或者--xinta=13,b=3;printf("和:%d差:%d積:%d商:%d余數(shù):%d\n",a+b,a-b,a*b,a/b,a%b);格式結(jié)果:值得注意的是,13/3的結(jié)果是整除的結(jié)果4,只有整數(shù)才能做整除與取模運(yùn)算。C語(yǔ)言中,四則運(yùn)算同樣遵循“先乘除后加減”的原則,如果需要改變運(yùn)算次序,可以用小括號(hào)“()”來(lái)提升運(yùn)算優(yōu)先等級(jí),比如:floata=1,b=2,c=3,d=4,r;r=(a+b)/c+d;自增/減運(yùn)算符屬于單目運(yùn)算符,符號(hào)與變量的位置不同,程序運(yùn)行的效果也截然不同。接著演示自增運(yùn)算符的使用方法:運(yùn)行結(jié)果:總結(jié):若++/--運(yùn)算符在前是先自增/減再執(zhí)行語(yǔ)句,若++/--運(yùn)算符在后則是先執(zhí)行語(yǔ)句再自增/減。inta=1,b=1;printf("a的值是%d,b的值是%d\n",++a,b++);printf("a的值是%d,b的值是%d\n",a,b);

(2)賦值運(yùn)算符演示程序:運(yùn)行結(jié)果:運(yùn)算符功能舉例運(yùn)算符功能舉例=賦值a=b;&=位與賦值a&=b等價(jià)于a=a&b+=加賦值a+=b等價(jià)于a=a+b^=位異或賦值a^=b等價(jià)于a=a^b-=減賦值a-=b等價(jià)于a=a-b|=位或賦值a|=b等價(jià)于a=a|b*=乘賦值a*=b等價(jià)于a=a*b<<=左移賦值a<<=n等價(jià)于a=a<<n/=除賦值a/=b等價(jià)于a=a/b>>=右移賦值a>>=n等價(jià)于a=a>>n%=取模賦值a%=b等價(jià)于a=a%b

inta=11,b=13,c=15,d=17,e=19;a+=1;b-=2;c*=3;d/=4;e%=5;printf("a:%d,b:%d,c:%d,d:%d,e:%d\n",a,b,c,d,e);

(3)逗號(hào)運(yùn)算符逗號(hào)運(yùn)算構(gòu)成的表達(dá)式一般形式是:

表達(dá)式1,表達(dá)式2,表達(dá)式3,…,表達(dá)式n以上表達(dá)式的功能是,從左往右依次求出每個(gè)表達(dá)式的值,表達(dá)式n的值即為整個(gè)逗號(hào)表達(dá)式的值。演示程序:運(yùn)行結(jié)果:inta=2,b;b=(a++,a+3);printf("b:%d\n",b);2.1.6任務(wù)程序的編寫(xiě)

(現(xiàn)場(chǎng)操作演示...)

圓周長(zhǎng):圓面積:球面面積:球體積:Tobecontinued...2.2C語(yǔ)言分支結(jié)構(gòu)能力目標(biāo):

理解、區(qū)分并掌握C語(yǔ)言的邏輯運(yùn)算符與位運(yùn)算符,理解并掌握C語(yǔ)言的比較運(yùn)算符,能利用if語(yǔ)句與switch語(yǔ)句實(shí)現(xiàn)分支結(jié)構(gòu)程序。任務(wù)要求:

任務(wù)A:輸入年份,判斷該年份是否為閏年。

任務(wù)B:某商場(chǎng)舉辦優(yōu)惠購(gòu)物活動(dòng),購(gòu)物滿(mǎn)5000元打8折,購(gòu)物滿(mǎn)2000元,不滿(mǎn)5000元打8.5折,購(gòu)物滿(mǎn)1000元,不滿(mǎn)2000元打9折,其余不打折,輸入購(gòu)物金額數(shù),自動(dòng)計(jì)算折后價(jià)。2.2.1C語(yǔ)言的運(yùn)算符(二)(1)邏輯運(yùn)算符在邏輯關(guān)系中,用整型或字符型數(shù)字“0”代表“假”,用非零值代表“真”,但邏輯表達(dá)式的計(jì)算結(jié)果只有“0”或者“1”。演示程序://邏輯與運(yùn)算printf("And:%d,%d,%d,%d\n",0&&0,0&&1,2&&0,3&&4);//邏輯或運(yùn)算printf("Or:%d,%d,%d,%d\n",0||0,0||1,2||0,3||4);//邏輯非運(yùn)算printf("Not:%d,%d\n",!0,!1);運(yùn)算符功能表達(dá)式&&邏輯與a&&b||邏輯或a||b!邏輯非!a

運(yùn)行結(jié)果:(2)位運(yùn)算符運(yùn)算符功能舉例運(yùn)算符功能舉例&按位與a&b^按位異或a^b|按位或a|b<<左移a<<n~按位取反~a>>右移a>>n首先演示按位與、按位或、按位取反、按位異或運(yùn)算符的使用:運(yùn)行結(jié)果:下面是四個(gè)表達(dá)式的手工驗(yàn)算過(guò)程:01000010B=42H,11111011B=FBH,10000101B=85H,10111001B=B9Hunsignedchara=0x7A,b=0xC3;printf("%x,%x,%x,%x\n",a&b,a|b,(unsignedchar)(~a),a^b);接著演示左移運(yùn)算符:運(yùn)行結(jié)果:

下面是手工驗(yàn)算過(guò)程:55H=01010101Bunsignedchardat=0x55;dat=dat<<1;printf("左移一位:%x\n",dat);dat=dat<<3;printf("繼續(xù)左移三位:%x\n",dat);C語(yǔ)言的左移運(yùn)算表達(dá)式在移動(dòng)數(shù)據(jù)位的過(guò)程中左側(cè)移出位丟棄,右側(cè)補(bǔ)010101010B=AAH,01010000B=50H

右移運(yùn)算與左移運(yùn)算類(lèi)似,不做演示。

(3)關(guān)系運(yùn)算符關(guān)系運(yùn)算符用來(lái)表達(dá)數(shù)值的大小,關(guān)系成立則運(yùn)算結(jié)果為“真”(1),否則為“假”(0)。演示程序:運(yùn)行結(jié)果:chara,b;a=(3>=2),b=(3==2);printf("%d,%d\n",a,b);運(yùn)算符符號(hào)實(shí)例讀作大于>小于等于<=大于等于>=等于==小于<不等于!=

(4)運(yùn)算優(yōu)先級(jí)

*C語(yǔ)言中的運(yùn)算優(yōu)先級(jí)一共分為16級(jí),數(shù)字越小,優(yōu)先級(jí)就越高。優(yōu)先級(jí)運(yùn)算符結(jié)合方向優(yōu)先級(jí)運(yùn)算符結(jié)合方向1后綴運(yùn)算符:[]().->++(后置)--(后置)從左往右2一元運(yùn)算符:++(前置)--(前置)!~+-*(指針)&從右往左3類(lèi)型轉(zhuǎn)換運(yùn)算符:()從右往左4乘除法運(yùn)算符:*/%從左往右5加減法運(yùn)算符:+-從左往右6移位運(yùn)算符:<<>>從左往右7關(guān)系運(yùn)算符:>>=<<=從左往右8關(guān)系運(yùn)算符:==!=從左往右9位運(yùn)算符:&從左往右10位運(yùn)算符:^從左往右11位運(yùn)算符:|從左往右12邏輯運(yùn)算符:&&從左往右13邏輯運(yùn)算符:||從左往右14條件三目運(yùn)算符:?:從右往左15賦值運(yùn)算符:=+=-=*=/=%=&=^=|=<<=>>=從右往左16逗號(hào)運(yùn)算符:,從左往右2.2.2分支語(yǔ)句(1)if語(yǔ)句if分支語(yǔ)句的通用格式為:if語(yǔ)句的流程圖:

if(條件表達(dá)式1)分支語(yǔ)句1;elseif(條件表達(dá)式2)分支語(yǔ)句2;elseif(條件表達(dá)式3)分支語(yǔ)句3;……elseif(條件表達(dá)式n)分支語(yǔ)句n;else分支語(yǔ)句n+1;例如,隨機(jī)輸入數(shù)字0~9,輸出與其對(duì)應(yīng)的英文翻譯:charnum;printf("輸入數(shù)字0~9:");scanf("%d",&num);If(num==0)printf("Zero\n");elseif(num==1)printf("One\n");elseif(num==2)printf("Two\n");elseif(num==3)printf("Three\n");elseif(num==4)printf("Four\n");elseif(num==5)printf("Five\n");elseif(num==6)printf("Six\n");elseif(num==7)printf("Seven\n");elseif(num==8)printf("Eight\n");elseif(num==9)printf("Nine\n");elseprintf("輸入數(shù)字超限!\n");

運(yùn)行結(jié)果:C語(yǔ)言有一條“條件三目運(yùn)算符(?:)”可以替代“if...else...”結(jié)構(gòu)語(yǔ)句,比如判斷隨機(jī)輸入整數(shù)是否為正數(shù):可以用條件三目運(yùn)算符替代:intnum;printf("請(qǐng)輸入一個(gè)整數(shù):");scanf("%d",&num);if(num>0)printf("輸入的數(shù)字是正數(shù):-)\n");elseprintf("輸入的數(shù)字不是正數(shù):-(\n");intnum;printf("請(qǐng)輸入一個(gè)整數(shù):");scanf("%d",&num);num>0?printf("輸入的數(shù)字是正數(shù):-)\n"):printf("輸入的數(shù)字不是正數(shù):-(\n");(2)switch開(kāi)關(guān)語(yǔ)句switch開(kāi)關(guān)語(yǔ)句的通用格式為:switch語(yǔ)句的流程圖:switch(表達(dá)式){case常量表達(dá)式1:語(yǔ)句1;break;case常量表達(dá)式2:語(yǔ)句2;break;……case常量表達(dá)式n:語(yǔ)句n;break;default:語(yǔ)句n+1;}例如,隨機(jī)輸入數(shù)字0~9,輸出與其對(duì)應(yīng)的英文翻譯:charnum;printf("輸入數(shù)字0~9:");scanf("%d",&num);switch(num){case0:printf("Zero\n");break;case1:printf("One\n");break;case2:printf("Two\n");break;case3:printf("Three\n");break;case4:printf("Four\n");break;case5:printf("Five\n");break;case6:printf("Six\n");break;case7:printf("Seven\n");break;case8:printf("Eight\n");break;case9:printf("Nine\n");break;default:printf("輸入數(shù)字超限!\n");}

運(yùn)行結(jié)果:任務(wù)要求:

任務(wù)A:輸入年份,判斷該年份是否為閏年。

任務(wù)B:某商場(chǎng)舉辦優(yōu)惠購(gòu)物活動(dòng),購(gòu)物滿(mǎn)5000元打8折,購(gòu)物滿(mǎn)2000元,不滿(mǎn)5000元打8.5折,購(gòu)物滿(mǎn)1000元,不滿(mǎn)2000元打9折,其余不打折,輸入購(gòu)物金額數(shù),自動(dòng)計(jì)算折后價(jià)。2.2.3任務(wù)程序的編寫(xiě)任務(wù)A:閏年是公歷中的概念,分為普通閏年和世紀(jì)閏年兩種,所謂普通閏年指的是年份數(shù)是4的倍數(shù)但不是100的倍數(shù)的年份,比如2020年,所謂世紀(jì)閏年指的是年份數(shù)是400的倍數(shù)的年份,比如2000年。(現(xiàn)場(chǎng)操作演示...)任務(wù)B:(現(xiàn)場(chǎng)操作演示...)Tobecontinued...2.3C語(yǔ)言循環(huán)結(jié)構(gòu)能力目標(biāo):

理解數(shù)組的概念,掌握一維數(shù)組的定義及使用方法,能利用while語(yǔ)句、do…while語(yǔ)句、for語(yǔ)句實(shí)現(xiàn)循環(huán)結(jié)構(gòu)程序。任務(wù)要求:任務(wù)A:隨機(jī)輸入5個(gè)正整數(shù),找出其中的最大值、最小值。任務(wù)B:隨機(jī)輸入2個(gè)正整數(shù),求出它們的最大公約數(shù)、最小公倍數(shù)。2.3.1數(shù)組數(shù)組是同類(lèi)型數(shù)據(jù)的有序集合(1)一維整型數(shù)組一維數(shù)組的定義:類(lèi)型說(shuō)明符數(shù)組名[整型常量表達(dá)式];其中,類(lèi)型說(shuō)明符就是組成數(shù)組的各個(gè)元素的數(shù)據(jù)類(lèi)型,數(shù)組名類(lèi)似于變量名,即用于表達(dá)數(shù)組的標(biāo)識(shí)符,方括號(hào)中的整型常量表達(dá)式表示數(shù)組元素的個(gè)數(shù),或者說(shuō)數(shù)組的長(zhǎng)度。一維數(shù)組定義之后即可使用其元素,元素格式為:數(shù)組名[下標(biāo)]。

比如:注意:如果數(shù)組長(zhǎng)度為N,則數(shù)組元素的下標(biāo)取值范圍為0~N-1inta[5];a[0]=12,a[1]=23,a[2]=34,a[3]=45,a[4]=56;數(shù)組在定義的時(shí)候也可以同時(shí)直接初始化初值,比如:一維數(shù)組在初始化的時(shí)候,甚至可以不必指定數(shù)組長(zhǎng)度,編譯器在編譯的時(shí)候,能根據(jù)初始化元素的個(gè)數(shù)自動(dòng)判斷數(shù)組長(zhǎng)度,比如:(2)一維浮點(diǎn)型數(shù)組浮點(diǎn)型數(shù)組的定義及使用與整型數(shù)組類(lèi)似,可以先定義再賦值,比如:也可以定義的同時(shí)進(jìn)行初始化初值,比如:inta[5]={12,23,34,45,56};inta[]={12,23,34,45,56};floata[5];a[0]=1.2,a[1]=2.3,a[2]=3.4,a[3]=4.5,a[4]=5.6;floata[5]={1.2,2.3,3.4,4.5,5.6};(3)一維字符型數(shù)組字符型數(shù)組的定義和使用除了與整型數(shù)組、浮點(diǎn)型數(shù)組類(lèi)似之外,也有自己的特點(diǎn)??梢韵榷x再賦值,比如:以上程序定義了一個(gè)長(zhǎng)度為6的字符型數(shù)組并賦值“Hello”字符串,注意最后一個(gè)字符“\0”是字符串結(jié)束標(biāo)志。也可以定義的同時(shí)進(jìn)行初始化初值,比如:

也可以在初始化的時(shí)候直接賦予字符串,比如:chara[6];a[0]=’H’,a[1]=’e’,a[2]=’l’,a[3]=’l’,a[4]=’o’,a[5]=’\0’;chara[6]={‘H’,’e’,’l’,’l’,’o’,’\0’};chara[6]=”Hello”;//尾部會(huì)自動(dòng)添加“\0”2.3.2循環(huán)語(yǔ)句循環(huán)結(jié)構(gòu)又稱(chēng)重復(fù)結(jié)構(gòu),可以完成重復(fù)性、規(guī)律性的操作,比如求若干數(shù)的和、迭代求根等等。(1)while語(yǔ)句通用格式:循環(huán)語(yǔ)句若由多條語(yǔ)句構(gòu)成,必須以大括號(hào)“{”、“}”括起來(lái)構(gòu)成復(fù)合語(yǔ)句。while(條件表達(dá)式)循環(huán)語(yǔ)句;例如,計(jì)算1+2+3+…+100=?運(yùn)行結(jié)果:unsignedintsum=0,i=1;while(i<=100){ sum+=i; i++;}printf("1+2+3+...+100=%d\n",sum);(2)do…while語(yǔ)句

通用格式:同樣,1+2+3+…+100=?運(yùn)行結(jié)果:do循環(huán)語(yǔ)句while(條件表達(dá)式);unsignedintsum=0,i=1;do{ sum+=i; i++;}while(i<=100);printf("1+2+3+...+100=%d\n",sum);(3)for語(yǔ)句

通用格式:for語(yǔ)句的執(zhí)行過(guò)程:for(表達(dá)式1;表達(dá)式2;表達(dá)式3)循環(huán)語(yǔ)句實(shí)際使用的時(shí)候,for語(yǔ)句的常用格式:同樣,1+2+3+…+100=?運(yùn)行結(jié)果:for(循環(huán)變量賦初值;循環(huán)條件;循環(huán)變量增/減值)循環(huán)語(yǔ)句unsignedintsum=0,i;for(i=1;i<=100;i++)sum+=i;printf("1+2+3+...+100=%d\n",sum);

(4)continue語(yǔ)句與break語(yǔ)句

●continue語(yǔ)句的作用是提前結(jié)束當(dāng)次循環(huán)進(jìn)行下一次循環(huán)。舉例說(shuō)明:運(yùn)行結(jié)果:inti=1;while(i<10){ if(i==5) { i++; continue; } printf("第%d次循環(huán)\n",i); i++;}

●break語(yǔ)句的作用則是直接跳出循環(huán)

舉例說(shuō)明:運(yùn)行結(jié)果:inti=1;while(i<10){ if(i==5) { i++; break; } printf("第%d次循環(huán)\n",i); i++;}2.3.3任務(wù)程序的編寫(xiě)

任務(wù)A:

以找出五個(gè)隨機(jī)正整數(shù)中的最大值為例,先假定第一個(gè)數(shù)就是最大值,然后跟第二個(gè)數(shù)比較,若假定的最大值比第二個(gè)數(shù)小,則將第二個(gè)數(shù)替換為假定的最大值,否則什么也不做。以此類(lèi)推,接著將假定的最大值與第三個(gè)、第四個(gè)、第五個(gè)數(shù)比較,最后假定最大值必然為五個(gè)數(shù)中真實(shí)的最大值。找出五個(gè)隨機(jī)正整數(shù)中的最小值也是采用類(lèi)似方法。(現(xiàn)場(chǎng)操作演示...)任務(wù)B:兩個(gè)正整數(shù)的最大公約數(shù)未必存在,比如兩個(gè)質(zhì)數(shù)就不存在最大公約數(shù),但最小公倍數(shù)是必然存在的,比如兩個(gè)質(zhì)數(shù)的乘積就是兩者的最小公倍數(shù)。以求解兩個(gè)隨機(jī)正整數(shù)的最大公約數(shù)為例,先假定較小的數(shù)字就是兩者的最大公約數(shù),將兩數(shù)同時(shí)除以假定最大公約數(shù),若能整除則假定最大公約數(shù)就是兩者實(shí)際的最大公約數(shù),結(jié)束求解過(guò)程,若不能整除,則將假定最大公約數(shù)遞減一次,再將兩數(shù)同時(shí)除以假定最大公約數(shù),依次類(lèi)推,直到求得最大公約數(shù)。對(duì)于兩個(gè)質(zhì)數(shù)而言,依照此流程最后求得的結(jié)果是1,但顯然1不能作為兩個(gè)正整數(shù)的最大公約數(shù)。求解兩個(gè)隨機(jī)正整數(shù)的最小公倍數(shù)也是采用類(lèi)似的方法,但假定的最小公倍數(shù)是較大的數(shù)字。(現(xiàn)場(chǎng)操作演示...)Tobecontinued...2.4模塊化程序的設(shè)計(jì)能力目標(biāo):

簡(jiǎn)單了解結(jié)構(gòu)體、指針的相關(guān)基礎(chǔ)知識(shí),重點(diǎn)理解并掌握C語(yǔ)言函數(shù)的概念及使用方法。任務(wù)要求:隨機(jī)輸入五個(gè)正整數(shù),將五個(gè)數(shù)字按從小到大的順序進(jìn)行排列。2.4.1結(jié)構(gòu)體認(rèn)知

●數(shù)組是同種類(lèi)型數(shù)據(jù)的組合。

●結(jié)構(gòu)體是不同類(lèi)型數(shù)據(jù)的組合。在STM32的HAL/LL庫(kù)中大量使用了結(jié)構(gòu)體,用于對(duì)片內(nèi)外設(shè)的一組不同的參數(shù)進(jìn)行設(shè)定,但這部分主要是一些自動(dòng)生成代碼,讀者僅僅需要了解即可。結(jié)構(gòu)體的使用可分為如下三步:構(gòu)造結(jié)構(gòu)體類(lèi)型→定義結(jié)構(gòu)體變量→結(jié)構(gòu)體變量賦值。①首先是構(gòu)造結(jié)構(gòu)體類(lèi)型的一般形式:struct結(jié)構(gòu)體名{ 類(lèi)型名1成員名1; 類(lèi)型名2成員名2; …… 類(lèi)型名3成員名3;};比如構(gòu)造一個(gè)名為“Student”的結(jié)構(gòu)體,用來(lái)記錄學(xué)生的基本信息:②然后是定義結(jié)構(gòu)體變量的一般形式:比如定義一個(gè)“Student”型的結(jié)構(gòu)體變量“student1”:structStudent{ unsignedintNo;//學(xué)號(hào) charName[10];//姓名 charSex;//性別};struct結(jié)構(gòu)名

變量名列表;structStudentstudent1;③最后是使用這個(gè)結(jié)構(gòu)體變量,包括賦值和讀取它的值。可以在定義的同時(shí)進(jìn)行初始化,比如:也可以在定義完成后進(jìn)行賦值,比如:structStudentstudent1={325,"張三",'M'};structStudentstudent1;student1.No=325;strcpy(student1.Name,"張三");//字符串賦值函數(shù),需要包含頭文件“string.h”student1.Sex='M';2.4.2指針認(rèn)知指針就是用于指向變量?jī)?nèi)存單元的變量,或者說(shuō)在指針變量中存儲(chǔ)了其指向變量的內(nèi)存地址。

指針在STM32單片機(jī)程序的開(kāi)發(fā)中,主要是調(diào)用HAL/LL庫(kù)API函數(shù)時(shí)進(jìn)行實(shí)參的地址引用,這里僅對(duì)①指針指向基本變量、②指針指向一維數(shù)組的使用方法進(jìn)行扼要介紹,在2.4.3中也會(huì)簡(jiǎn)單介紹③指針變量作為函數(shù)參數(shù)的使用方法。(1)指針指向基本變量首先是指針變量的定義,定義格式為:類(lèi)型說(shuō)明符*變量名;這里,“*”表示這是一個(gè)指針變量,類(lèi)型說(shuō)明符指的是指針?biāo)赶蜃兞康臄?shù)據(jù)類(lèi)型。比如:int*p;表示定義了一個(gè)指針變量p,他可以指向一個(gè)整型變量,但具體指向哪一個(gè)整型變量,需要對(duì)指針變量賦值,指針變量的賦值格式:變量1=&變量2;

這里,“&”是取地址運(yùn)算符,表示獲取變量2的地址,注意到這是一個(gè)單目運(yùn)算符,與位運(yùn)算符中的位與運(yùn)算符“&”不是一個(gè)功能,比如:

也可以定義的同時(shí)直接做初始化:利用指針引用變量,比如:

在利用指針引用變量時(shí),“*p”表示指針變量“p”指向變量的值。運(yùn)行結(jié)果:inta,*p;p=&a;inta,*p=&a;inta=56,*p=&a;printf("%d",*p);(2)指針指向一維數(shù)組數(shù)組在計(jì)算機(jī)內(nèi)存中的地址是連續(xù)的,一般我們可以將指針指向數(shù)組的第一個(gè)元素的地址,在遍歷數(shù)組中每一個(gè)元素時(shí),只需要將指針不斷往后偏移即可。比如定義一個(gè)指針并指向整型一維數(shù)組的第一個(gè)元素:也可以:

即“&a[0]”和“a”都可以表示數(shù)組a的首地址。int*p,a[5]={12,23,34,45,56};p=&a[0];int*p,a[5]={12,23,34,45,56};p=a;利用指針遍歷一維數(shù)組,比如:

這里的“*p++”,“++”優(yōu)先級(jí)別比“*”高,等價(jià)于“*(p++)”。

運(yùn)行結(jié)果:int*p,a[5]={12,23,34,45,56},i;p=a;for(i=0;i<5;i++){ printf("%d",*p++);}2.4.3函數(shù)與模塊化程序設(shè)計(jì)C語(yǔ)言程序一般是由一個(gè)主函數(shù)(即main函數(shù))加若干其他函數(shù)構(gòu)成,主函數(shù)是整個(gè)程序執(zhí)行的入口,不可或缺。將一段具有特定功能的代碼封裝成函數(shù),既方便程序員在后續(xù)的開(kāi)發(fā)中直接調(diào)用,也提高了代碼的可維護(hù)性,可謂一舉兩得。由于每一個(gè)函數(shù)也是一個(gè)獨(dú)立的功能模塊,因此C語(yǔ)言也被稱(chēng)為模塊化程序設(shè)計(jì)語(yǔ)言。函數(shù)的使用一般分三步進(jìn)行:定義、聲明、調(diào)用。定義的一般形式:函數(shù)類(lèi)型函數(shù)名(形式參數(shù)表){函數(shù)體語(yǔ)句}第一行構(gòu)成函數(shù)的首部,大括號(hào)中的內(nèi)容構(gòu)成函數(shù)的函數(shù)體。其中,形式參數(shù)簡(jiǎn)稱(chēng)“形參”,即函數(shù)的輸入值,函數(shù)的形參可以有多個(gè),也可以只有一個(gè),甚至于沒(méi)有形參;函數(shù)類(lèi)型也叫函數(shù)的返回值類(lèi)型,即函數(shù)的輸出值類(lèi)型,函數(shù)的返回值最多只能有一個(gè),當(dāng)函數(shù)沒(méi)有返回值時(shí),函數(shù)類(lèi)型必須寫(xiě)上“void”。聲明的一般形式:一般直接將函數(shù)的首部復(fù)制并粘貼到主函數(shù)之前,加上分號(hào)“;”即可。調(diào)用的一般形式:函數(shù)類(lèi)型函數(shù)名(形式參數(shù)表);函數(shù)名(實(shí)際參數(shù)表);調(diào)用函數(shù)時(shí),必須將形參全部替換為實(shí)際參數(shù)(簡(jiǎn)稱(chēng)“實(shí)參”)。函數(shù)的定義可以理解為是定義了一種運(yùn)算關(guān)系,形參可以理解為自變量,返回值可以理解為因變量;函數(shù)的調(diào)用可以理解為將常量代入這種運(yùn)算關(guān)系從而得出運(yùn)算結(jié)果;函數(shù)的聲明,這與編譯器的編譯順序有關(guān),比如定義的函數(shù)在主函數(shù)之后,而主函數(shù)調(diào)用了該函數(shù),如果不提前聲明,編譯器會(huì)認(rèn)為該函數(shù)不存在從而終止編譯。

比如,圓面積的計(jì)算:#include<stdio.h>constfloatpi=3.141592;//“const關(guān)鍵字說(shuō)明“pi”是一個(gè)常量main(){ floatr,s; printf("請(qǐng)輸入半徑:"); scanf("%f",&r); s=pi*r*r; printf("圓面積:%f\n",s);}將圓面積的計(jì)算公式封裝成獨(dú)立函數(shù):#include<stdio.h>constfloatpi=3.141592;//“const”關(guān)鍵字說(shuō)明“pi”是一個(gè)常量floatsquare(floatr);//函數(shù)的聲明main(){ floatr,s; printf("請(qǐng)輸入半徑:"); scanf("%f",&r); s=square(r);//函數(shù)的調(diào)用 printf("圓面積:%f\n",s);}//函數(shù)的定義floatsquare(floatr){ returnpi*r*r;//由“return”語(yǔ)句返回運(yùn)算結(jié)果}

圓面積計(jì)算函數(shù)中,形參只有半徑“r”,返回值類(lèi)型為浮點(diǎn)型,由于這不是一個(gè)void型函數(shù),因此調(diào)用時(shí)可以將函數(shù)返回值賦值給變量“s”。

運(yùn)行結(jié)果:

值得注意的是,在main函數(shù)和square函數(shù)中都有變量“r”,但這兩個(gè)變量“r”沒(méi)有任何關(guān)系,他們分屬于兩個(gè)不同函數(shù)的“局部變量”,其作用域僅限于各自所在的函數(shù)內(nèi)部;變量“pi”定義的位置在所有函數(shù)之前,這屬于“全局變量”,其作用域可達(dá)整個(gè)程序的任何位置,如果當(dāng)全局變量與局部變量同名時(shí),局部變量會(huì)在其作用域內(nèi)自動(dòng)屏蔽同名全局變量。接下來(lái)比較一下形參分別為變量和指針時(shí)的區(qū)別:#include<stdio.h>voidf1(inta);voidf2(int*p);main(){ inta=0; f1(a); printf("a=%d\n",a); f2(&a); printf("a=%d\n",a);}voidf1(inta){ a++;}voidf2(int*p){ (*p)++;}

運(yùn)行結(jié)果:f1函數(shù)采用的是“值傳遞”的參數(shù)傳遞方式,函數(shù)執(zhí)行完畢后,不會(huì)影響到原變量的值,而f2函數(shù)采用的是“地址傳遞”的參數(shù)傳遞方式,函數(shù)在執(zhí)行過(guò)程中,直接改變了指針指向的變量值,所以函數(shù)執(zhí)行完畢后,原變量的值自然發(fā)生了變化。2.4.4任務(wù)程序的編寫(xiě)顯然,本次任務(wù)必須借助于數(shù)組,在定義排序函數(shù)的時(shí)候,可以利用指針指向數(shù)組的首地址,在調(diào)用排序函數(shù)之后,數(shù)組中的元素即完成從小到大的排序。排序策略為:先將數(shù)組第一個(gè)元素依次與后面的四個(gè)比較,在比較過(guò)程中,只要發(fā)現(xiàn)第一個(gè)元素比某一個(gè)元素大,就交換兩個(gè)元素的位置,確保最小的元素排在數(shù)組的第一位,然后將數(shù)組的第二個(gè)元素與后面的三個(gè)比較……以此類(lèi)推。

(現(xiàn)場(chǎng)操作演示...)Tobecontinued...3.1LED單燈閃爍之軟件延時(shí)能力目標(biāo):

理解單片機(jī)GPIO兩種主要的輸出類(lèi)型,初步掌握使用STM32CubeIDE開(kāi)發(fā)單片機(jī)應(yīng)用程序的方法,掌握通過(guò)ISP下載程序并通過(guò)實(shí)物驗(yàn)證的方法。任務(wù)要求:電路如圖所示,要求通過(guò)單片機(jī)PC0引腳控制LED0以1秒周期閃爍。3.1.1STM32的GPIO及其輸出類(lèi)型STM32F103R6具有51個(gè)GPIO(General-purposeinput/output,通用輸入輸出)引腳,每個(gè)引腳都具備如圖所示結(jié)構(gòu)。GPIO的八種工作模式:

本次課著重講其中的⑴⑵兩種工作模式。⑴推挽輸出⑵開(kāi)漏輸出⑶復(fù)用推挽輸出⑷復(fù)用開(kāi)漏輸出⑸模擬量輸入⑹浮空輸入⑺下拉輸入⑻上拉輸入⑴推挽輸出

此時(shí)P-MOS管與N-MOS管發(fā)揮作用:

①當(dāng)控制輸出1時(shí),P-MOS管閉合、N-MOS管斷開(kāi),引腳輸出電源電壓(+3.3V);

②當(dāng)控制輸出0時(shí),P-MOS管斷開(kāi)、N-MOS管閉合,引腳輸出GND。

推挽輸出模式一般應(yīng)用在輸出電平為0和+3.3V而且需要高速切換開(kāi)關(guān)狀態(tài)的場(chǎng)合。在STM32的應(yīng)用中,除了必須用開(kāi)漏模式的場(chǎng)合,我們都習(xí)慣使用推挽輸出模式。

值得注意的是,當(dāng)引腳直接接地的時(shí)候,切不可推挽輸出高電平,否則電源將被直接短路?、崎_(kāi)漏輸出此時(shí)P-MOS管始終斷開(kāi),僅N-MOS管發(fā)揮作用:

①當(dāng)控制輸出1時(shí),N-MOS管斷開(kāi),引腳懸空;

②當(dāng)控制輸出0時(shí),N-MOS管閉合,引腳輸出GND。

開(kāi)漏輸出一般應(yīng)用在①I(mǎi)2C、SMBUS通訊等需要“線(xiàn)與”功能的總線(xiàn)電路中。除此之外,②還用在電平不匹配的場(chǎng)合,如需要輸出5伏的高電平,就可以在外部接一個(gè)上拉電阻,上拉電源為5V,并且把引腳設(shè)置為開(kāi)漏模式,當(dāng)輸出高阻態(tài)時(shí),由上拉電阻和電源向外輸出5V電平,如右圖所示。3.1.2STM32CubeIDE的使用STM32CubeMX的作用是通過(guò)圖形化配置完成STM32的工程目錄的建立與初始化代碼的生成。下面是操作步驟。

(1)在桌面上找到并雙擊程序圖標(biāo),打開(kāi)程序主界面。

(2)點(diǎn)擊菜單“File=>NewProject”新建工程,在搜索欄中輸入單片機(jī)型號(hào)“STM32F103R6”,出現(xiàn)兩種封裝的搜索結(jié)果。

(3)在搜索結(jié)果中選擇LQFP64封裝,雙擊打開(kāi)左圖配置界面。

(4)在右圖“Pinout&Configuration”界面上將引腳PC0修改為“GPIO_Output”模式。

(5)在左圖“ProjectManager”界面上對(duì)工程命名,制定工程目錄,指定集成開(kāi)發(fā)環(huán)境為“TrueSTUDIO”后點(diǎn)擊“DeviceConfigurationToolCodeGeneration”按鈕

生成單片機(jī)程序工程目錄。

本案例沒(méi)有對(duì)時(shí)鐘樹(shù)進(jìn)行設(shè)定,采用了默認(rèn)的內(nèi)部RC振蕩源。

接下來(lái)就是繼續(xù)完成程序代碼的編寫(xiě)。

本次任務(wù)需要用到兩個(gè)API函數(shù)(API函數(shù)來(lái)源于“UM1850_DescriptionofSTM32F1HALandLow-layerdrivers.PDF”文檔):①引腳輸出狀態(tài)翻轉(zhuǎn)函數(shù)HAL_GPIO_TogglePin

例程:HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0);//將PC0引腳輸出狀態(tài)取反②延時(shí)函數(shù)HAL_Delay

例程:下面是操作步驟。HAL_Delay(500);//延時(shí)500ms(即0.5s)

(1)在左側(cè)“Src”目錄中找到main.c文件,雙擊打開(kāi)。(5)值得注意的是,由于STM32CubeIDE默認(rèn)不生成HEX文件,需要人為設(shè)置:在IDE主界面菜單欄中選擇“Project(工程)”→“Properties(屬性)”打開(kāi)如圖3-12所示屬性對(duì)話(huà)框,選擇“C/C++Build(C/C++生成)”→“Settings(設(shè)置)”→“ToolSettings(工具設(shè)置)”→“MCUPostbuildoutputs(單片機(jī)編譯后輸出)”,在“ConverttoIntelHexfile(-Oihex)(轉(zhuǎn)換為英特爾HEX文件)”項(xiàng)目打鉤并保存,回到IDE主界面后再按下生成按鈕,即可在源代碼編譯成功后輸出HEX文件。3.1.3使用ISP方式下載程序

程序編寫(xiě)完畢,生成HEX文件以后,通過(guò)ISP工具下載到單片機(jī)電路運(yùn)行驗(yàn)證。特別注意的是,接線(xiàn)的時(shí)候請(qǐng)斷電。

步驟:

①將開(kāi)發(fā)板上核心板的PC0引腳與LED模塊LED0的引出端用杜邦線(xiàn)連接;②將開(kāi)發(fā)板USB通信口與計(jì)算機(jī)USB口通過(guò)USB線(xiàn)連接;③接通電源;④將核心板撥動(dòng)開(kāi)關(guān)撥到“ISP”位置,按下“RST”復(fù)位按鈕;⑤通過(guò)ISP工具“FlashLoaderDemonstrator”讀取工程目錄下“.../Debug/2.1.Hex”文檔中的機(jī)器碼,并將機(jī)器碼下載至單片機(jī)Flash,操作步驟請(qǐng)見(jiàn)后頁(yè)。

ISP工具桌面圖標(biāo)是。⑥程序下載完畢后,將核心板撥動(dòng)開(kāi)關(guān)撥回到“Run”位置,再次按下復(fù)位按鈕“RST”,單片機(jī)將按照設(shè)定程序運(yùn)行。具體的代碼另外給出。技能訓(xùn)練(選做):

修改電路,改由PC1驅(qū)動(dòng)LED1作單燈閃爍,閃爍周期改為2s。Tobecontinued...3.2按鈕輸入能力目標(biāo):

理解并掌握單片機(jī)GPIO三種主要的輸入類(lèi)型,掌握使用Proteus仿真單片機(jī)電路的方法。任務(wù)要求:電路如圖所示,要求通過(guò)按鈕BTN0控制LED0的亮滅(LED0接PC0,BTN0接PC1)。3.2.1GPIO的輸入類(lèi)型STM32F103R6具有51個(gè)GPIO(General-purposeinput/output,通用輸入輸出)引腳,每個(gè)引腳都具備如圖所示結(jié)構(gòu)。GPIO的八種工作模式:

本次課著重講其中的⑺⑻兩種工作模式。⑴推挽輸出⑵開(kāi)漏輸出⑶復(fù)用推挽輸出⑷復(fù)用開(kāi)漏輸出⑸模擬量輸入⑹浮空輸入⑺下拉輸入⑻上拉輸入⑴當(dāng)圖中上拉電阻、下拉電阻均未接入時(shí)輸入模式為浮空輸入,此時(shí)若輸入信號(hào)斷開(kāi),則引腳輸入狀態(tài)不定(不常用);

⑵當(dāng)圖中上拉電阻接入時(shí)輸入模式為上拉輸入,此時(shí)若輸入信號(hào)斷開(kāi),則引腳輸入為高電平;(常用)

⑶當(dāng)圖中下拉電阻接入時(shí)輸入模式為下拉輸入,此時(shí)若輸入信號(hào)斷開(kāi),則引腳輸入為低電平。(常用)

典型按鈕電路如圖:

左圖引腳PC1配置為上拉輸入時(shí),若松開(kāi)按鈕,引腳默認(rèn)輸入高電平,若按下按鈕,引腳輸入低電平;右圖引腳PC1配置為下拉輸入時(shí),若松開(kāi)按鈕,引腳默認(rèn)輸入低電平,若按下按鈕,引腳輸入高電平;

如果選擇浮空輸入模式,則按鈕上拉或下拉電阻必須外接,比如本項(xiàng)目仿真電路。3.2.2電路仿真

電路仿真采用Proteus,操作步驟:

(1)在桌面上找到并雙擊程序圖標(biāo),打開(kāi)左圖主界面,選擇“NewProject”新建工程(如右圖),過(guò)程中除了路徑之外,其余均采用缺省設(shè)定。(2)拾取元件。左圖中在左側(cè)工具欄中按下(ComponentMode)按鈕進(jìn)入元器件拾取模塊,接著按下右側(cè)的(PickDevice)按鈕打開(kāi)中圖元器件拾取對(duì)話(huà)框。在中圖“Keywords”搜索欄內(nèi)依次輸入本次課題所需元器件名稱(chēng),在右圖“Results”結(jié)果欄內(nèi)選中并雙擊所需元器件將其拾取到主界面元器件中,完成后關(guān)閉對(duì)話(huà)框。(3)放置元件并更改元器件參數(shù)。在主界面元件池中依次選擇所需元件將其擺放到主界面中心圖紙上。依次選中圖紙上的元件,在鼠標(biāo)右鍵彈出的快捷菜單內(nèi)選擇“EditProperties”打開(kāi)右圖所示編輯屬性對(duì)話(huà)框,修改參數(shù)后點(diǎn)“OK”按鈕保存退出。(4)電路連線(xiàn)。在左側(cè)工具欄中按下(TerminalsMode)終端模式按鈕,在終端列表中分別選擇電源終端POWER、接地終端GROUND并添加到圖紙中,完成電路連線(xiàn)。(5)設(shè)定電源正負(fù)極參數(shù)。在主界面中選擇菜單欄“Design=>ConfigurePowerRails...”打開(kāi)電源軌配置對(duì)話(huà)框如左圖所示,需要設(shè)定的是:①將電源正極由5V改為3.3V;②將模擬量電源正負(fù)極VDDA與VSSA分別添加到VCC/VDD網(wǎng)絡(luò)與GND網(wǎng)絡(luò),否則單片機(jī)將無(wú)法仿真,添加結(jié)果如中圖與右圖所示。(6)指定HEX文件路徑?;氐街鹘缑妫x擇原理圖中的單片機(jī)并在右鍵快捷菜單中選擇“EditProperties”打開(kāi)如圖所示編輯屬性對(duì)話(huà)框,在對(duì)話(huà)框中點(diǎn)擊按鈕,選擇HEX文件并確認(rèn)保存。(7)運(yùn)行仿真。按下左下角運(yùn)行按鈕即可開(kāi)始仿真。注意:Proteus8.8和8.9仿真模型中上拉模式不可用,必須外接上拉電阻。3.2.3任務(wù)程序的編寫(xiě)

本次內(nèi)容需要用到的新的API函數(shù)是:

引腳輸入函數(shù)HAL_GPIO_ReadPin

例程:

(現(xiàn)場(chǎng)操作演示...)GPIO_PinStatex=HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_1);//讀取PC1輸入狀態(tài)技能訓(xùn)練(選做):通過(guò)兩只按鈕控制一個(gè)LED的亮滅,要求兩個(gè)按鈕一個(gè)采用上拉輸入模式,另一個(gè)采用下拉輸入模式。參考電路如下圖所示。Tobecontinued...3.3流水燈之軟件延時(shí)能力目標(biāo):理解并掌握通過(guò)改進(jìn)算法提高編程效率的方法。任務(wù)要求:

電路如圖所示,要求實(shí)現(xiàn)流水燈效果,即按LED0~LED7的順序依次點(diǎn)亮,每次僅限一只LED發(fā)光,周期4秒。3.3.1程序算法

算法(Algorithm)是指解決方案準(zhǔn)確而完整的描述,是一系列解決問(wèn)題的清晰指令,算法代表著用系統(tǒng)的方法描述解決問(wèn)題的策略機(jī)制。首先人們自然會(huì)想到“位操作法”,但這種算法編程效率太低,下面介紹兩種比較好的算法:⑴查表法

即將8個(gè)狀態(tài),定義為8個(gè)字節(jié),每隔一段時(shí)間,按先后順序查表并將8個(gè)狀態(tài)量賦值給單片機(jī)的規(guī)定輸出口,狀態(tài)表如下。序號(hào)狀態(tài)字節(jié)(二進(jìn)制)狀態(tài)字節(jié)(十六進(jìn)制)序號(hào)狀態(tài)字節(jié)(二進(jìn)制)狀態(tài)字節(jié)(十六進(jìn)制)11111,1110FE51110,1111EF21111,1101FD61101,1111DF31111,1011FB71011,1111BF41111,0111F780111,11117F⑵移位法所謂移位法,就是利用C語(yǔ)言的移位運(yùn)算符“<<”、“>>”實(shí)現(xiàn)狀態(tài)字節(jié)的循環(huán)移位。但由于C語(yǔ)言的移位運(yùn)算符只能實(shí)現(xiàn)單向移位,因此必須通過(guò)一定的算法來(lái)間接實(shí)現(xiàn),具體的做法是:假設(shè)M位數(shù)據(jù)A需要循環(huán)左移N位(M>N),先將A左移N位得到B,再將A右移(M-N)位得到C,最后將A、B按位求或運(yùn)算即可獲得最終結(jié)果。比如,8位二進(jìn)制數(shù),各位均用字母表示為“ABCDEFGH”,需要循環(huán)左移3位,可先將原數(shù)左移3位,得到“DEFGH000”,再將原數(shù)右移5位,得到“00000ABC”,最后將兩數(shù)按位或即可得到循環(huán)左移3位的結(jié)果“DEFGHABC”,示意如下。①ABCDEFGH<<3→DEFGH000②A(yíng)BCDEFGH>>5→00000ABC③DEFGH000|00000ABC

→DEFGHABC3.3.2任務(wù)程序的編寫(xiě)

本次任務(wù)程序?qū)⒏鶕?jù)位操作法、查表法與移位法三種方法編寫(xiě),需要用到的新的API函數(shù):

①引腳輸出函數(shù)HAL_GPIO_WritePin

新版HAL庫(kù)改為:GPIO_PIN_RESETGPIO_PIN_SET

例程:今天我們要對(duì)若干個(gè)引腳一起輸出相同的電平值,比如

HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,GPIO_PIN_RESET);//PC0輸出低電平HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,GPIO_PIN_S

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論