C-51程序設(shè)計知識_第1頁
C-51程序設(shè)計知識_第2頁
C-51程序設(shè)計知識_第3頁
C-51程序設(shè)計知識_第4頁
C-51程序設(shè)計知識_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第六講:C-51程序設(shè)計本講重點: C-51的數(shù)據(jù)類型和存儲類型; 指針和中斷的使用; 通過實例消化理解C-51的編程方法; 嘗試將實驗課中的ASM-51程序轉(zhuǎn)為C-51程序.C語言作為一種非常方便的語言而得到廣泛的支持,C語言程序本身不依賴于機器硬件系統(tǒng),基本上不作修改就可將程序從不同的單片機中移植過來。C提供了很多數(shù)學函數(shù)并支持浮點運算,開發(fā)效率高,故可縮短開發(fā)時間,增加程序可讀性和可維護性。 C-51簡介C-51與ASM-51相比,有如下優(yōu)點:1.對單片機的指令系統(tǒng)不要求了解,僅要求對8051 的存貯器結(jié)構(gòu)有初步了解;2.寄存器分配、不同存貯器的尋址及數(shù)據(jù)類型等細節(jié)可由編譯器管理;3.程

2、序有規(guī)范的結(jié)構(gòu),可分成不同的函數(shù),這種方式可使程序結(jié)構(gòu)化;4.具有將可變的選擇與特殊操作組合在一起的能力,改善了程序的可讀性;5.提供的庫包含許多標準子程序,具有較強的數(shù)據(jù)處理能力;6.由于具有方便的模塊化編程技術(shù),使已編好程序可容量地植入新程序; C51的數(shù)據(jù)類型 常用的數(shù)據(jù)類型有: C51的程序結(jié)構(gòu) 與一般C語言的結(jié)構(gòu)相同,以main()函數(shù)為程序人口,程序體中包含若干語句還可以包含若干函數(shù)。位型 字符型 整型 長整型 浮點型bit char int long int float1位 1字節(jié) 2字節(jié) 4字節(jié) 4字節(jié)數(shù)組型 指針型 C-51數(shù)據(jù)的存儲類型名 存儲空間位置 長度 數(shù)據(jù)范圍 da

3、ta 直接尋址片內(nèi)RAM 8位 0255 bdata 可位尋址片內(nèi)RAM 1位 0/1idata 間接尋址片內(nèi)RAM 8位 0255xdata 片外RAM 16位 065535 C-51的包含的頭文件通常有:reg51.h math.h ctype.h stdio.h stdlib.h absacc.h常用有:reg51.h (定義特殊功能寄存器和位寄存器); math.h (定義常用數(shù)學運算); C-51的運算符與C語言基本相同:+ - * / (加 減 乘 除) = (位右移 位左移)& | (按位與 按位或) (按位異或 按位取反) C-51的基本語句與標準C語言基本相同: if 選擇語

4、言 switch/case 多分支選擇語言 while 循環(huán)語言 do-while 循環(huán)語言 for 循環(huán)語言 實例ORG 0000HMOV R0,#0DCH ;指向字形口MOV A,#80H;確定字形代碼MOVX R0,A ;輸出字形代碼MOV R1,#0DDH ;指向字位口MOV A,#20H;從最高位開始LEDO:MOVX R1,A;輸出字位代碼MOV R2,#18H;確定延時常數(shù)ACALL DEYS;調(diào)延時子程序RL A;右移一位SJMP LEDO;循環(huán)演示; 延時子程序DEYS: PUSH 02HDEY0: PUSH 02HDEY1: PUSH 02H DJNZ R2,$ POP 0

5、2H DJNZ R2,DEY1 POP 02H DJNZ R2,DEY0 POP 02H DJNZ R2,DEYS RET END例1.“8”字符循環(huán)演示 (字形口為DCH; 字位口為DDH) 匯編語言程序#include #include #define uchar unsigned char /* 字形口 */#define PORTA XBYTE0 xffdc /* 字位口 */#define PORTB XBYTE0 xffdd /* 延時 1MS子程序 */void msce(unsigned int x) unsigned char j; while(x-)!=0) for(j=0

6、;j60;j+); main( ) uchar rr,i; for(;) rr=0 x01;/* 從最右一位開始 */ for(i=0;i6;i+) PORTA =0 x80;/*輸出字形代碼*/ PORTB =rr; /*輸出字位代碼*/ msce(150); /*調(diào)延時子程序*/ rr=rr1; /*循環(huán)左移一位*/ “8”字符循環(huán)演示的C51程序 C51程序 #include main( ) int i; unsigned char xdata *p=0 x2000; /* 指針指向2000H單元 */ for(i=0;i256;i+) /*清零2000H-20FFH單元*/ *p=0;

7、 p+; 例2.清零程序 (將2000H20FFH的內(nèi)容清零) 匯編語言程序 ORG 0000HSE01: MOV R0,#00H MOV DPTR,#2000H ;(0000H)送DPTRLOO1: CLR A MOVX DPTR,A ;0送(DPTR) INC DPTR ;DPTR+1 INC R0 ;字節(jié)數(shù)加1 CJNE R0,#00H,LOO1 ;不到FF個字節(jié)再清LOOP: SJMP LOOP例3.拆字程序(將2000H的內(nèi)容拆開,高位送2001H低位,低位送2002H低位) 匯編語言程序 ORG 0000HSE02: MOV DPTR,#2000H MOVX A,DPTR MOV

