基于DA轉(zhuǎn)換模塊的單片機(jī)仿真和C語言開發(fā)_能力拓展訓(xùn)練_第1頁
基于DA轉(zhuǎn)換模塊的單片機(jī)仿真和C語言開發(fā)_能力拓展訓(xùn)練_第2頁
基于DA轉(zhuǎn)換模塊的單片機(jī)仿真和C語言開發(fā)_能力拓展訓(xùn)練_第3頁
基于DA轉(zhuǎn)換模塊的單片機(jī)仿真和C語言開發(fā)_能力拓展訓(xùn)練_第4頁
基于DA轉(zhuǎn)換模塊的單片機(jī)仿真和C語言開發(fā)_能力拓展訓(xùn)練_第5頁
已閱讀5頁,還剩29頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、目 錄 TOC o 1-3 h z u HYPERLINK l _Toc377302009 摘要 PAGEREF _Toc377302009 h I HYPERLINK l _Toc377302010 Abstract PAGEREF _Toc377302010 h II HYPERLINK l _Toc377302011 1設(shè)計任務(wù) PAGEREF _Toc377302011 h 1 HYPERLINK l _Toc377302012 1.1設(shè)計要求 PAGEREF _Toc377302012 h 1 HYPERLINK l _Toc377302013 1.2理論分析 PAGEREF _To

2、c377302013 h 1 HYPERLINK l _Toc377302014 2硬件電路設(shè)計 PAGEREF _Toc377302014 h 3 HYPERLINK l _Toc377302015 2.1單片機(jī)波形產(chǎn)生模塊 PAGEREF _Toc377302015 h 3 HYPERLINK l _Toc377302016 2.2 D/A轉(zhuǎn)換模塊 PAGEREF _Toc377302016 h 3 HYPERLINK l _Toc377302017 2.3顯示模塊 PAGEREF _Toc377302017 h 4 HYPERLINK l _Toc377302018 2.4總體電路設(shè)計

3、PAGEREF _Toc377302018 h 5 HYPERLINK l _Toc377302019 3程序設(shè)計 PAGEREF _Toc377302019 h 6 HYPERLINK l _Toc377302020 3.1程序框圖 PAGEREF _Toc377302020 h 6 HYPERLINK l _Toc377302021 3.2源程序 PAGEREF _Toc377302021 h 7 HYPERLINK l _Toc377302022 4軟件仿真 PAGEREF _Toc377302022 h 13 HYPERLINK l _Toc377302023 5心得體會 PAGERE

4、F _Toc377302023 h 14 HYPERLINK l _Toc377302024 參考文獻(xiàn) PAGEREF _Toc377302024 h 15 II摘要 波形發(fā)生器是一種能夠產(chǎn)生不同波形、不同頻率的設(shè)備。在本次課程設(shè)計中,要求設(shè)計一種采用D/A轉(zhuǎn)換的波形發(fā)生器,擬采用單片機(jī)產(chǎn)生各個時間點(diǎn)不同波形的值,利用D/A轉(zhuǎn)換芯片將單片機(jī)輸出的數(shù)字量轉(zhuǎn)換為模擬量輸出,形成相應(yīng)波形。 利用Keil軟件進(jìn)行C語言編程開發(fā),使用Proteus畫出電路圖,并對實(shí)驗(yàn)結(jié)果進(jìn)行軟件仿真。通過獨(dú)立鍵盤來控制兩種波形的類型選擇、頻率變化,并且頻率按1Hz的幅度等量變化,最終通過LCD液晶顯示器輸出顯示其各自的

5、類型以及頻率。關(guān)鍵字:波形發(fā)生器、單片機(jī)、A/D轉(zhuǎn)換、LCD液晶顯示器Abstract Waveform generator is a kind of can produce different waveform and frequency of the equipment. In the curriculum design, asked to design A waveform generator adopts D/A conversion, proposed values of various points in different waveforms by single chip mic

6、rocomputer, using D/A conversion chip microcontroller output of digital quantity can be converted into analog output, form the corresponding waveform. Using the Keil software development, C programming language to use Proteus draw circuit diagram, software simulation and the results of the experimen

7、t. Through independent keyboard to control the type selection of two kinds of waveform, frequency variation, and the frequency change 1 Hz every times, finally using LCD liquid crystal display output according to their respective types and frequency.Keywords: Waveform generator, MCU, A/D conversion,

8、 Liquid Crystal Display 1設(shè)計任務(wù)1.1設(shè)計要求設(shè)計一種采用D/A轉(zhuǎn)換的波形發(fā)生器,比如產(chǎn)生矩形波、三角波、鋸齒波、梯形波或正弦波及余弦波。要求進(jìn)行電路仿真實(shí)驗(yàn),并使用C語言進(jìn)行程序的開發(fā)。1.2理論分析一.波形函數(shù) 正弦波表達(dá)式:ft=Asin(t+),其波形如下圖所示:圖1 正弦波波形 鋸齒波表達(dá)式:ft=A(tnT),其波形如下圖所示:4T3T2TT5TAftt圖2 鋸齒波波形二.信號發(fā)生電路方案論證 方案一:通過單片機(jī)AT89C51控制D/A,輸出三種波形。此方案輸出的波形不夠穩(wěn)定,抗干擾能力弱,不易調(diào)節(jié)。但此方案電路簡單、成本低。 方案二:利用ADC9851芯

