MCS-51單片機C語言程序設計解讀課件_第1頁
MCS-51單片機C語言程序設計解讀課件_第2頁
MCS-51單片機C語言程序設計解讀課件_第3頁
MCS-51單片機C語言程序設計解讀課件_第4頁
MCS-51單片機C語言程序設計解讀課件_第5頁
已閱讀5頁,還剩251頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

第4章

單片機C語言程序設計第4章

單片機C語言程序設計1主要內容一、C語言與MCS-51二、C51的數據類型三、C51的運算量與存儲類型四、C51的運算符和表達式五、表達式語句與復合語句六、C51的輸入/輸出七、C51的程序結構八、函數九、C51構造數據類型主要內容一、C語言與MCS-512一、C語言與MCS-511、C語言與51單片機2、C51與標準C3、C51程序結構一、C語言與MCS-511、C語言與51單片機31、C語言與51單片機C語言目前已成為電子工程師進行單片機系統開發時的常用編程語言。用C語言來編寫目標系統軟件,會大大縮短開發周期,且明顯地增加軟件的可讀性,便于改進和擴充。用C語言編寫的應用程序必須經單片機的C語言編譯器(簡稱C51),轉換生成單片機可執行的代碼程序。基于51系列單片機的C語言或C語言編譯器簡稱為C51語言或C51。1、C語言與51單片機C語言目前已成為電子工程師進行單片機系41、C語言與51單片機用匯編程序設計MCS–51系列單片機應用程序時,必須要考慮其存儲器結構,尤其必須考慮其片內數據存儲器與特殊功能寄存器正確、合理的使用以及按實際地址處理端口數據。用C語言編寫MCS–51單片機的應用程序,雖然不像用匯編語言那樣具體地組織、分配存儲器資源和處理端口數據,但在C語言編程中,對數據類型與變量的定義,必須要與單片機的存儲結構相關聯,否則編譯器不能正確地映射定位。1、C語言與51單片機用匯編程序設計MCS–51系列單片機應51、C語言與51單片機支持MCS–51系列單片機的C語言編譯器有很多種。如AmericanAutomation、Avocet、BSO/TASKING、DUNFIELDSHAREWARE、KEIL、Franklin等。其中KEIL以它的代碼緊湊和使用方便等特點優于其它編譯器,目前用得最為普遍。1、C語言與51單片機支持MCS–51系列單片機的C語言編譯62、C51與標準CC51的主要語法規定、程序結構及程序設計方法都與標準的C語言相同,但在某些方面有區別。具體地說,在以下幾個方面不一樣:(1)C51中定義的庫函數和標準C語言定義的庫函數不同。標準的C語言定義的庫函數是按通用微型計算機來定義的,而C51中的庫函數是按MCS-51單片機相應情況來定義的;(2)C51中的數據類型與標準C的數據類型也有一定的區別,在C51中還增加了幾種針對MCS-51單片機特有的數據類型;2、C51與標準CC51的主要語法規定、程序結構及程序設計方72、C51與標準C(3)C51變量的存儲模式與標準C中變量的存儲模式不一樣,C51中變量的存儲模式是與MCS-51單片機的存儲器緊密相關的;(4)C51與標準C的輸入輸出處理不一樣,C51中的輸入輸出是通過MCS-51串行口來完成的,輸入輸出指令執行前必須要對串行口進行初始化;(5)C51與標準C在函數使用方面也有一定的區別,C51中有專門的中斷函數。2、C51與標準C(3)C51變量的存儲模式與標準C中變量的8表1ANSIC標準關鍵字關鍵字用途說明auto存儲種類說明用于聲明局部變量,為默認值break程序語句退出最內層循環體case程序語句switch語句中的選擇項char數據類型聲明單字節整型數或字符型數據const存儲種類說明在程序執行過程中不可修改的值continue程序語句轉向下一次循環default程序語句switch語句中缺省選擇項do程序語句構成do…while循環結構double數據類型聲明雙精度浮點數else程序語句構成if…else條件結構enum數據類型聲明枚舉類型數據extern存儲種類說明在其他程序模塊中聲明了的全局變量float數據類型聲明單精度浮點數for程序語句構成for循環結構goto程序語句構成goto循環結構if程序語句構成if…else條件結構int數據類型聲明整型數表1ANSIC標準關鍵字關鍵字用途說明auto存儲種9long數據類型聲明長整型數register存儲種類說明使用CPU內部寄存器變量return程序語句函數返回short數據類型聲明短整型signed數據類型聲明有符號整型數sizeof運算符計算表達式或數據類型的字節數static存儲種類說明靜態變量struct數據類型聲明結構體類型數據switch程序語句構成switch選擇結構typedef數據類型聲明重新進行數據類型定義union數據類型聲明聯合類型數據unsigned數據類型聲明無符號數據void數據類型聲明無類型數據或函數volatile數據類型聲明聲明該變量在程序執行中可被隱含地改變while程序語句構成while和do…while循環結構long數據類型聲明長整型數register存儲種類說明使用10表2C51編譯器擴充關鍵字關鍵字用途說明_at_地址定位為變量進行絕對地址定位_priority_多任務優先聲明規定RTX51或RTX51Tiny的任務優先級_task_任務聲明定義實時多任務函數alien函數特性聲明用于聲明與PL/M51兼容的函數bdata存儲器類型聲明可位尋址的MCS-51內部數據存儲器bit位變量聲明聲明一個位變量或位類型函數code存儲器類型聲明MCS-51的程序存儲空間compact存儲器模式按compact模式分配變量的存儲空間data存儲器類型聲明直接尋址MCS-51的內部數據寄存器表2C51編譯器擴充關鍵字關鍵字用途說明_at_地址定11idata存儲器類型聲明間接尋址MCS-51的內部數據寄存器interrupt中斷函數聲明定義一個中斷服務函數large存儲器模式按large模式分配變量的存儲空間pdata存儲器類型聲明分頁尋址的51外部數據空間sbit位變量聲明聲明一個位變量sfr特殊功能寄存器聲明聲明一個8位特殊功能寄存器sfr16特殊功能寄存器聲明聲明一個16位特殊功能寄存器small存儲器模式按small模式分配變量的存儲空間using寄存器組定義定義MCS-51的工作寄存器組xdata存儲器類型聲明定義MCS-51外部數據空間idata存儲器類型聲明間接尋址MCS-51的內部數據寄存器123、C51程序結構和標準C程序結構相同,采用函數結構每個C51程序由一個或多個函數組成,在這些函數中至少應包含一個主函數main(),也可以包含一個main()函數和若干個其它的功能函數。程序的執行總是從main()函數開始的,其位置無特殊規定。程序的開始部分一般是預處理命令、函數說明和變量定義等。3、C51程序結構和標準C程序結構相同,采用函數結構13預處理命令include<>函數說明longfun1(); floatfun2(); intx,y; floatz;功能函數1fun1(){函數體…}功能函數2fun2(){函數體…}主函數main(){主函數體…}預處理命令include<>14實例簡單控制指示燈功能要求:系統啟動后,當按下一個按鈕開關后再閃爍5次后熄滅。以后每次按下按鈕開關,發光二極管都會閃爍5次。實例簡單控制指示燈功能要求:15硬件設計:硬件設計:16實際動手:實際動手:17仿真:(Proteus)仿真:(Proteus)18C程序(續):#include<reg52.h>#include<stdio.h>sbitp10=P1^0;sbitp20=P2^0;voiddelay(unsignedinti);voidmain(){intn,c;P1=0xff;P2=0xff;C程序(續):#include<reg52.h>19C程序(續):if(p20==0){c=1;}if(c==1){n=5;while(n>0){p10=0;delay(10000000);p10=1;delay(10000000);n--;}c=0;}}C程序(續):if(p20==0)20C程序(續):voiddelay(unsignedinti){unsignedintj;for(j=0;j<i;j++){}}C程序(續):voiddelay(unsignedi21匯編程序org0000hsjmpmainorg0030hmain:movp2,#0ffhmovc,p2.0 jcmainmovr0,#5hloop:movp1,#00h acalldelay movp1,#0ffh acalldelay djnzr0,loop sjmpmain匯編程序org0000h22匯編程序delay:movr1,#05hnext2:movr2,#0ffhnext1:movr3,#0FFh djnzr3,$ djnzr2,next1 djnzr1,next2 retend匯編程序delay:movr1,#05h23二、C51的數據類型基本數據類型長度取值范圍unsignedchar1字節0~255signedchar1字節-128~+127unsignedint2字節0~65535signedint2字節-32768~+32767unsignedlong4字節0~4294967295signedlong4字節-2147483648~+2147483647float4字節1.175494E-38~3.402823E+38bit1位0或1sbit1位0或1sfr1字節0~255sfr162字節0~65535二、C51的數據類型基本數據類型長度取值范圍unsigned24特殊功能寄存器型這是C51擴充的數據類型,用于訪問MCS-51單片機中的特殊功能寄存器數據,它分sfr和sfr16兩種類型。sfr為字節型特殊功能寄存器類型,占一個內存單元;sfr16為雙字節型特殊功能寄存器類型,占用兩個字節單元。利用它們可以訪問MCS-51內部的所有兩個字節的特殊功能寄存器。在C51中對特殊功能寄存器的訪問必須先用sfr或sfr16進行聲明。特殊功能寄存器型這是C51擴充的數據類型,用于訪問MCS-525位類型這也是C51中擴充的數據類型,用于訪問MCS-51單片機中的可尋址的位單元。在C51中,支持兩種位類型:bit型和sbit型。它們在內存中都只占一個二進制位,其值可以是“1”或“0”。其中用bit定義的位變量在C51編譯器編譯時,在不同的時候位地址是可以變化的,而用sbit定義的位變量必須與MCS-51單片機的一個可以尋址位單元或可位尋址的字節單元中的某一位聯系在一起,在C51編譯器編譯時,其對應的位地址是不可變化的。位類型這也是C51中擴充的數據類型,用于訪問MCS-51單片26三、C51的運算量與存儲類型1、常量2、變量3、存儲模式4、絕對地址的訪問5、對特殊功能寄存器的訪問6、對并行口的訪問7、對位地址的訪問三、C51的運算量與存儲類型1、常量271、常量常量是指在程序執行過程中其值不能改變的量。C51中支持整型常量、浮點型常量、字符型常量和字符串型常量。1、常量常量是指在程序執行過程中其值不能改變的量。28(1)整型常量

