單片機c51編程_第1頁
單片機c51編程_第2頁
單片機c51編程_第3頁
單片機c51編程_第4頁
單片機c51編程_第5頁
已閱讀5頁,還剩106頁未讀, 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、單片機第單片機第4 4章章c51c51編編程程4.1 C514.1 C51的程序結構的程序結構 C51 C51程序結構同程序結構同ANSI CANSI C一樣,必須有一個主函數一樣,必須有一個主函數main( )main( ),從主函,從主函數數main( )main( )開始執行程序,默認情況下主函數是一個開始執行程序,默認情況下主函數是一個“死循環死循環結構,結構,不停地循環執行。不停地循環執行。 例:例:C51C51程序根本結構程序根本結構在此處定義全局變量在此處定義全局變量; ; / /所有函數都可以使用所有函數都可以使用void main( ) /void main( ) /* *

2、定義主函數定義主函數* */ / 在此處定義局部變量在此處定義局部變量; /; /只能在本函數范圍內使用只能在本函數范圍內使用 bgn: bgn: goto bgn; goto bgn; C C語言程序的組成結構如下所示:語言程序的組成結構如下所示:注釋說明;注釋說明;頭文件包含命令;頭文件包含命令;宏定義;宏定義;全局變量定義全局變量定義 / /* *可被各函數引用可被各函數引用* */ /用戶自定義函數聲明;用戶自定義函數聲明; main() /main() /* *主函數主函數* */ / 局部變量定義局部變量定義 / /* *只在本函數引用只在本函數引用* */ /執行語句執行語句 /

3、 /* *包括函數調用語句包括函數調用語句* */ / 用戶自定義函數;用戶自定義函數;中斷效勞程序定義;中斷效勞程序定義;用用“/“/符號開頭來注釋一行,如符號開頭來注釋一行,如“/“/變量聲明變量聲明。用用“/“/* *符號開頭,并以符號開頭,并以“* */ /符號結束。采用這種方法,可以對符號結束。采用這種方法,可以對C51C51源程序中的任何局部進行注釋,如源程序中的任何局部進行注釋,如“/“/* *聲明整型變量聲明整型變量count count * */ /。 一、注釋說明一、注釋說明 庫函數是編譯系統系統的標準函數。在使用時,只需在源程序的庫函數是編譯系統系統的標準函數。在使用時,

4、只需在源程序的開始處使用預處理命令開始處使用預處理命令#include#include將有關的頭文件包含進來即可。將有關的頭文件包含進來即可。 下面便介紹下面便介紹C51C51常用庫函數。常用庫函數。n本證庫函數本證庫函數 n直接訪問存儲區宏定義直接訪問存儲區宏定義 n字符串操作庫函數字符串操作庫函數 n字符轉換和字符分類庫函數字符轉換和字符分類庫函數 n數學庫函數數學庫函數 n輸入輸出庫函數輸入輸出庫函數 二、頭文件包含命令二、頭文件包含命令格式:格式: #include #include 一、本征庫函數一、本征庫函數 頭文件頭文件intrins.h_crol_crol_,_cror_cro

5、r_:將:將charchar型變量循環向左右移動指定位數后返回。型變量循環向左右移動指定位數后返回。_iror_iror_,_irol_irol_:將:將intint型變量循環向左右移動指定位數后返回。型變量循環向左右移動指定位數后返回。_lrol_lrol_,_lror_lror_:將:將longlong型變量循環向左右移動指定位數后返回。型變量循環向左右移動指定位數后返回。_nop_nop_:相當于插入匯編指令:相當于插入匯編指令NOPNOP。_testbit_testbit_:相當于:相當于JBC bitvarJBC bitvar測試該位變量并跳轉同時去除。測試該位變量并跳轉同時去除。_

6、chkfloat_chkfloat_: 測試并返回源點數狀態。測試并返回源點數狀態。例:例:#include “intrins.h#include “intrins.hVoid main()Void main() unsigned int a,b; unsigned int a,b; bit test_falg,brlt; bit test_falg,brlt; a=0 x1234; a=0 x1234; b=_irol_(a,4) /a b=_irol_(a,4) /a變量循環左移變量循環左移4 4位位 test_flag=1; test_flag=1; brlt=_testbit_(tes

7、t_flag) / brlt=_testbit_(test_flag) /測試位變量測試位變量test_flag,test_flag,并將其請并將其請0 0, /brlt=1 /brlt=1,test_flag=0;test_flag=0; 練習:利用上述庫函數編寫練習:利用上述庫函數編寫LEDLED燈流水燈程序燈流水燈程序二、直接訪問存儲區的宏定義二、直接訪問存儲區的宏定義 C51 C51編譯器提供了一組宏定義來對編譯器提供了一組宏定義來對5151系列單片機的系列單片機的codecode、datadata、pdatapdata和和xdataxdata空間進行絕對尋址。規定只能以無符號數空間進

