平凡单片机工作室.htm

来自「一个单片机学习的网站」· HTM 代码 · 共 242 行 · 第 1/2 页

HTM
242
字号
            src="平凡单片机工作室.files/c18.png"></IMG><BR>        图16 用定时器实现LED闪烁<BR>  参考图16输入源程序,建立并设置工程,本例使用实验仿真板难以得到理想的结果,应使用硬件进行练习。<BR>  分析:要使用单片机的定时器,首先要设置定时器的工作方式,然后给定时器赋初值,即进行定时器的初始化。这里选择定时器0,工作于定时方式,工作方式1,即16位定时/计数的工作方式,不使用门控位。由此可以确定定时器的工作方式字TMOD应为00000001B,即0x01。定时初值应为65536-60000=5536,由于不能直接给T0赋值,必须将5536转化为十六进制即为0x15a0,这样可以写出初始化程序:<BR>TMOD=0x01;<BR>TH0=0x15;<BR>TL0=0xa0;<BR>  初始化定时器后,要定时器工作,必须将TR0置1,程序中用“TR0=1;”来实现。<BR>  可以用中断或查询的方式来使用定时器,本例使用查询方式,中断方式稍后介绍。<BR>  由定时时间到后,TF0被置为1,因此,只需要查询TF0是否等于1即可得知定时时间是否到达,程序中用“if(TF0){…}”来判断,如果TF0=0,则条件不满足,大括号中的程序行不会被执行到,当定时时间到TF1=1后,条件满足,即执行大括号中的程序行,首先将TF0清零,然后重置定时初值,最后是执行规定动作――取反P1.0的状态。<BR>  2.中断编程<BR>  C51编译器支持在C源程序中直接开发中断过程,使用该扩展属性的函数定义语法如下:<BR>  返回值 函数名 interrupt&nbsp;n<BR>  其中n对应中断源的编号,其值从0开始,以80C51单片机为例,编号从0~4,分别对应外中断0、定时器0中断、外中断1、定时器1中断和串行口中断。<BR>  2.1 中断应用实例<BR>  下面我们同样通过一个例子来说明中断编程的应用。<BR>  例2 用中断法实现定时器控制P1.0所接LED以60ms闪烁。<BR><IMG 
            src="平凡单片机工作室.files/c19.png"></IMG><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  图17&nbsp;用中断法使用定时器<BR>  参考图17输入源程序,设置工程,同样,本例用实验仿真板难以看到真实的效果,应使用硬件来完成这一实验。<BR>  分析:本例与例1的要求相同,唯一的区别是必须用中断方式来实现。这里仍选用定时器T0,工作于方式1,无门控,因此,定时器的初始化操作与上例相同。要开启中断,必须将EA(总中断允许)和ET0(定时器T0中断允许)置1,程序中用“EA=1;”和“ET0=1;”来实现。在做完这些工作以后,就用for(;;){;}让主程序进入无限循环中,所有工作均由中断程序实现。<BR>由于定时器0的中断编号为1,所以中断程序中这样写:<BR>void&nbsp;timer0()&nbsp;interrupt&nbsp;1<BR>{…}<BR>  可见,用C51语言写中断程序是非常简单的,只要简单地在函数名后加上interrupt&nbsp;关键字和中断编号就成了。<BR>  2.2 寄存器组切换<BR>  为进行中断的现场保护,80C51单片机除采用堆栈技术外,还独特地采用寄存器组的方式,80C51中有4组名称均为R0~R7的工作寄存器,通过设置RS0、RS1来切换工作寄存器组,这使得中断保护工作非常简单和快速。使用汇编语言编程时,内存使用均由编程者控制,编程时可直接设置RS0、RS1,但用C语言编程,内存由编译器分配和使用,因此,不能自行设置RS0、RS1,否则会造成内存使用的冲突。<BR>  在C51中,寄存器组选择取决于特定的编译器指令,即使用using n指定,其中n的值是0~3,对应使用四组工作寄存器。<BR>例如上述例子中可以这么样来写:<BR>void&nbsp;timer0()&nbsp;interrupt&nbsp;1&nbsp;using&nbsp;2<BR>{…}<BR>表示在该中断程序中使用第2组工作寄存器。<BR>  3.串行口编程<BR>  80C51系列单片机片上有UART用于串行通信,80C51中有两个SBUF,一个用作发送缓冲器,一个用作接收缓冲器,在完成串口的初始化后,只要将数据送入发送SBUF,即可按设定好的波特率将数据发送出去,而在接收到数据后,可以从接收BUF中读到接收到的数据。下面通过一个例子来了解串行口编程的方法。<BR>  例3 单片机P1口接8只发光二极管,P3.2~P3.5接有K1~K4共四个按键,使用串行口编程,1)由PC机控制单片机的P1口,将PC机送出的数以二进制形式显示在发光二极管上;2)按下K1向主机发送数字0x55,按下K2向主机发送数字0xAA,使显示转下一行。<BR>&nbsp;<BR>#define&nbsp;uchar&nbsp;unsigned&nbsp;char<BR>#include&nbsp;"string.h"<BR>#include&nbsp;"reg51.h"<BR>void&nbsp;SendData(uchar&nbsp;Dat)<BR>{ 
            uchar&nbsp;i=0;<BR>SBUF=Dat;<BR>while(1){&nbsp; if(TI)<BR>{ 
            TI=0;<BR>break;}}<BR>}<BR>void&nbsp;mDelay(unsigned&nbsp;int&nbsp;DelayTime)<BR>{ 
            unsigned&nbsp;char&nbsp;j=0;<BR>for(;DelayTime&gt;0;DelayTime--)<BR>{ 
            for(j=0;j&lt;125;j++) <BR>{;} <BR>}<BR>}<BR>uchar&nbsp;Key()<BR>{ 
            uchar&nbsp;KValue;<BR>P3|=0x3e; 
            //中间4位置高电平<BR>if((KValue=P3|0xe3)!=0xff)<BR>{ 
            mDelay(10);<BR>if((KValue=P3|0xe3)!=0xff)<BR>{ 
            for(;;)<BR>if((P3|0xe3)==0xff)<BR>return(KValue);<BR>}<BR>}<BR>return(0);<BR>} 
            <BR><BR>void&nbsp;main()<BR>{ uchar&nbsp;KeyValue;<BR>P1=0xff; 
            //关闭P1口接的所有灯<BR>TMOD=0x20; //确定定时器工作模式<BR>TH1=0xFD;<BR>TL0=0xFD; 
            //定时初值<BR>PCON&amp;=0x80; //SMOD=1<BR>TR1=1; //开启定时器1<BR>SCON=0x40; 
            //串口工作方式1<BR>REN=1; //允许接收<BR>for(;;)<BR>{ if(KeyValue=Key())<BR>{ 
            if((KeyValue|0xfb)!=0xff) 
            //K1按下<BR>SendData(0x55);<BR>if((KeyValue|0xf7)!=0xff)<BR>SendData(0xaa);<BR>}<BR>if(RI)<BR>{ 
            P1=SBUF;<BR>RI=0;<BR>}<BR>}<BR>}<BR>&nbsp;<BR>  实现过程:输入程序,命名为exam53.c,建立名为exam53的工程,将文件加入,设置工程,使用实验仿真板进行调试。正确编译连接后进入调试,打开实验仿真板,然后再点击view&#61664;serial&nbsp;#1打开串行窗口,在窗口空白处点右键,在弹出式菜单中选择“Hex&nbsp;Mode”如图18所示。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<IMG 
            src="平凡单片机工作室.files/c20.png"></IMG><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;图18 选择显示模式<BR>  单击实验仿真板的K1键和K2键,即可看到串行窗口中分别出现55和AA;单击串行窗口的空白处,使其变为活动窗口,可接收键盘输入,按下键盘上不同的字符键,可见实验仿真板上的LED产生相应的变化。在实验仿真板上按下K1一次、K2连续两次、再按一次K1后,串行窗口中的状态如图19上部所示;在计算机键盘上按下“1”后实验仿真板显示的状态如图19下部所示。“0”使灯亮,“1”使灯灭,因此P1口的值为00110001,即0x31,这正是字符1的ASCII码值。<BR>  <IMG 
            src="平凡单片机工作室.files/c21.png"></IMG><BR>      图19 使用实验仿真板演示串行口操作<BR>  程序分析:本程序使用T1作为波特率发生器,工作于方式2(8位自动重装入方式),波特率为19200,串行口工作于方式1,根据以上条件算出T1的定时初值为0xfd,TMOD应初始化为0x20,SMOD初始化为0x30,PCON中的SMOD位置1,主程序main的开头对这些初值进行了设置。设置好初值后,用“TR1=1;”开启定时器1,用“REN=1;”允许接收数据,然后进入无限循环中开始正常工作。在这个无限循环中首先调用键盘程序,检测是否有键按下,及哪一个键被按下,如果K1被按下,则调用发送数据程序,将数0x55送出,如果K2被按下,则将数0xAA送出。接着检测RI是否等于1,如果RI等于1,说明接收到字符,清RI,准备下一次接收,并将接收到的数据送往P1口显示。一次循环结束,继续开始下一次循环。<BR>发送函数SendData中有只有一个参数Dat,即待发送的字符,函数将该待发送的字符送入SBUF后,使用一个无限循环等待发送的结束,在循环中通过检测TI来判断数据是否发送完毕,发送完毕使用break语句退出循环。<BR>  该实验同样可用硬件实现,下面介绍使用前面课程中介绍的仿真型实验板做实验的方法。由于该板占用了串口作为仿真机与PC机的通讯,因此做串口通讯类实验只能用下载后全速运行的方法,具体步骤如下:&nbsp;<BR>  1.设置工程,在Debug页中选择“Use&nbsp;Keil&nbsp;Monitor&nbsp;Drive”,点击Setting按钮,将通讯的波特率设置为19200;<BR>  2.进入调试后全速运行程序,然后按Debug-&gt;Stop&nbsp;Runing,按提示退出调试状态,实际上这不并会中断硬件电路的工作;<BR>  3.在PC机上运行一个串口调试软件,这里以“串口调试助手”软件为例,按图20设置串口参数。按下实验板上的K1、口,串口调试助手的接收窗口即可接收到0x55和0xAA,在串口调试助手的输出窗口中键入数据,即可由实验板接收并由P1显示出来。<BR><IMG 
            src="平凡单片机工作室.files/c22.png"></IMG><BR>       图20 设置串口参数<BR>  通过本课学习,我们了解了单片机内部资源编程的方法,下一课将通过一些综合性的例子的介绍,继续学习采用C语言编程的有关技术。<BR></FONT></TD></TR></TBODY></TABLE></TD>
    <TD></TD></TR>
  <TR>
    <TD></TD>
    <TD align=right vAlign=top>
      <HR color=#006600 noShade SIZE=1>
      【<A href="http://www.mcustudio.com/addreview.asp?id=单片机内部资源编程">发表评论</A>】 
      【<A href="http://www.mcustudio.com/review.asp?title=单片机内部资源编程">查看评论</A>】 
      【<A href="http://www.mcustudio.com/sendmail.asp?num=单片机内部资源编程">发给好友</A>】 
      【<A href="javascript:window.close()">关闭窗口</A>】</TD>
    <TD></TD></TR>
  <TR>
    <TD></TD>
    <TD vAlign=top>
      <SCRIPT language=javascript src=""></SCRIPT>
    </TD>
    <TD></TD></TR></TBODY></TABLE><LINK href="css.css" rel=stylesheet type=text/css>
