




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、 單片機單片機C51語言程序設計語言程序設計 學習目的學習目的 了解單片機C語言; 掌握C51數(shù)據(jù)類型; 掌握 C51的運算符; 掌握C51流程控制語句; 掌握C51的數(shù)組; 掌握C51的指針; 掌握C51的函數(shù)。單片機單片機C51語言程序設計語言程序設計 1.了解了解C51編程結構編程結構1.任務要求任務要求(1)掌握C51編程結構;(2)了解C51編程基本部分;(3)了解C51編程書寫格式;(4)掌握程序結構特點。2.任務描述任務描述 下面通過一個程序簡單來了解C51編程的結構和書寫格式。 任務實現(xiàn)任務實現(xiàn)-C51編程結構編程結構#include /*C語言的預編譯處理指令,包含51單片機
2、寄存器定義的頭文件*/void main(void) /*主函數(shù),第一個void表示無需返回值,第二個void表示沒有參數(shù)傳遞*/ /每個函數(shù)必須以花括號開始“” P2=0 x00; /P2=0000 0000B,即賦值語句 /*每個函數(shù)必須以花括號開始“”結束,而且花括號必須成對*/說明:以下有4點 程序結構特點程序結構特點 (1)“文件包含”處理 程序的第一行是一個“文件包含”處理,其含義是指一個文件內容將被另外一個文件全部包含了。由于單片機不認識端口“P1 ”,要想使單片機認識“P1”,就必須給“P1”作一個定義。這種定義已經(jīng)由KeilC51完成,無須用戶再定義,但是編程時必須將這種定義
3、“包含”進去,才能使單片機認識“P1”等各種寄存器的名字。注意: #include 預處理指令是以#號開頭的代碼行。#號必須是該行第一個字符,#后是指令關鍵字。在關鍵字和#號之間允許存在任意空白字符(也可以沒有)。整行語句構成了一條預處理指令,該指令將在編譯器進行編譯之前對源代碼進行轉換(keil進行轉換,無需人工操作)。(2)主函數(shù)main() main()函數(shù)被稱為主函數(shù),每一個C語言程序必須有且只能有一個主函數(shù)一個主函數(shù),函數(shù)后面一定要有一對花括號“ ”,程序寫在花括號里面的。 “”花括號必須成對出現(xiàn),位置不限,可跟函數(shù)名后,也可另起一行,多個花括號可以同行書寫,也可逐行書寫,為層次分明
4、,增加可讀性,同一層的“”花括號對齊,采用逐層縮進方式書寫。 (3)語句結束標志 C語言程序一行可以書寫多條語句,但每個語句必須以“;”結尾,一個語句也可以多行書寫。 (4)注釋 C語言程序設計中的注釋只是為了提高程序的可讀性,在編譯時,注釋內容不會被執(zhí)行。C語言的注釋有兩種: 一種是采用/*/表示; 另一種采用“/”表示。 二者的區(qū)別是二者的區(qū)別是:前一種可以注釋多行內容,后一種只能注釋一行內容。 2.相關知識相關知識1.C51程序開發(fā)概述程序開發(fā)概述 單片機的C語言采用C51編譯器(簡稱C51)。由C51產(chǎn)生的目標代碼短、運行速度高、所需存儲空間小、符合C語言的ANSI標準,生成的代碼遵循
5、Intel目標文件格式,而且可與A51匯編語言目標代碼混和使用。C51的優(yōu)點: 采用C51進行程序設計,編譯器能自動完成變量的存儲單元的分配。2.C51程序結構程序結構 與普通的C語言程序類似,C51程序是由若干模塊化的函數(shù)構成。主程序( main() )可以根據(jù)需要用來調用函數(shù)。當函數(shù)執(zhí)行完畢時,就發(fā)出返回(return)指令,而主程序main()后面的指令來恢復主程序流的執(zhí)行。同一個函數(shù)可以在不同的地方被調用,并且函數(shù)可以重復使用。C語言程序的擴展名為“.c”,如“XM4-1.c”。 一個一個C程序的執(zhí)行總是從程序的執(zhí)行總是從main( )函數(shù)開始函數(shù)開始,調用其他函調用其他函數(shù)后返回到數(shù)
6、后返回到main( )中,最后在主函數(shù)中,最后在主函數(shù)main( )中結束整個中結束整個C程程序的運行。序的運行。 3.標識符與關鍵字標識符與關鍵字 (1)標識符 C語言規(guī)定:語言規(guī)定: 標識符只能是字母(AZ,a z)、下劃線“”和數(shù)字(0 9)組成的字符串,并要求首字符是字母或下劃線,不能是數(shù)字。例如,可以使用x、y作為變量的標識符,使用delay()作為函數(shù)的標識符。 字母的大小寫是有區(qū)別的,如max和MAX是兩個完全不同的標識符。(2)關鍵字:關鍵字是一種已被系統(tǒng)使用過的具有特定含義的標識符。用戶不得再用關鍵字給變量等命名用戶不得再用關鍵字給變量等命名。C語言關鍵字分為如下三類: 類型
7、說明符:用來定義變量、函數(shù)或其他數(shù)據(jù)結構的類型,如unsigned char、int 、long等。 語句定義符:用來標識一個語句功能,如條件判斷語句“if”、“while”等。 預處理命令字:表示預處理命令的關鍵字,如程序開頭的“include”。 由ANSI C標準定義了32個關鍵字,如表3-1所示。表3-1 ANSI C語言的關鍵字 另外51單片機還擴展了相應的關鍵字。表3-2為Keil C51編譯器擴展的關鍵字。表3-2 Keil C51編譯器擴展關鍵字例如:sfr P1=0 x90;/*定義地址為“0 x90”的特殊功能寄存器名字為“P1”,對P1的操作也就是對地址為0 x90的寄存
8、器操作*/。(格式:sfr特殊功能寄存器名=地址常數(shù))sbit S=P20;/位定義S為P2.0(P2口的第0位)。(格式:sbit 位變量名=特殊功能寄存器名位位置)。 3.認識認識 C51的數(shù)據(jù)類型的數(shù)據(jù)類型學習目的學習目的 (1)掌握C語言的數(shù)據(jù)類型; (2)掌握C51數(shù)據(jù)的存儲類型; (3)掌握80C51硬件結構的C51定義。學習重點和難點學習重點和難點 (1)掌握C語言的數(shù)據(jù)類型; (2)掌握C51數(shù)據(jù)的存儲類型; (3)掌握80C51硬件結構的C51定義。 3.1.用不同數(shù)據(jù)類型控制用不同數(shù)據(jù)類型控制P2口的口的8位位LED閃爍閃爍1.任務要求任務要求(1)了解字符型數(shù)據(jù)類型應用;
9、(2)了解整型數(shù)據(jù)類型應用;(3)掌握延時程序編寫。2.任務描述任務描述 用不同數(shù)據(jù)類型控制P2口的8位LED閃爍。使用無符號字符型數(shù)據(jù)和無符號整型數(shù)據(jù)來設計兩個不同的延時時間,來控制LED0LED3和LED4LED7閃爍,可以看出兩組燈閃爍時間是不一樣的。3.任務實現(xiàn)任務實現(xiàn) (1)程序設計 先建立文件夾“XM10-1”,然后建立“XM10-1”工程項目,最后建立源程序文件“XM10-1.c”,輸入如下源程序:#include /包含單片機寄存器的頭文件/*函數(shù)功能:用字符型數(shù)據(jù)字符型數(shù)據(jù)延時一段短短時間*/void delay60(void) unsigned char i,j; /*定義
10、無符號字符型數(shù)據(jù)*/ for(i=0;i200;i+) for(j=0;j100;j+) ; /什么也不做,等待一個機器周期/*函數(shù)功能:用整型數(shù)據(jù)整型數(shù)據(jù)延時一段長時間*/void delay150(void) /*兩個void意思分別為無需返回值,沒有參數(shù)傳遞*/ unsigned int i; /*定義無符號整型數(shù)據(jù)整型數(shù)據(jù),最大取值范圍65535*/ for(i=0;i50000;i+) /做50000次空循環(huán) ; /什么也不做,等待一個機器周期/*數(shù)功能:主函數(shù) (C語言規(guī)定必須有1個主函數(shù))*/void main(void) while(1) /無限循環(huán) P2=0 xf0; /P2
11、=1111 0000B,LED0LED3燈亮 delay60(); /延時一段短時間 P2=0 xff; /P2=1111 1111B, LED0LED3燈滅 delay60(); /延時一段短時間 P2=0 x0f; /P2=0000 1111B,LED4LED7燈亮 delay150(); /延時一段長時間 P2=0 xff; /P2=1111 1111B, LED0LED3燈滅 delay150(); /延時一段長時間 3.2相關知識相關知識1.數(shù)據(jù)類型數(shù)據(jù)類型 數(shù)據(jù)的不同格式叫數(shù)據(jù)類型。C語言中常用的數(shù)據(jù)類型有整型、字符整型、字符型、實型、指針型、空類型型、實型、指針型、空類型。 根據(jù)
12、變量在程序執(zhí)行中是否發(fā)生變化,還可將數(shù)據(jù)類型分為常量和變量兩種。1)常量與變量 在程序運行過程中,其值不能被改變的量稱為常量常量。常量區(qū)分為不同的類型,如10,0,-4為整型常量,2.6、-3.15為實型常量,a,d為字符常量。 在程序執(zhí)行中,其值可以改變的量稱為變量變量,變量標識符常用小寫字小寫字母母來表示,變量必須先定義后使用,一般放在程序開頭部分。 2)整型數(shù)據(jù) 整型數(shù)據(jù)包括整型常量和整型變量。 (1)整型常量)整型常量 整型常量就是整型常數(shù)。在C語言中,整型常量可用以下三種形式表示:十進制整數(shù)。用09表示,如321, -106等。 八進制整數(shù)。以0開頭的數(shù)是八進制數(shù),用07表示。如02
13、15表示八進制數(shù)215,即等于十進制數(shù)141。 十六進制整數(shù)。以0 x開頭的數(shù)是十六進制數(shù),用09和AF表示。如0 xFF,代表十六進制數(shù)FF,等于十進制數(shù)255。 (2)整型變量整型變量 整型變量可分為基本型和無符號型,基本型類型說明符為int,在內存中占2個字節(jié);無符號型類型說明符為unsigned,同樣在內存中占2個字節(jié)。 KeilC51軟件編譯器支持的數(shù)據(jù)類型如表3-3所示。表3-3 C51的數(shù)據(jù)類型C規(guī)定 在程序中所使用的變量都必須在程序中定義,整型變量定義形式整型變量定義形式: 類型說明符類型說明符 變量標識符變量標識符1,變量標識符,變量標識符2,例如: int a,b;/指定變
14、量a、b為整型,各變量名之間用逗號相隔 unsigned short c,d;/ 指定變量c、d為無符號短整型 long e,f; / 指定變量e、f為長整型(3)實型數(shù)據(jù)實型數(shù)據(jù)有兩種表示形式:(本書沒有用到,不介紹本書沒有用到,不介紹)(4)字符型數(shù)據(jù) 字符型數(shù)據(jù)包括字符型常量和字符型變量字符型常量和字符型變量。 字符型常量 字符常量是用單引號括起來的一個字符。如a,x,d,?,等都是字符常量。字符型常量常用作顯示說明。 字符型變量字符型變量 字符型變量用來存放字符常量,只能放一個字符,其說明符是“char”,長度是1個字節(jié),定義形式為: charx,y;/*它表示x和y為字符型變量,在內
15、存中各占一個字節(jié)*/ unsigned char 與signed char型數(shù)據(jù)的區(qū)別是有無符號位, unsigned無符號位的數(shù)值范圍是0255; signed 有符號位的數(shù)值范圍是-128127。 字符串常量字符串常量 字符串常量是一對雙引號雙引號括起來的字符序列。例如: “Welcome to China.”;/ 是字符串常量 a;/是字符常量 (5)指針型數(shù)據(jù))指針型數(shù)據(jù) 有時在程序中圍繞變量的地址展開操作,這就引入“指針”的概念。變量的地址稱為變量的指針,指針即是地址。指針即是地址。(6)位類型數(shù)據(jù) 位類型數(shù)據(jù)是C51編譯器的一種擴充數(shù)據(jù)類型,利用它可以定義一個位變量,但不能定義位指
16、針,也不能定義位數(shù)組。該類型數(shù)據(jù)取值為“0”或“1” (7)空類型數(shù)據(jù) C語言經(jīng)常使用函數(shù),當函數(shù)被調用完后,無需返回一個函數(shù)值,這個函數(shù)值稱為空類型數(shù)據(jù),例如:/*函數(shù)功能:用整型型數(shù)據(jù)延時一段長時間*/void delay( ) /*用“void”說明該函數(shù)為“空類型”即無返回值, void的字面意思是“無類型” */ unsigned int i; /*定義無符號整數(shù),最大取值范圍65535*/ for(i=0;i50000;i+) /做50000次空循環(huán) ; /什么也不做,等待一個機器周期 (8)變量賦值 程序中常需要對一些變量預先賦值。C語言允許在定義變量的同時給變量賦值。如:int
17、 a=3; /* 指定a為整型變量,值為3*/float f=3.56;/* 指定f為實型變量,值為3.56 */char c=a; /* 指定c為字符變量,值為a */ 也可以使被定義的變量的一部分賦值。如: int a,b,c=5;表示指定a、b、c為整型變量,只對c賦值,c的值為5。2.C51數(shù)據(jù)的存儲類型數(shù)據(jù)的存儲類型 C51是面向80C51系列單片機的程序設計語言,應用程序中使用的任何數(shù)據(jù)(變量和常數(shù))必須以一定的存儲類型定位于單片機相應的存儲區(qū)域中。C51編譯器支持的存儲類型如表3-4所示。表3-4 C51的存儲類型與8051存儲空間的對應關系 對于80C51系列單片機來說,訪問片
18、內的RAM比訪問片外的RAM的速度要快得多,所以對于經(jīng)常使用的變量應該置于片內RAM,即用bdata、data、idata來定義;對于不常使用的變量或規(guī)模較大的變量應該置于片外RAM中,即用pdata、xdata來定義。例如:(1)bit bdata my_flag; /*位變量my_flag被定義為bdata存儲類型,C51編譯器將把該變量定義在80C51片內數(shù)據(jù)存儲區(qū)(RAM)中的位尋址區(qū)(地址:20H2FH) */(2) char data var0; /*字符變量var0被定義為data存儲類型,C51編譯器將把該變量定位在80C51片內數(shù)據(jù)存儲區(qū)中。(3) float idata x
19、,y,z; /*浮點變量x、y、z被定義為idata存儲類型,C51編譯器將把該變量定位在80C51片內數(shù)據(jù)區(qū),并只能用間接尋址的方式進行訪問*/(4) unsigned int pdata temp ; /*無符號整型變量temp被定義為pdata存儲類型,C51譯器將把該變量定位在80C51片外數(shù)據(jù)存儲區(qū)(片外RAM) */(5) unsigned char xdata array34; /*無符號字符二維數(shù)組 unsigned char array34被定義為xdata存儲類型,C51編譯器將其定位在片外數(shù)據(jù)存儲區(qū)(片外RAM),并占據(jù)3x4=12字節(jié)存儲空間,用于存放該數(shù)組變量*/ 如
20、果用戶不對變量的存儲類型進行定義,C51的編譯器采用默認的存儲類型。默認的存儲類型由編譯命令中存儲模式指令限制。C51支持的存儲模式如表3-5所示。 表3-5 C51存儲模式例如:char var ; /*在 small模式中,var定位data存儲區(qū)*/ /*在 compact模式中,var定位pdata存儲區(qū)*/ /*在 large模式中,var定位xdata存儲區(qū)*/ 在keil C51uVision 4平臺下,設置存儲模式的界面如圖3-3所示。3.4.80C51硬件結構的硬件結構的C51定義定義 C51是適合于80C51單片機的C語言。它對標準C語言進行擴展,從而具有對80C51單片機
21、硬件結構的良好支持與操作能力。 特殊功能寄存器的定義 80C51單片機內部RAM的80HFFH區(qū)域有21個特殊功能寄存器,為了對它們能夠直接訪問,C51編譯器利用擴充的關鍵字SFR和SFR16對這些特殊功能寄存器進行定義。SFR的定義方法: sfr 特殊功能寄存器名特殊功能寄存器名=地址常數(shù)地址常數(shù) 例如:sfr P0= 0 x80; /* 定義P0口,地址為0 x80*/ 4.認識認識 C51的運算符的運算符學習目的學習目的 (1)掌握算術運算符、關系表達式及優(yōu)先級; (2)掌握關系運算符、關系表達式及優(yōu)先級; (3)掌握邏輯運算符和邏輯表達式及優(yōu)先級; (4)掌握C51位操作及其表達式。
22、4.1分別用分別用P2、P3口顯示口顯示“加減加減”運算結果運算結果1.任務要求任務要求(1)了解“加” 、“減”運算及編程;(2)掌握十進制數(shù)、十六進制數(shù)、二進制數(shù)轉換;(3)掌握無符號字符型定義。2.任務描述任務描述 分別用P2、P3口顯示“加減”運算結果。把兩個數(shù)進行“加減”運算,即設“52+48”和“52-48”,把“加”運算運算結果送P2口顯示出來,把“減”運算結果送P3口顯示出來。3.任務實現(xiàn)任務實現(xiàn) (1)分析 設置兩個無符號字符型變量a和b,分別賦值十進制數(shù)52和48,然后進行a+b和a-b運算,并把運算結果分別送P2、P3口顯示。 (2)程序設計 先建立文件夾“XM11-1”
23、,然后建立“XM11-1”工程項目,最后建立源程序文件“XM11-1.c”,輸入如下源程序:#include /包含單片機寄存器的頭文件void main(void) unsigned char a,b; /定義無符號字符型,最大值255 a=52; /a賦值為52 b=48; /b賦值為48 P2=a+b; /*P2=52+48=100=64H=01100100B,結果為P2.7、P2.4、P2.3、P2.1、P2.0接的LED燈亮*/ P3=a-b; /P3=52-48=4=00000100B,結果為P3.7、P3.6、P3.5、P3.4、P3.3、P3.1、P3.0接的LED燈亮 Whi
24、le(1)/無限循環(huán) ; /空操作(3)用Proteus軟件仿真 效果圖如圖3-4所示。 4.2.用用P1口顯示邏輯口顯示邏輯“與或與或”運算結果運算結果1.任務要求任務要求(1)掌握“與”、“或”運算及編程;(2)掌握延時程序編程。 2.任務描述任務描述 用P1口顯示邏輯“與或”運算結果。把“(60 x0f)&(80 xa)”和“(60 x0f)|(80 xa)” 運算結果送P1口循環(huán)顯示出來。3.任務實現(xiàn)任務實現(xiàn) (1)分析 把“(60 x0f)&(80 xa)”進行“與”運算,即“(60 x0f)&(80 xa)”=0&1=0(60 x0f 為假即0, 80 xa 為真即1),結果送P1
25、口使得8只LED全亮,然后調延時;再把“(60 x0f)|(80 xa)”進行“或”運算,即“(60 x0f)|(80 xa)+0 xfe” =0|1+0 xfe=1+0 xfe=0 xff,結果送P1口使得8只LED全滅,然后調延時。(2)程序設計輸入如下源程序:#include /包含單片機寄存器的頭文件void delay(void) unsigned int i; for(i=0;i50000;i+) ; void main(void) while(1) /無限循環(huán) P1=(60 x0f)&(80 xa); /*運算結果送 P1=0000 0000B,LED0LED7燈亮*/ dela
26、y(); /延時 P1=(60 x0f)|(80 xa) +(0 xfe); /*運算結果送 P1=1111 1111B,LED0LED7燈滅*/ delay(); /延時 (3)用Proteus軟件仿真 經(jīng)過Keil軟件編譯通過后,在ProteusISIS編輯環(huán)境中繪制仿真電路圖,將編譯好的“XM11-2.hex”文件加載到AT89C51里,然后啟動仿真,就可以看到用P1口顯示邏輯“與或”運算結果,效果圖如圖3-5所示。圖3-5用P1口顯示邏輯“與或”運算結果 4.3.分別用分別用P2、P3口顯示位口顯示位“與或與或”運算結果運算結果1.任務要求任務要求(1)掌握位位“與”、位位“或”運算及
27、編程;(2)掌握十六進制數(shù)、二進制數(shù)轉換。 2.任務描述任務描述 分別用P2、P3口顯示位“與或”運算結果。把兩個數(shù)十六進制數(shù)進行位“與或”運算,即設“0 x52&0 x48”和“0 x52|0 x48”,把位“與”運算結果送P2口顯示出來,把位“或”運算結果送P3口顯示出來。3.任務實現(xiàn)任務實現(xiàn)(1)分析:設兩個十六進制數(shù)進行位“與”運算即“0 x52&0 x48=01010010&01001000=01000000”,把運算結果送P2口顯示出來,把數(shù)“0 x52|0 x48=01010010&01001000=01011010”運算結果送P3口顯示出來。(2)程序設計先建立文件夾“XM11
28、-3”,然后建立“XM11-3”工程項目,最后建立源程序文件“XM11-3.c”,輸入如下源程序:#include /包含單片機寄存器的頭文件void main(void) P2=0 x52&0 x48;/*P2=01010010&01001000=01000000B,結果為P2.7、P2.5、P2.4、P2.3、P2.2、P2.1、P2.0接的LED燈亮*/ P3=0 x52|0 x48;/*P3=01010010&01001000=01011010B,結果為P3.7、P3.5、P3.2、P3.0、接的LED燈亮*/While(1); /無限循環(huán) ; /空操作 4.4用用P1口顯示口顯示“左
29、右移左右移”運算結果運算結果1.任務要求任務要求(1)掌握“右移”、“左移”運算及編程;(2)掌握二進制數(shù)移位;(3)掌握無限循環(huán)編程。 2.任務描述任務描述 用P1口顯示“左右移”運算結果。把數(shù)“0 xaa”進行“”左移1位運算,即“0 xaa1”,把運算結果送P1口顯示出來,調延時,再把P1左移1位運算送顯示;然后再把剛剛左移2位的數(shù)進行右移2位運算,分別把運算結果送P1口顯示出來。3.任務實現(xiàn)任務實現(xiàn)(1)分析 設一個十六進制數(shù)“0 xaa”,即10101010B,進行左移1位運算。 “10101010B01010100”,規(guī)則為高位丟掉,低位添0,把運算結果送P1口顯示,再進行左移1位
30、運算“0101010010101000”,把運算結果送P1口顯示即LED6、LED4、LED2、LED1、LED0亮,其他LED7、LED5、LED3滅。然后再把這個數(shù)據(jù)進行右移2位運算,即“101010000101010000101010”,再把運算結果送P1口顯示即LED7、LED6、LED4、LED2、LED0亮,其他LED5、LED3、LED1滅。(2)程序設計 先建立文件夾“XM11-4”,然后建立“XM11-4”工程項目,最后建立源程序文件“XM11-4.c”,輸入如下源程序:#include /包含單片機寄存器的頭文件void delay(void) /*兩個void意思分別為無
31、需返回值,沒有參數(shù)傳遞*/ unsigned int i; /定義無符號整數(shù),最大取值范圍65535 for(i=0;i50000;i+) /做50000次空循環(huán) ; /什么也不做,等待一個機器周期void main(void) while(1) /無限循環(huán) P1=0 xaa1; /*運算結果送P1=01010100B,LED7、LED5、LED3、LED1、LED0亮,其他LED6、LED4、LED2滅*/ delay(); /延時 P1= P11; /*結果送P1=01010100B,再把運算結果送P1口顯示即LED7、LED5、LED3、LED1、LED0亮,其他LED6、LED4、LE
32、D2滅*/ delay(); /延時 P1= P11; /*結果送P1=00101010B,再把運算結果送P1口顯示即LED7、LED6、LED4、LED2、LED0亮,其他LED5、LED3、LED1滅*/ delay(); /延時 4.5相關知識相關知識 1.算術運算符、關系表達式及優(yōu)先級算術運算符、關系表達式及優(yōu)先級(1)算術運算符 運算符運算符 意義意義實例(設實例(設x=11,y=3)加法運算符加法運算符z=x+y;/z=14減法運算符減法運算符z=x-y;/z=8*乘法運算符乘法運算符z=x*y;/z=33除法運算符除法運算符z=xy;/z=3%模(求余)運算符模(求余)運算符z=
33、x%y;/z=2優(yōu)先級:算術運算符中取負運算的優(yōu)先級最高,其次是乘法、除法和取余,加法和減法的優(yōu)先級最低。也可以采用括號來改變優(yōu)先級的順序。例如: a+b/c; 該表達式中,除號優(yōu)先級高于加號,故先運算b/c所得結果,之后再與a相加。(a+b)*(c-d)-e; 該表達式中,括號優(yōu)先級最高,其次是“*”,最后是減號。故先運算(a+b)和(c-d),然后再將二者結果相乘,最后與e相減。 運算符運算符 意義意義實例(設實例(設x=3)x +先用先用x的值,再讓的值,再讓x加加1y=x +;/y=3,x=4+x先讓先讓x加加1,再用,再用x的值的值y=+x;/y=4,x=4x-先用先用x的值,再讓的
34、值,再讓x減減1y=x-;/y=3,x=2-x先讓先讓x減減1,再用,再用x的值的值y=-x;/y=2,x=2(2)自增減運算符自增減運算符的作用是使變量值自動加1或減1。2.關系運算符、關系表達式及優(yōu)先級關系運算符、關系表達式及優(yōu)先級(1)C51提供六種關系運算符運算符運算符意義意義實例(設實例(設a=2,b=3)小于ab;/返回值1大于ab;/返回值0= 小于等于a=b;/返回值1= 大于等于a=b;/返回值0= 等于a=b;/返回值0!=不等于a!=b;/返回值1(2)關系運算符的優(yōu)先級、=的優(yōu)先級相同,兩種=、!=相同;前4種優(yōu)先級高于后兩種。關系運算符的優(yōu)先級低于算術運算符。關系運算
35、符的優(yōu)先級高于賦值運算符。例如: ca+b 等效于 c(a+b); ab!=c 等效于(ab)!=c a=bc 等效于a=(bc)(3)關系運算符的結合性為左結合例如: a=4,b=3,c=1 ,則 f=abc,則ab的值為1,1c的值為0,故f=0。3.邏輯運算符和邏輯表達式及優(yōu)先級邏輯運算符和邏輯表達式及優(yōu)先級(1)C51提供3種邏輯運算符運算符運算符意義意義實例(設實例(設a=2,b=3)& 邏輯 “與”a&b;/返回值1|邏輯“或”a|b;/返回值1!邏輯“非”!a;/返回值0(2)邏輯運算符的優(yōu)先級 在邏輯運算中,邏輯非的優(yōu)先級最高,且高于算術運算符;邏輯或的優(yōu)先級最低,低于關系運算
36、符,但高于賦值運算符。4.C51位操作及其表達式位操作及其表達式C51提供提供6種位運算符:種位運算符: & 位與; | 位或; 位異或; 位取反; 右移; 除按位取反運算符“”以外,以上位操作運算符都是雙目運算符,及要求運算符兩側各有一個運算對象。(1)“按位與”運算符“&” 運算規(guī)則運算規(guī)則:參與運算的兩個運算對象,若兩者相應的位都為1,則該位結果為1,否則為0,即:0&0=0、 0&1=0、 1&0=0、 1&1=1 例如:a=45h=0100 0101b,b=0deh=1101 1110b,則表達式c=a&b=44h 主要用途:清零。用0去和需要清零的位按位與運算。取指定位。(2)“按
37、位或”運算符“|” 運算規(guī)則:參與運算的兩個運算對象,若兩者相應的位中有一位為1,則該位結果為1,否則為0,即: 0|0=0、 0|1=1、 1|0=1、 1|1=1例如:a=30h=00110000b,b=0fh=00001111b,則表達式c=a|b=3fh 主要用途是將一個數(shù)的某些位置1,則需要將這些位和1按位或,其余的位和0進行按位或運算則不變。(3)“異或”運算符“” 運算規(guī)則:參與運算的兩個運算對象,若兩者相應的位相同,則結果為0;若兩則相應的位相異,結果為1,即: 00=0、 01=1、 10=1、 11=0 例如:a=0a5h,b=3dh, 則表達式c=ab=98h 主要用途:
38、 特定位翻轉。 不用臨時變量交換兩數(shù)的至。(4)“位取反”運算符“” “”是一個單目運算符,用來對一個二進制數(shù)按位取反,即0變1,1變0。(5)位左移和位右移運算符“” 位左移、位右移運算符“”,用來將一個二進制位的全部左移或右移若干位;移位后,空白位補0,而溢出的位舍棄。 例如: a=15h, 則 a=a2=05h(6) 賦值和復合賦值運算符 符號稱為賦值運算符,其作用是將一個數(shù)據(jù)的值賦予一個變量。賦值表達式的值 就是被賦值變量的值。 在賦值運算符的前面加上其他運算符就可以構成復合賦值運算符。在C51中共有10種 復合運算符,這10種賦值運算符均為雙目運算符。即:+=, -=, *=, /=
39、, %=, =, &=, |=, =, =。采用這種復合賦值運算的目的,是為了簡化程序,提高C程序編譯效率。如:a+=b相當于a=a+b a%=b相當于a=a%b(7)其他運算符(共有其他運算符(共有7個)個) :數(shù)組的下標。 ( ):括號。 . :結構/聯(lián)合變量指針成員。& :取內容。 ? : 三目運算符。,:逗號運算符。Sizeof: sizeof運算符用于在程序中測試某一數(shù)據(jù)類型占用多少字節(jié)。小結:小結: (1)算術運算符、關系表達式及優(yōu)先級; (2)關系運算符、關系表達式及優(yōu)先級; (3)邏輯運算符和邏輯表達式及優(yōu)先級; (4)C51位操作及其表達式。 5.認識認識C51流程控制語句流
40、程控制語句學習目的學習目的(1)掌握C51的順序結構; (2)掌握C51的選擇結構;(3)掌握C51的循環(huán)結構。學習重點和難點學習重點和難點(1)掌握)掌握“if”語句功能及編程;語句功能及編程;(2)掌握)掌握“switch”語句功能及編程;語句功能及編程;(3)掌握)掌握“while”語句功能及編程。語句功能及編程。 5.1任務描述任務描述 用按鍵S控制P1口8只LED顯示狀態(tài)。P3.0接一個按鍵S,P1口接8只LED。設計一個程序實現(xiàn)以下功能:S按下第1次,LED1發(fā)光;S按下第2次,LED1、LED2發(fā)光;S按下第3次,LED1、LED2、LED3發(fā)光 S按下第 8次,LED1LED8
41、都發(fā)光;S按下第9次,LED1發(fā)光;S按下第10次,LED1、LED2發(fā)光依次循環(huán)。 3.任務實現(xiàn)任務實現(xiàn)(1)分析:先設置一個變量i,當i=1時,LED1發(fā)光;當i=2時,LED1、LED2發(fā)光;當i=3時,LED1、LED2、LED3發(fā)光;當i=8時,LED1LED8都發(fā)光。由“switch”語句根據(jù)i的值來實現(xiàn)LED發(fā)光。i值的改變可以通過按鍵S來控制,每按下S按鍵一次,i自增1,當增加到9時,將其值重新置為1。(2)程序設計 先建立文件夾“XM12-1”,然后建立“XM12-1”工程項目,最后建立源程序文件“XM12-1.c”,輸入如下源程序:#include /頭文件sbit S=P
42、30; /定義按鍵S接入P3.0引腳/*函數(shù)功能:延時約150ms*/void delay(void) unsigned char i,j; for(i=0;i200;i+) for(j=0;j250;j+) ;void main(void) unsigned char i ; i=0 ; /i初始化 while(1) /無限循環(huán) if(S=0) /判斷S按鍵是否被按下,如果S=0被按下 delay(); /150ms延時,消除鍵盤抖動 if(S=0) /*再判斷S按鍵是否被按下,如果S=0確被按下*/ i+; /i自增1 if(i=9) /如果i=9,將其值重新置為1 i=1 ; switc
43、h(i)/使用多分支語句 case 1:P1=0 xfe; /LED1發(fā)光 break; /退出switch語句 case 2:P1=0 xfc; / LED1、LED2發(fā)光 break; /退出switch語句 case 3:P1=0 xf8; break; /退出switch語句 case 4:P1=0 xf0; break; /退出switch語句 case 5:P1=0 xe0; break; /退出switch語句 case 6:P1=0 xc0; break; /退出switch語句 case 7:P1=0 x80; break; /退出switch語句 case 8:P1=0 x
44、00; break; /退出switch語句/ LED1LED8發(fā)光 defauit: /默認值,關閉所有LED P1=0 xff; 5.3.用用for語句實現(xiàn)蜂鳴器發(fā)出語句實現(xiàn)蜂鳴器發(fā)出1KHz音頻音頻1.任務要求任務要求(1)掌握“for”語句功能及編程;(2)掌握延時時間的估算方法;(3)掌握“while”語句功能及編程。 2.任務描述任務描述 設計一個用for語句實現(xiàn)蜂鳴器發(fā)出1KHz音頻的程序。要求為:(1)發(fā)出頻率為1KHz音頻;(2)蜂鳴器接到P1.0引腳上。3.任務實現(xiàn)任務實現(xiàn)(1)分析 設單片機晶振頻率為12MHz,則機器周期為1s。只要讓單片機的P1.0引腳的電平信號每隔音
45、頻的半個周期取反一次即可發(fā)出1KHz音頻。音頻的周期為T=1/1000Hz=0.001s,即1000s,半個周期為1000s/2=500s,即在P1.0引腳上每500s取反一次即可發(fā)出1KHz音頻。而延時500s需要消耗機器周期數(shù)N=500s /3=167,即延時每循環(huán)167次,就可讓P1.0引腳上取反一次就可以得到1KHz音頻。(2)程序設計如下源程序:#include/包含單片機寄存器的頭文件sbit sound=P10; /將 sound 位定義為 PI. 0 引腳/*函數(shù)功能:延時以形成約lKHz音頻*/void delay1000Hz(void)unsigned char i; fo
46、r(i=0;i167;i+);/*函數(shù)功能:主函數(shù) */void main(void)while(1) /無限循環(huán) sound =0; /P1. 0引腳輸出低電平 delay1000Hz;/延時以形成半個周期 sound =1; /PI. 0引腳輸出髙電平 delay1000Hz(); /延時以形成約周期lKHz音頻 小結:小結:消耗機器周期數(shù)的計算(近似值):(1)一重循環(huán) for(i=0;in;i+) / n必須為無符號字符型數(shù)據(jù) ; 消耗機器周期數(shù)為: N=3n 式中:N為消耗機器周期數(shù);n為需要設置的循環(huán)次數(shù)(n必須為無符號字符型數(shù)據(jù))。(2)二重循環(huán) for(i=0;in;i+) /
47、 n必須為無符號字符型數(shù)據(jù) for(i=0;im;i+) / m必須為無符號字符型數(shù)據(jù) ; 消耗機器周期數(shù)為: N=3nm 5.4.用用while語句實現(xiàn)語句實現(xiàn)P1口口8只只LED顯示狀態(tài)顯示狀態(tài)1.任務要求任務要求(1)掌握“while”語句功能及編程;(2)掌握延時程序編寫。 2.任務描述任務描述 設計一個用while語句實現(xiàn)P1口8只LED顯示狀態(tài)的程序。要求為: (1)P1口接8只發(fā)光二極管,低電平點亮;(2)點亮發(fā)光二極管間隔為150ms;(3)顯示99種狀態(tài)。3.任務實現(xiàn)任務實現(xiàn) (1)分析 設計一個用while語句實現(xiàn)P1口8只LED顯示狀態(tài)的程序,根據(jù)要求在while語句循環(huán)
48、中設置一個變量i,當i小于0 x64(十進制數(shù)100)時,將i的值送P1口顯示,并i自增1,當i等于0 x64時,就跳出while循環(huán)。 (2)程序設計 如下源程序:#include /包含單片機寄存器的頭文件/*函數(shù)功能:延時約150ms */void delay(void)unsigned char i, j;for (i=0;i200;i+) for(j=0;j250;j+); /*函數(shù)功能:主函數(shù)*/ void main(void)unsigned char i; while(1) /無限循環(huán)i=0; /將i置為0,即初始化 while(i0 x64) /i小于100時執(zhí)行循環(huán)體P1=
49、i; /將i值送P1 口顯示 Delay(); /調延時 i+; /i 自增 1 5.5用用dowhile 語句實現(xiàn)語句實現(xiàn)P1口口8只只LED顯示狀態(tài)顯示狀態(tài)1.任務要求任務要求 (1)掌握“dowhile”語句功能及編程;(2)掌握延時時間的估算方法; ( 3)掌握延時程序編寫。 2.任務描述任務描述 設計一個用dowhile語句實現(xiàn)P1口8只LED顯示狀態(tài)的程序。要求為:(1)P1口接8只發(fā)光二極管,低電平點亮;(2)點亮發(fā)光二極管間隔為150ms;(3)點亮次序為,LED1發(fā)光; LED1、LED2發(fā)光; LED1、LED2、LED3發(fā)光LED1LED8都發(fā)光; LED1發(fā)光; LED
50、1、LED2發(fā)光依次循環(huán)。3.任務實現(xiàn)任務實現(xiàn)(1)分析 只要在循環(huán)體中按照點亮次序依次點亮,再將循環(huán)條件設置為死循環(huán)即可。點亮LED的控制碼:LED1發(fā)光控制碼為0 xfe;LED1、LED2發(fā)光控制碼為0 xfc; LED1、LED2、LED3發(fā)光控制碼為0 xf8LED1LED8都發(fā)光的控制碼為0 x00; LED1發(fā)光的控制碼為0 xfe;LED1、LED2發(fā)光的控制碼為0 xfc依次循環(huán)。(2)程序設計如下:#include/包含單片機寄存器的頭文件void delay (void) /此程序延時約150msunsigned char i,j; for(i=0;i200;i+) fo
51、r(j=0;jy) max=x; else max=y; 例如:if (salary1000) index=0.4;else if (salary800)index=0. 3;else if (salary600) index=0. 2; else if (salary400)index=0. 1;elseindex=0;說明:if語句的嵌套,在if語句中又含一個或多個if語句,這種情況稱為if語句的嵌套。(2)開關語句 if語句比較適合于從兩者之間選擇。當要實現(xiàn)從多種選一時,采用switchcase多分支開關語句,可使程序變得更為簡潔。一般形式:Switch (表達式) Case 常量表達式
52、1:語句1; break; /*如果常量表達式1滿足,則執(zhí)行語句1,使用break跳出switch結構*/ Case 常量表達式2:語句2; break; /同上 : Case 常量表達式n:語句n; break; /同上 default:語句n+1; /*條件都不滿足時,執(zhí)行語句n +1*/ 注意:注意:對于Switch語句,需要注意兩點:一是常量表達式的值必須是整型或字符型;二是最好使用“break”。 4.C51的循環(huán)結構的循環(huán)結構 循環(huán)結構是結構化程序設計的3種基本結構之一,因此掌握循環(huán)結構的概念是程序設計,尤其是C程序設計最基本的要求。 在C51語言中,實現(xiàn)循環(huán)的語句主要有3種。(1
53、)While語句的一般形式 While(表達式)(表達式) 語句;語句; /*循環(huán)體循環(huán)體*/ While語句的語義是:計算表達式的值,當值為真(非0)時,執(zhí)行循環(huán)體語句,否則,跳出循環(huán)體,執(zhí)行后續(xù)操作。使用while語句應注意以下幾點注意以下幾點: While語句中的表達式一般是關系表達式或邏輯表達式,只要表達式的值為真(非0)即可繼續(xù)循環(huán)。 循環(huán)體如包含一個以上的語句,則必須用“”括起來,組成復合語句。 While循環(huán)體中,應有讓循環(huán)最終能結束的語句,否則將造成死循環(huán)。 實例:用while求1到10的和,程序如下:void main(void) unsigned char i,sum ;
54、sum=0; i=1; while(i=10) sum=sum+i i+; P0=sum;/將結果送P0口顯示 (2)dowhile 語句的一般形式 do 語句語句; /*循環(huán)體循環(huán)體*/ while (表達式表達式); dowhile 語句的執(zhí)行過程如下:首先執(zhí)行循環(huán)體語句一次,再判斷表達式的值。如果表達式的值為真(非0值),則重復執(zhí)行循環(huán)體語句,直到表達式的值變?yōu)榧伲?值)時循環(huán)結束。 對于這種結構,在任何條件下,循環(huán)體語句至少會被執(zhí)行一次。注意:do是C語言關鍵字,必須和while聯(lián)合使用; while(表達式)后的分號“;”不能少,它表示整個循環(huán)語句的結束。實例:用dowhile求1到
55、10的和,程序如下: void main(void) unsigned char i,sum ; sum=0; i=1; do sum=sum+i ; /*注意 不能省,否則跳不出循環(huán)體*/ i+; while(i=10); /分號“;”不能少 P0=sum;/將結果送P0口顯示 (3)for 語句的一般形式 for (表達式1; 表達式2; 表達式3) 語句; /*循環(huán)體*/ for循環(huán)語句結構可使程序按指定的次數(shù)重復執(zhí)行一個語句或一組語句。 for循環(huán)語句的執(zhí)行過程如下: 首先計算表達式1(表達式1實際上是賦初值),然后計算表達式2,若表達式2為真,則執(zhí)行循環(huán)體;否則退出for循環(huán),執(zhí)行f
56、or后面的語句。如果執(zhí)行了循環(huán)體,每執(zhí)行循環(huán)體一次,都計算表達式3,然后再重新計算表達式2,以此類推,直至表達式2為假,退出循環(huán)。 實例:用for循環(huán)語句求1到10的和,程序如下:void main(void) unsigned char i,sum ; sum=0; for(i=1;i=10;i+) sum=sum+i ; P0=sum;/將結果送P0口顯示小結:小結:(1)C51的順序結構; (2)C51的選擇結構;(3)C51的循環(huán)結構。課后練習課后練習 22、23、24、25 6.認識認識C51的數(shù)組的數(shù)組學習目的學習目的(1)掌握一維、二維數(shù)組;(2)掌握字符數(shù)組。 6.1用數(shù)組實現(xiàn)
57、用數(shù)組實現(xiàn)P1口口8只只LED顯示狀態(tài)顯示狀態(tài)1.任務要求任務要求(1)掌握“for”語句功能及編程;(2)掌握無符號字符型數(shù)組功能及編程;(3)掌握“while”語句功能及編程。 2.任務描述任務描述 設計一個程序用無符號字符型數(shù)組實現(xiàn)以下功能:一變量i,當i=1時,LED1發(fā)光(被點亮);當i=2時,LED1、LED2發(fā)光;當i=3時,LED1、LED2、LED3發(fā)光;當i=8時,LED1LED8都發(fā)光,當i=9時,LED1LED8都熄滅,當i=1時,LED1發(fā)光依次循環(huán)。3.任務實現(xiàn)任務實現(xiàn)(1)分析 用無符號字符型數(shù)組來實現(xiàn),大大簡化了程序設計和節(jié)約了存儲器空間,關鍵字為“code”,
58、其定義如下:unsigned char code Tab=0 xfe,0 xfc,0 xf8,0 xf0,0 xe0,0 xc0,0 x80,0 x00,0 xff;/*定義無符號字符型數(shù)組,數(shù)組元素為點亮LED狀態(tài)控制碼*/(2)程序設計 如下源程序: 6.2相關知識相關知識1.概述概述 在程序設計中,為了處理方便,把具有相同類型的若干變量按有序的形式組織起來。這些按序排列的同類型數(shù)據(jù)元素的集合稱為數(shù)組數(shù)組。 因此按數(shù)組元素的類型不同,數(shù)組又可分為數(shù)值數(shù)組、字符數(shù)組、指針數(shù)組、結構數(shù)組等。2.一維數(shù)組一維數(shù)組(1)一維數(shù)組的定義方式 類型說明符類型說明符 數(shù)組名數(shù)組名 整型常量表達式整型常量
59、表達式;例如: int a10;/*定義整型數(shù)組a,它有a0a9共10個元素,每個元素都是整型變量*/說明: 數(shù)組名的命名規(guī)則和變量名相同,遵循標識符命名規(guī)則; 數(shù)組名后是用方括號括方括號括起來的常量表達式,不能用圓括?。?常量表達式表示元素的個數(shù),即數(shù)組的長度。例如在int a10中,10表示a數(shù)組有10個數(shù)據(jù)元素,下標從0開始,這10個元素是:a0, a1, a2, a3, a4, a5, a6, a7, a8, a9。 常量表達式中可以包括常量和符號常量,不能包含變量。也就是說,C51不允許對數(shù)組的大小作動態(tài)定義,即數(shù)組大小不依賴于程序運行過程中變量的值;(2)一維數(shù)組的初始化 對數(shù)組元
60、素的初始化可以用以下方法實現(xiàn): 在定義數(shù)組時對數(shù)組元素賦予初值。 例如:int a10=0,1,2,3,4,5,6,7,8,9; 將數(shù)組元素的初值依次放在一對花括弧內。經(jīng)過上面的定義和初始化之后,a0=0, a1=1, a2=2, a3=3, a4=4, a5=5, a6=6, a7=7, a8=8, a9=9。 可以只給一部分元素賦值。 例如:int a10=0,1,2,3,4; 定義a數(shù)組有10個元素,但花括弧內只提供五個初值,這表示只給前五個元素賦初值,后面的五個元素值為0。 在對全部數(shù)組元素賦初值時,可以不指定數(shù)組的長度。 例如: int a5=1,2,3,4,5; 也可以寫成: in
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年關于合同法的新動向與重點考綱解析
- 環(huán)保阻燃電子復合材料行業(yè)跨境出海項目商業(yè)計劃書
- 六年級語文下冊教學計劃的課程整合
- 一年級下期班級衛(wèi)生管理計劃
- 道德與法治課程復習策略計劃
- 市政工程質量保證措施與創(chuàng)優(yōu)策略
- 2024屆江蘇省南京一中學中考沖刺卷數(shù)學試題含解析
- 教育機構財務審計保障措施
- 國際會議提升學術交流質量的措施
- 2025年甘肅省天水市部分校高考語文第三次聯(lián)考試題(含答案)
- GB/T 6495.1-1996光伏器件第1部分:光伏電流-電壓特性的測量
- GB/T 1095-2003平鍵鍵槽的剖面尺寸
- 流行病學調查表格設計
- ARV藥物血脂異常的診斷和治療吳昊課件
- 文藝復興時期的北方畫派課件
- 起重吊裝與履帶起重機的安全使用課件
- 弱電施工手冊
- 人力資源管理師二級理論知識要點
- 科研成果研制任務書
- 高分子材料完整版課件
- 完整版:美制螺紋尺寸對照表(牙數(shù)、牙高、螺距、小徑、中徑外徑、鉆孔)
評論
0/150
提交評論