C51中整型常量可以表示成以下幾種形式:十進制整數。如234、-56、0等。十六進制整數。以0x開頭表示,如0x12表示十六進制數12H。長整數。在C51中當一個整數的值達到長整型的范圍,則該數按長整型存放,在存儲器中占四個字節,另外,如一個整數后面加一個字母L,這個數在存儲器中也按長整型存放。如123L在存儲器中占四個字節。(1)整型常量29(2)浮點型常量

浮點型常量也就是實型常數。有十進制表示形式和指數表示形式。十進制表示形式又稱定點表示形式,由數字和小數點組成。如0.123、34.645等都是十進制數表示形式的浮點型常量。指數表示形式為:

[]數字[.數字]e[]數字例如:123.456e-3、-3.123e2等都是指數形式的浮點型常量。(2)浮點型常量30(3)字符型常量字符型常量是加單引號的字符,如‘a’、‘1’、‘F’等。可以是可顯示的ASCII字符,也可以是不可顯示的控制字符。對不可顯示的控制字符須在前面加上反斜杠“\”組成轉義字符。利用它可以完成一些特殊功能和輸出時的格式控制。常用的轉義字符如課本P73表4-4所示。

(3)字符型常量31表4.4常用轉義字符轉義字符含義ASCII碼\0空字符(null)00H\n換行符(LF)0AH\r回車符(CR)0DH\t水平制表符(HT)09H\b退格符(BS)08H\f換頁符(FF)0CH\‘單引號27H\”雙引號22H\\反斜杠5CH表4.4常用轉義字符轉義字符含義ASCII碼\0空32(4)字符串型常量字符串型常量由雙引號“”括起的字符組成。如“D”、“1234”、“ABCD”等。字符串常量與字符常量是不一樣的,一個字符常量在計算機內只用一個字節存放,而一個字符串常量在內存中存放時不僅雙引號內的字符一個占一個字節,而且系統會自動的在后面加一個轉義字符“\0”作為字符串結束符。因此不要將字符常量和字符串常量混淆,如字符常量‘A’和字符串常量“A”是不一樣的。(4)字符串型常量332、變量在C51中,變量在使用前必須對變量進行定義,指出變量的數據類型和存儲模式。以便編譯系統為它分配相應的存儲單元。定義的格式如下:[存儲種類]數據類型[存儲器類型]變量名表2、變量在C51中,變量在使用前必須對變量進行定義,指出變34(1)存儲種類存儲種類是指變量在程序執行過程中的作用范圍。C51變量的存儲種類有四種,分別是自動(auto)、外部(extern)、靜態(static)和寄存器(register)。如果省略存儲種類,則該變量默認為自動(auto)變量。(1)存儲種類存儲種類是指變量在程序執行過程中的作用范圍。35(2)數據類型說明符