9、片組成的電路輸出波形。ADC9851是精密高頻波形產(chǎn)生電路,能夠產(chǎn)生準(zhǔn)確的三角波、方波和正弦波三種周期性波形。但此方案成本高,程序復(fù)雜度高。 以上兩種方案綜合考慮,選擇方案一。三.顯示方案論證 方案一:采用LED數(shù)碼管。由于人眼具有視覺暫留特性,當(dāng)每只數(shù)碼管顯示的時間間隔小于1/16s時人眼感覺不到閃動,看到的是每只數(shù)碼管常亮。使用數(shù)碼管顯示編程較易,但要顯示內(nèi)容多,且數(shù)碼管不能顯示字母。 方案二:采用LCD液晶顯示器1602。其功率小,效果明顯,顯示編程容易控制,可以顯示字母。 綜合考慮以上兩種方案,選擇方案二。四.鍵盤方案論證 方案一:矩陣式鍵盤。矩陣式鍵盤的按鍵觸點(diǎn)接于由行、列母線構(gòu)成的

10、矩陣電路的交叉處。當(dāng)鍵盤上沒有鍵閉合時,所有的行和列線都斷開,行線都呈高電平。當(dāng)某一個鍵閉合時,該鍵所對應(yīng)的行線和列線被短路。 方案二:獨(dú)立式鍵盤。獨(dú)立式鍵盤有一個電源和上拉電阻和按鍵構(gòu)成。當(dāng)按鍵按下時,利用單片機(jī)查詢方式來進(jìn)行相應(yīng)的波形顯示及頻率值。 綜合考慮以上兩種方案,選擇方案二。 確定方案如下:利用AT89C51單片機(jī)采用程序設(shè)計方法產(chǎn)生鋸齒波、正弦波兩種波形,再通過D/A轉(zhuǎn)換器DAC0832將數(shù)字信號轉(zhuǎn)換成模擬信號,濾波放大,最終由示波器顯示出來。通過獨(dú)立鍵盤來控制波形類型選擇、頻率變化,最終通過LCD液晶顯示器輸出顯示其各自的類型以及頻率值。設(shè)計流程如圖3所示。示波器顯示波形LCD

11、液晶顯示器顯示波形和頻率模擬量DAC0832D/A轉(zhuǎn)換AT89C51產(chǎn)生波形數(shù)字量放大器濾波放大圖3設(shè)計流程圖2硬件電路設(shè)計2.1單片機(jī)波形產(chǎn)生模塊 AT89C51集成了CPU、RAM、ROM、定時/計數(shù)器和多功能I/O口等計算機(jī)所需要的基本功能部件,其構(gòu)成的最小系統(tǒng)由單片機(jī)、時鐘電路、復(fù)位電路等構(gòu)成,具有簡單可靠的優(yōu)點(diǎn)。如圖4所示為89C51單片機(jī)構(gòu)成的最小系統(tǒng),采用內(nèi)部振蕩方式產(chǎn)生時鐘信號,復(fù)位電路采用開關(guān)復(fù)位。RP1為P0口的上拉電阻,P0口輸出LCD液晶顯示器顯示的相關(guān)信息,P1口輸出波形數(shù)字量到D/A轉(zhuǎn)換模塊,P2口一部分與獨(dú)立鍵盤相連,一部分控制LCD液晶顯示器,P3口閑置不用。圖

12、4 單片機(jī)最小系統(tǒng)2.2 D/A轉(zhuǎn)換模塊 單片機(jī)產(chǎn)生的波形通過DAC0832完成D/A轉(zhuǎn)換,并經(jīng)過放大器濾波放大之后輸出,如下圖所示為D/A轉(zhuǎn)換模塊電路圖。圖5 D/A轉(zhuǎn)換模塊 DAC0832芯片采用直通工作方式,8位數(shù)字量只要輸入到DI7 DI0端,就立即進(jìn)行D/A轉(zhuǎn)換。經(jīng)DAC0832轉(zhuǎn)換后的模擬量通過放大器濾波放大之后,輸入到示波器顯示波形。2.3顯示模塊 顯示模塊通過液晶顯示器顯示輸出的波形和頻率,其電路圖如下圖所示。LM016L的8位數(shù)據(jù)端接單片機(jī)的P0口,三個控制端RS、RW、E也分別與單片機(jī)的P2口相連。圖6 液晶顯示模塊2.4總體電路設(shè)計 根據(jù)上述模塊電路的設(shè)計,設(shè)計總體電路如

13、下圖所示。單片機(jī)由編程產(chǎn)生波形數(shù)字量,波形和頻率值通過P0口輸入到LCD液晶顯示器顯示,波形數(shù)字量由P1口輸入到DAC0832進(jìn)行D/A轉(zhuǎn)換之后通過放大器放大濾波,由示波器顯示波形。單片機(jī)P2.0、P2.1、P2.2分別控制頻率增加、頻率減少和波形轉(zhuǎn)換,P2.4、P2.5、P2.6用與控制LCD液晶顯示器。圖7 總體電路設(shè)計3程序設(shè)計3.1程序框圖開 始初始化LCD液晶顯示器顯示否有鍵按下?是key3鍵按下key2鍵按下key1鍵按下標(biāo)志位flag=1波形類別k1取反標(biāo)志位flag=1頻率f-頻率f+計算定時器初值并賦值計算定時器初值并賦值定時器開始計算定時器初值并賦值波形類別k1=0波形類別

14、k1=1鋸齒波相應(yīng)值查正弦函數(shù)表相應(yīng)值num=255num=0結(jié) 束圖8 程序框圖3.2源程序#include#include#define uint unsigned int #define uchar unsigned charuint flag=0; /按鍵按下標(biāo)志位uint f=10; /初始頻率uint num=0; /正弦波計數(shù)變量uint T0h,T0l; /定時器0的的初始值sbit key1=P20; /頻率加按鍵sbit key2=P21; /頻率減按鍵sbit key3=P22; /波形轉(zhuǎn)換 bit k1=0; /k1=0為鋸齒波,k1=1為正弦波 sbit lcden=