8、行絕對尋址。規定只能以無符號數方式訪問,定義了方式訪問,定義了8 8個宏定義:個宏定義: CBYTE CBYTE以字節形式對以字節形式對codecode區尋址,區尋址, DBYTE DBYTE以字節形式對以字節形式對datadata區尋址區尋址 PBYTE PBYTE以字節形式對以字節形式對pdatapdata區尋址,區尋址, XBYTE XBYTE以字節形式對以字節形式對xdataxdata區尋址,區尋址, CWORD CWORD以字形式對以字形式對codecode區尋址,區尋址, DWORD DWORD以字形式對以字形式對datadata區尋址,區尋址, PWORD PWORD以字形式對以

9、字形式對pdatapdata區尋址,區尋址, XWORD XWORD以字形式對以字形式對xdataxdata區尋址。區尋址。 這些函數原型放在這些函數原型放在absacc.habsacc.h文件中。使用時須用預處理命令文件中。使用時須用預處理命令把該頭文件包含到文件中,形式為:把該頭文件包含到文件中,形式為:#include #include 。 訪問形式如下:訪問形式如下: 宏名宏名 地址地址 宏名為宏名為CBYTECBYTE、DBYTEDBYTE、PBYTEPBYTE、XBYTEXBYTE、CWORDCWORD、DWORDDWORD、PWORDPWORD或或XWORDXWORD。地址為存儲

10、單元的絕對地址,一般用十六進制形式表示。地址為存儲單元的絕對地址,一般用十六進制形式表示。注意:注意:CWORDCWORD、DWORDDWORD、PWORDPWORD和和XWORDXWORD地址地址 中的地址不是所訪問中的地址不是所訪問存儲單元的實際地址,所訪問存儲單元的地址存儲單元的實際地址,所訪問存儲單元的地址=2=2* *地址,地址,WORDWORD類類型為兩個字節型為兩個字節例、絕對地址對存儲單元的訪問例、絕對地址對存儲單元的訪問#include /#include /* *將絕對地址頭文件包含在文件中將絕對地址頭文件包含在文件中* */ /#include /#include /*

11、*將存放器頭文件包含在文件中將存放器頭文件包含在文件中* */ /#define uchar unsigned char #define uchar unsigned char #define uint unsigned int #define uint unsigned int void main(void)void main(void) uchar var1;uchar var1;uint var2;uint var2;var1=XBYTE0 x0005; var1=XBYTE0 x0005; / /* *XBYTE0 x0005XBYTE0 x0005訪問片外訪問片外RAMRAM的的00

12、050005字節單元字節單元* */ /var2=XWORD0 x0002; var2=XWORD0 x0002; / /* *XWORD0 x0002XWORD0 x0002訪問片外訪問片外RAMRAM的的00040004字單元字單元* */ /.while(1);while(1); 在上面程序中,其中在上面程序中,其中XBYTE0 x0005XBYTE0 x0005就是以絕對地址方式訪問的片外就是以絕對地址方式訪問的片外RAM 0005RAM 0005字節單元;字節單元;XWORD0 x0002XWORD0 x0002就是以絕對地址方式訪問的片外就是以絕對地址方式訪問的片外RAM RAM

13、00040004字單元。字單元。 三、字符串操作三、字符串操作 頭文件頭文件string.hstring.h,包括字符串比較、連接、復制、統,包括字符串比較、連接、復制、統計字符串長度、查找定位字符等功能函數等。計字符串長度、查找定位字符等功能函數等。#include “string.h#include “string.hVoid main()Void main() Char str=“today is Char str=“today is, wstr=sunny,weather20;, wstr=sunny,weather20; strcopy ( weather, str); strcop

14、y ( weather, str); / /執行后執行后weather=“today isweather=“today is strcat( weather, wstr); strcat( weather, wstr); / /執行后執行后weather=“today is sunnyweather=“today is sunny; ; 四、字符轉換和字符分類四、字符轉換和字符分類 頭文件頭文件stype.hstype.h,包括判斷類別,如:,包括判斷類別,如:isdigitisdigit,islowerislower和和isupperisupper等功能函數等。等功能函數等。#include

15、 “ctype.h#include “ctype.hVoid main()Void main() Char c, cupp;Char c, cupp;Bit i;Bit i; c=h; / c=h; /執行后執行后c=0 x86c=0 x86 i= isdigit(c) i= isdigit(c); / /執行后執行后i=0;i=0; cupp=_toupper(c); / cupp=_toupper(c); /執行后執行后 cupp=0 x48, cupp=0 x48,即即HH的的ASCIIASCII碼碼 五、數學函數五、數學函數 頭文件頭文件math.hmath.h,包括判斷類別,如:,包