數據類型說明符:指明變量的數據類型,指明變量在存儲器中占用的字節數。可以是基本數據類型說明符,也可以是組合數據類型說明符,還可以是用typedef或#define定義的類型別名。在C51中,為了增加程序的可讀性,允許用戶為系統固有的數據類型說明符用typedef或#define起別名,格式如下:

typedefc51固有的數據類型說明符別名;或

#define別名C51固有的數據類型說明符;定義別名后,就可以用別名代替數據類型說明符對變量進行定義。別名可以用大寫,也可以用小寫。(2)數據類型說明符36例如:#defineuchar

unsignedchar

#defineuint

unsignedint

這樣,在編程中,就可以用uchar代替unsignedchar,用uint代替unsignedint來定義變量。例如:37(3)存儲器類型存儲器類型:是指定義變量時,根據51單片機存儲器的特點,指明該變量所處的單片機的內存空間。MCS-51單片機的存儲區主要有:片內數據存儲器,特殊功能寄存器、片外數據存儲器、片內程序存儲器和片外程序存儲器。使用匯編指令訪問時,使用不同的指令和不同的尋址方式即可區分。在C51中,則要通過定義存儲器類型來加以說明。(3)存儲器類型存儲器類型:是指定義變量時,根據51單片機存38(3)存儲器類型C5l編譯器支持MCS-51單片機的硬件結構,可完全訪問MCS-51硬件系統的所有部分。編譯器通過將變量或者常量定義成不同的存儲類型(data,bdata,idata,pdata,xdata,code)的方法,將它們定位在不同的存儲區中。(3)存儲器類型C5l編譯器支持MCS-51單片機的硬件結構39存儲類型

與存儲空間的對應關系

data直接尋址片內數據存儲區,訪問速度快(128字節)bdata可位尋址片內數據存儲區,允許位與字節混合訪問(16字節)idata間接尋址片內數據存儲區,可訪問片內全部RAM地址空間(256字節)由MOV@R0,A指令訪問

pdata分頁尋址片外數據存儲區(256字節)由MOVX@R0,A指令訪問

xdata片外數據存儲區(64K),由MOVX@DPTR,A指令訪問

code代碼存儲區(64K),由MOVCA,@A+DPTR指令訪問

表C51存儲器類型存儲類型與存儲空間的對應關系data直接尋址片內數據存40(3)存儲器類型若未定義存儲類型,則C51編譯器自動選擇默認存儲器類型。默認的存儲器類型與C51的存儲模式有關。存儲模式

默認的存儲器類型

SMALL默認為data,最大為128字節

COMPACT默認為pdata,每頁256字節

LARGE默認為xdata,最大為64K(3)存儲器類型若未定義存儲類型,則C51編譯器自動選擇默認41(4)變量名表變量名表格式:

變量名1[=初值],變量名2[=初值],...在C51中規定變量名可以由字母、數字和下劃線三種字符組成,且第一個字母必須為字母或下劃線。變量名有兩種:普通變量名和指針變量名。指針變量名前面要帶“*

”號。(4)變量名表變量名表格式:42例:定義變量chari,j,k;unsignedintxdatam,n;unsignedpdata*dp1;longcount;sfrP1=0x90;例:定義變量chari,j,k;433、存儲模式如果在變量定義時省略了存儲器類型標識符,C51編譯器會選擇默認的存儲器類型。默認的存儲器類型由存儲模式決定。存儲模式是編譯器的編譯選項。可在軟件中設置,或用預處理命令設置。C51的存儲模式(memorymodels)有三種:SMALL、COMPACT和LARGE。3、存儲模式如果在變量定義時省略了存儲器類型標識符,C51編443、存儲模式(1)小模式(smallmodel)。在小模式下,所有未聲明存儲器類型的變量,都默認駐留在內部數據區,即這種方式和用DATA進行顯示說明一樣。(2)緊湊模式(compactmodel)。在緊湊模式下,所有未聲明存儲器類型的變量,都默認駐留在外部數據區的一個頁上。即這種方式和用PDATA進行變量存儲器類型的說明是一樣的。該模式利用R0和R1寄存器來進行間接尋址(@R0和@Rl)。3、存儲模式(1)小模式(smallmodel)。在小模453、存儲模式(3)大模式(largemodel)。在大模式下,所有未聲明存儲器類型的變量,都默認駐留在外部數據存儲區,即和用XDATA進行顯示說明一樣。此時最大可尋址64KB的存儲區域,使用數據指針寄存器(DPTR)來進行間接尋址。3、存儲模式(3)大模式(largemodel)。在大模式463、存儲模式設定存儲模式的預處理命令:#pragmasmall#pragmacompact#pragmalarge3、存儲模式設定存儲模式的預處理命令:474、絕對地址的訪問(1)使用預定義宏訪問(2)使用指針訪問(3)使用_at_關鍵字訪問4、絕對地址的訪問(1)使用預定義宏訪問48(1)使用預定義宏訪問

C51編譯器提供了一組宏定義來對51系列單片機的code、data、pdata和xdata空間進行絕對尋址。規定只能以無符號數方式訪問,定義了8個宏定義,其函數原型放在absacc.h文件中。使用時須用預處理命令把該頭文件包含到文件中,形式為:

#include<absacc.h>這些宏定義函數原型如下:(1)使用預定義宏訪問C51編譯器提供了一組宏定義來對549#defineCBYTE((unsignedcharvolatile*)0x50000L)#defineDBYTE((unsignedcharvolatile*)0x40000L)#definePBYTE((unsignedcharvolatile*)0x30000L)#defineXBYTE((unsignedcharvolatile*)0x20000L)#defineCWORD((unsignedintvolatile*)0x50000L)#defineDWORD((unsignedintvolatile*)0x40000L)#definePWORD((unsignedintvolatile*)0x30000L)#defineXWORD((unsignedintvolatile*)0x20000L)說明:Cxxxx:code區,Dxxxx:data區,Pxxxx:pdata區,Xxxxx:xdata區。BYTE:以字節形式尋址,WORD:以字形式尋址。#defineCBYTE((unsignedchar50(1)使用預定義宏訪問使用預定義宏訪問絕對地址的形式如下:

宏名[地址]如:

DBYTE[0x0030]

XWORD[0x0005](1)使用預定義宏訪問使用預定義宏訪問絕對地址的形式如下:51#include<absacc.h>#include<reg52.h>#defineucharunsignedchar#defineuintunsignedintvoidmain(void){ucharvar1;uintvar2;var1=XBYTE[0x0005];/*訪問片外RAM的0005字節單元*/var2=XWORD[0x0000];/*訪問片外RAM的0000字單元*/XWORD[0x0000]=0xAABB;/*將0xAABB送入片外RAM的0000H~0001H單元中*/......while(1);}#include<absacc.h>52(2)使用指針訪問采用指針的方法,可以在C51程序中對任意指定的存儲器單元進行訪問。方法:先定義,后賦絕對地址值(2)使用指針訪問采用指針的方法,可以在53#defineucharunsignedchar#defineuintunsignedintvoidtest_memory(void){ucharidataivar1;ucharxdata*xdp;/*定義一個指向xdata區的指針*/chardata*dp;/*定義一個指向data區的指針*/ucharidata*idp;/*定義一個指向idata區的指針*/xdp=0x1000;/*xdp指針賦值指向xdata區的1000H單元*/*xdp=0x5A;/*數據5AH送到xdata區的1000H單元*/dp=0x61;/*dp指針賦值指向data區61H單元*/*dp=0x23;/*將數據23H送到data區61H單元*/idp=&ivar1;/*idp指針指向idata區的ivar1變量*/*idp=0x16;/*數據16H送到idata區的變量ivar1所在的地址單元中,等價于ivar1=0x16*/}#defineucharunsignedchar54(3)使用_at_關鍵字訪問格式如下:[存儲器類型]數據類型說明符變量名_at_地址常數;說明:地址常數應在有效地址范圍內用_at_定義的變量必須是全局變量(3)使用_at_關鍵字訪問格式如下:55#defineucharunsignedchar#defineuintunsignedintdataucharx1_at_0x40;/*在data區中定義字節變量x1,它的地址為40H*/xdatauintx2_at_0x2000;/*在xdata區中定義字變量x2,它的地址為2000H*/voidmain(void){x1=0xff;x2=0x1234;......while(1);}#defineucharunsignedchar565、對特殊功能寄存器的訪問如果不作定義,對51單片機的特殊功能寄存器只能用直接尋址方式訪問。為了能用名字直接訪問這些特殊功能寄存器,C51提供了定義方法。可分為以下兩種方法: (1)用sfr/sfr16數據類型訪問特殊功能寄存器 (2)用sbit數據類型訪問特殊位5、對特殊功能寄存器的訪問如果不作定義,對51單片機的特殊功57(1)用sfr/sfr16數據類型訪問訪問特殊功能寄存器可用數據類型定義的方法來實現。格式如下:sfr/sfr16特殊功能寄存器名=地址;說明:特殊功能寄存器名必須大寫。sfr定義8位寄存器;sfr16定義16位寄存器。定義之后,就可以程序中直接引用寄存器名了。標準SFR在reg51.h等頭文件中已經定義好,只要用#include包含命令申明即可使用。(1)用sfr/sfr16數據類型訪問訪問特殊功能寄存器可用58(1)用sfr/sfr16數據類型訪問定義舉例:(地址可在表2.4中查出)sfrPSW=0xd0;sfrSCON=0x98;sfrTMOD=0x89;sfrP1=0x90;sfr16DPTR=0x82;sfr16T1=0X8A;

(1)用sfr/sfr16數據類型訪問定義舉例:(地址可在表59(2)用sbit數據類型訪問特殊位MCS-51單片機內21個特殊功能寄存器中,共有11個特殊功能寄存器是可位尋址的。訪問這些特殊位可用關鍵字sbit定義數據類型來實現。格式如下:

sbit特殊功能寄存器位名=位地址;其中,位地址有3種表示方法:特殊功能寄存器名^位號(如:P1^0)特殊功能寄存器地址^位號(如:0xD0^0)特殊功能寄存器絕對位地址(如:0xD7)(2)用sbit數據類型訪問特殊位MCS-51單片機內21個60(2)用sbit數據類型訪問特殊位定義舉例:sfrPSW=0xD0;sbitOV=PSW^2;sbitAC=0xD0^2;sbitCY=0xD7;(2)用sbit數據類型訪問特殊位定義舉例:61(2)用sbit數據類型訪問特殊位程序中的例子:#include<reg51.h>sbitP10=P1^0;sbitP12=P1^2;voidmain(){P10=1;P12=0;...}(2)用sbit數據類型訪問特殊位程序中的例子:626、對并行口的訪問(1)內部并口用sfr定義(前面已介紹,略)(2)外部并口對片外擴展的并口,應根據其硬件譯碼地址,將其看作片外數據存儲器的一個單元,使用#define語句進行定義。定義時用絕對地址定義,絕對地址定義在absacc.h頭文件中。6、對并行口的訪問(1)內部并口636、對并行口的訪問例:操作片外并口#include<absacc.h>#definePAXBYTE[0xffec]voidmain(){PA=0x30;/*將數據30H寫入地址為0xffec的存儲單元或I/O端口*/}6、對并行口的訪問例:操作片外并口647、對位地址的訪問C51中可使用bit和sbit數據類型對位地址進行訪問。bit定義格式如下:bit位變量名;例:bitdataa1;bitbdataa2;7、對位地址的訪問C51中可使用bit和sbit數據類型對位65四、C51的運算符和表達式1.賦值運算符2.算術運算符3.自增自減運算符4.關系運算符5.邏輯運算符6.位運算符7.復合運算符8.對指針操作的運算符9.條件運算符四、C51的運算符和表達式1.賦值運算符66四、C51的運算符和表達式1.賦值運算符

賦值運算符=在C中它的功能是給變量賦值,如x=10。賦值表達式后面加“;”號就構成了一個賦值表達式語句。四、C51的運算符和表達式1.賦值運算符67四、C51的運算符和表達式2.算術運算符C51中的算術運算符如下:+加或取正值運算符–減或取負值運算符*乘運算符/除運算符%模(取余)運算符,如8%5=3,即8除以5的余數是3四、C51的運算符和表達式2.算術運算符683.自增自減運算符

自增:++自減:––自增自減運算符可用在操作數之前,也可放在其后,例如“x=x+1”既可以寫成“++x”,也可寫成“x++”,其運算結果完全相同。但在表達式中這兩種用法是有區別的。四、C51的運算符和表達式3.自增自減運算符四、C51的運算符和表達式69四、C51的運算符和表達式例:x=99;

y=++x;則y=100,x=100,如果程序改為:x=99;

y=x++;則y=99,x=100。在這兩種情況下,x都被置為100。一般來說,用自增和自減操作生成的程序代碼比等價的賦值語句生成的代碼要快。四、C51的運算符和表達式例:70四、C51的運算符和表達式4.關系運算符C51中有6種關系運算符:

>大于<小于>=大于等于<=小于等于==測試等于!=測試不等于

關系和邏輯運算符的優先級比算術運算符低,例如表達式“10>x+12”的計算,應看作是“10>(x+12)”。四、C51的運算符和表達式4.關系運算符71四、C51的運算符和表達式5.邏輯運算符 邏輯與:&&

邏輯或:|| 邏輯非:!用法: 邏輯與:條件式1&&條件式2。 邏輯或:條件式1||條件式2。 邏輯非:!條件式。四、C51的運算符和表達式5.邏輯運算符72四、C51的運算符和表達式例如,當a=7,b=6,c=0時,則: !a=0, !c=1。 a&&b=1; !a&&b=0; b||c=1。 (a>0)&&(b>3)=1; (a>8)&&(b>0)=0。四、C51的運算符和表達式例如,當a=7,b=6,73四、C51的運算符和表達式6.位運算符位運算符的作用是按位對變量進行運算,但并不改變參與運算的變量的值。位運算符不能用來對浮點型數據進行操作。位運算一般的表達形式如下:

變量1位運算符變量2

四、C51的運算符和表達式6.位運算符74四、C51的運算符和表達式6.位運算符 C51中共有6種位運算符:

&按位與 |按位或

^按位異或 ~按位取反 <<左移 >>右移四、C51的運算符和表達式6.位運算符75四、C51的運算符和表達式6.位運算符位運算符也有優先級,從高到低依次是:

~(按位取反) <<(左移) >>(右移) &(按位與) ^(按位異或) |(按位或)四、C51的運算符和表達式6.位運算符76四、C51的運算符和表達式如:已知a=0x54=01010100B,b=0x3b=00111011B,則:a&b=00010000;a|b=01111111;a^b=01101111;~a=10101011;a<<2=01010000;b>>1=00011101。四、C51的運算符和表達式如:已知a=0x54=0177四、C51的運算符和表達式7.復合運算符復合運算符就是在賦值運算符“=”的前面加上其他運算符。以下是C51語言中的復合賦值運算符: +=加法賦值>>=右移位賦值 -=減法賦值&=邏輯與賦值 *=乘法賦值|=邏輯或賦值 /=除法賦值^=邏輯異或賦值 %=取模賦值~=邏輯非賦值 <<=左移位賦值四、C51的運算符和表達式7.復合運算符78四、C51的運算符和表達式7.復合運算符其含義就是變量與表達式先進行運算符所要求的運算,再把運算結果賦值給參與運算的變量。其實這是C語言中簡化程序的一種方法,凡是二目運算都可以用復合賦值運算符去簡化表達。例如:a+=56等價于a=a+56y/=x+9等價于y=y/(x+9)。四、C51的運算符和表達式7.復合運算符79四、C51的運算符和表達式8.對指針操作的運算符

& 取地址運算符 * 取內容運算符 &又能用于按位與,此時“&”的兩邊必須有操作對象。 *還可作為指針變量的標志,但此時一定出現在對指針定義中。四、C51的運算符和表達式8.對指針操作的運算符80四、C51的運算符和表達式9.條件運算符

C51條件運算符

?:

條件運算符是C51語言中唯一的一個三目運算符,它要求有三個運算對象,用它可以將三個表達式連接在一起構成一個條件表達式。條件表達式的一般格式為:

邏輯表達式?表達式1:表達式2四、C51的運算符和表達式9.條件運算符81四、C51的運算符和表達式

9.條件運算符

邏輯表達式?表達式1:表達式2其功能是先計算邏輯表達式的值,當邏輯表達式的值為真(非0值)時,將計算的表達式1的值作為整個條件表達式的值;當邏輯表達式的值為假(0值)時,將計算的表達式2的值作為整個條件表達式的值。例如:條件表達式max=(a>b)?a:b的執行結果是將a和b中較大的數賦值給變量max。四、C51的運算符和表達式9.條件運算符82五、表達式語句與復合語句1、C51基本書寫規則書寫格式相對自由,一行可以寫若干條語句,一個語句也可以寫成幾行,每個語句須以分號“;”結尾。C語言是區分大小寫的一種高級語言。使用標識符和關鍵詞時須注意大小寫。每個變量必須先說明后引用程序的注釋用/*......*/或//......表示。函數語句塊寫在大括號{}里面。表達式寫在小括號()里面。五、表達式語句與復合語句1、C51基本書寫規則83五、表達式語句與復合語句2、表達式語句在表達式的后邊加一個分號“;”就構成了表達式語句,如:

a=++b*9; x=8;y=7;可以一行放一個表達式形成表達式語句,也可以一行放多個表達式形成表達式語句,這時每個表達式后面都必須帶“;”號,另外,還可以僅由—個分號“;”占一行形成一個表達式語句,這種語句稱為空語句。五、表達式語句與復合語句2、表達式語句84五、表達式語句與復合語句3、復合語句

復合語句是由若干條語句組合而成的一種語句,在C51中,用一個大括號“{}”將若干條語句括在一起就形成了一個復合語句,復合語句最后不需要以分號“;”結束,但它內部的各條語句仍需以分號“;”結束。復合語句的一般形式為:

{局部變量定義;語句l;語句2;}五、表達式語句與復合語句3、復合語句85六、C51的輸入/輸出在C51語言中,它本身不提供輸入和輸出語句,輸入和輸出操作是由函數來實現的。在C51的標準函數庫中提供了一個名為“stdio.h”的一般I/O函數庫,它當中定義了C51中的輸入和輸出函數。當對輸入和輸出函數使用時,須先用預處理命令“#include<stdio.h>”將該函數庫包含到文件中。C51中,輸入/輸出函數較少使用。六、C51的輸入/輸出在C51語言中,它本身不提供輸入和輸出86七、C51的程序結構C51語言可分為三種基本結構:順序結構選擇結構循環結構七、C51的程序結構C51語言可分為三種基本結構:87七、C51的程序結構1、順序結構順序結構是指程序按語句的先后順序逐句執行,是最基本、最簡單的一種程序結構。

[例]求圓面積和周長的程序。#include”stdio.h”#definePI3.14main() {floatr,s,y;/*定義三個浮點型變量*/ r=30; s=PI*r*r; y=2*PI*r; }七、C51的程序結構1、順序結構88七、C51的程序結構2、選擇結構在C51中,實現選擇結構的語句有:if/else,if/elseif語句switch/case語句七、C51的程序結構2、選擇結構89(1)if語句if語句通常有三種格式:1)if(表達式){語句;}2)if(表達式){語句1;}else{語句2;}3)if(表達式1){語句1;}elseif(表達式2)(語句2;)elseif(表達式3)(語句3;)……elseif(表達式n-1)(語句n-1;)else

{語句n}(1)if語句if語句通常有三種格式:90[例1]從鍵盤輸入兩實數,然后按值的大小順序輸出#include”stdio.h”main(){floata,b,t; scanf(“%f,%f”,&a,&b);if(a>b) {t=a;a=b;b=t} printf(“%5.2f,%5.2f”,a,b);}[例1]從鍵盤輸入兩實數,然后按值的大小順序輸出#i91[例2]雙分支if(x=1) y=x+5; else y=x*5;[例2]雙分支if(x=1)92(2)switch/case語句switch是C51中提供的專門處理多分支結構的多分支選擇語句。它的格式如下:switch(表達式){case常量表達式1:{語句1;}break;case常量表達式2:{語句2;}break;……case常量表達式n:{語句n;}break;default:{語句n+1;}(2)switch/case語句switc93[例]多分支switch(score) { case10: case9:g=’A’;break; case8:g=’B’;break; case7:g=’C’;break; case6:g=’D’;break; case5: case4: case3: case2: case1: case0:g=’E’; }[例]多分支switch(score)94七、C51的程序結構3、循環結構實現循環結構的語句主要有:while語句dowhile語句for語句七、C51的程序結構3、循環結構95(1)while語句while語句在C51中用于實現當型循環結構,它的格式如下:

while(表達式){語句;}(1)while語句while語句在C596[例]求1十2十3十…100的和。inti,sum=0; i=1; while(i<=100) { sum=sum+i; i++; }[例]求1十2十3十…100的和。int97(2)dowhile語句dowhile語句在C51中用于實現直到型循環結構,它的格式如下:do{語句;}while(表達式);(2)dowhile語句dow98[例]求1十2十3十…100的和。int i,sum=0;i=1; do { sum=sum+i; i++; } while(i<=100);[例]求1十2十3十…100的和。int i99(3)for語句for語句可以方便地實現計數循環,格式如下:for(表達式1;表達式2;表達式3){語句;}[例]求1十2十3十…100的和。intt,sum=0;for(i=1;i<100;i++)sum=sum+i;(3)for語句for語句可以方便地實現100(4)break和continue語句break語句break語句可以跳出switch結構,使程序繼續執行switch結構后面的一個語句。break語句還可以從循環體中跳出循環,提前結束循環而接著執行循環結構下面的語句。(4)break和continue語句break語句101【例4-19】下面一段程序用于計算圓的面積,當計算到面積大于100時,由break語句跳出循環。for(r=1;r<=10;r++){area=pi*r*r;if(area>100)break;}【例4-19】下面一段程序用于計算圓的面積,當計算到面積大于102break和continue語句continue語句用在循環結構中,用于結束本次循環,跳過循環體中continue下面尚未執行的語句,直接進行下一次是否執行循環的判定。break和continue語句continue語句103【例4-20】輸出100~200間不能被3整除的數。

for(i=100;i<=200;i++){if(i%3==0)continue;printf(“%d”;i);}【例4-20】輸出100~200間不能被3整除的數。104(5)goto語句goto語句的格式為:

goto語句標號;goto語句是無條件轉移語句,它將程序運行的流向轉到指定的標號處。(5)goto語句goto語句的格式為:105八、函數1、函數的定義函數定義的一般格式如下:函數類型函數名(形式參數表)[interruptn][usingn]形式參數說明{ 局部變量定義 函數體(有返回值的要有return語句)}八、函數1、函數的定義106例: delay(intt)/*延時函數*/ {inti,j;/*采用默認的存儲類型*//*用雙重空循環延時*/ for(i=0;i<t;i++) for(j=0;j<10;j++); }例: delay(intt)/*延時函數*/1071、函數的定義格式說明:(1)函數類型函數類型說明了函數返回值的類型。(2)函數名函數名是用戶為自定義函數取的名字以便調用函數時使用。(3)形式參數表形式參數表用于列錄在主調函數與被調用函數之間進行數據傳遞的形式參數。1、函數的定義格式說明:108(4)interruptn修飾符interruptn是C51函數中非常重要的一個修飾符,這是因為中斷函數必須通過它進行修飾。在C51程序設計中,當函數定義時用了interruptn修飾符,系統編譯時把對應函數轉化為中斷函數,自動加上程序頭段和尾段,并按MCS-51系統中斷的處理方式自動把它安排在程序存儲器中的相應位置。(4)interruptn修飾符109(4)interruptn修飾符其中,n的取值為0~31,對應的中斷情況如下:0——外部中斷01——定時/計數器T02——外部中斷13——定時/計數器T14——串行口中斷5——定時/計數器T2其它值預留。(4)interruptn修飾符其中,n的取值為0~3110編寫MCS-51中斷函數注意如下:1)中斷函數不能進行參數傳遞,如果中斷函數中包含任何參數聲明都將導致編譯出錯。2)中斷函數沒有返回值,如果企圖定義一個返回值將得不到正確的結果,建議在定義中斷函數時將其定義為void類型,以明確說明沒有返回值。3)在任何情況下都不能直接調用中斷函數,否則會產生編譯錯誤。因為中斷函數的返回是由8051單片機的RETI指令完成的,RETI指令影響8051單片機的硬件中斷系統。如果在沒有實際中斷情況下直接調用中斷函數,RETI指令的操作結果會產生一個致命的錯誤。編寫MCS-51中斷函數注意如下:1114)使用C51編寫中斷服務程序,程序員無需關心ACC、B、DPH、DPL、PSW等寄存器的保護,C51編譯器會根據上述寄存器的使用情況在目標代碼中自動增加壓棧和出棧。4)使用C51編寫中斷服務程序,程序員無需關心ACC、B、D112例:一個定時器中斷服務程序voidTimer_Initial(void){TMOD=0x01;//timer0,mode1;

TH0=(65535-50000)/256;TL0=(65535-50000)%256;//50msET0=1;//openthetimerisrTR0=1;//beginthecounterEA=1;}例:一個定時器中斷服務程序voidTimer_Initia113voidTimer_ISR(void)interrupt1{staticintnum=0;

TH0=(65535-50000)/256;TL0=(65535-50000)%256;//50msnum++;if(num>=20){num=0;……….}}voidTimer_ISR(void)interrup114(5)函數返回值返回語句return用來回送一個數值給定義的函數,從函數中退出。返回值是通過return語句返回的。返回值的類型如果與函數定義的類型不一致,那么返回值將被自動轉換成函數定義的類型。如果函數無須返回值,可以用void類型說明符指明函數無返回值。(5)函數返回值返回語句return用來回送一個數值給定義的115例:intadd(intc,intd,inte,intf){intresult;result=max(c,d)+max(e,f);//調用函數maxreturn(result);}例:intadd(intc,intd,int116(6)usingn修飾符修飾符usingn用于指定本函數內部使用的工作寄存器組,其中n的取值為0~3,表示寄存器組號。對于usingn修飾符的使用,注意以下幾點:

1)加入usingn后,C51在編譯時自動的在函數的開始處和結束處加入以下指令。