15、P24; /液晶使能端sbit lcdrs=P25; /液晶數(shù)據(jù)/命令選擇端sbit lcdrw=P26; /液晶讀/寫選擇端code uchar sinx=0 x7F,0 x82,0 x85,0 x88,0 x8B,0 x8F,0 x92,0 x95,0 x98,0 x9B,0 x9E,0 xA1,0 xA4,0 xA7,0 xAA,0 xAD,0 xB0,0 xB3,0 xB6,0 xB8,0 xBB,0 xBE,0 xC1,0 xC3,0 xC6,0 xC8,0 xCB,0 xCD,0 xD0,0 xD2,0 xD5,0 xD7,0 xD9,0 xDB,0 xDD,0 xE0,0 xE2

16、,0 xE4,0 xE5,0 xE7,0 xE9,0 xEB,0 xEC,0 xEE,0 xEF,0 xF1,0 xF2,0 xF4,0 xF5,0 xF6,0 xF7,0 xF8,0 xF9,0 xFA,0 xFB,0 xFB,0 xFC,0 xFD,0 xFD,0 xFE,0 xFE,0 xFE,0 xFF,0XFF,0XFF,0 xFF,0 xFF,0 xFF,0 xFE,0 xFE,0 xFE,0 xFD,0 xFD,0 xFC,0 xFB,0 xFB,0 xFA,0 xF9,0 xF8,0 xF7,0 xF6,0 xF5,0 xF4,0 xF2,0 xF1,0 xEF,0 xEE,0

17、 xEC,0 xEB,0 xE9,0 xE7,0 xE5,0 xE4,0 xE2,0 xE0,0 xDD,0 xDB,0 xD9,0 xD7,0 xD5,0 xD2,0 xD0,0 xCD,0 xCB,0 xC8,0 xC6,0 xC3,0 xC1,0 xBE,0 xBB,0 xB8,0 xB6,0 xB3,0 xB0,0 xAD,0 xAA,0 xA7,0 xA4,0 xA1,0 x9E,0 x9B,0 x98,0 x95,0 x92,0 x8F,0 x8B,0 x88,0 x85,0 x82,0 x7F,0 x7C,0 x79,0 x76,0 x73,0 x6F,0 x6C,0 x69,0

18、 x66,0 x63,0 x60,0 x5D,0 x5A,0 x57,0 x54,0 x51,0 x4E,0 x4B,0 x48,0 x46,0 x43,0 x40,0 x3D,0 x3B,0 x38,0 x36,0 x33,0 x31,0 x2E,0 x2C,0 x29,0 x27,0 x25,0 x23,0 x21,0 x1E,0 x1C,0 x1A,0 x19,0 x17,0 x15,0 x13,0 x12,0 x10,0 x0F,0 x0D,0 x0C,0 x0A,0 x09,0 x08,0 x07,0 x06,0 x05,0 x04,0 x03,0 x03,0 x02,0 x01,0

19、 x01,0 x01,0 x00,0 x00,0 x00,0 x00,0 x00,0 x00,0 x00,0 x01,0 x01,0 x01,0 x02,0 x03,0 x03,0 x04,0 x05,0 x06,0 x07,0 x08,0 x09,0 x0A,0 x0C,0 x0D,0 x0F,0 x10,0 x12,0 x13,0 x15,0 x17,0 x19,0 x1A,0 x1C,0 x1E,0 x21,0 x23,0 x25,0 x27,0 x29,0 x2C,0 x2E,0 x31,0 x33,0 x36,0 x38,0 x3B,0 x3D,0 x40,0 x43,0 x46,0

20、 x48,0 x4B,0 x4E,0 x51,0 x54,0 x57,0 x5A,0 x5D,0 x60,0 x63,0 x66,0 x69,0 x6C,0 x6F,0 x73,0 x76,0 x79,0 x7C,0 x7F; /延時tmsdelayms(uint t) uint i,j; for(i=t;i0;i-) for(j=110;j0;j-);/鍵盤檢測void keyscan() if(key1=0) delayms(5); if(key1=0) flag=1; f+; while(!key1); if(key2=0) delayms(5); if(key2=0) flag=1;

21、f-; while(!key2); if(key3=0) delayms(5); if(key3=0) k1=!k1; while(!key3); /通過輸入頻率計算對應(yīng)sin函數(shù)輸出間隔,也就是設(shè)置定時器0的初始值void calculate() float n; n=65536-12000000/f/12/256; T0h=(uint)n/256; T0l=(uint)n%256;/1602寫命令void write_com(uchar com) lcdrs=0;P0=com;delayms(5);lcden=1;delayms(5);lcden=0;/1602寫數(shù)據(jù)void write_

22、data(uchar date)lcdrs=1;P0=date;delayms(5);lcden=1;delayms(5);lcden=0;/初始化void init()lcdrw=0;lcden=0;write_com(0 x38); /設(shè)置16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)接口write_com(0 x0c); /設(shè)置開顯示,不顯示光標(biāo)write_com(0 x06); /寫一個字符后地址指針加1write_com(0 x01); /顯示清0,數(shù)據(jù)指針清0write_com(0 x80+0 x00); write_data(0 x77); /寫wave: write_data(0 x61)

23、; write_data(0 x76); write_data(0 x65); write_data(0 x3a); write_com(0 x80+0 x40); /換行寫f: write_data(0 x66); write_data(0 x3a);TMOD=0 x01;/定時器T0初始化calculate(); TH0=T0h; TL0=T0l; EA=1; ET0=1;TR0=1;/寫頻率void write_f(uint f)uint bai,shi,ge;bai=f/100;shi=f%100/10;ge=f%10;write_com(0 x80+0 x42); write_dat

