⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 c51开关分支语句.htm

📁 单片机教程 用c语言实现编程 可以大大缩短我们的开发周期
💻 HTM
📖 第 1 页 / 共 3 页
字号:
		showAlert('已经把该社团网址复制到系统剪贴板,您可以使用(Ctrl+V或鼠标右键)粘贴功能,通过其他软件记录或发送给您的朋友。')
	}
	catch(e){}
}
function add_favorite(uid, url, name)
{
	window.open("/personal/favorite/add.php?member_id="+uid+"&url="+url+"&name="+name,'_blank','width=400,height=220,toolbar=0,locationbar=0,menubar=0,statbar=0'); 
	return false;
}

// 提示登录
function alertlert_login()
{
	showAlert('对不起,您目前没有权限,请先登录!');
	document.login_form1.account.focus();
}


//申请加入社团
function con_join(con_gid)
{
	showConfirm("您确认加入本社团吗?","window.location.href='/league/apply.php?g_id="+con_gid+"';","");
}


//退出本社团
function con_quiet(con_gid,con_uid)
{
	showConfirm("您确认退出本社团吗?","window.location.href='/league/member/quiet_member.php?g_id="+con_gid+"&q_uid="+con_uid+"';","");
}

</SCRIPT>
<!-- 回复框 -->
<DIV id=background style="DISPLAY: none"></DIV>
<DIV id=postbox 
style="DISPLAY: none; Z-INDEX: 50; LEFT: 769px; WIDTH: 600px; POSITION: absolute; TOP: 271px">
<FORM name=reply_comment action=/league/comment/index.php?gid=514465 method=post 
target=hidden_frame><INPUT id=act type=hidden value=add name=act> <INPUT id=r_id 
type=hidden name=r_id> <INPUT id=t_id type=hidden name=t_id> <INPUT id=f_uid 
type=hidden name=f_uid> 
<TABLE cellSpacing=0 cellPadding=0 width="70%" border=0>
  <TBODY>
  <TR>
    <TD height=13>&nbsp;</TD></TR>
  <TR>
    <TD class=box_common height=26>&nbsp;<SPAN 
      class=font_common_title>回复评论</SPAN></TD></TR></TBODY></TABLE>
<TABLE class=box_common01 cellSpacing=0 cellPadding=0 width="70%">
  <TBODY>
  <TR>
    <TD>
      <TABLE cellSpacing=8 cellPadding=0 width="100%" bgColor=#ffffff 
        border=0><TBODY>
        <TR>
          <TD class=font_common vAlign=top align=right height=63>内容:</TD>
          <TD class=font_common vAlign=top><TEXTAREA class=input_box01 id=input_area name=input_area rows=6 cols=48></TEXTAREA></TD></TR>
        <TR>
          <TD class=font_common vAlign=top align=right width="15%">原文:</TD>
          <TD class=font_common style="LINE-HEIGHT: 18px" vAlign=top 
            width="85%"><SPAN class=gray id=past_type></SPAN></TD></TR>
        <TR>
          <TD class=font_common vAlign=top align=middle colSpan=2><INPUT class=btn01 onclick=javascript:hidden_reply();submit_post(document.reply_comment); type=button value=发表 name=queding> 
            &nbsp;&nbsp; <INPUT class=btn01 onclick=hidden_reply(); type=reset value=取消> 
        </TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></FORM></DIV><!-- 回复框 -->
<DIV id=mainBox>
<DIV id=mainBoxBg>
<TABLE class=module_title cellSpacing=0 cellPadding=0 border=0>
  <TBODY>
  <TR>
    <TD class=corner_left></TD>
    <TD class=corner_center><A 
      href="http://www.5jia1.com/league/?gid=514465">首页</A>&nbsp;&gt;&nbsp;<A 
      href="http://www.5jia1.com/league/blog/blog_index.php?gid=514465">社团文集</A>&nbsp;&gt;&nbsp;<A 
      href="http://www.5jia1.com/league/blog/show_comm.php?bid=361539">第十二课 
      C51开关分支语句</A></TD>
    <TD class=corner_right></TD></TR></TBODY></TABLE>
<DIV class=module_content>
<DIV class=module_content_line>
<DIV class=bg>
<TABLE cellSpacing=10 cellPadding=0 width="100%" border=0>
  <TBODY>
  <TR>
    <TD align=middle>
      <TABLE class=box_common cellSpacing=1 cellPadding=5 width="100%" 
        border=0><TBODY>
        <TR class=box_common_title>
          <TD colSpan=2>
            <TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
              <TBODY>
              <TR>
                <TD width="35%"><B>第十二课 C51开关分支语句</B></TD>
                <TD align=right width="65%">作者: <A 
                  href="http://www.5jia1.com/personal/?member_id=505887" 
                  target=_blank>张文俊</A> &nbsp;&nbsp;2007-08-15 
                  09:08:10&nbsp;&nbsp; </TD></TR></TBODY></TABLE></TD></TR>
        <TR class=box_content>
          <TD vAlign=top align=middle width="10%"><A 
            href="http://www.5jia1.com/personal/?member_id=505887" 
            target=_blank><IMG class=box01 height=98 
            src="12.files/s_0_personal_photo_505887.jpg" width=98 vspace=5 
            border=0></A><BR><IMG height=14 src="12.files/icon_boy.gif" width=14 
            border=0>&nbsp; <A 
            href="http://www.5jia1.com/personal/?member_id=505887" 
            target=_blank>张文俊</A> </TD>
          <TD>
            <TABLE class="font_content  autowrap" cellSpacing=12 cellPadding=0 
            width="100%" border=0>
              <TBODY>
              <TR>
                <TD class=line_h20 style="WIDTH: 790px">
                  <DIV style="OVERFLOW-X: auto; WIDTH: 100%">
                  <TABLE style="TABLE-LAYOUT: fixed; WORD-BREAK: break-all" 
                  cellSpacing=0 cellPadding=0 width="100%" border=0>
                    <TBODY>
                    <TR>
                      <TH vAlign=center align=middle height=32>
                        <H1>第十二课 C51开关分支语句</H1></TH></TR>
                    <TR>
                      <TD align=middle bgColor=#f7f7f7 
                        height=25>作者:佚名&nbsp;&nbsp;&nbsp;&nbsp;来源:本站原创&nbsp;&nbsp;&nbsp;&nbsp;点击数: 
                        182&nbsp;&nbsp;&nbsp;更新时间:2007年07月14日&nbsp;&nbsp;</TD></TR></TBODY></TABLE>
                  <P align=left>学习了条件语句,用多个条件语句能实现多方向条件分支,但是能发现使用过多的 
                  条件语句实现多方向分支会使条件语句嵌套过多,程序冗长,这样读起来也很不好读。这个时候 
                  使用开关语句同样能达到处理多分支选择的目的,又能使程序结构清晰。它的语法为下:</P>
                  <P>switch &nbsp;(表达式)</P>
                  <P>{</P>
                  <P>case &nbsp;常量表达式 1: &nbsp;语句 1; &nbsp;break; case 
                  &nbsp;常量表达式 2: &nbsp;语句 2; &nbsp;break; case &nbsp;常量表达式 3: 
                  &nbsp;语句 3; &nbsp;break; case &nbsp;常量表达式 n: &nbsp;语句 n; 
                  &nbsp;break; default:&nbsp;&nbsp; &nbsp;语句</P>
                  <P>}</P>
                  <P>运行中 switch 后面的表达式的值将会做为条件,与 case 后面的各个常量表达式的值相 对比,如果相等时则执行 
                  case 后面的语句,再执行 break(间断语句)语句,跳出 switch 语句。如果 case 
                  后没有和条件相等的值时就执行 default 后的语句。当要求没有符合的条 件时不做任何处理,则能不写 default 
                  语句。</P>
                  <P>在上面的章节中我们一直在用 printf 这个标准的 C 输出函数做字符的输出,使用它当 
                  然会很方便,但它的功能强大,所占用的存储空间自然也很大,要 1K 左右字节空间,如果 再加上 scanf 输入函数就要达到 
                  2K 左右的字节,这样的话如果要求用 2K 存储空间的芯片时 就无法再使用这两个函数,例如 
                  AT89C2051。在这些小项目中,通常我们只是要求简单的字 
                  符输入输出,这里以笔者发表在本人网站的一个简单的串行口应用实例为例,一来学习使用开 关语句的使用,二来简单了解 51 
                  芯片串行口基本编程。这个实例是用 PC 串行口通过上位机程序 与由 AT89c51 组成的下位机相通信,实现用 PC 
                  软件控制 AT89c51 芯片的 IO 口,这样也就可 
                  以再通过相关电路实现对设备的控制。为了方便实验,在此所使用的硬件还是用回以上课程 中做好的硬件,以串行口和 &nbsp;PC 
                  &nbsp;连接,用 &nbsp;LED &nbsp;查看实验的结果。原代码请到在笔者的网站 下载,上面有 
                  &nbsp;单片机c语言 &nbsp;下位机源码、PC 上位机源码、电路图等资料。</P>
                  <P>代码中有多处使用开关语句的,使用它对不一样的条件做不一样的处理,如在 CSToOut 函数 中根据 
                  CN[1]来选择输出到那个 IO 口,CN[1]=0 则把 CN[2]的值送到 P0,CN[1]=1 则送到 P1, 
                  这样的写法比起用 if (CN[1]==0)这样的判断语句来的清晰明了。当然它们的效果没有太大 
                  的差别(在不考虑编译后的代码执行效率的情况下)。</P>
                  <P>在这段代码主要的作用就是通过串行口和上位机软件进行通信,跟据上位机的命令字串, 对指定的 IO 
                  端口进行读写。InitCom 函数,原型为 void InitCom(unsigned char BaudRate), 
                  其作用为初始化串行口。它的输入参数为一个字节,程序就是用这个参数做为开关语句的选择 参数。如调用 
                  InitCom(6),函数就会把波特率设置为 9600。当然这段代码只使用了一种波特 
                  率,能用更高效率的语句去编写,这里就不多讨论了。</P>
                  <P>看到这里,你也许会问函数中的 SCON,TCON,TMOD,SCOM 等是代表什么?它们是特殊 功能寄存器。</P>
                  <P>SBUF&nbsp;&nbsp; &nbsp;数据缓冲寄存器&nbsp;&nbsp; 
                  &nbsp;这是一个能直接寻址的串行口专用寄存器。有朋友这样问起 过“为何在串行口收发中,都只是使用到同一个寄存器 
                  SBUF?而不是收发各用一个寄存器。” 实际上 SBUF 
                  包含了两个独立的寄存器,一个是发送寄存,另一个是接收寄存器,但它们都 共同使用同一个寻址地址-99H。CPU 在读 SBUF 
                  时会指到接收寄存器,在写时会指到发送寄</P>
                  <P>存器,而且接收寄存器是双缓冲寄存器,这样能避免接收中断没有及时的被响应,数据没</P>
                  <P align=left><BR style="PAGE-BREAK-BEFORE: auto" 
                  clear=all>&nbsp;</P>
                  <DIV class=Section50>
                  <P>有被取走,下一帧数据已到来,而造成的数据重叠问题。发送器则不需要用到双缓冲,一般 
                  情况下我们在写发送程序时也不必用到发送中断去外理发送数据。操作 SBUF 寄存器的方法 则很简单,只要把这个 99H 
                  地址用关键字 sfr 定义为一个变量就能对其进行读写操作了,</P>
                  <P>如 sfr &nbsp;SBUF &nbsp;= &nbsp;0x99;当然你也能用其它的名称。通常在标准的 
                  reg51.h 或 at89x51.h 等 头文件中已对其做了定义,只要用#include 引用就能了。</P>
                  <P>SCON&nbsp;&nbsp; &nbsp;串行口控制寄存器&nbsp;&nbsp; 
                  &nbsp;通常在芯片或设备中为了监视或控制接口状态,都会引用 到接口控制寄存器。SCON 就是 51 
                  芯片的串行口控制寄存器。它的寻址地址是 98H,是一个 能位寻址的寄存器,作用就是监视和控制 51 
                  芯片串行口的工作状态。51 芯片的串行口能 工作在几个不一样的工作模式下,其工作模式的设置就是使用 SCON 
                  寄存器。它的各个位的具 体定义如下:</P>
                  <P>(MSB)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  &nbsp;(LSB) 
                  SM0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  &nbsp;SM1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  &nbsp;SM2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  &nbsp;REN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  &nbsp;TB8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  &nbsp;RB8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  &nbsp;TI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  &nbsp;RI</P>
                  <P>表 8-1&nbsp;&nbsp; &nbsp;串行口控制寄存器 SCON</P>
                  <P>SM0、SM1 &nbsp;为串行口工作模式设置位,这样两位能对应进行四种模式的设置。看表 &nbsp;8</P>
                  <P>-2 串行口工作模式设置。</P>
                  <TABLE cellSpacing=0 cellPadding=0 border=1>
                    <TBODY>
                    <TR>
                      <TD width=48 vborder="0">
                        <P>SM0</P></TD>
                      <TD width=48 vborder="0">
                        <P>SM1</P></TD>
                      <TD width=139 vborder="0">
                        <P>模&nbsp;&nbsp; &nbsp;式</P></TD>
                      <TD width=139 vborder="0">
                        <P>功&nbsp;&nbsp; &nbsp;能</P></TD>
                      <TD width=139 vborder="0">
                        <P>波特率</P></TD></TR>
                    <TR>
                      <TD width=48 vborder="0">
                        <P>0</P></TD>
                      <TD width=48 vborder="0">
                        <P>0</P></TD>
                      <TD width=139 vborder="0">
                        <P>0</P></TD>
                      <TD width=139 vborder="0">
                        <P>同步移位寄存器</P></TD>
                      <TD width=139 vborder="0">
                        <P>fosc/12</P></TD></TR>
                    <TR>
                      <TD width=48 vborder="0">
                        <P>0</P></TD>
                      <TD width=48 vborder="0">
                        <P>1</P></TD>
                      <TD width=139 vborder="0">
                        <P>1</P></TD>
                      <TD width=139 vborder="0">
                        <P>8 位 UART</P></TD>
                      <TD width=139 vborder="0">
                        <P>可变</P></TD></TR>
                    <TR>
                      <TD width=48 vborder="0">
                        <P>1</P></TD>
                      <TD width=48 vborder="0">
                        <P>0</P></TD>
                      <TD width=139 vborder="0">
                        <P>2</P></TD>
                      <TD width=139 vborder="0">
                        <P>9 位 UART</P></TD>
                      <TD width=139 vborder="0">
                        <P>fosc/32 或 fosc/64</P></TD></TR>
                    <TR>
                      <TD width=48 vborder="0">
                        <P>1</P></TD>
                      <TD width=48 vborder="0">
                        <P>1</P></TD>
                      <TD width=139 vborder="0">
                        <P>3</P></TD>
                      <TD width=139 vborder="0">
                        <P>9 位 UART</P></TD>
                      <TD width=139 vborder="0">
                        <P>可变</P></TD></TR></TBODY></TABLE>
                  <P>表 8-2&nbsp;&nbsp; &nbsp;串行口工作模式设置</P>
                  <P>在这里只说明最常用的模式 1,其它的模式也就一一略过,有兴趣的朋友能找相关的 硬件资料查看。表中的 
                  &nbsp;fosc &nbsp;代表振荡器的频率,也就是晶体震荡器的频率。UART &nbsp;为(Universal 
                  Asynchronous &nbsp;Receiver)的英文缩写。</P>
                  <P>SM2 在模式 2、模式 3 中为多处理机通信使能位。在模式 0 中要求该位为 0。</P>
                  <P>REM 为允许接收位,REM 置 1 时串行口允许接收,置 0 时禁止接收。REM 是由软件置位或 
                  清零。如果在一个电路中接收和发送引脚 P3.0,P3.1 都和上位机相连,在软件上有串行口中断 
                  处理程序,当要求在处理某个子程序时不允许串行口被上位机来的控制字符产生中断,那么可 以在这个子程序的开始处加入 REM=0 
                  来禁止接收,在子程序结束处加入 REM=1 再次打开串行口 接收。大家也能用上面的实际源码加入 REM=0 
                  来进行实验。</P>
                  <P>TB8 发送数据位 8,在模式 2 和 3 是要发送的第 9 位。该位能用软件根据需要置位或 
                  清除,通常这位在通信协议中做奇偶位,在多处理机通信中这一位则用于表示是地址帧还是 数据帧。</P>
                  <P>RB8 接收数据位 8,在模式 2 和 3 是已接收数据的第 9 位。该位可能是奇偶位,地址/ 数据标识位。在模式 0 
                  中,RB8 为保留位没有被使用。在模式 1 中,当 SM2=0,RB8 是已接 收数据的停止位。</P>
                  <P>TI 发送中断标识位。在模式 0,发送完第 8 位数据时,由硬件置位。其它模式中则是在 
                  发送停止位之初,由硬件置位。TI 置位后,申请中断,CPU 响应中断后,发送下一帧数据。 在任何模式下,TI 
                  都必须由软件来清除,也就是说在数据写入到 SBUF 后,硬件发送数据,</P>

⌨️ 快捷键说明

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