8、B,A ;(2000)AB SWAP A ;交換 ANL A,#0FH ;屏敝高位 INC DPTR MOVX DPTR,A ;送2001H INC DPTR MOV A,B ANL A,#0FH ;(2000)內(nèi)容屏敝高位 MOVX DPTR,A ;送2002H SJMP $拆字C51程序#include main( )unsigned char xdata *p=0 x2000;/*指針指向2000H單元*/ /* 2002H單元高4位清零,低4位裝2000H單元低4位 */ *(p+2)=(*p)&0 x0f; /* 2001H單元高4位清零,低4位裝2000H單元高4位 */*(p+1

9、)=(*p)4; 匯編語言程序 ORG 0000HL00: MOV R0,#10H ;查找16個字節(jié) MOV R1,#00H MOV DPTR,#2000HL11: MOVX A,DPTR CJNE A,#00H,L16 ;取出內(nèi)容與00H相等嗎? INC R1 ;取出個數(shù)加1L16: INC DPTR DJNZ R0,L11 ;未完繼續(xù) MOV DPTR,#2100H MOV A,R1 MOVX DPTR,A ;相同數(shù)個數(shù)送2100HL1E: SJMP L1E例4.查找零的個數(shù)(在2000H-200FH中查出有幾個字 節(jié)是零,把個數(shù)放在2100H單元中)查找零的個數(shù)C51程序#include

10、 main ( ) unsigned char xdata *p=0 x2000;/*指針p指向2000H單元*/ int n=0,i; for(i=0;i16;i+) if(*p=0) n+; /* 若該單元內(nèi)容為零,則n+1 */ p+; /* 指針指向下一單元 */ p=0 x2100; /* 指針p指向2100H單元 */ *p=n; /* 把個數(shù)放在2100H單元中 */ 匯編程序 ORG 0000H MOV A,R3 MOV B,R7 MUL AB ;R3*R7 XCH A,R7 ;R7=(R3*R7)低字節(jié) MOV R5,B ;R5=(R3*R7)高字節(jié) MOV B,R2 MUL

11、 AB ;R2*R7 ADD A,R5 MOV R4,A CLR A ADDC A,B MOV R5,A ;R5=(R2*R7)高字節(jié) MOV A,R6 MOV B,R3 MUL AB ;R3*R6 ADD A,R4 XCH A,B ADDC A,R5 MOV R5,A MOV PSW.5,C ;存CY MOV A,R2 MUL AB ;R2*R6 ADD A,R5 MOV R5,A CLR A MOV ACC.0,C MOV C,PSW.5 ;加上次加法的位 ADDC A,B MOV R4,A JMP $例5.雙字節(jié)無符號整數(shù)快速乘法 C51程序#include main( )unsigne

12、d int xdata *p1=0 x2000;/*雙字節(jié)被乘數(shù)在2000H單元*/ unsigned int xdata *p2=0 x2002;/*雙字節(jié)乘數(shù)在2002H單元 */ unsigned long xdata *p3=0 x2010;/*4字節(jié)乘積放在2010H單元*/ *p3=(*p1)*(*p2); 例6.工業(yè)順序控制C-51程序#include sbit P1_7=0 x97; /* 定義P1.7口地址 */ unsigned char TT;void Delay(unsigned int value) /* 延時子程序*/ while(value!=0) value-;

13、 void Serint1()interrupt 2 /*中斷服務程序-暫停并報警*/ int i; TT=P1; /* 保護現(xiàn)場 */ P1=0 x7f; /* 關(guān)輸出 */ while(!INT1) /* 若故障未消除,則報警 */ for(i=0;i0 xa0;i+) /* 給蜂鳴器發(fā)震蕩脈沖 */ P1_7=1;Delay(50); P1_7=0;Delay(50); P1_7=0;Delay(6550); P1=TT; /*恢復現(xiàn)場 */ main ( ) IE=0 x84; /* CPU開中斷,INT1開中斷 */ while(T0=0); /* 等待P3.4變高 */ for(;

14、) P1=0 xfe; Delay(60000); /* 工序1 */ P1=0 xfd; Delay(60000); /* 工序2 */ P1=0 xfb; Delay(60000); /* 工序3 */ P1=0 xf7; Delay(60000); /* 工序4 */ P1=0 xef; Delay(60000); /* 工序5 */ P1=0 xdf; Delay(60000); /* 工序6 */ P1=0 x8f; Delay(60000); /* 工序7 */ (續(xù)前)例7.電腦時鐘(用定時器產(chǎn)生0.1秒定時中斷,對時鐘計數(shù)器計數(shù)并送數(shù)碼管顯示) C51程序#include #i

15、nclude #define uchar unsigned char#define LEDwp XBYTE0 xffdc#define LEDwb XBYTE0 xffdduchar code table10=0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90;uchar hour=1,min=23,sec=45,m=0,n,i; /* 給時鐘賦初值 */uchar xdata *p; void Delay(unsigned int value) /*延時子程序*/ while(value!=0) value-; void T

16、rans(void) /*時間數(shù)據(jù)轉(zhuǎn)換子程序*/ if(sec=60) min+;sec=0; if(min=60) hour+;min=0; if(hour=24) hour=0; *(p+0)=hour/10; /* 時的十分位 */ *(p+1)=hour%10; /* 時的個位*/ *(p+2)=min/10; /* 分的十分位 */ *(p+3)=min%10; /* 分的個位 */ *(p+4)=sec/10; /* 秒的十分位 */ *(p+5)=sec%10; /* 秒的個位 */ void Show(void) /*循環(huán)顯示子程序*/ for(;) Trans( ); LEDwb=n=0 x20; for(i=0;i1; /* 中斷服務子程序(0.1秒中斷一次) *

溫馨提示

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

評論

0/150

提交評論