24、a(0 x30+bai); write_data(0 x30+shi); write_data(0 x30+ge);write_data(0 x48); /H write_data(0 x7a); /z/顯示波形頻率void xsf()if(k1=0) /顯示鋸齒波write_com(0 x80+0 x05); write_data(0 x73); /寫sawtooth write_data(0 x61); write_data(0 x77); write_data(0 x74);write_data(0 x6f);write_data(0 x6f);write_data(0 x74);wri

25、te_data(0 x68);write_f(f);if(k1=1) /顯示正弦波write_com(0 x80+0 x05); write_data(0 x73);/寫sinusoid write_data(0 x69); write_data(0 x6e); write_data(0 x75);write_data(0 x73);write_data(0 x6f);write_data(0 x69);write_data(0 x64);write_f(f);/主函數(shù)void main() init(); while(1) xsf(); keyscan(); if(flag=1) calcu

26、late(); flag=0; /定時器0中斷void T0_time() interrupt 1 TH0=T0h; TL0=T0l; if(k1=0)/輸出鋸齒波 P1=255-num; else P1=sinxnum; /輸出正弦波 num+; if(num=255) num=0; 該程序?qū)⒉ㄐ蔚拿總€周期等分成256個,由定時器精確計時,每次頻率f改變,定時器的初值重新計算,計算公式為:TH0=6553512106f12256/256 TL0=6553512106f12256%256 每次定時器定時完后重新開始定時,并通過查表得到波形的相應(yīng)數(shù)值,將該值輸入到D/A轉(zhuǎn)換模塊進(jìn)行D/A轉(zhuǎn)換之后

27、,輸出相應(yīng)波形。4軟件仿真 將由上述C語言程序通過Keil軟件生成的HEX文件下載到Proteus電路圖中的單片機(jī)上進(jìn)行仿真,仿真波形如圖9和圖10所示。圖9 鋸齒波仿真波形圖10 正弦波仿真圖形 通過仿真可得,每按下一次開關(guān)1時,頻率增加1Hz,每按下一次開關(guān)2頻率減少1Hz,基本實(shí)現(xiàn)等幅可調(diào),按下開關(guān)3可在鋸齒波和正弦波之間來回切換。5心得體會參考文獻(xiàn)1李群芳,張士軍.單片微型計算機(jī)與接口技術(shù).北京:電子工業(yè)出版社,2008.2郭天祥.51單片機(jī)C語言教程.北京:電子工業(yè)出版社,20093余永權(quán).ATMEL89系列單片機(jī)應(yīng)用程序設(shè)計.北京:北京航空航天大學(xué),20024吳友宇.模擬電子技術(shù)基

28、礎(chǔ).北京:清華大學(xué)出版社,20095 王志功.集成電路設(shè)計基礎(chǔ).北京:電子工業(yè)出版社,2004.附錄資料:不需要的可以自行刪除bat文件的基本應(yīng)用bat是dos下的批處理文件 .cmd是nt內(nèi)核命令行環(huán)境的另一種批處理文件 從更廣義的角度來看,unix的shell腳本以及其它操作系統(tǒng)甚至應(yīng)用程序中由外殼進(jìn)行解釋執(zhí)行的文本,都具有與批處理文件十分相似的作用,而且同樣是由專用解釋器以行為單位解釋執(zhí)行,這種文本形式更通用的稱謂是腳本語言。所以從某個程度分析,batch, unix shell, awk, basic, perl 等腳本語言都是一樣的,只不過應(yīng)用的范圍和解釋的平臺各有不同而已。甚至有些

29、應(yīng)用程序仍然沿用批處理這一稱呼,而其內(nèi)容和擴(kuò)展名與dos的批處理卻又完全不同。 = 首先批處理文件是一個文本文件,這個文件的每一行都是一條DOS命令(大部分時候就好象我們在DOS提示符下執(zhí)行的命令行一樣),你可以使用DOS下的Edit或者Windows的記事本(notepad)等任何文本文件編輯工具創(chuàng)建和修改批處理文件。 = 注 = 批處理文件中完全可以使用非dos命令,甚至可以使用不具有可執(zhí)行特性的普通數(shù)據(jù)性文件,這緣于windows系統(tǒng)這個新型解釋平臺的涉入,使得批處理的應(yīng)用越來越邊緣化。所以我們討論的批處理應(yīng)該限定在dos環(huán)境或者命令行環(huán)境中,否則很多觀念和設(shè)定都需要做比較大的變動。 =

30、 其次,批處理文件是一種簡單的程序,可以通過條件語句(if)和流程控制語句(goto)來控制命令運(yùn)行的流程,在批處理中也可以使用循環(huán)語句(for)來循環(huán)執(zhí)行一條命令。當(dāng)然,批處理文件的編程能力與C語言等編程語句比起來是十分有限的,也是十分不規(guī)范的。批處理的程序語句就是一條條的DOS命令(包括內(nèi)部命令和外部命令),而批處理的能力主要取決于你所使用的命令。 = 注 = 批處理文件(batch file)也可以稱之為批處理程序(batch program),這一點(diǎn)與編譯型語言有所不同,就c語言來說,擴(kuò)展名為c或者cpp的文件可以稱之為c語言文件或者c語言源代碼,但只有編譯連接后的exe文件才可以稱之

31、為c語言程序。因?yàn)榕幚砦募旧砑染哂形谋镜目勺x性,又具有程序的可執(zhí)行性,這些稱謂的界限是比較模糊的。 = 第三,每個編寫好的批處理文件都相當(dāng)于一個DOS的外部命令,你可以把它所在的目錄放到你的DOS搜索路徑(path)中來使得它可以在任意位置運(yùn)行。一個良好的習(xí)慣是在硬盤上建立一個bat或者batch目錄(例如C:BATCH),然后將所有你編寫的批處理文件放到該目錄中,這樣只要在path中設(shè)置上c:batch,你就可以在任意位置運(yùn)行所有你編寫的批處理程序。 = 注 = 純以dos系統(tǒng)而言,可執(zhí)行程序大約可以細(xì)分為五類,依照執(zhí)行優(yōu)先級由高到低排列分別是:DOSKEY宏命令(預(yù)先駐留內(nèi)存),COM

32、MAND.COM中的內(nèi)部命令(根據(jù)內(nèi)存的環(huán)境隨時進(jìn)駐內(nèi)存),以com為擴(kuò)展名的可執(zhí)行程序(由 直接載入內(nèi)存),以exe位擴(kuò)展名的可執(zhí)行程序(由 重定位后載入內(nèi)存),以bat位擴(kuò)展名的批處理程序(由 解釋分析,根據(jù)其內(nèi)容按優(yōu)先級順序調(diào)用第2,3,4,5種可執(zhí)行程序,分析一行,執(zhí)行一行,文件本身不載入內(nèi)存) = 第四,在DOS和Win9x/Me系統(tǒng)下,C:盤根目錄下的AUTOEXEC.BAT批處理文件是自動運(yùn)行批處理文件,每次系統(tǒng)啟動時會自動運(yùn)行該文件,你可以將系統(tǒng)每次啟動時都要運(yùn)行的命令放入該文件中,例如設(shè)置搜索路徑,調(diào)入鼠標(biāo)驅(qū)動和磁盤緩存,設(shè)置系統(tǒng)環(huán)境變量等。下面是一個運(yùn)行于Windows 9

33、8下的autoexec.bat的示例: ECHO OFF PATH C:WINDOWS;C:WINDOWSCOMMAND;C:UCDOS;C:DOSTools; C:SYSTOOLS;C:WINTOOLS;C:BATCH LH SMARTDRV.EXE /X LH DOSKEY.COM /insert LH CTMOUSE.EXE SET TEMP=D:TEMP SET TMP=D:TEMP = 注 = AUTOEXEC.BAT為DOS系統(tǒng)的自動運(yùn)行批處理文件,由COMMAND.COM啟動時解釋執(zhí)行; 而在Win9x環(huán)境中,不僅增加支持了 DOSSTART.BAT, WINSTART.BAT

34、等許多其它自動運(yùn)行的批處理文件,對AUTOEXEC.BAT 也增加了 .DOS .W40 .BAK .OLD .PWS 等許多變體以適應(yīng)復(fù)雜的環(huán)境和多變的需求。 = willsort 編注 = 以下關(guān)于命令的分類,有很多值得推敲的地方。常用命令中的本不是命令,而dir、copy等也很常用的命令卻沒有列入, 而特殊命令中所有命令對我來說都是常用命令。建議將批處理所引用的命令分為內(nèi)部命令、外部命令、第三方程序三類。而內(nèi)部命令和外部命令中別有一類是專用于或常用于批處理中的命令可稱之為批處理命令。 以下摘錄MS-DOS 6.22 幫助文檔中關(guān)于批處理命令的文字,當(dāng)然,其中有些概念和定義已經(jīng)有些落后了。

35、 批處理命令 批處理文件或批處理程序是一個包含若干MS-DOS命令的正文文件,擴(kuò)展名為.BAT。當(dāng)在命令提示符下敲入批處理程序的名稱時,MS-DOS成組執(zhí)行此批處理程序中的命令。 任何在命令提示符下可使用的命令都可用在批處理程序中。此外,下面MS-DOS命令是專門在批處理程序中使用的。 = 常用命令 echo、call、pause、rem(小技巧:用:代替rem)是批處理文件最常用的幾個命令,我們就從他們開始學(xué)起。 = 注 = 首先, 不是一個命令, 而是DOS 批處理的一個特殊標(biāo)記符, 僅用于屏蔽命令行回顯. 下面是DOS命令行或批處理中可能會見到的一些特殊標(biāo)記符: CR(0D) 命令行結(jié)束

36、符 Escape(1B) ANSI轉(zhuǎn)義字符引導(dǎo)符 Space(20) 常用的參數(shù)界定符 Tab(09) ; = 不常用的參數(shù)界定符 + COPY命令文件連接符 * ? 文件通配符 字符串界定符 | 命令管道符 文件重定向符 命令行回顯屏蔽符 / 參數(shù)開關(guān)引導(dǎo)符 : 批處理標(biāo)簽引導(dǎo)符 % 批處理變量引導(dǎo)符 其次, : 確實(shí)可以起到rem 的注釋作用, 而且更簡潔有效; 但有兩點(diǎn)需要注意: 第一, 除了 : 之外, 任何以 :開頭的字符行, 在批處理中都被視作標(biāo)號, 而直接忽略其后的所有內(nèi)容, 只是為了與正常的標(biāo)號相區(qū)別, 建議使用 goto 所無法識別的標(biāo)號, 即在 :后緊跟一個非字母數(shù)字的一個

