📄 fp01.htm
字号:
<font color="#0000ff"><br>
void main(void)<br>
{<br>
unsigned char i,j;<br>
<br>
led1=0; //点亮led1<br>
delay();<br>
led2=0; //点亮led2<br>
delay();<br>
led3=0; //点亮led3<br>
delay();<br>
led4=0; //点亮led4<br>
delay();<br>
led1=1; //熄灭led1<br>
delay();<br>
led2=1; //熄灭led2<br>
delay();<br>
led3=1; //熄灭led3<br>
delay();<br>
led4=1; //熄灭led4<br>
delay();<br>
<br>
for(;;)<br>
{<br>
j=getkey();<br>
switch(j)<br>
{<br>
case 1:<br>
led1=0; //点亮led1<br>
break;<br>
case 2:<br>
led2=0; //点亮led2<br>
break;<br>
case 3:<br>
led3=0; //点亮led3 led4<br>
led4=0;<br>
break;<br>
case 4:<br>
led1=1; //熄灭所有的灯<br>
led2=1;<br>
led3=1;<br>
led4=1;<br>
break;<br>
default:<br>
break;<br>
}<br>
}<br>
<br>
}<br>
<br>
</font></p>
<p><font size="4">可以看出这段程序的功能是开机时四个灯很快地亮一下,可能人眼看不到,但是等会我们用单步调试时就可以看到了,然后灯全灭了,这时如果按key1,LED1就会被点亮,如果按key2,LED2就会被点亮,如果按key3,LED3、LED4就会被点亮,如果按key4,四个灯就会一起熄灭。<br>
<br>
</font></p>
<p><span style="font-family:宋体"><font size="4">输入完成后,点击编译按钮,或者按</font><span lang="EN-US"><font size="4">F7编译。察看下面的报告框,如果出现Error或者Warning,要根据情况排除错误和警告,对于无关痛痒的警告可以忽略,具体请查看相关C51的编译器说明书籍或文件。直到最后编译成功为止。<br>
<br>
如果您希望编译成功后生成一个HEX目标文件,以方便烧写目标芯片,可以右键点击“Target
1”,选第二项“Options for Target 1”,将出现下面的窗口:<br>
</font><!--[if gte vml 1]><v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75"
o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f">
<v:stroke joinstyle="miter"/>
<v:formulas>
<v:f eqn="if lineDrawn pixelLineWidth 0"/>
<v:f eqn="sum @0 1 0"/>
<v:f eqn="sum 0 0 @1"/>
<v:f eqn="prod @2 1 2"/>
<v:f eqn="prod @3 21600 pixelWidth"/>
<v:f eqn="prod @3 21600 pixelHeight"/>
<v:f eqn="sum @0 0 1"/>
<v:f eqn="prod @6 1 2"/>
<v:f eqn="prod @7 21600 pixelWidth"/>
<v:f eqn="sum @8 21600 0"/>
<v:f eqn="prod @7 21600 pixelHeight"/>
<v:f eqn="sum @10 21600 0"/>
</v:formulas>
<v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/>
<o:lock v:ext="edit" aspectratio="t"/>
</v:shapetype><v:shape id="_x0000_i1030" type="#_x0000_t75" alt="" style='width:469.8pt;
height:314.4pt'>
<v:imagedata src="图片/KeyAnd10.jpg"
o:href="http://www.mcu51.com/product/mcu51emb/key-options.jpg"/>
</v:shape><![endif]-->
<img src="图片/KeyAnd10.jpg" v:shapes="_x0000_i1030" width="626" height="419"><o:p>
</o:p>
</span></span></p>
<p style="margin-left:2.0gd"><span style="font-family:宋体"><font size="4">我们的主机上的晶振是</font><span lang="EN-US"><font size="4">11.0592M或12的,你可以将上面框中的“Xtal”后边框中填入“11.0592”,以便软件仿真时计算程序运行时间,这个值的设置对于硬件仿真是没有影响的。<br>
<br>
下面依次是编译的内存模式,我们用默认的小模式,这时程序中没有注明的变量将编译在芯片内部的256字节里;程序空间大小,也用默认的64K模式,这个决定编译出来的代码主要是用长调用还是短调用,这些设置都是无所谓的了,仅仅是编译出来的程序大小有点差别而已。其他的设置都空着即可。<br>
<br>
点击设置窗口的“output”页,在Create HEX Flie前面的框里点一下打个勾,这样程序编译完成之后就会生成一个HEX目标文文件了。类似的你还可以选择生成一个lib库,但是我们现在还用不到。再下面还可以设置在编译完成是是否开始运行debug,即仿真,或者是否运行你自己指定的某些应用程序。这个设置窗口如下图:</font><br>
<!--[if gte vml 1]><v:shape id="_x0000_i1029" type="#_x0000_t75" alt=""
style='width:469.8pt;height:314.4pt'>
<v:imagedata src="图片/KeyAnd11.jpg"
o:href="http://www.mcu51.com/product/mcu51emb/key-option-output.jpg"/>
</v:shape><![endif]-->
<img src="图片/KeyAnd11.jpg" v:shapes="_x0000_i1029" width="626" height="419"><br>
<font size="4">另外几个页:listing,C51,A51,BL51 locate,BL51 Misc都默认设置不要改了,将来等到你会C51的高级应用时或许就用得着了。<br>
<br>
但是Debug页,就得好好设置一下了,如图</font>:<br>
<!--[if gte vml 1]><v:shape id="_x0000_i1028" type="#_x0000_t75" alt=""
style='width:469.8pt;height:314.4pt'>
<v:imagedata src="图片/KeyAnd12.jpg"
o:href="http://www.mcu51.com/product/mcu51emb/key-option-debug.jpg"/>
</v:shape><![endif]-->
<img src="图片/KeyAnd12.jpg" v:shapes="_x0000_i1028" width="626" height="419"><br>
<font size="4">这里可以设置使用<font color="#0000FF">软件仿真</font>或者<font color="#0000FF">硬件仿真</font>,我们已经接好了硬件仿真器和电路,当然是选择硬件仿真了。另外在下拉菜单里选上“keil
Monitor-51 Driver”,这是我们的仿真设备类型。下面还可以选择是否进入仿真后立即装载程序到仿真机中,和是否开始运行直到main函数。我们都先选上吧。<br>
这里要说明一下为什么有“Go till main” 选项,因为C51的编译中实际上在内部还调用了一个初始化函数,这个函数的作用是清除所有内存,设置sp指针等运行main程序之前的准备工作。你在编程的过程中实际上可以不理会这个函数。但是在硬件仿真时,装载代码之后PC指针是指向0000H位置的,前面的一段内部代码的运行又大家都基本一样,没有必要去调试,所以就有了自动运行到main的选项,这样装载之后就直接运行到main函数,也就是你开始编程的位置了。<br>
不过如果选择了 “Go till main”,装载之后需要等待一小段时间大约一两秒钟等待运行到该位置,因为是在仿真状态中运行,所以较慢。<br>
<br>
<span style="color:blue">注:如果您希望不复位单片机就可以直接下载新代码,必须做另外的设置,请参考相关文档。</span><br>
<br>
设置了使用硬件仿真当然还要再设置一下通讯端口和通讯波特率了,点击设置debug框右上角的“setings”
,进入下面的窗口:</font><br>
</span></span><span lang="EN-US"><!--[if gte vml 1]><v:shape id="_x0000_i1027"
type="#_x0000_t75" style='width:289.8pt;height:252pt' o:ole="">
<v:imagedata src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image004.png"
o:title=""/>
</v:shape><![endif]-->
<img src="图片/KeyAnd13.jpg" v:shapes="_x0000_i1027" width="386" height="336"><!--[if gte mso 9]><xml>
<o:OLEObject Type="Embed" ProgID="PBrush" ShapeID="_x0000_i1027"
DrawAspect="Content" ObjectID="_1140593778">
</o:OLEObject>
</xml><![endif]-->
</span><span lang="EN-US" style="font-family:宋体"><br>
<font size="4">选择仿真机所接电脑的串口号,再选择38400bps通讯速度,这个速度本仿真机完全胜任,而且下载迅速仿真速度飞快。另外“Cache
Option”,建议全部不选,这样仿真时需要显示变量值时,全部会从仿真机中读最新的,虽然慢些,但可以保证是当前的值。<br>
下面的“Stop Program Interrupt”项就不要选了,这是全速运行的夭折功能,仿真机虽然做了这个功能,但是由于共用了串口中断,在某些情况下会对用户程序造成一定的影响。<font color="#FF00FF">如果需要在全速运行中停止程序,需要复位一下仿真机,复位之后keil环境和仿真机会重新自动联机,但是这时仿真机里的程序代码已经被清除,所以必须退出debug环境,再重新联机装载程序。</font><br>
<span style="color:red">注意:顺便提一下:</span>
如果在全速运行时你想退出debug环境,keil将要等待比较久的超时退出,表现为报告无法联机。所以,在全速运行时要退出,请先按一下仿真机上的复位按钮,等调试环境重新联机之后,再退出调试环境,就可以顺利退出了。<br>
<br>
好了,到此为止,设置完成,点“OK”,再点设置窗口的“确定”。回到编辑环境中,再编译一次。你可以看到信息栏中多出现了一行“creating
hex file form "跑马灯" ...”.<o:p>
</o:p>
</font></span></p>
<font size="4"><span style="mso-bidi-font-size: 12.0pt; font-family: 宋体; mso-bidi-font-family: Times New Roman; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">终于将程序编译完毕了,下面开始仿真!<span lang="EN-US"><br>
<br>
点菜单Dubug下的Start/Stop debug session ,进入仿真状态。<br>
在下面几种情况中,会出现连接不上的提示框。<br>
1.硬件没有连接好。(仔细连接好)<br>
2.计算机的串口号设置错了。(重新设置)<br>
3.波特率设置过高,如115200。(重新设置)<br>
4.计算机串口被其他应用程序占用了。(关闭其他应用程序)<br>
5.仿真机正在全速运行。(按仿真机复位键,使程序停止运行)<br>
5.仿真机处于脱机运行状态并且在运行用户程序。(按仿真机复位,并在2秒内联机)<br>
6.用户板对通讯口P3.0和P3.1造成了干扰。(拔除用户板,测试是否可以联机,再检查用户板。)<br>
<br>
这时会出现这个窗口;<br>
<!--[if gte vml 1]><v:shape id="_x0000_i1026" type="#_x0000_t75" alt=""
style='width:290.4pt;height:134.4pt'>
<v:imagedata src="图片/KeyAnd14.jpg"
o:href="http://www.mcu51.com/product/mcu51emb/key-connect-err.jpg"/>
</v:shape><![endif]-->
<img src="图片/KeyAnd14.jpg" v:shapes="_x0000_i1026" width="387" height="179"><br>
<br>
别急,点settings,就可以重新进入通讯设置,将正确的串口号和波特率设置好。将其它的使用这个串口的应用程序关闭。
再仔细检查连线,按照本文一开始的说明接好.别忘了再按一下复位按钮,<br>
好,现在点“ try again”,通了!出现了以下窗口:<br>
</span></span><span lang="EN-US" style="mso-bidi-font-size: 12.0pt; font-family: Times New Roman; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><img border="0" src="图片/KeyAnd15.jpg" width="768" height="552"><!--[if gte vml 1]><v:shape
id="_x0000_i1025" type="#_x0000_t75" style='width:415.2pt;height:304.8pt'
o:ole="">
<v:imagedata src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image007.png"
o:title=""/>
</v:shape><![endif]-->
<!--[if gte mso 9]><xml>
<o:OLEObject Type="Embed" ProgID="PBrush" ShapeID="_x0000_i1025"
DrawAspect="Content" ObjectID="_1140593779">
</o:OLEObject>
</xml><![endif]-->
</span><span lang="EN-US" style="mso-bidi-font-size: 12.0pt; font-family: 宋体; mso-bidi-font-family: Times New Roman; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><br>
等待片刻,程序自动运行到main函数的第一句代码。那里的一个小箭头就是指向当前的一句代码。左下角时命令输入框,可以输入需要的调试命令。右边两个是观察窗口和内存窗口。在命令窗口里分为底下的输入行和上面的状态栏,在状态栏里可以看到有“connected
to Monitor-51 V3.4”字样,“V3.4”就是本仿真器的版本号。</span><span style="font-family: 宋体; mso-bidi-font-family: Times New Roman; color: blue; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">注:<span lang="EN-US">“V3.4”已经改为3个数字或字母,用来代表该仿真器的编号,每一台monitor-51仿真机都有不同的编号.<br>
</span></span><span lang="EN-US" style="mso-bidi-font-size: 12.0pt; font-family: 宋体; mso-bidi-font-family: Times New Roman; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><br>
窗口中间有一排快捷按钮,表示的意思如下:<br>
<!--[if gte vml 1]><v:shapetype id="_x0000_t75" coordsize="21600,21600"
o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f"
stroked="f">
<v:stroke joinstyle="miter"/>
<v:formulas>
<v:f eqn="if lineDrawn pixelLineWidth 0"/>
<v:f eqn="sum @0 1 0"/>
<v:f eqn="sum 0 0 @1"/>
<v:f eqn="prod @2 1 2"/>
<v:f eqn="prod @3 21600 pixelWidth"/>
<v:f eqn="prod @3 21600 pixelHeight"/>
<v:f eqn="sum @0 0 1"/>
<v:f eqn="prod @6 1 2"/>
<v:f eqn="prod @7 21600 pixelWidth"/>
<v:f eqn="sum @8 21600 0"/>
<v:f eqn="prod @7 21600 pixelHeight"/>
<v:f eqn="sum @10 21600 0"/>
</v:formulas>
<v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/>
<o:lock v:ext="edit" aspectratio="t"/>
</v:shapetype><v:shape id="_x0000_i1025" type="#_x0000_t75" alt="" style='width:255.6pt;
height:275.4pt'>
<v:imagedata src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image001.jpg"
o:href="http://www.mcu51.com/product/mcu51emb/key-debug-icon.jpg"/>
</v:shape><![endif]-->
<img src="图片/KeyAnd16.jpg" v:shapes="_x0000_i1025" width="341" height="367"></span><br>
<br>
</font>
<p style="margin-bottom:12.0pt"><font size="4"><span style="font-family:宋体">现在我们点击单步<span lang="EN-US">“Step
Over”,可以看到程序代码一句句被运行,你同样可以做其它类型的调试(</span></span><span style="color: blue">单步<span lang="EN-US">,断点,全速,在线编程,目标代码下载</span></span><span style="font-family:宋体">等)。<span lang="EN-US"><br>
<span style="mso-spacerun: yes"> </span><br>
现在我们可以点击一下显示汇编窗口按钮,可以看到我们的这个程序的汇编代码,在这个窗口按一下右键,可以看到有一个菜单,可以选择是否C和汇编混合显示模式等等,还有一个重要的功能,就是“load
Hex or Object file”,这个功能可以实现将其他已经编译好了的HEX文件下载到仿真机中,也就是下载功能。当然你现在不能下载,因为嵌入式仿真机的限制,每次装载程序之前必须复位一次。以清空内部的用户程序空间。现在已经装载了一个试验程序,就不能重新下载一个新的其他的程序了。要实现下载其他的目标程序,可以在仿真设置那里将自动load代码设置去掉,这样,连接成功后进入仿真状态,用户空间并没有装载任何代码,再显示汇编窗口,点右键/“load
Hex or Object file”,就可以下载你需要的代码了。因为本机有脱机运行功能,了解这个就显得非常重要了。当你手头只有你需要运行的目标代码HEX文件,而没有源文件或者调试文件时,你就无法使用debug的装载功能,而只有通过汇编窗口的load
HEX文件了。<br>
<br>
<span style="mso-spacerun: yes"> </span><br>
到此为止,您应该体会到了Monitor-51仿真机的方便易用和强大功能了吧?同时你还基本上掌握仿真器的使用和KEILC51软件的使用,算是已经一只脚跨进了单片机编程的大门了。<br>
<br>
你也可以继续发挥您的钻研精神,自己主动的编写一些功能函数,比如将LED和键盘的显示和控制关系做得更加的复杂。<br>
<br>
我们也会继续编写一些深入学习的教材,以帮助更加深入地学习和掌握C51。<br style="mso-special-character:line-break">
<o:p>
</o:p>
</span></span></font></p>
<p style="margin-bottom:12.0pt"><span style="font-family:宋体"><font size="4">上面的例程可以在光盘中找到。</font><span lang="EN-US"><o:p>
</o:p>
</span></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体"> <o:p>
</o:p>
</span></p>
<p><br>
</p>
</BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -