《單片機控制技術(shù)項目式教程(第2版)》習(xí)題答案 - 王璇 項目8-11_第1頁
《單片機控制技術(shù)項目式教程(第2版)》習(xí)題答案 - 王璇 項目8-11_第2頁
《單片機控制技術(shù)項目式教程(第2版)》習(xí)題答案 - 王璇 項目8-11_第3頁
《單片機控制技術(shù)項目式教程(第2版)》習(xí)題答案 - 王璇 項目8-11_第4頁
《單片機控制技術(shù)項目式教程(第2版)》習(xí)題答案 - 王璇 項目8-11_第5頁
已閱讀5頁,還剩47頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

《單片機控制技術(shù)項目式教程(第2版)》習(xí)題答案項目8知識思考與項目訓(xùn)練答案選擇題:1.B2.A3.D4.A5.A6.C7.B8.A(二)填空題:1.并行通信,串行通信2.起始位,數(shù)據(jù)位,奇偶效驗位,停止位3.TXD,RXD4.SBUF5.RXD6.電平轉(zhuǎn)換(三)簡答題:什么是串行通信?它有哪些特點?有哪幾種幀格式?答:串行通信是組成數(shù)據(jù)的所有位通過一條數(shù)據(jù)線一位一位地傳送的通信方式。其突出優(yōu)點是只需一對傳送線,大大降低了傳送成本;其缺點是傳送速度相對較慢。串行通信適用于遠距離通信。字符幀也稱數(shù)據(jù)幀,由起始位、數(shù)據(jù)位、奇偶校驗位和停止位等4部分組成,分為無空閑字符幀和有空閑字符幀。51單片機的串行口由哪些功能部件組成?各有什么作用?答:51單片機的串行口由特殊功能寄行器SBUF、SCON、PCON組成。SBUF是51單片機內(nèi)部的接收、發(fā)送緩沖器;SCON用來控制串行口的工作方式和狀態(tài);PCON主要是為CHMOS型單片機的電源控制而設(shè)置的專用寄存器。51單片機串行口有幾種工作方式?各工作方式的波特率如何確定?答:51單片機的串行口有4種工作方式,分別是方式0、方式1、方式2和方式3,這些工作方式由SCON中的SM0、SM1兩位編碼決定。工作方式幀格式波特率方式08位全是數(shù)據(jù)位,沒有起始位、停止位固定,每個機器周期傳送一位數(shù)據(jù)方式110位,其中1位起始位,8位數(shù)據(jù)位,1位停止位不固定,取決于T1溢出率和SMOD方式211位,其中1位起始位,9位數(shù)據(jù)位,1位停止位固定,即2SMOD×fosc/64方式3同方式2同方式1若晶振頻率為fosc=11.0592MHz,采用串行口工作方式1,波特率為4800b/s,計算出用T1作為波特率發(fā)生器的方式字和計數(shù)初值。答:T1采用方式2,TMOD=0x20SMOD=0初值Ⅹ=256-2SMOD/32×fosc/(12×波特率)=256-20/32×11.0592×106/(12×4800)=250=0xFA所以初值為0xFA(四)項目訓(xùn)練:1.設(shè)fosc=11.0592MHz,試編寫一段程序,對串口初始化,使之工作于方式l,波特率為1200b/s,用查詢串行口狀態(tài)的方法讀出接收緩沖器的數(shù)據(jù)并回送到發(fā)送緩沖器。解:T1采用方式2,TMOD=0x20SMOD=0初值Ⅹ=256-2SMOD/32×fosc/(12×波特率)=256-20/32×11.0592×106/(12×1200)=232=0xE8程序設(shè)計:#include<reg51.h>voidmain(){unsignedcharc;SCON=0x50;TMOD=0x20;PCON=0x00;TH1=0xE8;TL1=0xE8;RI=0;TR1=1;while(1){if(RI){RI=0;c=SBUF;SBUF=c;if(TI)TI=0;}}}2.用Protues設(shè)計一個兩個單片機通信的電路,甲機連接一只按鍵和一只發(fā)光二極管,乙機連接一只按鍵和一只一位的數(shù)碼管,編寫兩個單片機通信的程序,甲機的按鍵通過串行口通信控制乙機的數(shù)碼管顯示”A”,”B”,”C”,”D”;乙機的按鍵通過串行口通信控制甲機的發(fā)光二極管閃爍。電路設(shè)計:甲機程序設(shè)計:#include<reg51.h>#defineucharunsignedchar#defineuintunsignedintsbitK1=P1^7;sbitD1=P1^0;//***************************************************************************//延時1msvoidDelay(uintx){uchari;while(x--)for(i=0;i<120;i++);}//***************************************************************************//向串口發(fā)送字符voidputc_to_SerialPort(ucharc){SBUF=c;while(TI==0);TI=0;}//***************************************************************************voidmain(){ucharOperation_NO=-1;SCON=0x50;//串口工作方式1TMOD=0x20;//T1工作方式2PCON=0x00;TH1=0xFD;//波特率9600TL1=0xFD;TI=0;RI=0;TR1=1;D1=1;while(1){if(K1==0){while(K1==0);Operation_NO=(Operation_NO+1)%4;}switch(Operation_NO){case0:putc_to_SerialPort('A'); break;case1:putc_to_SerialPort('B');break;case2:putc_to_SerialPort('C');break;case3:putc_to_SerialPort('D');break;} if(RI){RI=0;if(SBUF=='1'){while(RI==0) {D1=~D1; Delay(100); } }else D1=1;}Delay(100);}}乙機程序設(shè)計:#include<reg51.h>#defineucharunsignedchar#defineuintunsignedintsbitK2=P1^7;//***********************************************************************//延時1msvoidDelay(uintx){uchari;while(x--)for(i=0;i<120;i++);}//***********************************************************************//向串口發(fā)送字符voidputc_to_SerialPort(ucharc){SBUF=c;while(TI==0);TI=0;}//***********************************************************************voidmain(){ucharOperation_NO=0;P0=0x00;SCON=0x50;TMOD=0x20; PCON=0x00;TH1=0xFD;//波特率9600TL1=0xFD; TI=0;RI=0; TR1=1; while(1){if(K2==0){while(K2==0);if(++Operation_NO%2) putc_to_SerialPort('1'); else putc_to_SerialPort('0');} if(RI){RI=0;switch(SBUF){case'A':P0=0x77; break;case'B':P0=0x7C; break;case'C':P0=0x39; break;case'D':P0=0x5E; break;}}Delay(100);}}3.利用串口調(diào)試助手進行實驗板與PC機的通信,PC機發(fā)送一段英文文字,如“Howareyou!”,希望在接收區(qū)顯示同樣的一段英文文字,如“Howareyou!”,請編寫單片機串口通信程序。電路設(shè)計:用一根RS-232C串口線將下圖的J1與PC機的串口連接起來,PC機打開stc-isp-15xx-v6.85H軟件。程序設(shè)計:#include<AT89X51.h> #defineucharunsignedchar#defineuintunsignedintunsignedchara;bitflag=0; //定義發(fā)送數(shù)據(jù)標(biāo)志位//串口初始化子程序voidinit(){ TMOD=0x20;//T1工作在方式2 TH1=0xFA; //波特率為9600b/s TL1=0xFA; TR1=1;//開啟T1 SM0=0;//串口工作在方式1 SM1=1; REN=1; //允許串口接收 EA=1;//開總中斷 ES=1;//開串口中斷RI=0; }//串口發(fā)送數(shù)據(jù)子程序voidsend(){ES=0;SBUF=a;while(!TI);TI=0;flag=0;ES=1;}//串口接收數(shù)據(jù)子程序voidreceive()interrupt4{a=SBUF;RI=0;flag=1;}//主函數(shù)voidmain(){ init(); while(1) {if(flag==1)send();}}項目9知識思考與項目訓(xùn)練答案選擇題:1.A2.D3.B4.A5.B6.C7.C8.B(二)填空題:1.分辨率、精度和轉(zhuǎn)換速度2.電流輸出D/A、電壓輸出D/A3.1/2n4.直通方式、單緩沖方式和雙緩沖方式5.高電平、低電平(三)簡答題:在單片機應(yīng)用系統(tǒng)中為什么要進行A/D和D/A轉(zhuǎn)換,它們的作用是什么?答:單片機只能發(fā)送和接收數(shù)字信號。在實時控制系統(tǒng)中,經(jīng)常需要將計算機計算結(jié)果的數(shù)字量轉(zhuǎn)換為連續(xù)變化的模擬量,用來控制、調(diào)節(jié)一些電路,實現(xiàn)對被控對象的控制,所以要進行D/A轉(zhuǎn)換。另一面,各種傳感器檢測到的各種模擬量也需要轉(zhuǎn)換成數(shù)字量才能被單片機接收進行處理,所以要進行A/D轉(zhuǎn)換。使用DAC0832時,單緩沖方式如何工作?雙緩沖方式如何工作?軟件編程有什么區(qū)別?答:單緩沖方式,就是使DAC0832的兩個8位數(shù)據(jù)寄存器中有一個處于直通方式,而另一個處于受控的鎖存方式,或者兩個8位數(shù)據(jù)寄存器處于同時受控的方式,即同時送數(shù),同時鎖存。在實際應(yīng)用中,如果只有一路模擬量輸出或雖有幾路模擬量但并不要求同步輸出的情況,就可采用單緩沖方式。用一條賦值語句就可以將單片機中的數(shù)據(jù)送給DAC芯片進行D/A轉(zhuǎn)換:#defineDAC0832XBYTE[0x7FFF]DAC0832=0x08;雙緩沖方式,就是把DAC0832的兩個鎖存器都接成受控鎖存方式。DAC0832的WR1、WR2、CS和XFER都受單片機送來的信號的控制。在雙緩沖方式下,單片機必須送兩次寫信號才能完成一次D/A轉(zhuǎn)換。第一次寫信號,將數(shù)據(jù)送入輸入寄存器中鎖存,第二次寫信號才將此數(shù)據(jù)送入DAC寄存器鎖存并輸出進行D/A轉(zhuǎn)換。所以應(yīng)分配給DAC0832兩個RAM地址,然后使用兩條賦值語句,才能將一個數(shù)字量轉(zhuǎn)換成模擬量:#defineDAC0832_1XBYTE[0xBFFF]#defineDAC0832_2XBYTE[0x7FFF]DAC0832_1=0x08;DAC0832_2=0x08;PCF8591的主要特點是什么?簡述其工作原理。答:PCF8591是一個單片集成的具有I2C總線接口的8位A/D及D/A轉(zhuǎn)換器,具有4路A/D輸入,1路D/A輸出。在PCF8591上輸入輸出的地址、控制和數(shù)據(jù)信號都是通過I2C總線以串行的方式進行傳輸。PCF8591的功能包括多路模擬輸入、內(nèi)置跟蹤保持、8-bit模數(shù)轉(zhuǎn)換和8-bit數(shù)模轉(zhuǎn)換。PCF8591的最大轉(zhuǎn)化速率由I2C總線的最大速率決定。PCF8591的主要特性如下:單獨供電PCF8591的操作電壓范圍+2.5V~+6V低待機電流通過I2C總線串行輸入/輸出PCF8591通過3個硬件地址引腳尋址PCF8591的采樣率由I2C總線速率決定4個模擬輸入可編程為單端型或差分輸入自動增量頻道選擇PCF8591的模擬電壓范圍從VSS到VDDPCF8591內(nèi)置跟蹤保持電路8-bit逐次逼近A/D轉(zhuǎn)換器通過1路模擬輸出實現(xiàn)DAC增益PCF8591的工作原理:PCF8591采用典型的I2C總線接口器件尋址方法,即總線地址由器件地址(1001)、引腳地址(由A0~A2接地或+5V來確定,接地代表0;接+5V代表1)、方向位(即R/W)組成。D/A轉(zhuǎn)換的數(shù)據(jù)輸入和A/D轉(zhuǎn)換的數(shù)據(jù)輸出都是通過I2C總線串行輸入和輸出的。因此PCF8951中I2C總線的通信格式包括寫數(shù)據(jù)格式和讀數(shù)據(jù)格式。I2C總線的特點和通信格式是怎樣的?答:I2C總線由2根線:串行數(shù)據(jù)線(SDA)和串行時鐘線(SCL)組成。連接到總線上的每一個器件都有一個唯一的地址,而且都可以作為一個發(fā)生器或接收器,SDA和SCL都是雙向線路,分別通過一個電阻連接到電源(+5V)端。I2C總線上的數(shù)據(jù)傳輸速率在標(biāo)準(zhǔn)模式下可達100Kb/s,快速模式可達400Kb/s,高速模式下可達3.4Mb/s。連接到總線的器件數(shù)量只由總線的電容(400PF)限制決定。I2C總線寫通信格式:1234567NN-1主機產(chǎn)生起始位發(fā)從機地址90H等待從機應(yīng)答發(fā)送數(shù)據(jù)等待從機應(yīng)答發(fā)送數(shù)據(jù)等待從機應(yīng)答。。。。停止位I2C總線讀通信格式:1234567NN-1主機產(chǎn)生起始位發(fā)從機地址91H等待從機應(yīng)答接收從機發(fā)出的數(shù)據(jù)向從機應(yīng)答接收從機發(fā)出的數(shù)據(jù)向從機應(yīng)答。。。。主機產(chǎn)生停止位(四)項目訓(xùn)練:1.試采用DAC0832芯片設(shè)計單緩沖方式的D/A轉(zhuǎn)換器接口電路,并編寫程序,使DAC0832輸出15個正向階梯波。原理圖設(shè)計:源程序設(shè)計:#include<reg51.h>#include<absacc.h>#defineuintunsignedint#defineucharunsignedchar#defineDAC0832XBYTE[0x7FFE]voidDelayMS(uintx){uchart;while(x--)for(t=0;t<120;t++);}voidmain(){uchari;while(1){for(i=0;i<17;i++){DAC0832=i*17; DelayMS(10); }}}2.參照任務(wù)2,將圖9.14的硬件電路作修改,設(shè)計成一個完整的信號發(fā)生器,通過按鍵控制輸出鋸齒波、三角波、方波或正弦波,并寫出完整的程序。原理圖設(shè)計:源程序設(shè)計:#include<reg52.h>sbitDACCS=P3^0;sbitDACWR=P3^1;//正弦波波表unsignedcharcodeSinWave[]={127,152,176,198,217,233,245,252,255,252,245,233,217,198,176,152,127,102,78,56,37,21,9,2,0,2,9,21,37,56,78,102};//三角波波表unsignedcharcodeTriWave[]={0,16,32,48,64,80,96,112,128,144,160,176,192,208,224,240,255,240,224,208,192,176,160,144,128,112,96,80,64,48,32,16};//鋸齒波表unsignedcharcodeSawWave[]={0,8,16,24,32,40,48,56,64,72,80,88,96,104,112,120,128,136,144,152,160,168,176,184,192,200,208,216,224,232,240,248};unsignedcharcode*pWave;//波表指針unsignedcharT1RH=1;//T1重載值的高字節(jié)unsignedcharT1RL=1;//T1重載值的低字節(jié)unsignedintfWave=0;voidSetWaveFreq(unsignedcharfreq);externvoidKeys_Scan();voidmain(){DACCS=0; DACWR=0; EA=1;//開總中斷pWave=SinWave;//默認(rèn)正弦波SetWaveFreq(10);//默認(rèn)頻率10Hzwhile(1){Keys_Scan();//調(diào)用按鍵驅(qū)動 }}/*按鍵動作函數(shù),根據(jù)鍵碼執(zhí)行相應(yīng)的操作,keycode-按鍵鍵碼*/voidKeyAction(unsignedcharkeycode){staticunsignedchari=0;if(keycode==0x0D)//回車鍵,切換波形{//在3種波形間循環(huán)切換if(i==0){i=1;pWave=TriWave;}elseif(i==1){i=2;pWave=SawWave;}else{i=0;pWave=SinWave;}}elseif(keycode==0x26)//向上鍵,增加頻率{if(fWave<250)//達到最大值25之前可遞增頻率值{fWave+=10;SetWaveFreq(fWave);}}elseif(keycode==0x28)//向下鍵,降低頻率{if(fWave>10)//達到最小值2之前可遞減頻率值{fWave-=10;SetWaveFreq(fWave);}}}voidSetWaveFreq(unsignedcharfreq){ unsignedlongtmp; tmp=(11059200/12)/(freq*32); tmp=65536-tmp; tmp=tmp+33; T1RH=(unsignedchar)(tmp>>8); T1RL=(unsignedchar)tmp; TMOD&=0x0F; TMOD|=0X10; TH1=T1RH; TL1=T1RL; ET1=1; PT1=1; TR1=1;}/*T1中斷服務(wù)函數(shù),執(zhí)行波形輸出*/voidInterruptTimer1()interrupt3{staticunsignedchari=0;TH1=T1RH;//重新加載重載值TL1=T1RL;//循環(huán)輸出波表中的數(shù)據(jù) P0=pWave[i];i++;if(i>=32){i=0;}}項目10知識思考與項目訓(xùn)練答案(一)選擇題:1.A2.D3.B4.C5.A6.C7.B(二)填空題:1.分辨率、轉(zhuǎn)換時間、量程、精度2.逐次逼近(比較)式、雙積分式3.84.延時法、查詢法、中斷法5.64位光刻ROM、溫度傳感器、6.低位(三)簡答題:A/D轉(zhuǎn)換器有哪些主要性能指標(biāo)?它們在選擇A/D轉(zhuǎn)換器起怎樣的作用?答:描述A/D轉(zhuǎn)換器性能的指標(biāo)參數(shù)很多,都是在選擇A/D轉(zhuǎn)換器時必須要考慮的,主要有以下幾個:(1)分辨率:分辨率是指A/D轉(zhuǎn)換器能分辨的最小模擬輸入量。分辨率越高,轉(zhuǎn)換時對輸入量的微小變化的反應(yīng)越靈敏。(2)轉(zhuǎn)換時間:指A/D轉(zhuǎn)換器完成一次轉(zhuǎn)換所需的時間。轉(zhuǎn)換時間是編程時必須考慮的參數(shù)。(3)量程:指A/D轉(zhuǎn)換器所能轉(zhuǎn)換的輸入電壓范圍,如5V、10V等。(4)精度:指與數(shù)字輸出量所對應(yīng)的模擬輸入量的實際值與理論值之間的差值。ADC0809與51單片機怎么連接?畫出電路圖。答:單片機與ADC0809連接時,主要考慮ADC0809的數(shù)字量輸出線、通道選擇地址線、轉(zhuǎn)換結(jié)束信號線、輸出允許信號線和啟動轉(zhuǎn)換信號線的連接。ADC0809的數(shù)字量輸出線DB7~DB0通常與單片機的數(shù)據(jù)總線DB7~DB0直接相連。ADC0809的通道選擇地址線C、B、A可以與單片機的數(shù)據(jù)總線DB2~DB0連接,也可以與單片機的地址總線AB2~AB0連接。ADC0809與51單片機連接電路圖:簡述DS18B20的特點。答:DS18B20的主要特征:全數(shù)字溫度轉(zhuǎn)換及輸出;先進的單總線數(shù)據(jù)通信;可編程分辨率9~12可選,精度可達±0.5°C;12位分辨率時的最大工作周期為750ms;電壓適應(yīng)范圍寬,+3.3V~+5.5V,可選擇數(shù)據(jù)線寄生電源工作方式;檢測溫度范圍為–55°C~+125°C;內(nèi)置EEPROM,限溫報警功能;64位光刻ROM,內(nèi)置產(chǎn)品序列號,方便多機掛接;多樣封裝形式,適應(yīng)不同硬件系統(tǒng)。DS18B20有哪些命令字?各有什么用處?答:DS18B20工作時,控制其工作的單片機可以使用各種命令對DS18B20進行操作,操作過程為:初始化、發(fā)功能命令、發(fā)存儲器操作命令。(1)讀ROM[33H]:這個命令允許總線控制器讀到DS18B20的8位系列編碼、唯一的序列號和8位CRC碼。只有在總線上存在單只DS18B20的時候才能使用這個命令。(2)匹配ROM[55H]:這個是匹配ROM命令,后跟64位ROM序列,讓總線控制器在多點總線上定位1只特定的DS18B20。(3)跳過ROM[CCH]:這條命令允許總線控制器不用提供64位ROM編碼就使用存儲器操作命令,在單點總線情況下,可以節(jié)省時間。(4)搜索ROM[F0H]:當(dāng)1個系統(tǒng)初次啟動時,總線控制器可能并不知道單線總線上有多少器件或它們的64位ROM編碼。(5)報警搜索[ECH]:這條命令的流程和SearchROM相同。(6)寫暫存存儲器[4EH]:這個命令向DS18B20的暫存器TH和TL中寫入數(shù)據(jù),可以在任何時刻發(fā)出復(fù)位命令來中止寫入。(7)讀暫存存儲器[BEH]:這個命令讀取暫存器的內(nèi)容。(8)拷貝暫存存儲器[48H:這個命令把暫存器的內(nèi)容拷貝到DS18B20的EEPROM存儲器里,即把溫度報警觸發(fā)字節(jié)存入非易失性存儲器里。(9)溫度轉(zhuǎn)換[44H]:這條命令啟動1次溫度轉(zhuǎn)換而無需其他數(shù)據(jù)。(10)重新調(diào)出[B8H:這條命令把報警觸發(fā)器里的值拷貝回暫存器。(11)讀電源[B4H:若把這條命令發(fā)給DS18B20后發(fā)出讀時間隙,器件就會返回它的電源模式:0為寄生電源,1為外部電源。單片機是怎樣控制DS18B20的?DS18B20的初始化、寫數(shù)據(jù)和讀數(shù)據(jù)時序是怎樣的?答:單片機與DS18B20連接后,通過軟件對DS18B20寫入命令字來進行控制。作為單總線器件,DS18B20與單片機間采用串行數(shù)據(jù)傳輸方式,要求嚴(yán)格按照時隙進行操作。主機使用時間隙來讀寫DS18B20的數(shù)據(jù)位和寫命令字的位。DS18B20的初始化時序:主機總線發(fā)送一復(fù)位脈沖(最短為480μs的低電平信號),接著釋放總線并進入接收狀態(tài)。DS18B20在檢測到總線的上升沿之后等待15~60μs,接著DS18B20發(fā)出存在脈沖(低電平持續(xù)60~240μs),主機接收到高電平后初始化成功。DS18B20的寫數(shù)據(jù)時序:當(dāng)主機總線從高拉至低電平時就產(chǎn)生寫時間隙。從開始15μs之內(nèi)應(yīng)將所需寫的位送到總線上,DS18B20在15~60μs間對總線采樣,若為低電平,則寫入的位是0;若為高電平,則寫入的位是1。連續(xù)寫2位間的間隙應(yīng)大于1μs。每一位的發(fā)送都應(yīng)該有一個至少15μs的低電平起始位,隨后的數(shù)據(jù)“0”或“1”應(yīng)該在45μs內(nèi)完成。整個位的發(fā)送時間應(yīng)該保持在60~120μs,否則不能保證通信的正常。圖10.12DS18B20讀數(shù)據(jù)時序圖DS18B20的讀數(shù)據(jù)時序:主機在將總線從高電平拉至低電平時,至少在1μs后將總線拉高,表示讀時間隙的起始,隨后在總線被釋放后的15μs中DS18B20會發(fā)送內(nèi)部數(shù)據(jù)位,這時控制如果發(fā)現(xiàn)總線為高電平表示讀出“1”,如果總線為低電平則表示讀出數(shù)據(jù)“0”,主機必須在45μs內(nèi)完成讀位,并在60~120圖10.12DS18B20讀數(shù)據(jù)時序圖(四)項目訓(xùn)練:1.用AT89C51和ADC0809設(shè)計一個數(shù)字電壓表,要求電壓測量范圍為0V~+5V,用一只4位共陽極的數(shù)碼管顯示電壓值,精確到0.001V。電路原理圖設(shè)計:源程序設(shè)計:#include<reg51.h>#defineucharunsignedchar#defineuintunsignedint//***************************************************************************//共陽極數(shù)碼管碼表ucharcodeLEDData[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//ADC0809控制腳定義sbitOE=P1^0;sbitEOC=P1^1;sbitST=P1^2;sbitCLK=P1^3;//***************************************************************************//延時1ms子程序voidDelayMS(uintx){uchari;while(x--)for(i=0;i<120;i++);}//***************************************************************************//顯示轉(zhuǎn)換結(jié)果子程序voidDisplay(uchard){floata;uintb;a=d*5/255;//計算出電壓模擬量值b=a*1000+0.5;//電壓值*1000,保留三位小數(shù),四舍五入P2=0x08;//數(shù)碼管第4位顯示個位數(shù)P0=LEDData[b%10];DelayMS(5);P0=0xFF;P2=0x04;//數(shù)碼管第3位顯示十位數(shù)P0=LEDData[b%100/10];DelayMS(5);P0=0xFF;P2=0x02;//數(shù)碼管第2位顯示百位數(shù)P0=LEDData[b/100%10];//把小數(shù)點加入段碼DelayMS(5);P0=0xFF;P2=0x01;//數(shù)碼管第1位顯示千位數(shù)和小數(shù)點P0=LEDData[b/1000]&0x7F;//把小數(shù)點加入段碼DelayMS(5);P0=0xFF;}//***************************************************************************//主程序voidmain(){TMOD=0x02;//定時器0工作在方式2TH0=0x14;TL0=0x14;IE=0x82;//開T0中斷TR0=1;P1=0x3F;//選擇ADC0809的通道3(011)//高4位設(shè)通道地址為011(3),低4位為ST,EOC,OE等while(1){ST=0;ST=1;ST=0;//啟動轉(zhuǎn)換while(EOC==0);//等待轉(zhuǎn)換結(jié)束OE=1;//允許輸出Display(P3);//顯示A/D轉(zhuǎn)換結(jié)果OE=0;//關(guān)閉輸出}}//***************************************************************************//T0中斷子程序voidTimer0_INT()interrupt1{CLK=!CLK;//ADC0809時鐘信號}2.用AT89C51和DS18B20設(shè)計一個溫度計,用一只4位共陽極的數(shù)碼管顯示測量到的溫度值,要求溫度值保留兩位小數(shù)。電路原理圖設(shè)計:源程序設(shè)計:#include<reg51.h>#defineucharunsignedchar#defineuintunsignedint//***************************************************************************//測溫口定義sbittemp_ds=P3^0;//定義全局變量uinttemp;//存儲整型溫度值floatf_temp;//存儲浮點型溫度值//定義共陽極段碼表unsignedcharcodetable[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//***************************************************************************//延時子程序voiddelay(uintx){uinty;while(x--) for(y=160;y>0;y--);}//***************************************************************************//DS18B20初始化子程序,成功返回1,否則返回0intDS18B20_init(void){uinti;temp_ds=0;//發(fā)復(fù)位脈沖i=160;while(i>0)i--;temp_ds=1;i=8;while(i>0)i--;}//***************************************************************************//從DS18B20讀1位數(shù)據(jù)bittempreadbit(void){uinti;bitdat;temp_ds=0;//拉低控制線i++;temp_ds=1;//拉高控制線i++;i++;dat=temp_ds;//讀1為數(shù)據(jù)i=10;while(i>0)i--;temp_ds=1;//拉高控制線return(dat);}//***************************************************************************//從DS18B20讀一個字節(jié)uchartempreadbyte(void){uchari,j,dat;dat=0;for(i=1;i<=8;i++)//讀到的8位組成1字節(jié){j=tempreadbit();dat=(j<<7)|(dat>>1);}return(dat);}//***************************************************************************//向DS18B20寫一位數(shù)據(jù)voidtempwritebit(bitinstruc_data){inttime;if(instruc_data){temp_ds=0;//拉低控制線time=3;while(time>0)time--;temp_ds=1;//拉高控制線time=8;while(time>0)time--;}else{temp_ds=0;//拉低控制線time=14;while(time>0)time--;time--;}temp_ds=1;//拉高控制線time++;time++;}//***************************************************************************//向DS18B20寫一個字節(jié)數(shù)據(jù)voidtempwritebyte(ucharinstru){inti;for(i=1;i<=8;i++)//將1字節(jié)拆分位8位,1位1位地寫給DS18B20{tempwritebit(instru&0x01);instru=instru>>1;}}//***************************************************************************//讀取寄存器中存儲的溫度數(shù)據(jù)uintget_temp(){uchartemp_L,temp_H;DS18B20_init();delay(1);tempwritebyte(0xcc);//寫跳過ROM指令tempwritebyte(0xbe);//寫入讀暫存器指令temp_L=tempreadbyte();//讀溫度低8位temp_H=tempreadbyte();//讀溫度高8位temp=temp_H<<8|temp_L;//獲取溫度數(shù)據(jù)f_temp=temp*0.0625;//12位溫度數(shù)據(jù),分辨率為0.0625;temp=f_temp*100+0.5;//乘100是小數(shù)點后保留兩位,加0.5是減小誤差returntemp;}//***************************************************************************//顯示子程序voiddis_temp(uintt){uinti;i=t/1000;//將千位顯示在數(shù)碼管第1位P0=table[i];P2=0x01;delay(5);P0=0xFF;i=t%1000/100;//將百位和小數(shù)點顯示在數(shù)碼管第2位P0=table[i]&0x7F;P2=0x02;delay(5);P0=0xFF;i=t%100/10;//將十位顯示在數(shù)碼管第3位P0=table[i];P2=0x04;delay(5);P0=0xFF;i=t%10;//將個位顯示在數(shù)碼管第4位P0=table[i];P2=0x08;delay(5);P0=0xFF;}//***************************************************************************//主函數(shù)voidmain(){DS18B20_init();while(1){DS18B20_init();delay(1);tempwritebyte(0xcc);//寫跳過ROM指令tempwritebyte(0x44);//啟動轉(zhuǎn)換dis_temp(get_temp());//調(diào)用顯示子函數(shù)}}項目11知識思考與項目訓(xùn)練答案(一)選擇題:1.D2.B3.C4.D5.A6.C7.A8.B(二)填空題:1.程序存儲器(Flash)、高速A/D轉(zhuǎn)換、PWM/PCA2.電源電路3.P1M1、P1M04.IAP_CONTR、IRC_CLKO5.ADC_START、ADC_FLAG6.簡答題:STC15F2K60S2系列單片機的最小工作系統(tǒng)如何設(shè)計?答:STC15F2K60S2系列單片機的最小工作系統(tǒng)包括電源、復(fù)位和時鐘,在單片機的電源和地之間加入+5V電源,在IAP_CONTR寄存器和IRC_CLKO寄存器中設(shè)置軟件復(fù)位和內(nèi)部時鐘,最小工作系統(tǒng)就構(gòu)成。2.STC15F2K60S2系列單片機提供了多少個中斷請求源,它們分別是什么?答:STC15F2K60S2系列單片機提供了14個中斷請求源,它們分別是:外部中斷0()、定時器0中斷、外部中斷1()、定時器1中斷、串口1中斷、A/D轉(zhuǎn)換中斷、低壓檢測(LVD)中斷、PCA/CCP中斷、串口2中斷、SPI中斷、外部中斷2(INT2)、外部中斷3(INT3)、定時器T2中斷以及外部中斷4(INT43.簡述STC15F2K60S2系列單片機的定時/計數(shù)器的4種工作模式和特點。答:STC15F2K60S2系列單片機內(nèi)部設(shè)置了3個定時器:3個16位定時器/計數(shù)器T0和T1以及定時器T2。T0有4種工作模式:模式0(16位自動重裝載模式),模式1(16位不可重裝載模式),模式2(8位自動重裝模式),模式3(兩個8位定時器/計數(shù)器)。T1除模式3外,其他工作模式與T0相同,T1在模式3時無效,停止計數(shù)。T2的工作模式固定為16位自動重裝載模式。T2可以當(dāng)定時器使用,也可以當(dāng)串口的波特率發(fā)生器和可編程時鐘輸出。4.簡述STC15F2K60S2系列單片機內(nèi)部A/D轉(zhuǎn)換器工作的過程?答:STC15F2K60S2系列單片機內(nèi)部A/D轉(zhuǎn)換器工作的過程如下:先給ADC上電,也就是置位ADC控制寄存器中的ADC_POWER位,由ADC控制寄存器ADC_CONTR中的CHS2~CHS0確定由哪路模擬通道輸入,通過模擬多路開關(guān),將通過ADC0~7的模擬量輸入送給比較器。用數(shù)/模轉(zhuǎn)換器(DAC)轉(zhuǎn)換的模擬量與輸入的模擬量通過比較器進行比較,將比較結(jié)果保存到逐次比較寄存器,并通過逐次比較寄存器輸出轉(zhuǎn)換結(jié)果。A/D轉(zhuǎn)換結(jié)束后,最終的轉(zhuǎn)換結(jié)果保存到ADC轉(zhuǎn)換結(jié)果寄存器ADC_RES和ADC_RESL,同時,置位ADC控制寄存器ADC_C0NTR中的A/D轉(zhuǎn)換結(jié)束標(biāo)志位ADC_FLAG,以供程序查詢或發(fā)出中斷申請。ADC的轉(zhuǎn)換速度由ADC控制寄存器中的SPEED1和SPEED0確定。(四)項目訓(xùn)練:1.用STC15F2K60S2單片機的定時/計數(shù)器T1軟件模擬高速PWM,單片機工作頻率24MHz,要求從單片機的P3.5(T0CLKO)高速輸出不斷變化占空比的PWM信號。要求PWM占空比最小為24T/周期,最大為(周期-24T)/周期,T為時鐘周期。電路設(shè)計:單片機連接電源,從P3.4引出PWM波形。程序設(shè)計://***************************************************************************#defineMAIN_Fosc24000000UL //定義主時鐘24MHz#definePWM_DUTY6000 /*定義PWM的周期為6000T,T為時鐘周期,因為主頻使用24MHZ的,則PWM頻率為4000HZ。*/#define PWM_HIGH_MIN 24 //限制PWM輸出的最小占空比。#define PWM_HIGH_MAX(PWM_DUTY-PWM_HIGH_MIN) //限制PWM輸出的最大占空比。//***************************************************************************typedef unsignedchar u8;typedef unsignedint u16;typedef unsignedlong u32;//***************************************************************************sbit P_PWM=P3^4;//定義PWM輸出引腳。u16 pwm; //定義PWM輸出高電平的時間的變量,用戶操作PWM的變量。u16 PWM_high,PWM_low; //PWM中間變量//***************************************************************************//延時函數(shù),這里只支持1~255ms.自動適應(yīng)主時鐘voiddelay_ms(u8ms){u16i; do{i=MAIN_Fosc/13000; while(--i) ;}while(--ms);}//***************************************************************************//計算PWM重裝值函數(shù)void LoadPWM(u16i){ u16 j; if(i>PWM_HIGH_MAX) i=PWM_HIGH_MAX; //如果寫入大于最大占空比數(shù)據(jù),則強制為最大占空比。 if(i<PWM_HIGH_MIN) i=PWM_HIGH_MIN; //如果寫入小于最小占空比數(shù)據(jù),則強制為最小占空比。 j=65536UL-PWM_DUTY+i; //計算PWM低電平時間 i=65536UL-i; //計算PWM高電平時間 EA=0; PWM_high=i; //裝載PWM高電平時間 PWM_low=j; //裝載PWM低電平時間 EA=1;}//***************************************************************************//主函數(shù)voidmain(void){ P0M1=0; P0M0=0; //設(shè)置為準(zhǔn)雙向口 P1M1=0; P1M0=0; //設(shè)置為準(zhǔn)雙向口 P2M1=0; P2M0=0; //設(shè)置為準(zhǔn)雙向口 P3M1=0; P3M0=0; //設(shè)置為準(zhǔn)雙向口 P4M1=0; P4M0=0; //設(shè)置為準(zhǔn)雙向口 P5M1=0; P5M0=0; //設(shè)置為準(zhǔn)雙向口 P6M1=0; P6M0=0; //設(shè)置為準(zhǔn)雙向口 P7M1=0; P7M0=0; //設(shè)置為準(zhǔn)雙向口 P_PWM=0; P3M1&=~(1<<4); //P3.4設(shè)置為PWM輸出 P3M0|=(1<<4); TR1=0; //停止計數(shù) ET1=1; //允許中斷 PT1=1; //高優(yōu)先級中斷 TMOD=0x00; //T1工作模式0:16位自動重裝,定時 AUXR|=0x80;//1T,不分頻 INT_CLKO|=0x02; //P3.4輸出時鐘 TH1=0; TL1=0; TR1=1; //T1開始運行 EA=1; pwm=PWM_DUTY/10; //給PWM一個初值,這里為10%占空比 LoadPWM(pwm); //計算PWM重裝值 while(1) { while(pwm<(PWM_HIGH_MAX-8)) { pwm+=8; //PWM逐漸加到最大 LoadPWM(pwm); delay_ms(8); } while(pwm>(PWM_HIGH_MIN+8)) { pwm-=8; //PWM逐漸減到最小 LoadPWM(pwm); delay_ms(8); } }}//***************************************************************************//T0中斷函數(shù)voidtimer0_int(void)interrupt1{ if(P_PWM) { TH1=(u8)(PWM_low>>8); //如果是輸出高電平,則裝載低電平時間。 TL1=(u8)PWM_low; } else { TH1=(u8)(PWM_high>>8); //如果是輸出低電平,則裝載高電平時間。 TL1=(u8)PWM_high; }}//***************************************************************************2.用STC15F2K60S2單片機設(shè)計一個電壓測量系統(tǒng),測量P1.0管腳上輸入的可調(diào)電阻分壓電壓,單片機工作頻率為22.1184MHz。用一只4位共陰極的數(shù)碼管來顯示檢測到的電壓值,要求電壓值保留兩位小數(shù)。電路設(shè)計:在單片機P1.0口接入R1可變電阻的滑動點,可調(diào)分壓,采用單片機的I/O方式控制74HC595驅(qū)動4位數(shù)碼管,控制74HC595的數(shù)據(jù)和時鐘線從單片機的P4.0、P4.3和P5.4引出。軟件設(shè)計://***************************************************************************#include "STC15Fxxxx.H"http://用戶定義宏#defineMAIN_Fosc22118400L //定義主時鐘22.1184MHz#defineDIS_DOT0x0A//在段碼表中0~9數(shù)字與0.~9.的間隔數(shù)#defineTimer0_Reload(65536UL-(MAIN_Fosc/1000))//T0中斷頻率,1000次/秒//***************************************************************************typedef unsignedchar u8;typedef unsignedint u16;typedef unsignedlong u32;//***************************************************************************/*共陰極LED段碼表,包括01234567890.1.2.3.4.5.6.7.8.9.*/u8codet_display[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF}; //位碼表u8codeT_COM[]={0x01,0x02,0x04,0x08}; //***************************************************************************//IO口定義sbit P_HC595_SER=P4^0; //HC595的14 腳SER數(shù)據(jù)輸入sbit P_HC595_RCLK=P5^4; //HC595的12腳RCLk鎖存時鐘sbit P_HC595_SRCLK=P4^3; //HC595的11腳SRCLK數(shù)據(jù)時鐘移位//***************************************************************************//本地變量聲明u8 LED4[4]; //顯示緩沖u8 display_index; //顯示位索引bit B_1ms; //1ms標(biāo)志u8 msecond;u16 Get_ADC10bitResult(u

溫馨提示

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

評論

0/150

提交評論