37、特殊符號. 第二, 與rem 不同的是, :后的字符行在執(zhí)行時不會回顯, 無論是否用echo on打開命令行回顯狀態(tài), 因?yàn)槊罱忉屍鞑徽J(rèn)為他是一個有效的命令行, 就此點(diǎn)來看, rem 在某些場合下將比 : 更為適用; 另外, rem 可以用于 config.sys 文件中. = echo 表示顯示此命令后的字符 echo off 表示在此語句后所有運(yùn)行的命令都不顯示命令行本身 與echo off相象,但它是加在每個命令行的最前面,表示運(yùn)行時不顯示這一行的命令行(只能影響當(dāng)前行)。 call 調(diào)用另一個批處理文件(如果不用call而直接調(diào)用別的批處理文件,那么執(zhí)行完那個批處理文件后將無法返回當(dāng)

38、前文件并執(zhí)行當(dāng)前文件的后續(xù)命令)。 pause 運(yùn)行此句會暫停批處理的執(zhí)行并在屏幕上顯示Press any key to continue.的提示,等待用戶按任意鍵后繼續(xù) rem 表示此命令后的字符為解釋行(注釋),不執(zhí)行,只是給自己今后參考用的(相當(dāng)于程序中的注釋)。 = 注 = 此處的描述較為混亂, 不如直接引用個命令的命令行幫助更為條理 ECHO 當(dāng)程序運(yùn)行時,顯示或隱藏批處理程序中的正文。也可用于允許或禁止命令的回顯。 在運(yùn)行批處理程序時,MS-DOS一般在屏幕上顯示(回顯)批處理程序中的命令。 使用ECHO命令可關(guān)閉此功能。 語法 ECHO ON|OFF 若要用echo命令顯示一條命

39、令,可用下述語法: echo message 參數(shù) ON|OFF 指定是否允許命令的回顯。若要顯示當(dāng)前的ECHO的設(shè)置,可使用不帶參數(shù)的ECHO 命令。 message 指定讓MS-DOS在屏幕上顯示的正文。 CALL 從一個批處理程序中調(diào)用另一個批處理程序,而不會引起第一個批處理的中止。 語法 CALL drive:pathfilename batch-parameters 參數(shù) drive:pathfilename 指定要調(diào)用的批處理程序的名字及其存放處。文件名必須用.BAT作擴(kuò)展名。 batch-parameters 指定批處理程序所需的命令行信息。 PAUSE 暫停批處理程序的執(zhí)行并顯

40、示一條消息,提示用戶按任意鍵繼續(xù)執(zhí)行。只能在批處 理程序中使用該命令。 語法 PAUSE REM 在批處理文件或CONFIG.SYS中加入注解。也可用REM命令來屏蔽命令(在CONFIG.SYS 中也可以用分號 ; 代替REM命令,但在批處理文件中則不能替代)。 語法 REM string 參數(shù) string 指定要屏蔽的命令或要包含的注解。 = 例1:用edit編輯a.bat文件,輸入下列內(nèi)容后存盤為c:a.bat,執(zhí)行該批處理文件后可實(shí)現(xiàn):將根目錄中所有文件寫入 a.txt中,啟動UCDOS,進(jìn)入WPS等功能。 批處理文件的內(nèi)容為: 命令注釋: echo off 不顯示后續(xù)命令行及當(dāng)前命令

41、行 dir c:*.* a.txt 將c盤文件列表寫入a.txt call c:ucdosucdos.bat 調(diào)用ucdos echo 你好 顯示你好 pause 暫停,等待按鍵繼續(xù) rem 準(zhǔn)備運(yùn)行wps 注釋:準(zhǔn)備運(yùn)行wps cd ucdos 進(jìn)入ucdos目錄 wps 運(yùn)行wps 批處理文件的參數(shù) 批處理文件還可以像C語言的函數(shù)一樣使用參數(shù)(相當(dāng)于DOS命令的命令行參數(shù)),這需要用到一個參數(shù)表示符%。 %1-9表示參數(shù),參數(shù)是指在運(yùn)行批處理文件時在文件名后加的以空格(或者Tab)分隔的字符串。變量可以從%0到%9,%0表示批處理命令本身,其它參數(shù)字符串用%1到%9順序表示。 例2:C:根

42、目錄下有一批處理文件名為f.bat,內(nèi)容為: echo off format %1 如果執(zhí)行C:f a: 那么在執(zhí)行f.bat時,%1就表示a:,這樣format %1就相當(dāng)于format a:,于是上面的命令運(yùn)行時實(shí)際執(zhí)行的是format a: 例3:C:根目錄下一批處理文件名為t.bat,內(nèi)容為: echo off type %1 type %2 那么運(yùn)行C:t a.txt b.txt %1 : 表示a.txt %2 : 表示b.txt 于是上面的命令將順序地顯示a.txt和b.txt文件的內(nèi)容。 = 注 = 參數(shù)在批處理中也作為變量處理, 所以同樣使用百分號作為引導(dǎo)符, 其后跟0-9中的

43、一個數(shù)字構(gòu)成參數(shù)引用符. 引用符和參數(shù)之間 (例如上文中的 %1 與 a: ) 的關(guān)系類似于變量指針與變量值的關(guān)系. 當(dāng)我們要引用第十一個或更多個參數(shù)時, 就必須移動DOS 的參數(shù)起始指針. shift 命令正充當(dāng)了這個移動指針的角色, 它將參數(shù)的起始指針移動到下一個參數(shù), 類似C 語言中的指針操作. 圖示如下: 初始狀態(tài), cmd 為命令名, 可以用 %0 引用 cmd arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 arg10 | | | | | | | | | | %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 經(jīng)過1次shift后,

44、 cmd 將無法被引用 cmd arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 arg10 | | | | | | | | | | %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 經(jīng)過2次shift后, arg1也被廢棄, %9指向?yàn)榭? 沒有引用意義 cmd arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 arg10 | | | | | | | | | %0 %1 %2 %3 %4 %5 %6 %7 %8 遺憾的是, win9x 和DOS下均不支持 shift 的逆操作. 只有在 nt 內(nèi)核命令行