16、括判斷類別,如:sinsin,coscos和和absabs等功能函數等。等功能函數等。#include “math.h#include “math.hVoid main()Void main() int x,y;int x,y;flaot z;flaot z;Begin: x=-100; Begin: x=-100; y=abs(x) y=abs(x); / /執行后執行后y=100;y=100; z=log10(y); / z=log10(y); /執行后執行后 z=2 z=2Goto begin;Goto begin; 三、宏定義三、宏定義宏定義語句屬于宏定義語句屬于C51C51語言的預處

17、理命令,使用宏定義可以使變量的書寫語言的預處理命令,使用宏定義可以使變量的書寫簡化,增加程序的可讀性、可維護性和可移植性。簡化,增加程序的可讀性、可維護性和可移植性。簡單的宏定義格式如下:簡單的宏定義格式如下:#define #define 宏替換名宏替換名 宏替換體宏替換體例如:例如:#define uchar unsigned char#define uchar unsigned char在編譯時可由在編譯時可由C51C51編譯器把編譯器把“unsigned char“unsigned char用用“uchar“uchar來替代來替代 變量變量在程序運行中其值可以改變的量。在程序運行中其值

18、可以改變的量。 一個變量由變量名和變量值構成,變量名即是存貯單元地址一個變量由變量名和變量值構成,變量名即是存貯單元地址的符號表示,而變量的值就是該單元存放的內容。定義一個變量,的符號表示,而變量的值就是該單元存放的內容。定義一個變量,編譯系統就會自動為它安排一個存貯單元,具體的地址值用戶不編譯系統就會自動為它安排一個存貯單元,具體的地址值用戶不必在意。必在意。 變量的定義的一般格式為變量的定義的一般格式為 數據類型數據類型 存儲類型存儲類型 變量名變量名 C51C51中定義變量除了定義數據類型外,還應定義存儲類型中定義變量除了定義數據類型外,還應定義存儲類型 例:例:int data x ,

19、 y ; int data x , y ; 表示表示x , y x , y 為為1616位整數并指定放位整數并指定放在片內數據存儲區在片內數據存儲區四、全局變量與局部變量定義四、全局變量與局部變量定義intinti,j;i,j;/整型變量整型變量charcharch;ch;/字符型變量字符型變量short int short int shi;shi;/短整型變量短整型變量unsigned int unsigned int ut;ut;/無符號整型變量無符號整型變量float float fset,st;fset,st;/浮點型變量浮點型變量1、 數據類型數據類型 C51編譯器兼容編譯器兼容AN

20、SI C,支持,支持ANSI C的根本數據類型,的根本數據類型,并對數據類型進行了擴展并對數據類型進行了擴展 1C51支持的支持的ANSI C數據類型數據類型變量名稱變量名稱符號符號類型類型數據長度數據長度值域范圍值域范圍位型量位型量bit1位位0,1字符型字符型有符號有符號signed char 8位位-128+127無符號無符號unsigned char8位位0255整數型整數型有符號有符號signed int16位位-32768+32767無符號無符號unsigned int16位位065535長整型長整型有符號有符號signed long32位位-231231-1無符號無符號unsig

21、ned long32位位232-1浮點型浮點型float32位位3.4E-383.4E+38 2 2C51C51擴展數據類型擴展數據類型 Sfr Sfr,sfr16sfr16、sbitsbit 用于訪問特殊功能的存放器用于訪問特殊功能的存放器SFRSFR,這三種類型的變量只,這三種類型的變量只能聲明為全局變量,并且在定義時必須指定變量訪問的能聲明為全局變量,并且在定義時必須指定變量訪問的SFRSFR地址。地址。 sfr sfr 變量可以訪問指定地址的變量可以訪問指定地址的8 8位位SFRSFR 格式:格式:sfr sfr 變量名變量名=SFR=SFR地址地址例如:例如: sfr P0=0X80

22、; sfr P1=0X90; sfr P0=0X80; sfr P1=0X90; sfr P2=0XA0; sfr P3=0XB0; sfr P2=0XA0; sfr P3=0XB0; sfr16 sfr16 變量可以訪問指定地址的變量可以訪問指定地址的1616位位SFRSFR 格式:格式:sfr16 sfr16 變量名變量名= =變量地址變量地址 變量地址為變量地址為1616位特殊功能存放器的低位特殊功能存放器的低8 8位地址。位地址。 例如:例如: sfr16 T2=0XCC; sfr16 T2=0XCC; sfr T2-L=0XCC; sfr T2-L=0XCC; sfr T2-H=0X

