基于DA转换模块的单片机仿真和C语言开发_能力拓展训练_第1页
基于DA转换模块的单片机仿真和C语言开发_能力拓展训练_第2页
基于DA转换模块的单片机仿真和C语言开发_能力拓展训练_第3页
基于DA转换模块的单片机仿真和C语言开发_能力拓展训练_第4页
基于DA转换模块的单片机仿真和C语言开发_能力拓展训练_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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设计任务 PAGEREF _Toc377302011 h 1 HYPERLINK l _Toc377302012 1.1设计要求 PAGEREF _Toc377302012 h 1 HYPERLINK l _Toc377302013 1.2理论分析 PAGEREF _To

2、c377302013 h 1 HYPERLINK l _Toc377302014 2硬件电路设计 PAGEREF _Toc377302014 h 3 HYPERLINK l _Toc377302015 2.1单片机波形产生模块 PAGEREF _Toc377302015 h 3 HYPERLINK l _Toc377302016 2.2 D/A转换模块 PAGEREF _Toc377302016 h 3 HYPERLINK l _Toc377302017 2.3显示模块 PAGEREF _Toc377302017 h 4 HYPERLINK l _Toc377302018 2.4总体电路设计

3、PAGEREF _Toc377302018 h 5 HYPERLINK l _Toc377302019 3程序设计 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 参考文献 PAGEREF _Toc377302024 h 15 II摘要 波形发生器是一种能够产生不同波形、不同频率的设备。在本次课程设计中,要求设计一种采用D/A转换的波形发生器,拟采用单片机产生各个时间点不同波形的值,利用D/A转换芯片将单片机输出的数字量转换为模拟量输出,形成相应波形。 利用Keil软件进行C语言编程开发,使用Proteus画出电路图,并对实验结果进行软件仿真。通过独立键盘来控制两种波形的类型选择、频率变化,并且频率按1Hz的幅度等量变化,最终通过LCD液晶显示器输出显示其各自的

5、类型以及频率。关键字:波形发生器、单片机、A/D转换、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设计任务1.1设计要求设计一种采用D/A转换的波形发生器,比如产生矩形波、三角波、锯齿波、梯形波或正弦波及余弦波。要求进行电路仿真实验,并使用C语言进行程序的开发。1.2理论分析一.波形函数 正弦波表达式:ft=Asin(t+),其波形如下图所示:图1 正弦波波形 锯齿波表达式:ft=A(tnT),其波形如下图所示:4T3T2TT5TAftt图2 锯齿波波形二.信号发生电路方案论证 方案一:通过单片机AT89C51控制D/A,输出三种波形。此方案输出的波形不够稳定,抗干扰能力弱,不易调节。但此方案电路简单、成本低。 方案二:利用ADC9851芯

9、片组成的电路输出波形。ADC9851是精密高频波形产生电路,能够产生准确的三角波、方波和正弦波三种周期性波形。但此方案成本高,程序复杂度高。 以上两种方案综合考虑,选择方案一。三.显示方案论证 方案一:采用LED数码管。由于人眼具有视觉暂留特性,当每只数码管显示的时间间隔小于1/16s时人眼感觉不到闪动,看到的是每只数码管常亮。使用数码管显示编程较易,但要显示内容多,且数码管不能显示字母。 方案二:采用LCD液晶显示器1602。其功率小,效果明显,显示编程容易控制,可以显示字母。 综合考虑以上两种方案,选择方案二。四.键盘方案论证 方案一:矩阵式键盘。矩阵式键盘的按键触点接于由行、列母线构成的

10、矩阵电路的交叉处。当键盘上没有键闭合时,所有的行和列线都断开,行线都呈高电平。当某一个键闭合时,该键所对应的行线和列线被短路。 方案二:独立式键盘。独立式键盘有一个电源和上拉电阻和按键构成。当按键按下时,利用单片机查询方式来进行相应的波形显示及频率值。 综合考虑以上两种方案,选择方案二。 确定方案如下:利用AT89C51单片机采用程序设计方法产生锯齿波、正弦波两种波形,再通过D/A转换器DAC0832将数字信号转换成模拟信号,滤波放大,最终由示波器显示出来。通过独立键盘来控制波形类型选择、频率变化,最终通过LCD液晶显示器输出显示其各自的类型以及频率值。设计流程如图3所示。示波器显示波形LCD

11、液晶显示器显示波形和频率模拟量DAC0832D/A转换AT89C51产生波形数字量放大器滤波放大图3设计流程图2硬件电路设计2.1单片机波形产生模块 AT89C51集成了CPU、RAM、ROM、定时/计数器和多功能I/O口等计算机所需要的基本功能部件,其构成的最小系统由单片机、时钟电路、复位电路等构成,具有简单可靠的优点。如图4所示为89C51单片机构成的最小系统,采用内部振荡方式产生时钟信号,复位电路采用开关复位。RP1为P0口的上拉电阻,P0口输出LCD液晶显示器显示的相关信息,P1口输出波形数字量到D/A转换模块,P2口一部分与独立键盘相连,一部分控制LCD液晶显示器,P3口闲置不用。图

12、4 单片机最小系统2.2 D/A转换模块 单片机产生的波形通过DAC0832完成D/A转换,并经过放大器滤波放大之后输出,如下图所示为D/A转换模块电路图。图5 D/A转换模块 DAC0832芯片采用直通工作方式,8位数字量只要输入到DI7 DI0端,就立即进行D/A转换。经DAC0832转换后的模拟量通过放大器滤波放大之后,输入到示波器显示波形。2.3显示模块 显示模块通过液晶显示器显示输出的波形和频率,其电路图如下图所示。LM016L的8位数据端接单片机的P0口,三个控制端RS、RW、E也分别与单片机的P2口相连。图6 液晶显示模块2.4总体电路设计 根据上述模块电路的设计,设计总体电路如

13、下图所示。单片机由编程产生波形数字量,波形和频率值通过P0口输入到LCD液晶显示器显示,波形数字量由P1口输入到DAC0832进行D/A转换之后通过放大器放大滤波,由示波器显示波形。单片机P2.0、P2.1、P2.2分别控制频率增加、频率减少和波形转换,P2.4、P2.5、P2.6用与控制LCD液晶显示器。图7 总体电路设计3程序设计3.1程序框图开 始初始化LCD液晶显示器显示否有键按下?是key3键按下key2键按下key1键按下标志位flag=1波形类别k1取反标志位flag=1频率f-频率f+计算定时器初值并赋值计算定时器初值并赋值定时器开始计算定时器初值并赋值波形类别k1=0波形类别

14、k1=1锯齿波相应值查正弦函数表相应值num=255num=0结 束图8 程序框图3.2源程序#include#include#define uint unsigned int #define uchar unsigned charuint flag=0; /按键按下标志位uint f=10; /初始频率uint num=0; /正弦波计数变量uint T0h,T0l; /定时器0的的初始值sbit key1=P20; /频率加按键sbit key2=P21; /频率减按键sbit key3=P22; /波形转换 bit k1=0; /k1=0为锯齿波,k1=1为正弦波 sbit lcden=

15、P24; /液晶使能端sbit lcdrs=P25; /液晶数据/命令选择端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); /通过输入频率计算对应sin函数输出间隔,也就是设置定时器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写数据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); /设置16*2显示,5*7点阵,8位数据接口write_com(0 x0c); /设置开显示,不显示光标write_com(0 x06); /写一个字符后地址指针加1write_com(0 x01); /显示清0,数据指针清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);/主函数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; 该程序将波形的每个周期等分成256个,由定时器精确计时,每次频率f改变,定时器的初值重新计算,计算公式为:TH0=6553512106f12256/256 TL0=6553512106f12256%256 每次定时器定时完后重新开始定时,并通过查表得到波形的相应数值,将该值输入到D/A转换模块进行D/A转换之后

27、,输出相应波形。4软件仿真 将由上述C语言程序通过Keil软件生成的HEX文件下载到Proteus电路图中的单片机上进行仿真,仿真波形如图9和图10所示。图9 锯齿波仿真波形图10 正弦波仿真图形 通过仿真可得,每按下一次开关1时,频率增加1Hz,每按下一次开关2频率减少1Hz,基本实现等幅可调,按下开关3可在锯齿波和正弦波之间来回切换。5心得体会参考文献1李群芳,张士军.单片微型计算机与接口技术.北京:电子工业出版社,2008.2郭天祥.51单片机C语言教程.北京:电子工业出版社,20093余永权.ATMEL89系列单片机应用程序设计.北京:北京航空航天大学,20024吴友宇.模拟电子技术基

28、础.北京:清华大学出版社,20095 王志功.集成电路设计基础.北京:电子工业出版社,2004.附录资料:不需要的可以自行删除bat文件的基本应用bat是dos下的批处理文件 .cmd是nt内核命令行环境的另一种批处理文件 从更广义的角度来看,unix的shell脚本以及其它操作系统甚至应用程序中由外壳进行解释执行的文本,都具有与批处理文件十分相似的作用,而且同样是由专用解释器以行为单位解释执行,这种文本形式更通用的称谓是脚本语言。所以从某个程度分析,batch, unix shell, awk, basic, perl 等脚本语言都是一样的,只不过应用的范围和解释的平台各有不同而已。甚至有些

29、应用程序仍然沿用批处理这一称呼,而其内容和扩展名与dos的批处理却又完全不同。 = 首先批处理文件是一个文本文件,这个文件的每一行都是一条DOS命令(大部分时候就好象我们在DOS提示符下执行的命令行一样),你可以使用DOS下的Edit或者Windows的记事本(notepad)等任何文本文件编辑工具创建和修改批处理文件。 = 注 = 批处理文件中完全可以使用非dos命令,甚至可以使用不具有可执行特性的普通数据性文件,这缘于windows系统这个新型解释平台的涉入,使得批处理的应用越来越边缘化。所以我们讨论的批处理应该限定在dos环境或者命令行环境中,否则很多观念和设定都需要做比较大的变动。 =

30、 其次,批处理文件是一种简单的程序,可以通过条件语句(if)和流程控制语句(goto)来控制命令运行的流程,在批处理中也可以使用循环语句(for)来循环执行一条命令。当然,批处理文件的编程能力与C语言等编程语句比起来是十分有限的,也是十分不规范的。批处理的程序语句就是一条条的DOS命令(包括内部命令和外部命令),而批处理的能力主要取决于你所使用的命令。 = 注 = 批处理文件(batch file)也可以称之为批处理程序(batch program),这一点与编译型语言有所不同,就c语言来说,扩展名为c或者cpp的文件可以称之为c语言文件或者c语言源代码,但只有编译连接后的exe文件才可以称之

31、为c语言程序。因为批处理文件本身既具有文本的可读性,又具有程序的可执行性,这些称谓的界限是比较模糊的。 = 第三,每个编写好的批处理文件都相当于一个DOS的外部命令,你可以把它所在的目录放到你的DOS搜索路径(path)中来使得它可以在任意位置运行。一个良好的习惯是在硬盘上建立一个bat或者batch目录(例如C:BATCH),然后将所有你编写的批处理文件放到该目录中,这样只要在path中设置上c:batch,你就可以在任意位置运行所有你编写的批处理程序。 = 注 = 纯以dos系统而言,可执行程序大约可以细分为五类,依照执行优先级由高到低排列分别是:DOSKEY宏命令(预先驻留内存),COM

32、MAND.COM中的内部命令(根据内存的环境随时进驻内存),以com为扩展名的可执行程序(由 直接载入内存),以exe位扩展名的可执行程序(由 重定位后载入内存),以bat位扩展名的批处理程序(由 解释分析,根据其内容按优先级顺序调用第2,3,4,5种可执行程序,分析一行,执行一行,文件本身不载入内存) = 第四,在DOS和Win9x/Me系统下,C:盘根目录下的AUTOEXEC.BAT批处理文件是自动运行批处理文件,每次系统启动时会自动运行该文件,你可以将系统每次启动时都要运行的命令放入该文件中,例如设置搜索路径,调入鼠标驱动和磁盘缓存,设置系统环境变量等。下面是一个运行于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系统的自动运行批处理文件,由COMMAND.COM启动时解释执行; 而在Win9x环境中,不仅增加支持了 DOSSTART.BAT, WINSTART.BAT

34、等许多其它自动运行的批处理文件,对AUTOEXEC.BAT 也增加了 .DOS .W40 .BAK .OLD .PWS 等许多变体以适应复杂的环境和多变的需求。 = willsort 编注 = 以下关于命令的分类,有很多值得推敲的地方。常用命令中的本不是命令,而dir、copy等也很常用的命令却没有列入, 而特殊命令中所有命令对我来说都是常用命令。建议将批处理所引用的命令分为内部命令、外部命令、第三方程序三类。而内部命令和外部命令中别有一类是专用于或常用于批处理中的命令可称之为批处理命令。 以下摘录MS-DOS 6.22 帮助文档中关于批处理命令的文字,当然,其中有些概念和定义已经有些落后了。

35、 批处理命令 批处理文件或批处理程序是一个包含若干MS-DOS命令的正文文件,扩展名为.BAT。当在命令提示符下敲入批处理程序的名称时,MS-DOS成组执行此批处理程序中的命令。 任何在命令提示符下可使用的命令都可用在批处理程序中。此外,下面MS-DOS命令是专门在批处理程序中使用的。 = 常用命令 echo、call、pause、rem(小技巧:用:代替rem)是批处理文件最常用的几个命令,我们就从他们开始学起。 = 注 = 首先, 不是一个命令, 而是DOS 批处理的一个特殊标记符, 仅用于屏蔽命令行回显. 下面是DOS命令行或批处理中可能会见到的一些特殊标记符: CR(0D) 命令行结束

36、符 Escape(1B) ANSI转义字符引导符 Space(20) 常用的参数界定符 Tab(09) ; = 不常用的参数界定符 + COPY命令文件连接符 * ? 文件通配符 字符串界定符 | 命令管道符 文件重定向符 命令行回显屏蔽符 / 参数开关引导符 : 批处理标签引导符 % 批处理变量引导符 其次, : 确实可以起到rem 的注释作用, 而且更简洁有效; 但有两点需要注意: 第一, 除了 : 之外, 任何以 :开头的字符行, 在批处理中都被视作标号, 而直接忽略其后的所有内容, 只是为了与正常的标号相区别, 建议使用 goto 所无法识别的标号, 即在 :后紧跟一个非字母数字的一个

37、特殊符号. 第二, 与rem 不同的是, :后的字符行在执行时不会回显, 无论是否用echo on打开命令行回显状态, 因为命令解释器不认为他是一个有效的命令行, 就此点来看, rem 在某些场合下将比 : 更为适用; 另外, rem 可以用于 config.sys 文件中. = echo 表示显示此命令后的字符 echo off 表示在此语句后所有运行的命令都不显示命令行本身 与echo off相象,但它是加在每个命令行的最前面,表示运行时不显示这一行的命令行(只能影响当前行)。 call 调用另一个批处理文件(如果不用call而直接调用别的批处理文件,那么执行完那个批处理文件后将无法返回当

38、前文件并执行当前文件的后续命令)。 pause 运行此句会暂停批处理的执行并在屏幕上显示Press any key to continue.的提示,等待用户按任意键后继续 rem 表示此命令后的字符为解释行(注释),不执行,只是给自己今后参考用的(相当于程序中的注释)。 = 注 = 此处的描述较为混乱, 不如直接引用个命令的命令行帮助更为条理 ECHO 当程序运行时,显示或隐藏批处理程序中的正文。也可用于允许或禁止命令的回显。 在运行批处理程序时,MS-DOS一般在屏幕上显示(回显)批处理程序中的命令。 使用ECHO命令可关闭此功能。 语法 ECHO ON|OFF 若要用echo命令显示一条命

39、令,可用下述语法: echo message 参数 ON|OFF 指定是否允许命令的回显。若要显示当前的ECHO的设置,可使用不带参数的ECHO 命令。 message 指定让MS-DOS在屏幕上显示的正文。 CALL 从一个批处理程序中调用另一个批处理程序,而不会引起第一个批处理的中止。 语法 CALL drive:pathfilename batch-parameters 参数 drive:pathfilename 指定要调用的批处理程序的名字及其存放处。文件名必须用.BAT作扩展名。 batch-parameters 指定批处理程序所需的命令行信息。 PAUSE 暂停批处理程序的执行并显

40、示一条消息,提示用户按任意键继续执行。只能在批处 理程序中使用该命令。 语法 PAUSE REM 在批处理文件或CONFIG.SYS中加入注解。也可用REM命令来屏蔽命令(在CONFIG.SYS 中也可以用分号 ; 代替REM命令,但在批处理文件中则不能替代)。 语法 REM string 参数 string 指定要屏蔽的命令或要包含的注解。 = 例1:用edit编辑a.bat文件,输入下列内容后存盘为c:a.bat,执行该批处理文件后可实现:将根目录中所有文件写入 a.txt中,启动UCDOS,进入WPS等功能。 批处理文件的内容为: 命令注释: echo off 不显示后续命令行及当前命令

41、行 dir c:*.* a.txt 将c盘文件列表写入a.txt call c:ucdosucdos.bat 调用ucdos echo 你好 显示你好 pause 暂停,等待按键继续 rem 准备运行wps 注释:准备运行wps cd ucdos 进入ucdos目录 wps 运行wps 批处理文件的参数 批处理文件还可以像C语言的函数一样使用参数(相当于DOS命令的命令行参数),这需要用到一个参数表示符%。 %1-9表示参数,参数是指在运行批处理文件时在文件名后加的以空格(或者Tab)分隔的字符串。变量可以从%0到%9,%0表示批处理命令本身,其它参数字符串用%1到%9顺序表示。 例2:C:根

42、目录下有一批处理文件名为f.bat,内容为: echo off format %1 如果执行C:f a: 那么在执行f.bat时,%1就表示a:,这样format %1就相当于format a:,于是上面的命令运行时实际执行的是format a: 例3:C:根目录下一批处理文件名为t.bat,内容为: echo off type %1 type %2 那么运行C:t a.txt b.txt %1 : 表示a.txt %2 : 表示b.txt 于是上面的命令将顺序地显示a.txt和b.txt文件的内容。 = 注 = 参数在批处理中也作为变量处理, 所以同样使用百分号作为引导符, 其后跟0-9中的

43、一个数字构成参数引用符. 引用符和参数之间 (例如上文中的 %1 与 a: ) 的关系类似于变量指针与变量值的关系. 当我们要引用第十一个或更多个参数时, 就必须移动DOS 的参数起始指针. shift 命令正充当了这个移动指针的角色, 它将参数的起始指针移动到下一个参数, 类似C 语言中的指针操作. 图示如下: 初始状态, cmd 为命令名, 可以用 %0 引用 cmd arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 arg10 | | | | | | | | | | %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 经过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 经过2次shift后, arg1也被废弃, %9指向为空, 没有引用意义 cmd arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 arg10 | | | | | | | | | %0 %1 %2 %3 %4 %5 %6 %7 %8 遗憾的是, win9x 和DOS下均不支持 shift 的逆操作. 只有在 nt 内核命令行

