智能小車C語言程序控制 課件 第七章 制作跑馬燈_第1頁
智能小車C語言程序控制 課件 第七章 制作跑馬燈_第2頁
智能小車C語言程序控制 課件 第七章 制作跑馬燈_第3頁
智能小車C語言程序控制 課件 第七章 制作跑馬燈_第4頁
智能小車C語言程序控制 課件 第七章 制作跑馬燈_第5頁
已閱讀5頁,還剩28頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

智能小車C語言程序控制秦磊

梁爽

主編第7章

制作跑馬燈

在設(shè)計程序時,經(jīng)常會遇到某一段代碼需要被多次執(zhí)行的情況。利用循環(huán)語句,就可以反復(fù)執(zhí)行一段具有固定規(guī)律的程序,減少代碼的編寫量。本章將介紹循環(huán)語句的基礎(chǔ)知識,并完成相關(guān)案例。7.1for循環(huán)for循環(huán)的功能是:通過合理設(shè)置初始值、循環(huán)條件和步進,準確地指定循環(huán)次數(shù),確保循環(huán)體被足量執(zhí)行。一般情況下,for循環(huán)的初始值、循環(huán)條件和步進都是集中編寫的,以便閱讀和計算其循環(huán)的次數(shù)。for(設(shè)置初始值;循環(huán)條件;步進){

循環(huán)體;}7.1for循環(huán)

for循環(huán)的入口是設(shè)置初始值語句,然后開始循環(huán)條件、循環(huán)體和步進語句的循環(huán)執(zhí)行;循環(huán)條件通常是一個邏輯表達式,如果該表達式為真,則執(zhí)行循環(huán)體和步進語句,為假則退出循環(huán),執(zhí)行for循環(huán)之后的程序;步進語句的主要作用是影響循環(huán)條件,確保在若干次循環(huán)之后能夠退出循環(huán);循環(huán)體是需要重復(fù)執(zhí)行的程序。如果設(shè)置初始值之后,循環(huán)條件為假,則循環(huán)體和步進語句一次都不會執(zhí)行,直接退出for循環(huán)。例使用for循環(huán)輸出數(shù)字1~5,每個數(shù)字占一行。#include<stdio.h>intmain(){ for(inti=1;i<=5;i++) { printf("%d\n",i); } return0;}12345例使用for循環(huán)計算1+2+3+…+100的結(jié)果。#include<stdio.h>intmain(){ intsum=0; for(inti=1;i<=100;i++) { sum+=i; } printf("%d\n",sum); return0;}5050(1)在for循環(huán)中,設(shè)置初始值、循環(huán)條件和步進語句三段代碼之間用“;”隔開。(2)循環(huán)體中如果有多行語句,要用“{}”括起來,每一行都以“;”結(jié)尾;如果只有一行語句,可以省略“{}”,但是仍然要以“;”結(jié)尾。在while循環(huán)和do-while循環(huán)中也有這樣的要求。(3)for循環(huán)還有一種寫法是“for(;;){循環(huán)體;}”,也就是沒有設(shè)置初始值、循環(huán)條件和步進語句三段代碼,但保留兩個“;”,這會構(gòu)成無限循環(huán),如果循環(huán)體中沒有break語句確保強制退出,會導(dǎo)致死循環(huán),也就是計算機不停地計算,既無法得到希望的答案,又會拖累計算機整體的運行速度。(4)一般情況下,如果變量i在for循環(huán)以外沒有使用需求,則將其定義在for循環(huán)中,當for循環(huán)執(zhí)行結(jié)束后,系統(tǒng)會自動釋放變量i所占用的系統(tǒng)資源,還可以防止與其他位置出現(xiàn)的變量i產(chǎn)生沖突;同理,凡是在for循環(huán)中臨時使用的變量,都應(yīng)該定義在for循環(huán)中。小貼士7.2while循環(huán)while循環(huán)的語法接近自然語言,簡單易讀,常用于循環(huán)條件比較復(fù)雜或者循環(huán)次數(shù)難以確定的循環(huán)程序。在while循環(huán)中只要循環(huán)條件為真,就一直循環(huán)執(zhí)行循環(huán)體。while(循環(huán)條件){