23、CD; sfr T2-H=0XCD; 定義定義sfr16sfr16和和sfrsfr類型的變量用于訪問單片機定時器類型的變量用于訪問單片機定時器2 2的的1616位計數存放器位計數存放器 sbitsbit 變量可以訪問可位尋址的變量可以訪問可位尋址的SFRSFR中的某一位中的某一位 格式:格式: sbitsbit變量名變量名= =位地址位地址 sbitsbit變量名變量名=SFR=SFR地址地址 位序號位序號 sbitsbit變量名變量名=Sfr=Sfr變量變量 位序號位序號 sbitsbit變量名變量名=Sfr16=Sfr16變量變量 位序號位序號 例如:例如:sfr P0=0X80; sfr

24、 P0=0X80; sbit P0-0=0X80; sbit P0-0=0X80; sbit sbit P0-1=P01P0-1=P012 2、存儲類型、存儲類型 1 1 程序存儲器程序存儲器 如某變量需要存放在程序存儲器中,定義時用存儲類型標如某變量需要存放在程序存儲器中,定義時用存儲類型標識符識符codecode,程序運行中不可以改變用,程序運行中不可以改變用codecode定義的變量的值定義的變量的值 2 2數據存儲器數據存儲器 內部數據存儲器內部數據存儲器 Data Data:片內數據存儲區的低:片內數據存儲區的低128128字節中,直接尋址,訪問字節中,直接尋址,訪問速度快速度快 b

25、data bdata :可位尋址片內數據存儲區,允許位與字節混合訪:可位尋址片內數據存儲區,允許位與字節混合訪問問(16(16字節字節) ) ,必須定義為全部變量,必須定義為全部變量 idata idata :片內數據存儲區整個:片內數據存儲區整個256256字節字節 ,間接訪問,間接訪問 外部數據存儲器外部數據存儲器 間接訪問,存取速度比較慢間接訪問,存取速度比較慢 pdata :分頁尋址片外數據存儲區:分頁尋址片外數據存儲區(256字節字節) 由由MOVX R0,A指令訪問指令訪問 xdata :片外數據存儲區:片外數據存儲區(64K) 由由MOVX DPTR,A指令訪問指令訪問 存儲類型

26、存儲類型 與存儲空間的對應關系與存儲空間的對應關系 data data 直接尋址片內數據存儲區,訪問速度快直接尋址片內數據存儲區,訪問速度快(128(128字節字節) ) bdata bdata 可位尋址片內數據存儲區,允許位與字節混合訪問可位尋址片內數據存儲區,允許位與字節混合訪問(16(16字節字節) ) idata idata 間接尋址片內數據存儲區,可訪問片內全部間接尋址片內數據存儲區,可訪問片內全部RAMRAM地址空間地址空間(256256字節)字節) pdata pdata 分頁尋址片外數據存儲區分頁尋址片外數據存儲區(256(256字節字節) )由由MOVX R0MOVX R0,

27、A A指令訪指令訪問問 xdata xdata 片外數據存儲區片外數據存儲區(64(64K)K),由,由MOVX DPTRMOVX DPTR,A A指令訪問指令訪問 code code 代碼存儲區代碼存儲區(64(64K)K),由,由MOVC A,A+DPTRMOVC A,A+DPTR指令訪問指令訪問 表表 C51C51存儲類型存儲類型存儲模式存儲模式 默認的存儲類型默認的存儲類型 SMALL SMALL 默認的存儲類型為默認的存儲類型為datadata,最大為,最大為128128字節字節 COMPACT COMPACT 默認的存儲類型為默認的存儲類型為pdatapdata,每頁,每頁2562

28、56字節字節 LARGE LARGE 默認的存儲類型為默認的存儲類型為xdataxdata,最大為,最大為6464K K 3 3、 存儲模式存儲模式 小模式,緊湊模式,大模式小模式,緊湊模式,大模式 變量假設未定義存儲類型,那么變量假設未定義存儲類型,那么C51C51編譯器自動選擇默認存編譯器自動選擇默認存儲類型儲類型五、用戶自定義函數聲明五、用戶自定義函數聲明當用戶自定義的函數放在當用戶自定義的函數放在mainmain函數的后面時,需要進行函數聲明函數的后面時,需要進行函數聲明當用戶自定義的函數放在當用戶自定義的函數放在mainmain函數的前面時,不需要進行函數聲明函數的前面時,不需要進行

29、函數聲明函數聲明的方法:函數聲明的方法:只需要將自定義函數的函數頭復制到該位置即可;只需要將自定義函數的函數頭復制到該位置即可;例如:用戶定義了以下函數例如:用戶定義了以下函數Void delay()Void delay() Unsigned char i;Unsigned char i;For(i=0;i255;i+);For(i=0;i ( (大于大于) ); ( = ( = (大于或等于大于或等于) ); = ( var2var1var2; ; result = result =var1=var2var1=var2; ; result = result = var1var2 var1va

30、r2 ; ; result = result = var1=var2 var1=var2 ; ; goto bgn; goto bgn; 4 4、邏輯運算符及其表達式、邏輯運算符及其表達式& & 邏輯與邏輯與 ( (兩個操作數都為真時,結果才為真,否那么兩個操作數都為真時,結果才為真,否那么 為假為假) ) 邏輯或邏輯或 只要兩個操作數中有一個為真,結果便為真,否那么只要兩個操作數中有一個為真,結果便為真,否那么為假為假) )! ! 邏輯非邏輯非 ( (對操作數的值取反對操作數的值取反) ) & &和和 要求有兩個操作對象,而要求有兩個操作對象,而! !是單目運

31、算符,只要是單目運算符,只要求有一個運算對象。求有一個運算對象。例、例、void main( )void main( ) unsigned int var1, var2 ,result; unsigned int var1, var2 ,result; gbn: gbn: var1=0 x5555; var1=0 x5555; var2=0 xAAAA; var2=0 xAAAA; result =var1&var2; result =var1&var2; result =var1|var2; result =var1|var2; result =var1var2; resul

32、t =var1var2; result =var1; result =var1; var1=0 x1234; var1=0 x1234; var2=0 x0002; var2=0 x0002; result =var11; result =var12; result =var12; goto bgn; goto bgn; 5 5、位操作運算符及其表達式、位操作運算符及其表達式 & &按位與;按位與; 按位或;按位或; 按位異或;按位異或; 按位取反。按位取反。 位右移位右移6、特殊運算符、特殊運算符C51中支持的位運算符有:中支持的位運算符有:1?運算運算:格式:格式:?表達式

33、?表達式2:表達式:表達式3;假設表達式假設表達式1的值為真,就返回表達式的值為真,就返回表達式2的值,否那么返回表的值,否那么返回表達式達式3的值的值2&運算:返回操作數的地址運算:返回操作數的地址3*運算:操作數為指針,所做的操作均是針對指針所指運算:操作數為指針,所做的操作均是針對指針所指向的變量。向的變量。例、例、void main( )void main( ) unsigned int var1, var2 ,result, unsigned int var1, var2 ,result,* *spt;spt; gbn: gbn: var1=100; var1=100; va

34、r2=200; var2=200; result =var1var2? Var1:var2; result =var1var2? Var1:var2; var1=300; var1=300; var2=200; var2=200; spt =&result; spt =&result; * *spt =var1+var2;spt =var1+var2; var2= var2=* *spt;spt; goto bgn; goto bgn; 例:假設例:假設i=5 i=5 那么那么j=i+j=i+; ( (執行后執行后i=6,j=?)i=6,j=?) j=+i j=+i; (I=6

35、,j=6) (I=6,j=6)7 7、自增減運算符及其表達式、自增減運算符及其表達式 作用:使變量的值增作用:使變量的值增1 1或減或減l l, 如:如:+i (i (使用使用i i之前,先使之前,先使i i值增值增1)1) - -i (i (使用使用i i之前,先使之前,先使i i值減值減1)1) i+ ( i+ (在使用在使用i i之后,使之后,使i i值增值增l)l) i- ( i- (在使用在使用i i之后,使之后,使i i值減值減1)1)二分支與循環程序結構二分支與循環程序結構1 1、分支控制語句、分支控制語句 實現分支控制語句的有實現分支控制語句的有ifif語言和語言和switch

36、switch語言語言 1 1if if 語句語句 形式形式1 1: if( if(表達式表達式) ) 語句;語句; 形式形式2 2: if if表達式表達式 語句語句1 1; else else 語句語句2 2; 形式形式3 3:ifif表達式表達式1 1 語句語句1 1; else ifelse if表達式表達式2 2 語句語句2 2; else ifelse if表達式表達式3 3 語句語句3 3; .else(else(語句語句n n;) )八、執行語句八、執行語句(2)switch (2)switch 語句語句switchswitch語句的格式如下:語句的格式如下:switchswit

37、ch表達式表達式1 1case case 常量表達式常量表達式1 1: 語句語句1 1;breakbreak;case case 常量表達式常量表達式2 2: 語句語句2 2;breakbreak;case case 常量表達式常量表達式3 3: 語句語句3 3;breakbreak;.case case 常量表達式常量表達式n n: 語句語句n n;breakbreak;default:default:語句語句n+1;n+1; 2 2、循環控制語句、循環控制語句 實現循環控制語句的有實現循環控制語句的有whilewhile語句、語句、do-whiledo-while語句和語句和forfor語

38、句語句 1 1whilewhile語句語句 while( while(表達式表達式) ) 循環體語句;循環體語句; 2 2do-whiledo-while語句語句 do do 循環體語句;循環體語句; while while表達式表達式 3 3forfor語句語句 for for表達式表達式1 1;表達式;表達式2 2;表達式;表達式3 3 循環體語句;循環體語句; 表達式表達式1 1:循環變量初值設定:循環變量初值設定 表達式表達式2 2:循環條件表達式:循環條件表達式 表達式表達式3 3:循環變量更新表達式:循環變量更新表達式練習:練習:1 1、編寫程序使、編寫程序使LEDLED閃爍閃爍/

39、 /* * 名稱:閃爍的名稱:閃爍的LEDLED;說明:;說明:LED LED 按設定的時間間隔閃爍按設定的時間間隔閃爍* */ /#include#includesbit LED=P10;sbit LED=P10;/延時延時void DelayMS(uint x)void DelayMS(uint x) unsigned charunsigned char i;i;while(x-)while(x-) for(i=0;i120;i+);for(i=0;i120;i+); /主程序主程序void main()void main() while(1)while(1)LED=LED;LED=LED

40、;DelayMS(150);DelayMS(150); 2 2、編寫程序使、編寫程序使LEDLED左右來回點亮左右來回點亮/ /* * 名稱:名稱:8 8 只只LED LED 左右來回點亮左右來回點亮說明:程序利用循環移位函數說明:程序利用循環移位函數_crol_crol_和和_cror_cror_形成來回滾動的效果形成來回滾動的效果* */ /#include#include#include#includevoid DelayMS(uint x) /void DelayMS(uint x) /延時延時 uchar i;uchar i;while(x-)while(x-)for(i=0;i12

41、0;i+);for(i=0;i120;i+); /主程序主程序void main()void main() unsigned char i;unsigned char i; P2=0 x01;P2=0 x01; while(1)while(1) for(i=0;i7;i+)for(i=0;i7;i+) P2=_crol_(P2,1); P2=_crol_(P2,1); /P2 /P2 的值向左循環移動的值向左循環移動DelayMS(150);DelayMS(150); for(i=0;i7;i+)for(i=0;i7;i+) P2=_cror_(P2,1); P2=_cror_(P2,1);