{

PUSHPSW;標志寄存器入棧

MOVPSW,#與寄存器組號相關的常量

……

POPPSW;標志寄存器出棧

}(6)usingn修飾符修飾符usingn用于指定117(6)usingn修飾符2)usingn修飾符不能用于有返回值的函數,因為C51函數的返回值是放在寄存器中的。如寄存器組改變了,返回值就會出錯。(6)usingn修飾符2)usingn修1182、函數的調用與聲明函數調用的一般形式如下:

函數名(實參列表);2、函數的調用與聲明函數調用的一般形式如下:1192、函數的調用與聲明被調用的函數必須是已經存在的函數。按照函數調用在主調函數中出現的位置,函數調用方式有以下三種:(1)函數作為語旬。把函數調用作為一個語句,不使用函數返回值,只是完成函數所定義的操作。例如:refresh_led();2、函數的調用與聲明被調用的函數必須是已120(2)函數作為表達式。函數調用出現在一個表達式中,使用函數的返回值。intk;k=sum(a,b);(3)函數作為一個參數。函數調用作為另一個函數的實參。intk;k=sum(sum(a,b),c);(2)函數作為表達式。函數調用出現在一個表達式中,使用函數的121函數的聲明與使用變量一樣,在調用一個函數之前,必須對該函數進行聲明。函數聲明的一般格式為[extern]

函數類型函數名(形式參數列表)函數定義時參數列表中的參數稱為形式參數,簡稱形參。函數調用時所使用的替換參數,是實際參數,簡稱實參。定義的形參與函數調用的實參類型應該一致,書寫順序應該相同。函數的聲明與使用變量一樣,在調用一個函122如果聲明的函數在文件內部,則聲明時不用extern,如果聲明的函數不在文件內部,而在另一個文件中,聲明時須帶extern,指明使用的函數在另一個文件中。如果聲明的函數在文件內部,則聲明時不用extern,如果聲明1233、函數的嵌套與遞歸1)函數的嵌套在一個函數的調用過程中調用另一個函數。2)函數的遞歸自身調用。因51單片機的RAM空間小,嵌套與遞歸的深度都較小。遞歸一般較少使用。3、函數的嵌套與遞歸1)函數的嵌套124九、C51構造數據類型數組指針結構聯合枚舉因51單片機存儲器容量較小,以上數據類型中較常用的有數組和指針,其余較少使用。九、C51構造數據類型數組125十、C編程與單片機開發板使用實例使用51單片機,用4個按鍵來控制4個LED燈的亮滅,當按鍵K1按下時,LED1發光;K2被按下時,LED2發光......K4被按下時,LED4發光。請編程并使用單片機開發板實現。十、C編程與單片機開發板使用實例使用51單片機,用4個按鍵來126#include<reg51.h>sbitp30=P3^0;sbitp31=P3^1;sbitp32=P3^2;sbitp33=P3^3;sbitp00=P0^0;sbitp01=P0^1;sbitp02=P0^2;sbitp03=P0^3;voidmain(void){P3=0xFF;P0=0xFF;if(p33==0)p03=0;if(p32==0)p02=0;if(p31==0)p01=0;if(p30==0)p00=0;}#include<reg51.h>voidmain(vo127ENDEND128第4章

單片機C語言程序設計第4章

單片機C語言程序設計129主要內容一、C語言與MCS-51二、C51的數據類型三、C51的運算量與存儲類型四、C51的運算符和表達式五、表達式語句與復合語句六、C51的輸入/輸出七、C51的程序結構八、函數九、C51構造數據類型主要內容一、C語言與MCS-51130一、C語言與MCS-511、C語言與51單片機2、C51與標準C3、C51程序結構一、C語言與MCS-511、C語言與51單片機1311、C語言與51單片機C語言目前已成為電子工程師進行單片機系統開發時的常用編程語言。用C語言來編寫目標系統軟件,會大大縮短開發周期,且明顯地增加軟件的可讀性,便于改進和擴充。用C語言編寫的應用程序必須經單片機的C語言編譯器(簡稱C51),轉換生成單片機可執行的代碼程序。基于51系列單片機的C語言或C語言編譯器簡稱為C51語言或C51。1、C語言與51單片機C語言目前已成為電子工程師進行單片機系1321、C語言與51單片機用匯編程序設計MCS–51系列單片機應用程序時,必須要考慮其存儲器結構,尤其必須考慮其片內數據存儲器與特殊功能寄存器正確、合理的使用以及按實際地址處理端口數據。用C語言編寫MCS–51單片機的應用程序,雖然不像用匯編語言那樣具體地組織、分配存儲器資源和處理端口數據,但在C語言編程中,對數據類型與變量的定義,必須要與單片機的存儲結構相關聯,否則編譯器不能正確地映射定位。1、C語言與51單片機用匯編程序設計MCS–51系列單片機應1331、C語言與51單片機支持MCS–51系列單片機的C語言編譯器有很多種。如AmericanAutomation、Avocet、BSO/TASKING、DUNFIELDSHAREWARE、KEIL、Franklin等。其中KEIL以它的代碼緊湊和使用方便等特點優于其它編譯器,目前用得最為普遍。1、C語言與51單片機支持MCS–51系列單片機的C語言編譯1342、C51與標準CC51的主要語法規定、程序結構及程序設計方法都與標準的C語言相同,但在某些方面有區別。具體地說,在以下幾個方面不一樣:(1)C51中定義的庫函數和標準C語言定義的庫函數不同。標準的C語言定義的庫函數是按通用微型計算機來定義的,而C51中的庫函數是按MCS-51單片機相應情況來定義的;(2)C51中的數據類型與標準C的數據類型也有一定的區別,在C51中還增加了幾種針對MCS-51單片機特有的數據類型;2、C51與標準CC51的主要語法規定、程序結構及程序設計方1352、C51與標準C(3)C51變量的存儲模式與標準C中變量的存儲模式不一樣,C51中變量的存儲模式是與MCS-51單片機的存儲器緊密相關的;(4)C51與標準C的輸入輸出處理不一樣,C51中的輸入輸出是通過MCS-51串行口來完成的,輸入輸出指令執行前必須要對串行口進行初始化;(5)C51與標準C在函數使用方面也有一定的區別,C51中有專門的中斷函數。2、C51與標準C(3)C51變量的存儲模式與標準C中變量的136表1ANSIC標準關鍵字關鍵字用途說明auto存儲種類說明用于聲明局部變量,為默認值break程序語句退出最內層循環體case程序語句switch語句中的選擇項char數據類型聲明單字節整型數或字符型數據const存儲種類說明在程序執行過程中不可修改的值continue程序語句轉向下一次循環default程序語句switch語句中缺省選擇項do程序語句構成do…while循環結構double數據類型聲明雙精度浮點數else程序語句構成if…else條件結構enum數據類型聲明枚舉類型數據extern存儲種類說明在其他程序模塊中聲明了的全局變量float數據類型聲明單精度浮點數for程序語句構成for循環結構goto程序語句構成goto循環結構if程序語句構成if…else條件結構int數據類型聲明整型數表1ANSIC標準關鍵字關鍵字用途說明auto存儲種137long數據類型聲明長整型數register存儲種類說明使用CPU內部寄存器變量return程序語句函數返回short數據類型聲明短整型signed數據類型聲明有符號整型數sizeof運算符計算表達式或數據類型的字節數static存儲種類說明靜態變量struct數據類型聲明結構體類型數據switch程序語句構成switch選擇結構typedef數據類型聲明重新進行數據類型定義union數據類型聲明聯合類型數據unsigned數據類型聲明無符號數據void數據類型聲明無類型數據或函數volatile數據類型聲明聲明該變量在程序執行中可被隱含地改變while程序語句構成while和do…while循環結構long數據類型聲明長整型數register存儲種類說明使用138表2C51編譯器擴充關鍵字關鍵字用途說明_at_地址定位為變量進行絕對地址定位_priority_多任務優先聲明規定RTX51或RTX51Tiny的任務優先級_task_任務聲明定義實時多任務函數alien函數特性聲明用于聲明與PL/M51兼容的函數bdata存儲器類型聲明可位尋址的MCS-51內部數據存儲器bit位變量聲明聲明一個位變量或位類型函數code存儲器類型聲明MCS-51的程序存儲空間compact存儲器模式按compact模式分配變量的存儲空間data存儲器類型聲明直接尋址MCS-51的內部數據寄存器表2C51編譯器擴充關鍵字關鍵字用途說明_at_地址定139idata存儲器類型聲明間接尋址MCS-51的內部數據寄存器interrupt中斷函數聲明定義一個中斷服務函數large存儲器模式按large模式分配變量的存儲空間pdata存儲器類型聲明分頁尋址的51外部數據空間sbit位變量聲明聲明一個位變量sfr特殊功能寄存器聲明聲明一個8位特殊功能寄存器sfr16特殊功能寄存器聲明聲明一個16位特殊功能寄存器small存儲器模式按small模式分配變量的存儲空間using寄存器組定義定義MCS-51的工作寄存器組xdata存儲器類型聲明定義MCS-51外部數據空間idata存儲器類型聲明間接尋址MCS-51的內部數據寄存器1403、C51程序結構和標準C程序結構相同,采用函數結構每個C51程序由一個或多個函數組成,在這些函數中至少應包含一個主函數main(),也可以包含一個main()函數和若干個其它的功能函數。程序的執行總是從main()函數開始的,其位置無特殊規定。程序的開始部分一般是預處理命令、函數說明和變量定義等。3、C51程序結構和標準C程序結構相同,采用函數結構141預處理命令include<>函數說明longfun1(); floatfun2(); intx,y; floatz;功能函數1fun1(){函數體…}功能函數2fun2(){函數體…}主函數main(){主函數體…}預處理命令include<>142實例簡單控制指示燈功能要求:系統啟動后,當按下一個按鈕開關后再閃爍5次后熄滅。以后每次按下按鈕開

溫馨提示

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

評論

0/150

提交評論