微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 单片机c语言教程:C51开关分支语句

单片机c语言教程:C51开关分支语句

时间:09-12 来源:互联网 点击:

学习了条件语句,用多个条件语句能实现多方向条件分支,但是能发现使用过多的 条件语句实现多方向分支会使条件语句嵌套过多,程序冗长,这样读起来也很不好读。这个时候 使用开关语句同样能达到处理多分支选择的目的,又能使程序结构清晰。它的语法为下:

switch (表达式)

{

case 常量表达式 1: 语句 1; break; case 常量表达式 2: 语句 2; break; case 常量表达式 3: 语句 3; break; case 常量表达式 n: 语句 n; break; default: 语句

}

运行中 switch 后面的表达式的值将会做为条件,与 case 后面的各个常量表达式的值相 对比,如果相等时则执行 case 后面的语句,再执行 break(间断语句)语句,跳出 switch 语句。如果 case 后没有和条件相等的值时就执行 default 后的语句。当要求没有符合的条 件时不做任何处理,则能不写 default 语句。

在上面的章节中我们一直在用 printf 这个标准的 C 输出函数做字符的输出,使用它当 然会很方便,但它的功能强大,所占用的存储空间自然也很大,要 1K 左右字节空间,如果 再加上 scanf 输入函数就要达到 2K 左右的字节,这样的话如果要求用 2K 存储空间的芯片时 就无法再使用这两个函数,例如 AT89C2051。在这些小项目中,通常我们只是要求简单的字 符输入输出,这里以笔者发表在本人网站的一个简单的串行口应用实例为例,一来学习使用开 关语句的使用,二来简单了解 51 芯片串行口基本编程。这个实例是用 PC 串行口通过上位机程序 与由 AT89c51 组成的下位机相通信,实现用 PC 软件控制 AT89c51 芯片的 IO 口,这样也就可 以再通过相关电路实现对设备的控制。为了方便实验,在此所使用的硬件还是用回以上课程 中做好的硬件,以串行口和 PC 连接,用 LED 查看实验的结果。原代码请到在笔者的网站 下载,上面有 单片机c语言 下位机源码、PC 上位机源码、电路图等资料。

代码中有多处使用开关语句的,使用它对不一样的条件做不一样的处理,如在 CSToOut 函数 中根据 CN[1]来选择输出到那个 IO 口,CN[1]=0 则把 CN[2]的值送到 P0,CN[1]=1 则送到 P1, 这样的写法比起用 if (CN[1]==0)这样的判断语句来的清晰明了。当然它们的效果没有太大 的差别(在不考虑编译后的代码执行效率的情况下)。

在这段代码主要的作用就是通过串行口和上位机软件进行通信,跟据上位机的命令字串, 对指定的 IO 端口进行读写。InitCom 函数,原型为 void InitCom(unsigned char BaudRate), 其作用为初始化串行口。它的输入参数为一个字节,程序就是用这个参数做为开关语句的选择 参数。如调用 InitCom(6),函数就会把波特率设置为 9600。当然这段代码只使用了一种波特 率,能用更高效率的语句去编写,这里就不多讨论了。

看到这里,你也许会问函数中的 SCON,TCON,TMOD,SCOM 等是代表什么?它们是特殊 功能寄存器。

SBUF 数据缓冲寄存器 这是一个能直接寻址的串行口专用寄存器。有朋友这样问起 过“为何在串行口收发中,都只是使用到同一个寄存器 SBUF?而不是收发各用一个寄存器。” 实际上 SBUF 包含了两个独立的寄存器,一个是发送寄存,另一个是接收寄存器,但它们都 共同使用同一个寻址地址-99H。CPU 在读 SBUF 时会指到接收寄存器,在写时会指到发送寄存器,而且接收寄存器是双缓冲寄存器,这样能避免接收中断没有及时的被响应,数据没有被取走,下一帧数据已到来,而造成的数据重叠问题。发送器则不需要用到双缓冲,一般 情况下我们在写发送程序时也不必用到发送中断去外理发送数据。操作 SBUF 寄存器的方法 则很简单,只要把这个 99H 地址用关键字 sfr 定义为一个变量就能对其进行读写操作了,

如 sfr SBUF = 0x99;当然你也能用其它的名称。通常在标准的 reg51.h 或 at89x51.h 等 头文件中已对其做了定义,只要用#include 引用就能了。

SCON 串行口控制寄存器 通常在芯片或设备中为了监视或控制接口状态,都会引用 到接口控制寄存器。SCON 就是 51 芯片的串行口控制寄存器。它的寻址地址是 98H,是一个 能位寻址的寄存器,作用就是监视和控制 51 芯片串行口的工作状态。51 芯片的串行口能 工作在几个不一样的工作模式下,其工作模式的设置就是使用 SCON 寄存器。它的各个位的具 体定义如下:

(MSB) (LSB) SM0 SM1 SM2 REN TB8 RB8 TI RI

表 8-1 串行口控制寄存器 SCON

SM0、SM1 为串行口工作模式设置位,这样两位能对应进行四种模式的设置。看表 8-2 串行口工作模式设置。

SM0

SM1

模 式

功 能

波特率

0

0

0

同步移位寄存器

fosc/12

0

1

1

8 位 UART

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top