45、环境下, shift 才支持 /n 参数, 可以以第一参数为基准返复移动起始指针. = 特殊命令 if goto choice for是批处理文件中比较高级的命令,如果这几个你用得很熟练,你就是批处理文件的专家啦。 一、if 是条件语句,用来判断是否符合规定的条件,从而决定执行不同的命令。 有三种格式: 1、if not 参数 = 字符串 待执行的命令 参数如果等于(not表示不等,下同)指定的字符串,则条件成立,运行命令,否则运行下一句。 例:if %1=a format a: = if 的命令行帮助中关于此点的描述为: IF NOT string1=string2 command 在此有以

46、下几点需要注意: 1. 包含字符串的双引号不是语法所必须的, 而只是习惯上使用的一种防空字符 2. string1 未必是参数, 它也可以是环境变量, 循环变量以及其他字符串常量或变量 3. command 不是语法所必须的, string2 后跟一个空格就可以构成一个有效的命令行 = 2、if not exist 路径文件名 待执行的命令 如果有指定的文件,则条件成立,运行命令,否则运行下一句。 如: if exist c:config.sys type c:config.sys 表示如果存在c:config.sys文件,则显示它的内容。 * 注 * 也可以使用以下的用法: if exist

47、 command device 是指DOS系统中已加载的设备, 在win98下通常有: AUX, PRN, CON, NUL COM1, COM2, COM3, COM4 LPT1, LPT2, LPT3, LPT4 XMSXXXX0, EMMXXXX0 A: B: C: ., CLOCK$, CONFIG$, DblBuff$, IFS$HLP$ 具体的内容会因硬软件环境的不同而略有差异, 使用这些设备名称时, 需要保证以下三点: 1. 该设备确实存在(由软件虚拟的设备除外) 2. 该设备驱动程序已加载(aux, prn等标准设备由系统缺省定义) 3. 该设备已准备好(主要是指a: b: .

48、, com1., lpt1.等) 可通过命令 mem/d | find device /i 来检阅你的系统中所加载的设备 另外, 在DOS系统中, 设备也被认为是一种特殊的文件, 而文件也可以称作字符设备; 因为设备(device)与文件都是使用句柄(handle)来管理的, 句柄就是名字, 类似于文件名, 只不过句柄不是应用于磁盘管理, 而是应用于内存管理而已, 所谓设备加载也即指在内存中为其分配可引用的句柄. = 3、if errorlevel 待执行的命令 很多DOS程序在运行结束后会返回一个数字值用来表示程序运行的结果(或者状态),通过if errorlevel命令可以判断程序的返回值

49、,根据不同的返回值来决定执行不同的命令(返回值必须按照从大到小的顺序排列)。如果返回值等于指定的数字,则条件成立,运行命令,否则运行下一句。 如if errorlevel 2 goto x2 = 注 = 返回值从大到小的顺序排列不是必须的, 而只是执行命令为 goto 时的习惯用法, 当使用 set 作为执行命令时, 通常会从小到大顺序排列, 比如需将返回码置入环境变量, 就需使用以下的顺序形式: 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 . 当然, 也可以使用以下循环来替代, 原理是一致的: for %e in (1 2 3 4 5 6 7 8.) do if errorlevel %e set el=%e 更高效简洁的用法, 可以参考我写的另一篇关于获取 errorlevel 的文章 出现此种现象的原因是, if errorlevel 比较返回码的判断条件并非等于, 而是大于等于. 由于 goto 的跳转特性, 由小到大排序会导致在较小的返回码处就跳出; 而由于 set命令的 重复 赋值特性, 由大到小排序会导致较小的返回码 覆盖 较大的返回码. 另外, 虽然 if err

51、orlevel= command 也是有效的命令行, 但也只是 解释命令行时将 = 作为命令行切分符而忽略掉罢了 = 二、goto 批处理文件运行到这里将跳到goto所指定的标号(标号即label,标号用:后跟标准字符串来定义)处,goto语句一般与if配合使用,根据不同的条件来执行不同的命令组。 如: goto end :end echo this is the end 标号用:字符串来定义,标号所在行不被执行。 = willsort 编注 label 常被译为 标签 , 但是这并不具有广泛的约定性. goto 与 : 联用可实现执行中途的跳转, 再结合 if 可实现执行过程的条件分支, 多

52、个 if 即可实现命令的分组, 类似 C 中 switch case 结构或者 Basic 中的 select case 结构, 大规模且结构化的命令分组即可实现高级语言中的函数功能. 以下是批处理和C/Basic在语法结构上的对照: 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、用于选择),从而根据用户的选择返回不同的errorlevel,然后于if errorlevel配合,根据用户的选择运行不同的命令。 注意:choice命令为DOS或者Windows系统提供的外部命令,不同版本的choice命令语法会稍有不同,请用choice /?查看用法。 choice的命令语法(该语法为Windows 2003中choice命令的语法,其它版本的choice的命令语法与此大同小异): CHOICE /C choices /N /CS /T timeout /D choice /M text 描述: 该工具允许用户从选择列表选择一个项目并返回所选项目的索引。 参数列表: /C

54、 choices 指定要创建的选项列表。默认列表是 YN。 /N 在提示符中隐藏选项列表。提示前面的消息得到显示, 选项依旧处于启用状态。 /CS 允许选择分大小写的选项。在默认情况下,这个工具 是不分大小写的。 /T timeout 做出默认选择之前,暂停的秒数。可接受的值是从 0 到 9999。如果指定了 0,就不会有暂停,默认选项 会得到选择。 /D choice 在 nnnn 秒之后指定默认选项。字符必须在用 /C 选 项指定的一组选择中; 同时,必须用 /T 指定 nnnn。 /M text 指定提示之前要显示的消息。如果没有指定,工具只 显示提示。 /? 显示帮助消息。 注意: E

55、RRORLEVEL 环境变量被设置为从选择集选择的键索引。列出的第一个选 择返回 1,第二个选择返回 2,等等。如果用户按的键不是有效的选择, 该工具会发出警告响声。如果该工具检测到错误状态,它会返回 255 的 ERRORLEVEL 值。如果用户按 Ctrl+Break 或 Ctrl+C 键,该工具会返回 0 的 ERRORLEVEL 值。在一个批程序中使用 ERRORLEVEL 参数时,将参数降 序排列。 示例: CHOICE /? CHOICE /C YNC /M 确认请按 Y,否请按 N,或者取消请按 C。 CHOICE /T 10 /C ync /CS /D y CHOICE /C

56、ab /M 选项 1 请选择 a,选项 2 请选择 b。 CHOICE /C ab /N /M 选项 1 请选择 a,选项 2 请选择 b。 = willsort 编注 = 我列出win98下choice的用法帮助, 已资区分 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 指定允许的按键(待选字符), 默认为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 秒后默认选择 c text Prompt string to display 要显示的提示字符串 ERRORLEVEL is set to offset of key user presses in choices. ERRORLEVEL 被设置为用户键入

58、的字符在待选字符中的偏移值 如果我运行命令:CHOICE /C YNC /M 确认请按 Y,否请按 N,或者取消请按 C。 屏幕上会显示: 确认请按 Y,否请按 N,或者取消请按 C。 Y,N,C? 例:test.bat的内容如下(注意,用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 此批处理运行后,将显示defrag,mem,endD,M,E? ,用户可选择d m e ,然后if语句根据用户的选择作出判断,d表示执行标号为defrag的程序段,m表示执行标号为mem的程序段,e表示执行标号为end的程序段,每个程序段最后都以goto end将程序跳到end标号处,然后程序将显示good bye,批处理运行结束。 四、for 循环命令,只要条件符合,它将多次执行同一命令。 语法: 对一组文件中的每一个文件执行某个特定命令。 FOR %variable IN (set) DO command command-parameters %variable 指定一个单一字母可替换的参数。 (set) 指定一个或一组文件。可以使用通配符。 command 指定对每个文件执行的命令。 co

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论