45、環(huán)境下, shift 才支持 /n 參數(shù), 可以以第一參數(shù)為基準(zhǔn)返復(fù)移動起始指針. = 特殊命令 if goto choice for是批處理文件中比較高級的命令,如果這幾個你用得很熟練,你就是批處理文件的專家啦。 一、if 是條件語句,用來判斷是否符合規(guī)定的條件,從而決定執(zhí)行不同的命令。 有三種格式: 1、if not 參數(shù) = 字符串 待執(zhí)行的命令 參數(shù)如果等于(not表示不等,下同)指定的字符串,則條件成立,運(yùn)行命令,否則運(yùn)行下一句。 例:if %1=a format a: = if 的命令行幫助中關(guān)于此點(diǎn)的描述為: IF NOT string1=string2 command 在此有以

46、下幾點(diǎn)需要注意: 1. 包含字符串的雙引號不是語法所必須的, 而只是習(xí)慣上使用的一種防空字符 2. string1 未必是參數(shù), 它也可以是環(huán)境變量, 循環(huán)變量以及其他字符串常量或變量 3. command 不是語法所必須的, string2 后跟一個空格就可以構(gòu)成一個有效的命令行 = 2、if not exist 路徑文件名 待執(zhí)行的命令 如果有指定的文件,則條件成立,運(yùn)行命令,否則運(yùn)行下一句。 如: if exist c:config.sys type c:config.sys 表示如果存在c:config.sys文件,則顯示它的內(nèi)容。 * 注 * 也可以使用以下的用法: if exist

47、 command device 是指DOS系統(tǒng)中已加載的設(shè)備, 在win98下通常有: AUX, PRN, CON, NUL COM1, COM2, COM3, COM4 LPT1, LPT2, LPT3, LPT4 XMSXXXX0, EMMXXXX0 A: B: C: ., CLOCK$, CONFIG$, DblBuff$, IFS$HLP$ 具體的內(nèi)容會因硬軟件環(huán)境的不同而略有差異, 使用這些設(shè)備名稱時, 需要保證以下三點(diǎn): 1. 該設(shè)備確實(shí)存在(由軟件虛擬的設(shè)備除外) 2. 該設(shè)備驅(qū)動程序已加載(aux, prn等標(biāo)準(zhǔn)設(shè)備由系統(tǒng)缺省定義) 3. 該設(shè)備已準(zhǔn)備好(主要是指a: b: .

48、, com1., lpt1.等) 可通過命令 mem/d | find device /i 來檢閱你的系統(tǒng)中所加載的設(shè)備 另外, 在DOS系統(tǒng)中, 設(shè)備也被認(rèn)為是一種特殊的文件, 而文件也可以稱作字符設(shè)備; 因?yàn)樵O(shè)備(device)與文件都是使用句柄(handle)來管理的, 句柄就是名字, 類似于文件名, 只不過句柄不是應(yīng)用于磁盤管理, 而是應(yīng)用于內(nèi)存管理而已, 所謂設(shè)備加載也即指在內(nèi)存中為其分配可引用的句柄. = 3、if errorlevel 待執(zhí)行的命令 很多DOS程序在運(yùn)行結(jié)束后會返回一個數(shù)字值用來表示程序運(yùn)行的結(jié)果(或者狀態(tài)),通過if errorlevel命令可以判斷程序的返回值

49、,根據(jù)不同的返回值來決定執(zhí)行不同的命令(返回值必須按照從大到小的順序排列)。如果返回值等于指定的數(shù)字,則條件成立,運(yùn)行命令,否則運(yùn)行下一句。 如if errorlevel 2 goto x2 = 注 = 返回值從大到小的順序排列不是必須的, 而只是執(zhí)行命令為 goto 時的習(xí)慣用法, 當(dāng)使用 set 作為執(zhí)行命令時, 通常會從小到大順序排列, 比如需將返回碼置入環(huán)境變量, 就需使用以下的順序形式: if errorlevel 1 set el=1 if errorlevel 2 set el=2 if errorlevel 3 set el=3 if errorlevel 4 set el=4

50、 if errorlevel 5 set el=5 . 當(dāng)然, 也可以使用以下循環(huán)來替代, 原理是一致的: for %e in (1 2 3 4 5 6 7 8.) do if errorlevel %e set el=%e 更高效簡潔的用法, 可以參考我寫的另一篇關(guān)于獲取 errorlevel 的文章 出現(xiàn)此種現(xiàn)象的原因是, if errorlevel 比較返回碼的判斷條件并非等于, 而是大于等于. 由于 goto 的跳轉(zhuǎn)特性, 由小到大排序會導(dǎo)致在較小的返回碼處就跳出; 而由于 set命令的 重復(fù) 賦值特性, 由大到小排序會導(dǎo)致較小的返回碼 覆蓋 較大的返回碼. 另外, 雖然 if err

51、orlevel= command 也是有效的命令行, 但也只是 解釋命令行時將 = 作為命令行切分符而忽略掉罷了 = 二、goto 批處理文件運(yùn)行到這里將跳到goto所指定的標(biāo)號(標(biāo)號即label,標(biāo)號用:后跟標(biāo)準(zhǔn)字符串來定義)處,goto語句一般與if配合使用,根據(jù)不同的條件來執(zhí)行不同的命令組。 如: goto end :end echo this is the end 標(biāo)號用:字符串來定義,標(biāo)號所在行不被執(zhí)行。 = willsort 編注 label 常被譯為 標(biāo)簽 , 但是這并不具有廣泛的約定性. goto 與 : 聯(lián)用可實(shí)現(xiàn)執(zhí)行中途的跳轉(zhuǎn), 再結(jié)合 if 可實(shí)現(xiàn)執(zhí)行過程的條件分支, 多

