版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第二課C51的數(shù)據(jù)和數(shù)據(jù)類型(P55)2.1KEIL51數(shù)據(jù)類型位型(bit)字符型(char)有符號(hào)(signedchar)基本類型無符號(hào)(unsignedchar)數(shù)整型(int)有符號(hào)(signedint)無符號(hào)(unsignedint)據(jù)長(zhǎng)整型(long)有符號(hào)(signedlong)無符號(hào)(unsignedlong)類浮點(diǎn)型(float)雙精度浮點(diǎn)型(double)型數(shù)組類型(array)構(gòu)造類型結(jié)構(gòu)類型(struct)共同體(union)枚舉(enum)指針類型空類型2.2KEIL51數(shù)據(jù)類型數(shù)據(jù)類型長(zhǎng)度/bit長(zhǎng)度/byte值域charunsignedchar810?255signedchar81-128?+127intunsignedint1620?65535signedint162-32768?+32767longunsignedlong3240?4294967295signedlong324-2147483648?+2147483647float324±1.175494E-38?±3.402823E+38(6位數(shù)字)double648±1.175494E-38?±3.402823E+38(10位數(shù)字)一般指針*1?3bit10或1sbit10或1sfr810?255sfr161620?655352.3KEIL51數(shù)據(jù)的存儲(chǔ)類型與存儲(chǔ)空間的對(duì)應(yīng)關(guān)系數(shù)據(jù)存儲(chǔ)器存儲(chǔ)類型長(zhǎng)度byte與存儲(chǔ)空間的對(duì)應(yīng)關(guān)系片內(nèi)數(shù)據(jù)存儲(chǔ)器data1片內(nèi)RAM區(qū)低128字節(jié),訪問速度快bdata1片內(nèi)RAM位尋址區(qū)(20H?2FH),允許位與字節(jié)混合訪問idata1片內(nèi)間接尋址區(qū),可訪問片內(nèi)所有RAM地址空間(256字節(jié))
片外數(shù)據(jù)存儲(chǔ)器xdata2片外數(shù)據(jù)存儲(chǔ)區(qū)(64KB字節(jié))空間,由MOVX@DPTR訪問pdata2分頁尋址片外數(shù)據(jù)存儲(chǔ)區(qū)(256字節(jié))由MOVX@R0訪問片外程序存儲(chǔ)器code代碼存儲(chǔ)區(qū)(64KB字節(jié))由MOVC@DPTR訪問第三課KEIL51數(shù)據(jù)的存儲(chǔ)類型與存儲(chǔ)器結(jié)構(gòu)(P59)3.1Cx51系列單片機(jī)在物理上有四個(gè)存儲(chǔ)空間(見圖3-1)片內(nèi)程序存儲(chǔ)器空間片外程序存儲(chǔ)器空間片內(nèi)數(shù)據(jù)存儲(chǔ)器空間片外數(shù)據(jù)存儲(chǔ)器空間地址地址晶址地址FFFFH片外ROMFFHSFRFFH180HRAMFFH80HSFRrrrrn片外RAMFLASH80H30HRAM130HRAM164KB空間64KB空間20H位尋址區(qū)|20H位尋址區(qū)10000H00H工作寄存器口一3蛆!00H工作寄存囂口--3組|0000H89C5189C5289C51189C5289C5189C52h)、片內(nèi)數(shù)據(jù)存儲(chǔ)器靛、程序存儲(chǔ)器c).片外數(shù)據(jù)存儲(chǔ)器圖3-1既51單片機(jī)存儲(chǔ)器結(jié)構(gòu)注:使用片外程序存儲(chǔ)器時(shí),單片機(jī)引^PEA接地。即EA河3.2通用寄存器區(qū):地址(00H?1FH)(P60)組號(hào)PSW.4/RS1PSW.3/RS0地址00000H?07H10108H?0FH21010H?17H31118H?1FH3.3可位尋址區(qū)(20H?2FH)位地址:00H?7FH共128位(P61)RAM地址位地址2F7F7E7D7C7B7A79782E77767574737271702D6F6E6D6C6B6A69682C67666564636261602B5F5E5D5C5B5A59582A5756555453525150294F4E4D4C4B4A4948
284746454443424140273F3E3D3C3B3A3938263736353433323130252F2E2D2C2B2A2928242726252423222120231F1E1D1C1B1A1918221716151413121110210F0E0D0C0B0A09082007060504030201003.4、用戶RAM區(qū)Cx51單片機(jī)用戶RAM區(qū)(30H?7FH);Cx52單片機(jī)用戶RAM區(qū)(30H?FFH)。注:上電復(fù)位時(shí),堆棧指針SP指向07H,C51單片機(jī)的棧頂和棧底是從小到大在使用匯編語言時(shí),通常將棧頂定位在30H(MOVSP,#30H),在使用C語言編程時(shí)堆棧是系統(tǒng)自動(dòng)分配的,不需用戶考慮。3.5特殊功能寄存器(SFR)(P64)SFRMSB位地址/位定義LSB字節(jié)地址*BF0H*ACCE0H*PSWD7D6D5D4D3D2D1D0D0HCYACF0RS1RS0OVF1P*t2conCFCECDCCCBCAC9C8C8HTF2EXF2RCLKTCLKEXEN2TR2C/T2CP/RL2*IPBFBEBDBCBBBAB9B8B8H---PSPT1PX1PT0PX0*P3B7B6B5B4B3B2B1B0B0HP3.7/RDP3.6/WRP3.5/T1P3.4/T0P3.3/INT1P3.2/INT0P3.1/TXDP3.0/RXD*IEAFAEADACABAAA9A8A8HEA--ESET1EX1ET0EX0*P2A7A6A5A4A3A2A1A0A0HP2.7P2.6P2.5P2.4P2.3P2.2P2.1P2.0SBUF99H*SCON9F9E9D9C9B9A999898HSM0SM1SM2RENTB8RB8TIRI*P1979695949392919090HP1.7P1.6P1.5P1.4P1.3P1.2P1.1P1.0TH18DHTH08CHTL18BHTL08AHTMODGATEC/flM1M0GATEC/TOM1M089H*TCON8F8E8D8C8B8A898888HTF1TR1TF0TR0IE1IT1IE0IT0PCON87HDPH83HDPL82HSP81H*P0878685848382818080HP0.7P0.6P0.5P0.4P0.3P0.2P0.1P0.0注1:*表示可以進(jìn)行位操作注2:KEILCx51提供了一種自主形式的定義方法。這種定義引入關(guān)鍵字“sfr”,語法如下:sfrSCON=0x98;sfrTMOD=0x89;/*見頭文件reg51.h*/注3:定義datacharx與定義chardatax是等價(jià)的,但應(yīng)該盡量使用后一種方法。第四課常量和變量(P56)4.1、常量---在程序運(yùn)行的過程中,其值不能改變的量。與變量一樣,常量可以有不同的數(shù)據(jù)類型,可以用一個(gè)標(biāo)識(shí)符代表一個(gè)常量,習(xí)慣上常量標(biāo)識(shí)符用大寫字母,例:#defineCONST60/*即:CONST=60*/#definePAI3.1416/*即:PAI=3.1416*/4.2、變量---在程序運(yùn)行的過程中,其值可以改變的量。例:#defineCONST60main()(intvar1,result;var1=2;result=var1*CONST;while(1)}運(yùn)行結(jié)果result=1204.3、變量在存儲(chǔ)器中的物理排列(圖4-1)1)、位變量2)、整型變量3)、浮點(diǎn)型變量(1位符號(hào)位,8位指數(shù)位,23位尾數(shù)位)地址+0+1+2+3內(nèi)容SEEEEEEEEMMMMMMMMMMMMMMMMMMMMMMM其中,S符號(hào)位,1表示負(fù),0表示正;E:階碼(在兩個(gè)字節(jié)中)偏移為127;M:23位尾數(shù),最高位為“1”。一個(gè)整型變量值為0x1234,一個(gè)長(zhǎng)整型變量值為0x12345678,一個(gè)浮點(diǎn)變量值為-12.5的十六進(jìn)制為0xC1480000,它們?cè)趦?nèi)存的排列分別表示在4-1中(書2P52)
圖4-1變星存儲(chǔ)方式注1:AT89C51芯片中RAM只有低128位,而AT89C52芯片中RAM另外還有高128位,地址為80H到FFH,并和特殊寄存器SFR地址重疊。圖4-1變星存儲(chǔ)方式注2:在編寫程序時(shí),如是使用signed和unsigned兩種數(shù)據(jù)類型,那么就得使用兩種格式類型的庫函數(shù),這將使占用的存儲(chǔ)空間成倍增長(zhǎng),因此在編程時(shí),如是只強(qiáng)調(diào)程序的運(yùn)算速度而又不進(jìn)行負(fù)數(shù)運(yùn)算,最好采用無符號(hào)(unsigned)格式。注3:盡量使用位變量。注4:縮寫形式定義:typedefunsignedcharuchatypedefunsigneduintuint4.4存儲(chǔ)模式及說明(P63)存儲(chǔ)模式說明SMALL小模式參數(shù)及局部變量放入可直接尋址的片內(nèi)存儲(chǔ)器(最大128字節(jié),默認(rèn)存儲(chǔ)類型是data)COMPACT緊湊模式參數(shù)及局部變量分頁外存儲(chǔ)器(最大256字節(jié),默認(rèn)存儲(chǔ)類型是pdata),通過寄存器R0和R1間接尋址,橙空間位于單片機(jī)內(nèi)部RAM。LARGE大模式參數(shù)及局部變量直接放入片外數(shù)據(jù)存儲(chǔ)器(最大64KB,默認(rèn)存儲(chǔ)類型是xdata),通過數(shù)據(jù)指針DPTR來尋址,訪問效率低。第五課8051并行接口及其Cx51定義(P66)P0-P3口,32根I/O線;輸入緩沖器;輸出緩沖器;引至芯片外的端口引腳;P0、P1、P3為準(zhǔn)雙向口;?0為雙向三態(tài)口;向外擴(kuò)展存儲(chǔ)器要用P0口和P2口,P2口輸出地址高8位(A15?A8),P0口數(shù)據(jù)和地址復(fù)用;P0?P3可以字節(jié)尋址,也可以位尋址;標(biāo)準(zhǔn)8051的端口沒有數(shù)據(jù)方向寄存器。P1、P2、和P3都有內(nèi)部上拉,都可以作為輸入或輸出。寫端口就是寫一個(gè)要送端口的值;讀端口,必須先向端口寫“1”(單片機(jī)復(fù)位時(shí)口線的初值是全“1”)第六課位變量(P68)6.1、位變量的Cx51的語法及語義如下:bitdir_bit;/*將dir_bit定義為位變量*/6.2、函數(shù)可包含類型為bit的參數(shù),也可以將其作為返回值。例:bitfunc(bitb0,bitb1){/**/Return(b1);}6.3、對(duì)位變量定義的限制:位變量不能定義成一個(gè)指針,如不能定義bit*bit_point;不存在位數(shù)組,如不能定義bitb_array[];6.4、可位尋址對(duì)象:是指可以字節(jié)或位尋址的對(duì)象。位于8051內(nèi)部RAM中,因此存儲(chǔ)類型為idata.6.5、sbit位變量名=位地址sbitP1_1=Ox91;這樣是把位的絕對(duì)地址賦給位變量。同sfr一樣sbit的位地址必須位于80H-FFH之間。6.6、sbit位變量名=特殊功能寄存器名人位位置sftP1=0x90;sbitP1_1=P1人1;//先定義一個(gè)特殊功能寄存器名再指定位變量名所在的位置當(dāng)可尋址位位于特殊功能寄存器中時(shí)可采用這種方法6.7、sbit位變量名=字節(jié)地址人位位置sbitP1_1=0x90A1;sbitP1_0=P1a0;//而是自己定義特殊寄存器sfrP1=0x90;//這里沒有使用預(yù)定義文件,sbitP1_7=0x90a7;//之前我們使用的預(yù)定義文件其實(shí)就是這個(gè)作用sbitP1_1=0x91;//這里分別定義P1端口和P10,P11,P17弓|腳第七課算術(shù)運(yùn)算符及其表達(dá)式(P69)7.1、Cx51算術(shù)運(yùn)算符及其表達(dá)式算術(shù)運(yùn)算符表達(dá)式含義+a+b加法運(yùn)算符,或正值符號(hào)_a-b減法運(yùn)算符,或負(fù)值符號(hào)*a*b乘法運(yùn)算符,/a/b除法運(yùn)算符,%9%5余4模(求余)運(yùn)算符,或正值符號(hào)7.2、Cx51關(guān)系運(yùn)算符及其表達(dá)式算術(shù)運(yùn)算符表達(dá)式含義〈a〈b小于〉a>b大于〈二a<=b小于或等于〉=a>=b大于或等于==a==b測(cè)試等于!=a!=b測(cè)試不等于7.3、Cx51邏輯運(yùn)算符及其表達(dá)式
算術(shù)運(yùn)算符表達(dá)式含義&&a&&b邏輯“與”(AND)||a||b邏輯"或”(OR)!a!b邏輯“非”(NOT)7.4、Cx51位操作及其表達(dá)式算術(shù)運(yùn)算符表達(dá)式含義&a&b按位與ab按位或"a"b按位異或'a~b按位取反<<a<<7左移7位>>a>>8右移8位注:左移或右移,空出位補(bǔ)“0”,移出位丟掉。7.5、Cx51自增減運(yùn)算符及其表達(dá)式自增減運(yùn)算符含義++i,--i在使用i之前,先使i值加(減)1i++,i--在使用i之后,再使i值加(減)17.6、Cx51復(fù)合運(yùn)算符及其表達(dá)式算術(shù)運(yùn)算符表達(dá)式含義+=a+=ba=a+b加法-=a-=ba=a-b減法*二a*=ba=a*b乘法/=a/=ba=a/b除法%=a%=ba=a%b求余<<=a<<=8a=a<<8左移>>=a>>=8a=a>>8右移&=a&=ba=a&b按位與a"=ba=a"b按位異或|=a|=ba=a|b按位或~=a~=ba=a~b按位取反注:優(yōu)先級(jí)說明優(yōu)先級(jí)illdoublelongunsigned低irttr—chair自動(dòng)數(shù)據(jù)類型轉(zhuǎn)換規(guī)則!(非)優(yōu)先級(jí)算術(shù)運(yùn)算符高關(guān)系運(yùn)算符"位&和||賦值運(yùn)算符低憂先次序第八課Cx51控制語句(P80)8.1、循環(huán)語句whiledowhileif/elseswitch/case(P90)for語句for(表達(dá)式1;表達(dá)式2;表達(dá)式3)for(i=0;i<50;i++)特例1:for(;i<50;i++)缺省表達(dá)式1,不對(duì)1設(shè)初值特例2:for(i=1;;i++){sum=sum+i}不判斷循環(huán)條件,無休止地進(jìn)行下去。相當(dāng)于i=1;while(1){sum=sum+1;i++;}特例3:for(;i<100;){sum=sum+1;i++}相當(dāng)于while(i<100){sum=sum+1;i++;}特例4:for(i=1;i<100;i++);沒有循環(huán)體,起延時(shí)作用特例5:for(;;){/*循環(huán)體*/}相當(dāng)于while(1){/*循環(huán)體*/}/*死循環(huán)體*/為了使程序具有可讀性,不主張使用for語句的特例第九課Cx51T0中斷(P182)9.1、T0定時(shí)器/計(jì)數(shù)器操作模式112分頻TH1tlithi(8位)(8位〉、TF1廣中斷tC\T=OT1引腳己偵=1TR11-112分頻TH1tlithi(8位)(8位〉、TF1廣中斷tC\T=OT1引腳己偵=1TR11-而1引腳一定時(shí)器/■計(jì)數(shù)器T1(或TO)操作模式1:16位計(jì)數(shù)器T1模式T0模式GATEC仃M1M0GATEC/fM1M2GATE=0或INT0(INT1)引腳高電平,與TR0(或TR1)二1打開控制門C/T=1計(jì)數(shù)器模式;WT=0定時(shí)器模式M1M2=00,01,10,11分別對(duì)應(yīng)模式0、1、2、3
9.3、控制寄存器TCON(可位尋址)TF1TR1TF0TR0IE1IT1IE0IT0TCON.7TCON.6TCON.5TCON.4TCON.3TCON.2TCON.1TCON.0定時(shí)器1定時(shí)器定時(shí)器0定時(shí)器外部中斷外部中斷1類外部中斷外部中斷0類溢出標(biāo)1運(yùn)行溢出標(biāo)0運(yùn)行1請(qǐng)求標(biāo)型控制位。由0請(qǐng)求標(biāo)型控制位。由志,由硬控制志,由硬控制志。由硬軟件置位或志。由硬軟件置位或件置位,位。靠件置位,位??考梦?,清除。IT1=1件置位,清除。IT0=1進(jìn)入中斷軟件置進(jìn)入中斷軟件置進(jìn)入中斷下降沿觸發(fā),進(jìn)入中斷下降沿觸發(fā),后被硬件“1”或后被硬件“1”或后被硬件IT1=1低電平后被硬件IT0=0低電平自動(dòng)清除清“0”自動(dòng)清除清“0”自動(dòng)清除觸發(fā);自動(dòng)清除觸發(fā);9.4、允許中斷寄存器IE(可位尋址)EA-ET2ESET1EX1ET0EX0總允許保留定時(shí)器2串行口定時(shí)器1外中斷1定時(shí)器0外中斷01:開中斷;0:關(guān)中斷9.5、中斷請(qǐng)求9.6、中斷優(yōu)先級(jí)寄存器IP(可位尋址)PSPT1PX1PT0PX0串行口定時(shí)器1外中斷1定時(shí)器0外中斷01:高優(yōu)先級(jí)0:低優(yōu)先級(jí)第十課串行移位寄存器HC595功能及編程外中斷(INT0或INT1)及編程修改原理圖:將P13與INT1管腳連接在一起,主程序條件:P14=0;IT1=1;/*下降沿觸發(fā)*/EX1=1;/*外中斷1允許*/EA=1;/*總中斷允許*/按下“設(shè)定”鍵,進(jìn)中斷1服務(wù)程序,進(jìn)入中斷程序后,再進(jìn)行鍵盤掃描,求出鍵位值如果發(fā)現(xiàn)按下“確認(rèn)”鍵,則退出中斷1服務(wù)程序。第十一課KeliC控制流程:以溫度控制器為例畫流程圖第十二課偉福仿真器支持51單片機(jī)的匯編語言O(shè)RG0000HLJMPSTART;主程序開始ORG000BHLJMPT0PRG;T0中斷程序ORG0023H;串行口中斷程序LJMPUARTORG0100H;主程序入口地址START:MOVSP,#5FHMOVR0,#08HMOVR1,#5FHCLRAT0PRG:CLRES;T0中斷程序入口地址MOVTL0,#0E0HMOVTH0,#0B1HRETI;中斷返回UART:MOVR3,#8;串行口中斷程序入口地址movA,#5TCNT:RRADJNZR3,TCNTRETI;中斷返回END;匯編程序結(jié)束偉福仿真器編譯匯編程序與編譯C語言程序的過程是相同的,導(dǎo)入程序后按F9自動(dòng)編譯,連接,運(yùn)行。第十三課Cx51數(shù)組(P94)13.1、一維數(shù)組的定義方法類型說明符數(shù)組名[整型表達(dá)式]charch[10];13.2、一維數(shù)組初始化1、在定義數(shù)組時(shí)給數(shù)組的全部元素賦值ucharidatach[6]={0,1,2,3,4,5};ch[0]=0,ch[1]=1,ch[2]=2,ch[3]=3,ch[4]=4,ch[5]=52、在定義數(shù)組時(shí)給數(shù)組的部分元素賦值ucharidatach[6]={0,1,2,};ch[0]=0,ch[1]=1,ch[2]=2,ch[3]=0,ch[4]=0,ch[5]=03、在定義數(shù)組時(shí),若不對(duì)數(shù)組的全部元素賦值,則數(shù)組的全部元素被賦值為“0”intidatach[6];4、可以在程序運(yùn)行過程中,用循環(huán)或鍵盤輸入語句給數(shù)組賦值。13.3、二維數(shù)組的定義方法類型說明符數(shù)組名[整型表達(dá)式][整型表達(dá)式]intch[3][5];13.4、二維數(shù)組的存取順序ch[0][0]->ch[0][1]->ch[0][2]->ch[0][3]->ch[0][4]->ch[1][0]->ch[1][1]->ch[1][2]->ch[1][3]->ch[1][4]->ch[2][0]->ch[2][1]->ch[2][2]->ch[2][3]->ch[2][4]13.5、二維數(shù)組初始化1、在定義數(shù)組時(shí)給數(shù)組的全部元素賦值intidatach[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};intidatach[3][4]={1,2,3,4},{5,6,7,8},{9,10,11,12};2、在定義數(shù)組時(shí)給數(shù)組的部分元素賦值inta[3][4]={{1},{5},{9}};/*賦值后數(shù)組元素如下*/["1000s5000擺QQL13.6、字符數(shù)組的定義方法類型說明符數(shù)組名[整型表達(dá)式]charch[10];13.7、字符數(shù)組置初值1、charch[10]={B,E,I,,J,I,N,G,\0};/*‘\0是結(jié)束符,如果定義時(shí)未加結(jié)束符,C編譯器自動(dòng)在其后面加入,所以定義字符數(shù)組的長(zhǎng)度要比字符串中最長(zhǎng)的串多一個(gè)字符,用于裝入字符串的結(jié)束符\0*/2、charch[10]={“BEIJING”};3、charch[10]=“BEIJING;/*字符串常量*/13.8、數(shù)組的應(yīng)用:查表數(shù)碼管的段碼表,傳感器的非線性補(bǔ)償表等都可以用數(shù)組的方法寫到單片機(jī)的程序存儲(chǔ)器中。使用查表法對(duì)溫度傳感器進(jìn)行非線性修正。第十四課Cx51函數(shù)(P125)14.1、函數(shù)的分類:主函數(shù)和普通函數(shù)普通函數(shù):標(biāo)準(zhǔn)庫函數(shù)和用戶自定義函數(shù)14.2、標(biāo)準(zhǔn)庫函數(shù)標(biāo)準(zhǔn)庫函數(shù)是由C編譯系統(tǒng)的函數(shù)庫提供的。14.3、用戶自定義函數(shù)用戶根據(jù)自己的需要編寫的函數(shù)。14.4、函數(shù)的定義1、無參數(shù)函數(shù)的定義方法(既無返回參數(shù),也無輸入?yún)?shù))void函數(shù)名(void)/*例子****************************/voidrst(void)//發(fā)復(fù)位脈沖{dat_1820=0;dl_us(80);//延時(shí)公式=30+(i-1)*13usdat_1820=1;dl_us(1);}*****************************2、有返回參數(shù),無輸入?yún)?shù)的函數(shù)的定義方法返回值類型標(biāo)識(shí)符函數(shù)名(void){函數(shù)體語句}/*例子****************************/bitrdbit(void)//讀一個(gè)位,bit返回值類型聲明{uchari;bitdat_bit;/*dat_bit數(shù)據(jù)類型聲明*/dat_1820=0;i++;dat_1820=1;i++;i++;dat_bit=dat_1820;dat_1820=0;i=8;//i=3,4,5,7,8分別延時(shí)30,39,47,62,70微妙while(i>0){i--;}dat_1820=1;i++;i++;return(dat_bit);}/*返回的位變量dat_bit,不僅要在函數(shù)定義時(shí)聲明,在函數(shù)體內(nèi)部也要說明*/*****************************3、無返回參數(shù),有輸入?yún)?shù)的函數(shù)的定義方法void函數(shù)名(數(shù)據(jù)類型形式參數(shù)1,數(shù)據(jù)類型形式參數(shù)2,){函數(shù)體語句}/—//個(gè)S個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)/voiddl_ms(uintcount){uchari;while(count--){for(i=0;i<125;i++){;}}}/"""""""""""""""""""""""""""""""""""""""""""""""http://個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)/4、空函數(shù)的定義方法返回值類型標(biāo)識(shí)符函數(shù)名(void){}/個(gè)〃I_個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)/Floatmin(){}/"""""""""""""""""""""""""""""""""""""""""""""""/***********************************************調(diào)用空函數(shù)時(shí)。什么工作也不做,此函數(shù)只是模塊化設(shè)計(jì)時(shí)占位需要,為以后程序擴(kuò)充用。14.5、函數(shù)的參數(shù)和函數(shù)值1、形式參數(shù)在定義函數(shù)時(shí),函數(shù)名后面括號(hào)中的變量名稱為“形式參數(shù)”,簡(jiǎn)稱“形數(shù)”///個(gè)〃II**********************************************/voiddl_ms(uintcount)/*在函數(shù)名dl_ms后面括號(hào)中的變量uintcount為“形式參數(shù)”,只是說明了參數(shù)的數(shù)據(jù)類型,沒有實(shí)際的數(shù)值*/{uchari;while(count—){for(i=0;i<125;i++){;}}}/"""""""""""""""""""""""""""""""""""""""""""""""http://個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)個(gè)/2、實(shí)際參數(shù)在函數(shù)調(diào)用時(shí),主調(diào)用函數(shù)名后面括號(hào)中的表達(dá)式稱為“實(shí)際參數(shù)”,簡(jiǎn)稱“實(shí)參”。main(){dl_ms(500);/*主調(diào)用函數(shù)直接將數(shù)值500傳遞給dl_ms()函數(shù)*/}3、函數(shù)的返回值(P128)**************************************/*文件名:study3.C2008.4.6*/#include<reg52.h>typedefunsignedcharuchar;typedefunsignedintuint;uintmin(uintk1,uintk2);/*子函數(shù)聲明。函數(shù)的形參k1,k2*/main()/*主函數(shù)開始*/{intresult;result=min(35,25);/*函數(shù)的實(shí)參k1=35,k2=25*/}intmin(intk1,intk2)/*子函數(shù)開始*/{intk3;k3=(k1+k2)/2;return(k3);/*計(jì)算結(jié)果送到k3*/}/""""""""""""""""""""""""""""""""""""""/**************************************mainO①ICDresult=mirL(35J25);1一斗①ICDintminfintkl^intk2)^return(k3);第①步:主調(diào)用函數(shù)main()在調(diào)用有參數(shù)min()函數(shù)時(shí),將實(shí)際參數(shù)35,25分別傳遞給被調(diào)用函數(shù)的形參k1,k2第②步:被調(diào)用函數(shù)min()使用實(shí)參35,25作為輸入變量進(jìn)行運(yùn)算,所得結(jié)果通過返回語句return(k3)返回給主函數(shù)第③步:在主函數(shù)result=min(35,25)中,通過等號(hào)賦值給變量resulto這個(gè)return(k3)中變量k3就是被調(diào)用函數(shù)的返回值,簡(jiǎn)稱函數(shù)的返回值。一個(gè)函數(shù)可以有一個(gè)以上的return語句,但多于一個(gè)的return語句必須在在選擇結(jié)構(gòu)(if或do/case)中使用,因?yàn)楸徽{(diào)用函數(shù)一次只能返回一個(gè)變量值。14.6、函數(shù)的調(diào)用1、函數(shù)調(diào)用的一般形式函數(shù)名(實(shí)際參數(shù)表列);函數(shù)名(實(shí)參1,實(shí)參2,…);//一個(gè)以上實(shí)參之間用“,”2、函數(shù)調(diào)用的方式(P130)、把被調(diào)用函數(shù)名作為主調(diào)用函數(shù)中的一個(gè)語句disp();、函數(shù)結(jié)果作為表達(dá)式的一個(gè)運(yùn)算對(duì)象result=min(35,25)*3.1416、作為另一個(gè)函數(shù)的參數(shù)m=max(a,min(k1,k2))14.7、對(duì)被調(diào)用函數(shù)的說明1、被調(diào)用函數(shù)必須是已存在的函數(shù)(庫函數(shù)或用戶自定義函數(shù))2、如果在程序中使用了庫函數(shù),或使用了不在同一程序中的用戶自定義函數(shù),要使用#include語句3、一般形式:被調(diào)函數(shù)聲明;主調(diào)用函數(shù)***************************************voiddisp(void);main(){....disp();}***************************************14.8、函數(shù)的嵌套(P132)在調(diào)用一個(gè)函數(shù)的過程中允許調(diào)用另一個(gè)函數(shù)。由于51單片機(jī)RAM空間的限制,注意嵌套深度14.9、函數(shù)的遞歸調(diào)用(P132)在調(diào)用一個(gè)函數(shù)的過程中又直接或間接調(diào)用該函數(shù)本身,這種情況稱為函數(shù)的遞歸調(diào)用。遞歸調(diào)用主要用于問題的求解,求階乘等。第十五課溫度傳感器DS18B20工作原理及編程15.1、單線(1-wire)技術(shù)。只有一根數(shù)據(jù)線;數(shù)據(jù)傳輸是雙向的;單主機(jī)能控制一個(gè)或多個(gè)從機(jī)設(shè)備15.2、主機(jī)和從機(jī)通信過程:初始化單線器件,識(shí)別單線器件和單線數(shù)據(jù)傳輸。只有主機(jī)呼叫從機(jī)時(shí),從機(jī)才能應(yīng)答單線(1-wire)協(xié)議由復(fù)位脈沖,應(yīng)答脈沖、寫0、寫1、讀0、和讀1這幾種信號(hào)類型組成。這些信號(hào),除了應(yīng)答脈沖,其他均由主機(jī)發(fā)出,并且所有命令和數(shù)據(jù)都是字節(jié)的低位在前。15.3、DS18B20的主要技術(shù)指標(biāo):每個(gè)DS18B20都有唯一的64位ROM編碼,它存放在64位激光ROM中64位激光ROM內(nèi)容8位CRC校驗(yàn)碼48位產(chǎn)品序列號(hào)8位產(chǎn)品系列編碼MSBLSBMSBLSBMSBLSBDS18B20的存儲(chǔ)器結(jié)構(gòu)(中間結(jié)果RAM)溫度值低位字節(jié)溫度值高位字節(jié)TH/用戶使用字節(jié)1(TH的易失性拷貝,上電時(shí)被除數(shù)刷新)TL/用戶使用字節(jié)2(TL的易失性拷貝,上電時(shí)被除數(shù)刷新)配置字節(jié)(配置寄存器易失性拷貝,上電時(shí)被除數(shù)刷新)保留字節(jié)(內(nèi)部計(jì)算用)保留字節(jié)(內(nèi)部計(jì)算用)保留字節(jié)(內(nèi)部計(jì)算用)CRC字節(jié)非易失性電可擦除RAMTH/用戶使用字節(jié)1(存儲(chǔ)高溫觸發(fā)器)TL/用戶使用字節(jié)2(存儲(chǔ)低溫觸發(fā)器)配置字節(jié)(配置寄存器)配置寄存器0R1R011111MSBLSB其中R1和R0是溫度分辨率,配置表如下:R1R0分辨率最大轉(zhuǎn)換時(shí)間溫度值分辨率
009位93.75(t/8)0.5°C0110位conv187.50((t/4)0.25°C1011位conv375((t/2)0.125C1112位conv750((t…)0.0625C出廠默認(rèn)設(shè)置是12位分辨率MSB高位字節(jié)LSBMSB低位字節(jié)LSBSSSSS26252423222i202-i2-22-32-250.0625S是符號(hào)位溫度值分辨率配置表溫度數(shù)字輸出(二進(jìn)制)數(shù)字輸出(十六進(jìn)制)+125000001111101000007D0H+8500000101010100000550H+25.062500000001100100010191H+10.125000000001010001000A2H+0.500000000000010000008H000000000000000000000H-0.51111111111111000FFF8H-10.1251111111101011110FF5EH-25.06251111111001101111FF6FH-551111110010010000FC90H15.4、DS18B20的單線協(xié)議,必須遵循下面的順序:初始化:主機(jī)拉低單線480ps以上,產(chǎn)生復(fù)位脈沖,然后釋放該線,進(jìn)入Rx接收模式。主機(jī)釋放總線時(shí),會(huì)產(chǎn)生一個(gè)上升沿,DS18B20檢測(cè)到這個(gè)是升沿后,延遲15-603,通過拉低總線'60-2403來產(chǎn)生應(yīng)答脈沖,主機(jī)接收到從機(jī)的應(yīng)答脈沖后說明有單線器件在線。(見下列時(shí)序)主機(jī)|》住Qus從機(jī)應(yīng)答L(ACK);I60~240us15.5、DS18B20的命令1、ROM操作命令命令類型命令字節(jié)功能說明ReadRom(讀ROM)33H此命令讀激光ROM中的64位,只能用于總線上單個(gè)DS18B20器件的情況,多掛則會(huì)發(fā)生數(shù)據(jù)沖突。MatchRom(匹配ROM)55H此命令后跟64位ROM序列號(hào),尋址多掛接總線上的對(duì)應(yīng)DS18B20O只有序列號(hào)完全匹配的DS18B20才能響應(yīng)后面的內(nèi)存操作命令,其他不匹配的將等待復(fù)位脈沖,此命令可用于單掛或多掛接總線。
SkipRom(跳過ROM)CCH用于單掛總線系統(tǒng)時(shí),可以無須提供64位ROM序列號(hào)即可運(yùn)行內(nèi)存操作命令。如果總線上掛接多個(gè)DS18B20,并且在此命令后執(zhí)行讀命令,將會(huì)發(fā)生數(shù)據(jù)沖突。SearchRom(搜索ROM)F0H主機(jī)調(diào)用此命令,通過一個(gè)排除法過程,可以識(shí)別出總線上所有器件的ROM序列號(hào)AlarmSearch(告警ROM)ECH此命令流程和SearchRom命令相同,但是DS18B20只有在最近的一次溫度測(cè)量時(shí)滿足了告警觸發(fā)條件,才會(huì)響應(yīng)此命令。2、內(nèi)存操作命令命令類型命令字節(jié)功能說明WriteScratchpad(寫暫存器)4EH此命令寫暫存器中地址2-地址4的3個(gè)字節(jié)(TH、TL和配寄存器)在發(fā)起復(fù)位脈沖之前,3個(gè)字節(jié)都必須要寫。ReadScratchpad(讀暫存器)BEH此命令讀取暫存器內(nèi)容,從字節(jié)0一直讀取到字節(jié)8(第9個(gè)字節(jié))。主機(jī)可以隨時(shí)發(fā)起復(fù)位脈沖以停止此操作。CopyScratchpad(復(fù)制暫存器)48H此命令將暫存器中的內(nèi)容復(fù)制到E2RAM,以便將溫度告警觸發(fā)字節(jié)存入非易失內(nèi)存,如果在此命令后主機(jī)產(chǎn)生讀時(shí)隙,那么只要器件在進(jìn)行復(fù)制就會(huì)輸出0,復(fù)制完成后,再輸出1。ConvertT(溫度轉(zhuǎn)換)44H此命令開始溫度轉(zhuǎn)換操作。如果此命令后主機(jī)產(chǎn)生時(shí)隙,那么只要器件進(jìn)行了溫度轉(zhuǎn)換就會(huì)輸出0,轉(zhuǎn)換完成后再輸出1。RecallE2(重調(diào)E2存儲(chǔ)器)B8H此命令將存儲(chǔ)在E2RAM中的溫度告警觸發(fā)值和配置寄存器值重新拷貝到暫存器中。此重調(diào)操作在DS18B20加電時(shí)自動(dòng)產(chǎn)生。ReadPowerSupply(讀供電方式)B4H主機(jī)發(fā)此命令后的每個(gè)讀數(shù)據(jù)時(shí)隙內(nèi),DS18B20會(huì)發(fā)信號(hào)通知它的供電方式:0為寄生電源方式,1為外部供電方式15.6、數(shù)據(jù)處理15.7、程序設(shè)計(jì)實(shí)例//溫度計(jì)子程序ds18b20voidmrd1820(void)//18b20的主讀程序{ucharidatalast;ucharlsb,msb;ET0=0;//讀18b20時(shí)關(guān)T0中斷tempst();//寫18b20dl_us(150);//延時(shí)last=rdtemp();dl_us(50);//延時(shí)msb=last/10;lsb=last%10;buffer[0]=msb;buffer[1]=lsb;ET0=1;//讀完18b20打開T0中斷}voidrst(void)//發(fā)復(fù)位脈沖{dat_1820=0;dl_us(80);//延時(shí)公式=30+(i-1)*13usdat_1820=1;dl_us(1);}voidackp(void)//等待存在脈沖應(yīng)答{uchari=0;while(dat_1820);while(~dat_1820);dl_us(1);}bitrdbit(void)//讀一個(gè)位{uchari;bitdat_bit;dat_1820=0;i++;dat_1820=1;i++;i++;dat_bit=dat_1820;dat_1820=0;i=8;//i=3,4,5,7,8分別延時(shí)30,39,47,62,70微妙while(i>0){i--;}dat_1820=1;i++;i++;return(dat_bit);}ucharrdbyte(void)//讀一個(gè)字節(jié){uchari,j,dat;for(i=1;i<=8;i++){j=rdbit();dat=(j<<7)|(dat>>1);}
return(dat);}〃寫1//寫一個(gè)字節(jié)voidwtbyte(uchar〃寫1//寫一個(gè)字節(jié){unsignedinti;ucharj;bittestb;for(j=1;j<=8;j++){testb=dat&0x01;dat=dat>>1;if(testb){dat_1820=0;i++;i++;dat_1820=1;i=7;while(i>0){i--;}}else//寫0{dat_1820=0;i=7;while(i>0){i--;}dat_1820=1;i++;i++;}}}voidtempst(void)//開始溫度轉(zhuǎn)換sssss{rst();ackp();rst();ackp();wtbyte(0xcc);//跳過rom檢測(cè)wtbyte(0x44);//開始讀溫度dl_ms(8);}ucharrdtemp(void)//開始讀溫度{uchara,b,y1,y2,y3;rst();ackp();dl_ms(2);wtbyte(0xcc);//跳過rom檢測(cè)wtbyte(0xbe);//開始讀溫度暫存器a=rdbyte();//讀溫度暫存器低字節(jié)b=rdbyte();//讀溫度暫存器高字節(jié)y1=a>>4;y2=b<<4;y3=y1|y2;buffer[2]=buffer1[a&0x0f];return(y3);}第十六課串行口及串行口中斷(P193)16.1、串行口控制寄存器SCON(地址98H,可以位尋址)SM0SM1SM2RENTB8RB8TIRI16.2、串行口工作方式SM0SM1說明波特率00方式0同步移位寄存器fosc/1201方式18位UART可變10位異步收發(fā)由定時(shí)器控制10方式29位UART11位異步收發(fā)fosc/32或fosc/6411方式39位UART可變12位異步收發(fā)由定時(shí)器控制16.3、串行口RS232數(shù)據(jù)格式以方式1為例:起始位總是“0”(低電平),停止位總是“1”(高電平)1位起始位1位停止位-L-8位數(shù)據(jù)位卜■-二二二丁二二JI16.4、串行口RS232與主機(jī)通訊線連接16.5、串行口數(shù)據(jù)緩沖寄存器SBUFSBUF是一個(gè)可以直接尋址的串行口專用寄存器。實(shí)際上SBUF包含了兩個(gè)獨(dú)立的寄存器,個(gè)是發(fā)送寄存器,另一個(gè)是接收寄存器,但它們都共同使用同一個(gè)尋址地址一99H。CPU在讀SBUF時(shí)會(huì)指到接收寄存器,在寫時(shí)會(huì)指到發(fā)送寄存器,而且接收寄存器是雙緩沖寄存器,這樣可以避免接收中斷沒有及時(shí)的被響應(yīng),數(shù)據(jù)沒有被取走,下一幀數(shù)據(jù)已到來,而造成的數(shù)據(jù)重疊問題。發(fā)送器則不需要用到雙緩沖,一般情況下我們?cè)趯懓l(fā)送程序時(shí)也不必用到發(fā)送中斷去外理發(fā)送數(shù)據(jù)。16.5、串行口RS232方式1:UART為(UniversalAsynchronousReceiver)、SCON中的REN為允許接收位,REN置1時(shí)串口允許接收,置0時(shí)禁止接收。REN是由軟件置位或清零。、TB8發(fā)送數(shù)據(jù)位8,在模式2和3是要發(fā)送的第9位。該位可以用軟件根據(jù)需要置位或清除,通常這位在通信協(xié)議中做奇偶位,在多處理機(jī)通信中這一位則用于表示是地址幀還是數(shù)據(jù)幀。、RB8接收數(shù)據(jù)位8,在模式2和3是已接收數(shù)據(jù)的第9位。該位可能是奇偶位,地址數(shù)據(jù)標(biāo)識(shí)位。在模式0中,RB8為保留位沒有被使用。在模式1中,當(dāng)SM2=0,RB8是已接收數(shù)據(jù)的停止位。、TI發(fā)送中斷標(biāo)識(shí)位。由硬件置位。TI置位后,申請(qǐng)中斷,CPU響應(yīng)中斷后,發(fā)送下一幀數(shù)據(jù)。TI都必須由軟件來清除,也就是說在數(shù)據(jù)寫入到SBUF后,硬件發(fā)送數(shù)據(jù),中斷響應(yīng)(如中斷打開),這時(shí)TI=1,表明發(fā)送已完成,TI不會(huì)由硬件清除,所以這時(shí)必須用軟件對(duì)其清零。、RI接收中斷標(biāo)識(shí)位。由硬件置位。RI=1,申請(qǐng)中斷,要求CPU取走數(shù)據(jù)。但在模式1中,SM2=1時(shí),當(dāng)未收到有效的停止位,則不會(huì)對(duì)RI置位。同樣RI也必須要靠軟件清除。、常用的串口模式1是傳輸10個(gè)位的,1位起始位(0),8位數(shù)據(jù)位,低位在先,1位停止位(1)。它的波特率是可變的,其速率是取決于定時(shí)器1或定時(shí)器2的定時(shí)值(溢出速率)。、波特率:串行端口每秒內(nèi)可以傳輸?shù)牟ㄌ匚粩?shù)。只有上下位機(jī)的波特率一樣時(shí)才可以進(jìn)行正常通訊。如標(biāo)準(zhǔn)9600模式1加上起始位和停止位,每個(gè)數(shù)據(jù)字節(jié)就要占用10個(gè)二進(jìn)位,每秒傳輸?shù)淖止?jié)數(shù)是9600^10=960字節(jié)。模式1的波特率是可變的,取決于定時(shí)器1或2(52芯片)的溢出速率。計(jì)算模式1的波特率:波特率=(2SMO厚32)X定時(shí)器1溢出速率上式中如設(shè)置了PCON寄存器中的SMOD位為1時(shí)就可以把波特率提升2倍。通常會(huì)使用定時(shí)器1工作在定時(shí)器工作模式2下,這時(shí)定時(shí)值中的TL1做為計(jì)數(shù),TH1做為自動(dòng)重裝值,這個(gè)定時(shí)模式下,定時(shí)器溢出后,TH1的值會(huì)自動(dòng)裝載到TL1,再次開始計(jì)數(shù),這樣可以不用軟件去干預(yù),使得定時(shí)更準(zhǔn)確。在這個(gè)定時(shí)模式2下定時(shí)器1溢出速率的計(jì)算公式如下:溢出速率=(計(jì)數(shù)速率)/(256-TH1)上式中的“計(jì)數(shù)速率”與所使用的晶體振蕩器頻率有關(guān),在51芯片中定時(shí)器啟動(dòng)后會(huì)在每一個(gè)機(jī)器周期使定時(shí)寄存器TH的值增加一,一個(gè)機(jī)器周期等于十二個(gè)振蕩周期,通常用11.0592M晶體是為了得到標(biāo)準(zhǔn)的無誤差的波特率定時(shí)器1為模式2,SMOD設(shè)為1:9600=(2:32)X((11.0592M/12)/(256-TH1))TH1=250、串行口常用波特率串行口工作方式波特率Fosc=6MHzFosc=12MHzFosc=11.0592MHzSMODTMODTH1SMODTMODTH1SMODTMODTH1方式01MXXX方式1或方式362.5K120FFH19.2K120FDH9.6K020FDH4.8K120F3H020FAH2.4K120F3H020F3H020F4AH1.2K120E6H020E6H020E8H600020CCH020CCH020D0H300120CCH02098H0202EH137.502072H020EFEBH020FEFFH16.6、串行口初始化(在主程序里)、確定定時(shí)器工作方式:編程TMOD、計(jì)算定時(shí)器1的初值:裝載TH1、啟動(dòng)定時(shí)器1:編程TCON中的TR1、確定串行口的控制方式:編程SCON、串行口在中斷方式工作時(shí),須開源中斷(ES=1)和總中斷(EA=1)例:main(){TMOD=0x20;//定時(shí)器1定時(shí)方式2TH1=0xFD;//11.0592MHz晶振時(shí),波特率9600TR1=1;//啟動(dòng)定時(shí)器1開始計(jì)數(shù)(TCON=0x40)SCON=0x50;〃串口方式1,允許接收位REN=1PCON=0x00;//PCON.7置位時(shí)可獲得2倍的UART的波特率ES=1;//允許串行口中斷EA=1;//打開總中斷//RI=0;//清收發(fā)標(biāo)志//TI=0;//}16.7、串行口接收、查詢接收(在主程序里)for(i=0;i<32;i++)//準(zhǔn)備接收32個(gè)數(shù)據(jù){while(!RI);//等待接收標(biāo)志RI變1RI=0;〃收到數(shù)據(jù)后RI標(biāo)志變1,用軟件清除number[i]=SBUF;//接收到的數(shù)據(jù)在SBUF中,存到數(shù)組number[i]是}、中斷接收(在主程序里)在串行口中斷服務(wù)程序中建立一個(gè)已進(jìn)中斷的標(biāo)志,例如F_ri=1;serial()interrupt4//串行口中斷服務(wù)子程序{if(RI==1){F_ri=1;//說明已經(jīng)接收到一個(gè)數(shù)據(jù),read=SBUF;//將接收到SBUF中的數(shù)據(jù)送到read中暫存RI=0;/用軟件清除接收RI中斷標(biāo)志number[rd]=read;//數(shù)據(jù)送數(shù)組rd++;if(rd>60){rd=60;
在主程序里等待標(biāo)志變“1”,while(1)在主程序里等待標(biāo)志變“1”,while(1)即:F_ri=1{ES=1;while(F_ri==0);F_ri=0;dl_us(10);}16.8、串行口發(fā)送、不用中斷發(fā)送一個(gè)字節(jié)(在主程序里):SBUF=0x5a;//向SBUF送一個(gè)數(shù)據(jù)0x5awhile(TI==0);//等待TI變"1”,while(!TI);TI=0;〃發(fā)送過程結(jié)束后,用軟件清0、用中斷發(fā)送一個(gè)字節(jié)在主程序里執(zhí)行SBUF=0x5a;//向SBUF送一個(gè)數(shù)據(jù)0x5a的語句在子程序里判斷是接收中斷還是發(fā)送中斷,進(jìn)行相應(yīng)的處理,一定要用軟件清除相應(yīng)的中斷標(biāo)志(RI或TI)16.9、通信協(xié)議(見附5:一個(gè)串行口通訊協(xié)議例子)、通訊協(xié)議即網(wǎng)絡(luò)中(包括互聯(lián)網(wǎng))傳遞、管理信息的一些規(guī)范。如同人與人之間相互交流是需要遵循一定的規(guī)矩一樣,計(jì)算機(jī)之間的相互通信需要共同遵守一定的規(guī)則,這些規(guī)則就稱為網(wǎng)絡(luò)協(xié)議。、RS232通信協(xié)議基本結(jié)構(gòu)波特率9600bit/s,8bit,1位停止,無校驗(yàn)位格式0EBH,地址,命令,長(zhǎng)度(n),數(shù)據(jù)1,---數(shù)據(jù)n,冗余說明:0EBH為幀起始位長(zhǎng)度小于輸出端口數(shù)冗余=地址+命令+長(zhǎng)度+數(shù)1+---+數(shù)n如果冗余=0EBH,為防止與幀起始位相同,則發(fā)送反碼,即冗余=14H當(dāng)接收正確時(shí),1)在命令1,2,5,6時(shí),回送0EBH,地址,命令,01H,0FAH,冗余,并執(zhí)行命令。2)在命令3,4,7時(shí),回送相應(yīng)信息。當(dāng)接收不正確時(shí),1)地址正確,冗余不正確,回送0EBH,地址,命令,01H,0F5H,冗余。2)地址不正確,不回送任何信息。附1:KEILC51程序例子1/*文件名:study2.C2008.2.19*/#pragmaDEBUGCODE#include<reg52.h>/*define8052registers*/#include<stdio.h>/*defineI/Ofunctions*/typedefunsignedcharuchar;typedefunsignedintuint;ucharbdataFLAG;sbitFLAG1=FLAG';sbitFLAG2=FLAG"2;sbitP1_1=P1"1;uchardatatime,Dtime;#defineLAMPP00/*輸出綠燈P00=1綠燈亮;P00=0綠燈滅*/#defineKEY_INP10/*輸入單鍵按下P10=0,不按鍵P10=1*/ucharB_T50ms=200,B_T100ms=2,B_T200ms=4,B_T500ms=10;ucharB_TT1s=20,B_T30s=60,B_T120s=240;bitFLAG_ERRON;bitFLAG_SIGN;ucharJFLAG;uchardatabuffer[8];uchardataTemper[4];ucharidatabuffer0[150];//這條語句若用data定義,buffer。的長(zhǎng)度就只能小于ucharcodebuffer1[16]={0,0,1,1,2,3,3,4,5,5,6,6,7,8,8,9};voiddl_us(uintcount);voiddl_ms(uintcount);voidext_1(void);//interrupt2;voidTimer_0(void);//interrupt1;main(){ucharJFLAG,i;P1=0xFF;FLAG=P1;JFLAG=FLAG>>6;JFLAG=JFLAG&0x03;switch(JFLAG){case0:time=2;Dtime=20;break;case1:time=4;Dtime=40;break;case2:time=6;Dtime=60;break;case3:time=8;Dtime=80;break;}for(i=1;i<180;i++){buffer0[i]=0;}for(i=1;i<150;i++)(buffer0[i]=i;}while(1)//單鍵沒按下P10=1執(zhí)行下列語句,上電時(shí)燈就亮,{if(P10==1){LAMP=1;}else{LAMP=0;dl_ms(500);}}}voiddl_us(uintcount){uinti;for(i=0;i<count;i++){;}}voiddl_ms(uintcount){uchari;while(count--){for(i=0;i<125;i++){;}}}ext_1()interrupt2{EX1=0;//進(jìn)中斷程序后就關(guān)掉外中斷1,改為查詢方式ET0=1;}Timer_0()interrupt1{}附2:KEILC51程序例子2#pragmaDEBUGCODE#include<reg52.h>/*define8052registers*/#include<stdio.h>/*defineI/Ofunctions*/typedefunsignedcharuchar;typedefunsignedintuint;voidmain(void)(uchavar1,var2,result1,result2;var1=3;var2=5;result1=var1+var2;result2=var1*var2;while(1)}注:其中reg51.h或reg52.h是頭文件,C語言系統(tǒng)自帶的。這是關(guān)于單片機(jī)資源的定義文件。如果選用89C51單片機(jī),則頭文件選reg51.h;如果選用89C52單片機(jī),則頭文件選reg52.h;系統(tǒng)帶的頭文件可能不全時(shí),應(yīng)由用戶自已修改。例如打開reg52.h文件只有對(duì)口地址的定義,而沒有口的各位的定義附3:表5-1常用轉(zhuǎn)義字符表轉(zhuǎn)義字符含義ASCII碼(16/10進(jìn)制)\o空字符(NULL)00H/0\n換行符(LF)0AH/10\r回車符(CR)0DH/13\t水平制表符(HT)09H/9\b退格符(BS)08H/8\f換頁符(FF)0CH/12\'單引號(hào)27H/39\"雙引號(hào)22H/34\\反斜杠5CH/92附4:51單片機(jī)中斷源中斷源矢量單元中斷編號(hào)外部中斷00003H0定時(shí)器0溢出000BH1外部中斷10013H2定時(shí)器1溢出001BH3串行口0023H4附5:—個(gè)串行口通訊協(xié)議例子;通訊協(xié)議;PC發(fā)送的命令;1、回送出錯(cuò)命令變址量=4;命令格式起始DE=01**CRCCR
TOC\o"1-5"\h\z;PC發(fā)送碼@01**01CR;儀表接收碼ERR:DB40H,30H,31H,2AH,2AH,30H,31H,0DH;2、回送正確命令變址量=4;命令格式起始DE=01##CRCCR;PC發(fā)送碼@01##01CR;儀表接收碼RIG:DB40H,30H,31H,23H,23H,30H,31H,0DH;3、讀0010H內(nèi)的時(shí)間參數(shù)(兩個(gè)字節(jié))變址量=11;命令格式起始DE=01RE地址=0010H長(zhǎng)度CRCCR;PC發(fā)送碼@0152450010234CR;儀表接收碼RE210:DB40H,30H,31H,35H,32H,34H,35H,30H,30H,31H,30H,32H,33H,34H,0DH;4、讀0012H內(nèi)的功率參數(shù)(兩個(gè)字節(jié))變址量=11;命令格式起始DE=01RE地址=0012H長(zhǎng)度CRCCR;PC發(fā)送碼@0152450012236CR;儀表接收碼RE212:DB40H,30H,31H,35H,32H,34H,35H,30H,30H,31H,32H,32H,33H,36H,0DH;5、讀0010H時(shí)間參數(shù)(兩個(gè)字節(jié))和功率參數(shù)(兩個(gè)字節(jié))變址量=11;命令格式起始DE=01RE地址=0010H長(zhǎng)度CRCCR;PC發(fā)送碼@0152450010432CR;儀表接收碼變址量=RE410:DB40H,30H,31H,35H,32H,34H,35H,30H,30H,31H,30H,34H,33H,32H,0DH;6、往儀表內(nèi)寫時(shí)間參數(shù)(兩個(gè)字節(jié))假設(shè)寫34分00秒變址量=10;命令格式起始DE=01W2地址=0010時(shí)間CRCCR;PC發(fā)送碼@0157320010
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 個(gè)人房產(chǎn)作為抵押的貸款合同模板版B版
- 2025年度濕地公園綠化苗木采購及生態(tài)修復(fù)合同4篇
- 2025年度大曰金地產(chǎn)樓盤銷售代理合同市場(chǎng)拓展版4篇
- 二零二五年度杭州房產(chǎn)中介獨(dú)家租賃服務(wù)合同2篇
- 二零二五年度風(fēng)力發(fā)電場(chǎng)施工安全文明措施費(fèi)支付合同2篇
- 二零二五年度礦產(chǎn)資源租賃合同范本4篇
- 2025版危險(xiǎn)品租賃與環(huán)保驗(yàn)收服務(wù)合同3篇
- 二零二四年塔吊設(shè)備保養(yǎng)與維修承包合同范本3篇
- 二零二五版新能源儲(chǔ)能設(shè)施安裝勞務(wù)分包合同3篇
- 2025版企業(yè)高管勞動(dòng)合同范本(含保密條款)2篇
- 消防產(chǎn)品目錄(2025年修訂本)
- 地方性分異規(guī)律下的植被演替課件高三地理二輪專題復(fù)習(xí)
- 城市軌道交通的網(wǎng)絡(luò)安全與數(shù)據(jù)保護(hù)
- 《行政職業(yè)能力測(cè)驗(yàn)》2023年公務(wù)員考試新疆維吾爾新疆生產(chǎn)建設(shè)兵團(tuán)可克達(dá)拉市預(yù)測(cè)試題含解析
- 醫(yī)院投訴案例分析及處理要點(diǎn)
- 練習(xí)20連加連減
- 五四制青島版數(shù)學(xué)五年級(jí)上冊(cè)期末測(cè)試題及答案(共3套)
- 商法題庫(含答案)
- 鋼結(jié)構(gòu)用高強(qiáng)度大六角頭螺栓連接副 編制說明
- 溝通與談判PPT完整全套教學(xué)課件
- 移動(dòng)商務(wù)內(nèi)容運(yùn)營(吳洪貴)項(xiàng)目四 移動(dòng)商務(wù)運(yùn)營內(nèi)容的傳播
評(píng)論
0/150
提交評(píng)論