42、/P2 /P2 的值向右循環移動的值向右循環移動DelayMS(150);DelayMS(150); 3 3編寫程序,用數碼管顯示按鍵的編號編寫程序,用數碼管顯示按鍵的編號XTAL218XTAL119ALE30EA31PSEN29RST9P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78P3.0/RXD10P3.1/TXD11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD17P

43、3.6/WR16P3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427U1AT89C51#include unsigned char code DSY_CODE=0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90;void main() unsigned char a,b;while(1) a=P1;switch(a)case 0 xfe:b=1;break;case 0 xfd:b=2;break;case

44、 0 xfb:b=3;break;case 0 xf7:b=4;break;case 0 xef:b=5;break;case 0 xdf:b=6;break;case 0 xbf:b=7;break;case 0 x7f:b=8;break;default:break; P2=DSY_CODEb;3 3、交通燈:東西向綠燈亮假設干秒,黃燈閃爍、交通燈:東西向綠燈亮假設干秒,黃燈閃爍5 5 次后紅燈亮,次后紅燈亮, 紅燈紅燈亮后,南北向由紅燈變為綠燈,假設干秒后南北向黃燈閃爍亮后,南北向由紅燈變為綠燈,假設干秒后南北向黃燈閃爍5 5 此后變此后變紅燈,東西向變綠燈,如此重復。紅燈,東西向變綠燈

45、,如此重復。/ /* * 名稱:名稱:LED LED 模擬交通燈模擬交通燈說明:東西向綠燈亮假設干秒,黃燈閃爍說明:東西向綠燈亮假設干秒,黃燈閃爍5 5 次后紅燈亮,次后紅燈亮, 紅燈亮后,南紅燈亮后,南北向由紅燈變為綠燈,假設干秒后南北向黃燈閃爍北向由紅燈變為綠燈,假設干秒后南北向黃燈閃爍5 5 此后變紅燈,東西向變此后變紅燈,東西向變綠燈,如此重復。綠燈,如此重復。* */ /#include#include#define uchar unsigned char#define uchar unsigned char#define uint unsigned int#define uint