循環(huán)體;}例使用while循環(huán)找出等比數(shù)列“1,2,4,8,…”中大于100的最小數(shù)字。#include<stdio.h>intmain(){ inti=1; while(i<=100) { i*=2; } printf("%d\n",i); return0;}128(1)while語句后沒有“;”。(2)while循環(huán)的結(jié)構(gòu)雖然簡單,但是依然要在程序中設(shè)計好初始值、循環(huán)條件和步進語句,以確保while循環(huán)能夠正常開始和結(jié)束。特別要注意避免死循環(huán),很多初學(xué)者在編寫循環(huán)體時,都會忘記編寫類似步進的語句,導(dǎo)致循環(huán)條件始終為真。但是,在單片機編程中,經(jīng)常會使用while(1)無限循環(huán),以控制程序持續(xù)運行,因為單片機一般在通電后要一直工作,直到斷電。for(;;)雖然也是無限循環(huán),但很少在單片機中使用。小貼士7.3do-while循環(huán)do-while循環(huán)與while循環(huán)有些相似,都是當循環(huán)條件為真時執(zhí)行循環(huán)體,主要的區(qū)別在于do-while循環(huán)是先執(zhí)行循環(huán)體后判斷循環(huán)條件,當循環(huán)條件為真時,再次執(zhí)行循環(huán)體,直到循環(huán)條件為假,這樣能夠確保循環(huán)體至少被執(zhí)行一次;而while循環(huán)則是先判斷循環(huán)條件后執(zhí)行循環(huán)體,循環(huán)體有可能一次都不被執(zhí)行。do{

循環(huán)體;}while(循環(huán)條件);例有一組數(shù)字,第一個數(shù)字和第二個數(shù)字都是1,從第三個數(shù)字開始,每個數(shù)字是前兩個數(shù)字之和,即1,1,2,3,5,8,…,求第10個數(shù)字是多少?#include<stdio.h>intmain(){ inta1=1; inta2=1; inta3; intn=3; do { a3=a1+a2; a1=a2; a2=a3; n++; } while(n<=10); printf("%d\n",a3); return0;}557.4循環(huán)嵌套在循環(huán)語句內(nèi),可以嵌套條件語句和循環(huán)語句,從而實現(xiàn)更加多樣的程序流程。在編寫嵌套程序時,要確保格式規(guī)范,以便閱讀和排除錯誤,特別要注意不能多寫或少寫大括號。#include<stdio.h>intmain(){ intsum=0; for(inti=1;i<=100;i++) { if(i%2!=0) { sum+=i; } } printf("%d\n",sum); return0;}例計算100以內(nèi)所有奇數(shù)的和。例使用“*”排列出一個邊長為6的三角形。#include<stdio.h>intmain(){ for(inti=1;i<=6;i++) { for(intj=1;j<=i;j++) { printf("*"); } printf("\n"); } return0;}*********************例使用“*”和空格排列出一個邊長為6的倒三角形。#include<stdio.h>intmain(){ for(inti=1;i<=6;i++) { for(intj=1;j<=6;j++) { if(j>=i)printf("*"); elseprintf(""); } printf("\n"); } return0;}*********************7.5break語句有時,循環(huán)語句執(zhí)行到中間的某個階段,就完成了計算任務(wù),不需要繼續(xù)執(zhí)行,或者受到外部事件控制,強制結(jié)束循環(huán)計算。這個時候可以使用break語句結(jié)束當前的循環(huán),執(zhí)行循環(huán)語句后面的程序。#include<stdio.h>intmain(){ intx; printf("請輸入一個大于2的整數(shù):"); scanf("%d",&x); charflag=1; for(inti=2;i<x;i++) { if(x%i==0) { flag=0; break; } } if(flag) { printf("%d是素數(shù)。\n",x); } else { printf("%d不是素數(shù)。\n",x); } return0;}例判斷輸入的數(shù)字是不是素數(shù)。例判斷輸入的數(shù)字是不是素數(shù)。#include<stdio.h>intmain(){

intx; charflag=1;

printf("請輸入一個大于2的整數(shù):");

scanf("%d",&x); if(x<2) {

printf("請輸入一個大于2的整數(shù)。\n"); } else { for(int

i=2;i<x;i++) { if(x%i==0) { flag=0; break; } } if(flag)printf("%d是素數(shù)。\n",x); elseprintf("%d不是素數(shù)。\n",x); } return0;}例判斷輸入的數(shù)字是不是素數(shù)。#include<stdio.h>intmain(){ //輸入數(shù)據(jù)

intx;

printf("請輸入一個大于2的整數(shù):");

scanf("%d",&x); //檢查數(shù)據(jù)

if(x<2) {

printf("請輸入一個大于2的整數(shù)。\n"); return0; } //處理數(shù)據(jù)

charflag=1; for(int

i=2;i<x;i++) { if(x%i==0) { flag=0; break; } } //輸出數(shù)據(jù)