<DIV align=center style="WIDTH: 768px">
<DIV align=center>
<TABLE align=center border=1 borderColor=#6687ba cellPadding=0 cellSpacing=1 
width=777>
  <TBODY>
  <TR bgColor=#fafbfc>
    <TD align=middle height=52 width=771>
      <DIV align=left>
      <P><FONT face=" _GB2312"><B><A href="http://www.gw160.com/"><IMG border=0 
      height=31 src="平凡单片机工作室.files/gwdz.gif" width=88></A><A 
      href="http://hqele.51.net/"> <IMG border=0 height=30 
      src="平凡单片机工作室.files/hqdzw.gif" width=100></A> <IMG height=31 
      src="平凡单片机工作室.files/logo140.jpg" width=88> <A 
      href="http://www.ccelec.com/" target=_blank><IMG border=0 height=32 
      src="平凡单片机工作室.files/zonyandz.gif" width=88></A> <A 
      href="http://www.21io.com/"><IMG border=0 height=31 
      src="平凡单片机工作室.files/21iologo.gif" width=89></A><A 
      href="http://www.21ele.com/main.asp"> <IMG border=0 height=31 
      src="平凡单片机工作室.files/hclogo.gif" width=88></A> <A 
      href="http://half.nease.net/"><IMG border=0 height=31 
      src="平凡单片机工作室.files/freewind.gif" width=88> </A><A 
      href="http://www.longtoo.com/"><IMG border=0 height=31 
      src="平凡单片机工作室.files/longtoo.gif" width=88></A></B></FONT></P>
      <P><FONT face=" _GB2312"><B><A href="http://bes.8u8.com/"><IMG border=0 
      height=31 src="平凡单片机工作室.files/zydh.gif" width=88></A><A 
      href="http://www.xch-dz.com/"> <IMG border=0 height=31 
      src="平凡单片机工作室.files/xch2.gif" width=88> </A><A 
      href="http://bbs.cnelc.com/"><IMG border=0 height=31 
      src="平凡单片机工作室.files/cnelc.gif" width=88></A> <IMG height=31 
      src="平凡单片机工作室.files/logo1.gif" width=88></B></FONT> <FONT 
      face=" _GB2312"><B><A href="http://www.cvtech.com.cn/"><IMG border=0 
      height=31 src="平凡单片机工作室.files/cwt.gif" width=88></A></B></FONT> <A 
      href="http://www.51-lab.com/"><IMG border=0 height=30 
      src="平凡单片机工作室.files/51-lab.gif" width=100></A> <STRONG><FONT 
      face=??_GB2312><A href="http://gktd.com/"><IMG border=0 height=31 
      src="平凡单片机工作室.files/looo.gif" width=88></A></FONT></STRONG> <FONT 
      face=" _GB2312"><B><A href="http://5is.net/"><IMG border=0 height=32 
      src="平凡单片机工作室.files/5is.gif" width=88></A></B></FONT> </P>
      <P><FONT face=" _GB2312"><B><A 
      href="http://www.mcustudio.com/learnc/sdkh.51.net"><IMG border=0 height=31 
      src="平凡单片机工作室.files/xt.gif" width=88></A> <A 
      href="http://www.zymcu.com/"><IMG border=0 height=31 
      src="平凡单片机工作室.files/zymcu104.gif" width=88></A> <A 
      href="http://www.powercn.net/"><IMG border=0 height=31 
      src="平凡单片机工作室.files/power-cn.gif" width=88> </A><STRONG><A 
      href="http://www.pic16.com/"><IMG border=0 height=31 
      src="平凡单片机工作室.files/pic16lg.gif" width=88></A><A 
      href="http://www.ximeda.com/"> <IMG border=0 height=32 
      src="平凡单片机工作室.files/ximedalogo.gif" width=88> </A><A 
      href="http://www.senwas.com/newsgroup/bmb/index.php"><IMG border=0 
      height=32 src="平凡单片机工作室.files/logox.gif" width=100> </A><I><A 
      href="http://www.nbglin.com/"><IMG border=0 height=31 
      src="平凡单片机工作室.files/xc.gif" 
      width=88></A></I></STRONG></B></FONT><STRONG><EM><FONT face=" _GB2312"><A 
      href="http://www.mcufans.com/"> <IMG border=0 height=31 
      src="平凡单片机工作室.files/slogo.gif" width=88></A> </FONT></EM></STRONG></P>
      <P><STRONG><FONT face=??_GB2312><A href="http://www.hkwx.com/"><IMG alt="" 
      border=0 height=32 name=PIC16 src="平凡单片机工作室.files/hkwxGIF.gif" 
      width=88></A> <A href="http://www.21xr.com/"><IMG alt="" border=0 
      height=31 id=乐源电子 name=乐源电子 src="平凡单片机工作室.files/logo.gif" width=88> <IMG 
      alt="无线遥控模块&amp;人体感应模块 21xr.com新锐科技......" border=0 height=31 
      src="平凡单片机工作室.files/log3.gif" width=88><A href="http://www.21xr.com/"></A> 
      </FONT></STRONG></P></DIV>
      <P align=left><A href="http://myradio.51.net/" target=_blank></A><A 
      href="http://myradio.51.net/">监听与测向爱好者 </A><A 
      href="http://amine.nease.net/">Amine嵌入式系统开发 </A><STRONG><A 
      href="http://amine.nease.net/"></A></STRONG><A 
      href="http://www.mcustudio.com/www.mcufan.com">单片机爱好者 </A><A 
      href="http://www.ec188.com/">通大信息发布网 </A><A 
      href="http://www.eleccn.net/bbs">中国电器论坛 </A><A 
      href="http://www.vip998.com/">飞扬科技 </A><A 
      href="http://www.tianlxy.com/">中国IC在线 </A><A 
      href="http://www.zymcu.com/">中源单片机 </A><A 
      href="http://www.61ic.com/">61IC湖南电子网 </A></P>
      <P align=left><A href="http://mcu51.cn.gs/">志艺单片机工作室 </A><A 
      href="http://www.ait.com.cn/mcu/">单片机天地 </A><A 
      href="http://ychunzhi.y365.com/">春芝单片机工作室 </A><A 
      href="http://www.erenow.net/bbs/">生物医学工程论坛 </A><A 
      href="http://315m.9523.com/315m/">315遥控网 </A><A 
      href="http://www.daqchina.net/">大中化工业自动化 </A><A 
      href="http://doughty.512j.com/">单片机制作信息网 </A><A 
      href="http://www.lanyi.cn/">电子信息资源网 </A></P></TD></TR></TBODY></TABLE></DIV>
<P align=center><BR></P>
<P align=center>说明:部份资料为网上收集,如有侵犯您的版权,请通知我站即撤 </P></DIV></BODY></HTML>

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?