46、unsigned intsbit RED_A=P00; /sbit RED_A=P00; /東西向燈東西向燈sbit YELLOW_A=P01;sbit YELLOW_A=P01;sbit GREEN_A=P02;sbit GREEN_A=P02;sbit RED_B=P03; /sbit RED_B=P03; /南北向燈南北向燈sbit YELLOW_B=P04;sbit YELLOW_B=P04;sbit GREEN_B=P05;sbit GREEN_B=P05;uchar Flash_Count=0,Operation_Type=1; /uchar Flash_Count=0,Opera

47、tion_Type=1; /閃爍次數,操作類型變量閃爍次數,操作類型變量/延時延時void DelayMS(uint x)void DelayMS(uint x) uchar i;uchar i;while(x-) for(i=0;i120;i+);while(x-) for(i=0;i120;i+); void Traffic_Light()void Traffic_Light() switch(Operation_Type)switch(Operation_Type) case 1: RED_A=1;YELLOW_A=1;GREEN_A=0;case 1: RED_A=1;YELLOW_A

48、=1;GREEN_A=0; RED_B=0;YELLOW_B=1;GREEN_B=1;RED_B=0;YELLOW_B=1;GREEN_B=1; DelayMS(2000);Operation_Type=2;break;DelayMS(2000);Operation_Type=2;break;case 2: DelayMS(300);case 2: DelayMS(300); YELLOW_A=YELLOW_A;GREEN_A=1;YELLOW_A=YELLOW_A;GREEN_A=1; i if(+Flash_Count!=10) return; /f(+Flash_Count!=10) r

49、eturn; /閃爍閃爍5 5 次次 Flash_Count=0;Operation_Type=3;break;Flash_Count=0;Operation_Type=3;break;case 3:case 3: RED_A=0;YELLOW_A=1;GREEN_A=1;RED_A=0;YELLOW_A=1;GREEN_A=1; RED_B=1;YELLOW_B=1;GREEN_B=0;RED_B=1;YELLOW_B=1;GREEN_B=0; DelayMS(2000);DelayMS(2000); Operation_Type=4;break;Operation_Type=4;break

50、;case 4: DelayMS(300);case 4: DelayMS(300); YELLOW_B=YELLOW_B;GREEN_B=1;YELLOW_B=YELLOW_B;GREEN_B=1; if(+Flash_Count!=10) return;if(+Flash_Count!=10) return; Flash_Count=0;Operation_Type=1;Flash_Count=0;Operation_Type=1;/主程序主程序void main()void main() while(1) Traffic_Light();while(1) Traffic_Light();

51、 4 4、數碼管從左到右依次滾動顯示、數碼管從左到右依次滾動顯示0707,程序通過每次僅循環選通一只,程序通過每次僅循環選通一只數碼管數碼管/ /* *名稱:名稱:8 8 只數碼管滾動顯示單個數字說明:數碼管從左到右依次滾動只數碼管滾動顯示單個數字說明:數碼管從左到右依次滾動顯示顯示0707,程序通過每次僅循環選通一只數碼管,程序通過每次僅循環選通一只數碼管* */ /#include#include#include#includeUnsigned char code Unsigned char code DSY_CODE=0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92

52、,0 x82,0 xf8,0 x80,0 x90;DSY_CODE=0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90;/延時延時void DelayMS(uint x)void DelayMS(uint x) Unsigned char t;Unsigned char t;while(x-) while(x-) for(t=0;t120;t+);for(t=0;t120;t+); /主程序主程序void main()void main() uchar i,wei=0 x80;uchar i,wei=0 x80;while(1

53、)while(1) for(i=0;i8;i+)for(i=0;i8;i+) wei=_crol_(wei,1);wei=_crol_(wei,1);P0=DSY_CODEi; /P0=DSY_CODEi; /發送數字段碼發送數字段碼P2=wei; /P2=wei; /發送位碼發送位碼DelayMS(300);DelayMS(300);P2=0 xff; /P2=0 xff; /關閉顯示關閉顯示 1-56八、用戶自定義函數及中斷效勞程序八、用戶自定義函數及中斷效勞程序C51C51可以自定義任意多個函數??梢宰远x任意多個函數。C51C51程序從程序從mainmain主函數開始執行。主函數開始執

54、行。C51C51的編譯環境提供了多種庫函數供用戶使用。的編譯環境提供了多種庫函數供用戶使用。合理使用函數來設計程序,可以有利于代碼的模塊化,促進團合理使用函數來設計程序,可以有利于代碼的模塊化,促進團隊協作和資源共享。隊協作和資源共享。 1-57函數定義的一般格式如下:函數定義的一般格式如下:函數類型函數類型 函數名參數表函數名參數表reentrantinterrupt musing nreentrantinterrupt musing n 局部變量定義局部變量定義函數體函數體 前面部件稱為函數的首部,后面稱為函數的尾部,格式說明前面部件稱為函數的首部,后面稱為函數的尾部,格式說明:1、函數類

55、型、函數類型函數類型說明了函數返回值的類型。函數類型說明了函數返回值的類型。2、函數名、函數名函數名是用戶為自定義函數取的名字以便調用函數時使用。函數名是用戶為自定義函數取的名字以便調用函數時使用。3、形式參數表、形式參數表形式參數表用于列錄在主調函數與被調用函數之間進行數據傳遞的形式參數。形式參數表用于列錄在主調函數與被調用函數之間進行數據傳遞的形式參數。一、函數及中斷效勞程序定義一、函數及中斷效勞程序定義1-584 4reentrantreentrant修飾符修飾符 這個修飾符用于把函數定義為可重入函數。所謂可重入函數就這個修飾符用于把函數定義為可重入函數。所謂可重入函數就是允許被遞歸調用

56、的函數。函數的遞歸調用是指當一個函數正被調是允許被遞歸調用的函數。函數的遞歸調用是指當一個函數正被調用尚未返回時,又直接或間接調用函數本身。一般的函數不能做到用尚未返回時,又直接或間接調用函數本身。一般的函數不能做到這樣,只有重入函數才允許遞歸調用。這樣,只有重入函數才允許遞歸調用。 1-595 5interrupt minterrupt m修飾符修飾符 interrupt m是是C51函數中非常重要的一個修飾符,這是因為中斷函數中非常重要的一個修飾符,這是因為中斷函數必須通過它進行修飾。在函數必須通過它進行修飾。在C51程序設計中,當函數定義時用了程序設計中,當函數定義時用了interrup

57、t m修飾符,系統編譯時把對應函數轉化為中斷函數,自動加修飾符,系統編譯時把對應函數轉化為中斷函數,自動加上程序頭段和尾段,并按上程序頭段和尾段,并按MCS-51系統中斷的處理方式自動把它安排系統中斷的處理方式自動把它安排在程序存儲器中的相應位置。在程序存儲器中的相應位置。 在該修飾符中,在該修飾符中,m的取值為的取值為031,對應的中斷情況如下:,對應的中斷情況如下:0外部中斷外部中斷01定時定時/計數器計數器T02外部中斷外部中斷13定時定時/計數器計數器T14串行口中斷串行口中斷5定時定時/計數器計數器T2 其它值預留。其它值預留。1-60編寫編寫89C5189C51中斷函數注意如下:中

58、斷函數注意如下:1 1中斷函數不能進行參數傳遞,如果中斷函數中包含任何中斷函數不能進行參數傳遞,如果中斷函數中包含任何參數聲明都將導致編譯出錯。參數聲明都將導致編譯出錯。2 2中斷函數沒有返回值,如果企圖定義一個返回值將得不中斷函數沒有返回值,如果企圖定義一個返回值將得不到正確的結果,建議在定義中斷函數時將其定義為到正確的結果,建議在定義中斷函數時將其定義為voidvoid類型,類型,以明確說明沒有返回值。以明確說明沒有返回值。3 3在任何情況下都不能直接調用中斷函數,否那么會產生在任何情況下都不能直接調用中斷函數,否那么會產生編譯錯誤。因為中斷函數的返回是由編譯錯誤。因為中斷函數的返回是由8

59、0518051單片機的單片機的RETIRETI指令指令完成的,完成的,RETIRETI指令影響指令影響80518051單片機的硬件中斷系統。如果在單片機的硬件中斷系統。如果在沒有實際中斷情況下直接調用中斷函數,沒有實際中斷情況下直接調用中斷函數,RETIRETI指令的操作結指令的操作結果會產生一個致命的錯誤。果會產生一個致命的錯誤。1-61【例】編寫一個用于統計外中斷【例】編寫一個用于統計外中斷0 0的中斷次數的中斷效勞程序的中斷次數的中斷效勞程序extern int x;extern int x;void int0() interrupt 0 using 1void int0() inter

60、rupt 0 using 1 x+; x+; 1-626 6using nusing n修飾符修飾符 修飾符修飾符using nusing n用于指定本函數內部使用的工作存放器用于指定本函數內部使用的工作存放器組,其中組,其中n n的取值為的取值為0303,表示存放器組號。,表示存放器組號。 對于對于using nusing n修飾符的使用,注意以下幾點:修飾符的使用,注意以下幾點:1 1參加參加using nusing n后,后,C51C51在編譯時自動的在函數的開始處在編譯時自動的在函數的開始處和結束處參加以下指令。和結束處參加以下指令。 PUSH PSW PUSH PSW ;標志存放器入棧;標志存放器入棧 MOV PSW MOV PSW,# #與存放器組號相關的常量

溫馨提示

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

評論

0/150

提交評論