if(flag)printf("%d是素數(shù)。\n",x); elseprintf("%d不是素數(shù)。\n",x); return0;}一般情況下,設(shè)計的程序應(yīng)當包含以下四個步驟:輸入數(shù)據(jù)、檢查數(shù)據(jù)、處理數(shù)據(jù)和輸出數(shù)據(jù)。只有經(jīng)過檢查符合要求的數(shù)據(jù)才能夠被處理,從而確保程序正常運行。這四個步驟如果能夠形成順序結(jié)構(gòu),程序的可讀性就更高。通過靈活編寫各類相關(guān)語句,不僅可以提高程序的運行效率,增強程序的安全性、穩(wěn)定性,還可以靈活的擴展程序的應(yīng)用領(lǐng)域,甚至程序反而變得更加精簡易讀,這是編程精益求精的要求,也是所有程序員應(yīng)具備的素質(zhì)。小貼士7.6continue語句有時,循環(huán)體執(zhí)行到一半,就發(fā)現(xiàn)可以結(jié)束本次循環(huán),開始下一次循環(huán)。這時就要使用continue語句。voidsetup(){Serial.begin(9600);Stringx="";for(inti=1;i<=100;i++){if(i%7==0)continue;if(String(i).indexOf("7")>=0)continue;//String(i)將i所存儲的數(shù)字轉(zhuǎn)換成字符串

x+=String(i)+",";}Serial.println(x);}例在Arduino平臺上,輸出1~100范圍內(nèi)所有與“7”無關(guān)的數(shù)字。(1)本例利用了Arduino內(nèi)置的String對象及相關(guān)方法。String(變量)可以將任意一種變量內(nèi)保存的數(shù)據(jù)轉(zhuǎn)換為字符串,以便參與字符串相關(guān)的運算。通過strings.indexOf(key)方法可以方便地檢索關(guān)鍵字key在字符串strings中出現(xiàn)的位置,如果在第一個字符位置出現(xiàn),則返回0;如果在第二個字符位置出現(xiàn),則返回1,依此類推。如果沒有檢索到,則返回-1。(2)本例使用面向?qū)ο蟮木幊谭椒?,代碼更加簡潔,大幅提升了程序開發(fā)效率,這是目前主流的編程形式。小貼士7.7跑馬燈的制作跑馬燈是指一組燈按一定的順序輪流交替點亮。跑馬燈簡便易用、顏色豐富,在日常生活中有廣泛的應(yīng)用。本案例要求利用Arduino開發(fā)板制作跑馬燈,使發(fā)光二極管依次點亮再依次熄滅,如此循環(huán)往復(fù)。主要硬件有Arduino開發(fā)板1塊、發(fā)光二極管4個、1kΩ電阻4個、面包板1塊,跑馬燈接線圖如圖2-7-4所示。例跑馬燈代碼const

intled1=2;const

intled2=3;const

intled3=4;const

intled4=5;voidsetup(){

pinMode(led1,OUTPUT);

pinMode(led2,OUTPUT);

pinMode(led3,OUTPUT);

pinMode(led4,OUTPUT);while(1){

digitalWrite(led1,HIGH);delay(500);

digitalWrite(led2,HIGH);delay(500);

digitalWrite(led3,HIGH);delay(500);

digitalWrite(led4,HIGH);delay(500);

digitalWrite(led1,LOW);delay(500);

digitalWrite(led2,LOW);delay(500);

digitalWrite(led3,LOW);delay(500);

digitalWrite(led4,LOW);delay(500);}}例跑馬燈代碼boolflag=0;voidsetup(){for(int

i=2;i<=5;i++){

pinMode(i,OUTPUT);

digitalWrite(i,flag);}}voidloop(){flag=!flag;for(int

i=2;i<=5;i++){

digitalWrite(i,flag);delay(500);}}7.8模擬按鍵響應(yīng)事件編程實現(xiàn)以下功能:每按一次按鍵,在串口監(jiān)視助手軟件中輸出的數(shù)字加1。需要的硬件有Arduino開發(fā)板1塊、按鍵1個、1kΩ電阻1個和面包板1塊。例按鍵響應(yīng)代碼constintbtn=2;intx=0;voidsetup(){pinMode(btn,INPUT);Serial.begin(9600);}voidloop(){if(digitalRead(btn)) //當按下按鍵時觸發(fā)

{while(digitalRead(btn));//等待按鍵抬起,循環(huán)體為空

x++;Serial.println(x);}}(1)使用“pinMode(通道,INPUT);”語句,可以將指定數(shù)字端口設(shè)置為輸入模式,用以讀取輸入的電平狀態(tài)。(2)使用“digitalRead(通道)”語句讀取端口上的電壓,當電壓大于或等于3V時返回HIGH(1),小于或等于2V時返回LOW(0)。(3)本案例通過一個下拉電阻將2號數(shù)字端口固定在低電平,當按下按鍵后,連接到5V,讀取到高電平。小貼士系統(tǒng)運行后,在某些情況下,雖然只按了一次按鍵,但是會發(fā)現(xiàn)串口監(jiān)視助手軟件中輸出了多個數(shù)字,這是因為在按鍵按下和抬起的瞬間,信號發(fā)生了抖動,多次觸發(fā)響應(yīng)程序。按鍵在長期使用后,質(zhì)量會變差,出現(xiàn)接觸不良的情況,更容易出現(xiàn)抖動現(xiàn)象;很多單片機電路也沒有集成消抖電路,所以一般情況下,編寫按鍵響應(yīng)程序時都要添加消抖代碼,等待一段時間,等抖動消失后,再運行核心語句。拓展例按鍵消抖代碼constintbtn=2;intx=0;voidsetup(){pinMode(btn,INPUT);Serial.be

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論