52、個 if 即可實(shí)現(xiàn)命令的分組, 類似 C 中 switch case 結(jié)構(gòu)或者 Basic 中的 select case 結(jié)構(gòu), 大規(guī)模且結(jié)構(gòu)化的命令分組即可實(shí)現(xiàn)高級語言中的函數(shù)功能. 以下是批處理和C/Basic在語法結(jié)構(gòu)上的對照: Batch C / Basic goto&: goto&: goto&:&if if&else / if&elseif&endif goto&:&if. switch&case / select case goto&:&if&set&envar. function() / function(),sub() = 三、choice 使用此命令可以讓用戶輸入一個字符(

53、用于選擇),從而根據(jù)用戶的選擇返回不同的errorlevel,然后于if errorlevel配合,根據(jù)用戶的選擇運(yùn)行不同的命令。 注意:choice命令為DOS或者Windows系統(tǒng)提供的外部命令,不同版本的choice命令語法會稍有不同,請用choice /?查看用法。 choice的命令語法(該語法為Windows 2003中choice命令的語法,其它版本的choice的命令語法與此大同小異): CHOICE /C choices /N /CS /T timeout /D choice /M text 描述: 該工具允許用戶從選擇列表選擇一個項(xiàng)目并返回所選項(xiàng)目的索引。 參數(shù)列表: /C

54、 choices 指定要創(chuàng)建的選項(xiàng)列表。默認(rèn)列表是 YN。 /N 在提示符中隱藏選項(xiàng)列表。提示前面的消息得到顯示, 選項(xiàng)依舊處于啟用狀態(tài)。 /CS 允許選擇分大小寫的選項(xiàng)。在默認(rèn)情況下,這個工具 是不分大小寫的。 /T timeout 做出默認(rèn)選擇之前,暫停的秒數(shù)。可接受的值是從 0 到 9999。如果指定了 0,就不會有暫停,默認(rèn)選項(xiàng) 會得到選擇。 /D choice 在 nnnn 秒之后指定默認(rèn)選項(xiàng)。字符必須在用 /C 選 項(xiàng)指定的一組選擇中; 同時,必須用 /T 指定 nnnn。 /M text 指定提示之前要顯示的消息。如果沒有指定,工具只 顯示提示。 /? 顯示幫助消息。 注意: E

55、RRORLEVEL 環(huán)境變量被設(shè)置為從選擇集選擇的鍵索引。列出的第一個選 擇返回 1,第二個選擇返回 2,等等。如果用戶按的鍵不是有效的選擇, 該工具會發(fā)出警告響聲。如果該工具檢測到錯誤狀態(tài),它會返回 255 的 ERRORLEVEL 值。如果用戶按 Ctrl+Break 或 Ctrl+C 鍵,該工具會返回 0 的 ERRORLEVEL 值。在一個批程序中使用 ERRORLEVEL 參數(shù)時,將參數(shù)降 序排列。 示例: CHOICE /? CHOICE /C YNC /M 確認(rèn)請按 Y,否請按 N,或者取消請按 C。 CHOICE /T 10 /C ync /CS /D y CHOICE /C

56、ab /M 選項(xiàng) 1 請選擇 a,選項(xiàng) 2 請選擇 b。 CHOICE /C ab /N /M 選項(xiàng) 1 請選擇 a,選項(xiàng) 2 請選擇 b。 = willsort 編注 = 我列出win98下choice的用法幫助, 已資區(qū)分 Waits for the user to choose one of a set of choices. 等待用戶選擇一組待選字符中的一個 CHOICE /C:choices /N /S /T:c,nn text /C:choices Specifies allowable keys. Default is YN 指定允許的按鍵(待選字符), 默認(rèn)為YN /N Do

57、not display choices and ? at end of prompt string. 不顯示提示字符串中的問號和待選字符 /S Treat choice keys as case sensitive. 處理待選字符時大小寫敏感 /T:c,nn Default choice to c after nn seconds 在 nn 秒后默認(rèn)選擇 c text Prompt string to display 要顯示的提示字符串 ERRORLEVEL is set to offset of key user presses in choices. ERRORLEVEL 被設(shè)置為用戶鍵入

58、的字符在待選字符中的偏移值 如果我運(yùn)行命令:CHOICE /C YNC /M 確認(rèn)請按 Y,否請按 N,或者取消請按 C。 屏幕上會顯示: 確認(rèn)請按 Y,否請按 N,或者取消請按 C。 Y,N,C? 例:test.bat的內(nèi)容如下(注意,用if errorlevel判斷返回值時,要按返回值從高到低排列): echo off choice /C dme /M defrag,mem,end if errorlevel 3 goto end if errorlevel 2 goto mem if errorlevel 1 goto defrag :defrag c:dosdefrag goto en

59、d :mem mem goto end :end echo good bye 此批處理運(yùn)行后,將顯示defrag,mem,endD,M,E? ,用戶可選擇d m e ,然后if語句根據(jù)用戶的選擇作出判斷,d表示執(zhí)行標(biāo)號為defrag的程序段,m表示執(zhí)行標(biāo)號為mem的程序段,e表示執(zhí)行標(biāo)號為end的程序段,每個程序段最后都以goto end將程序跳到end標(biāo)號處,然后程序?qū)@示good bye,批處理運(yùn)行結(jié)束。 四、for 循環(huán)命令,只要條件符合,它將多次執(zhí)行同一命令。 語法: 對一組文件中的每一個文件執(zhí)行某個特定命令。 FOR %variable IN (set) DO command command-parameters %variable 指定一個單一字母可替換的參數(shù)。 (set) 指定一個或一組文件??梢允褂猛ㄅ浞?。 command 指定對每個文件執(zhí)行的命令。 co

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論