<meta name="keywords" content="必胜时时彩开户,keywords" /> 第十二课 C51开关分支语句 联系我们

第十二课 C51开关分支语句

学习了条件语句,用多个条件语句能完成多偏向条件分支,但是能发现应用过量的 条件语句完成多偏向分支会使条件语句嵌套过量,法式模范模范杂乱,这样读起来也很欠好读。这个时间 应用开关语句异常能到达处置赏罚赏罚多分支选择的目的,又能使法式模范模范结构清晰。它的语法为下:

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

可变

1

0

2

9 位 UART

fosc/32 或 fosc/64

1

1

3

9 位 UART

可变

表 8-2    串行口使命形式设置

在这里只诠释最经常应用的形式 1,其它的形式也就逐一略过,有兴趣的同伙能找相关的 硬件质料检查。表中的  fosc  代表振荡器的频率,也就是晶体震惊器的频率。UART  为(Universal Asynchronous  Receiver)的英文缩写。

SM2 在形式 2、形式 3 中为多处置赏罚赏罚机通讯使能位。在形式 0 中请求该位为 0。

REM 为允许吸收位,REM 置 1 时串行口允许吸收,置 0 时榨取吸收。REM 是由软件置位或 清零。假定在一个电路中吸收和发送引脚 P3.0,P3.1 都和上位机相连,在软件上有串行口中止 处置赏罚赏罚法式模范模范,当请求在处置赏罚赏罚某个子法式模范模范时禁绝可串行口被上位机来的控制字符发生中止,那么可 以在这个子法式模范模范的泉源处加入 REM=0 来榨取吸收,在子法式模范模范阻拦处加入 REM=1 再次掀开串行口 吸收。年夜家也能用下面的现实源码加入 REM=0 来阻拦实验。

TB8 发送数据位 8,在形式 2 和 3 是要发送的第 9 位。该位能用软件凭证须要置位或 扫除,通常这位在通讯协定中做奇偶位,在多处置赏罚赏罚机通讯中这一名则用于体现是地址帧还是 数据帧。

RB8 吸收数据位 8,在形式 2 和 3 是已吸收数据的第 9 位。该位能够是奇偶位,地址/ 数据标识位。在形式 0 中,RB8 为生涯位没有被应用。在形式 1 中,当 SM2=0,RB8 是已接 收数据的阻拦位。

TI 发送中止标识位。在形式 0,发送完第 8 位数据时,由硬件置位。其它形式中则是在 发送阻拦位之初,由硬件置位。TI 置位后,请求中止,CPU 照顾中止后,发送下一帧数据。 在任何形式下,TI 都必须由软件来扫除,也就是说在数据写入到 SBUF 后,硬件发送数据,

中止照顾(如中止掀开),这个时间 TI=1,注解发送已完成,TI 不会由硬件扫除,以是这个时间必须


 

用软件对其清零。

RI 吸收中止标识位。在形式 0,吸收第 8 位阻拦时,由硬件置位。其它形式中则是在接 收阻拦位的半中央,由硬件置位。RI=1,请求中止,请求 CPU 取走数据。但在形式 1 中,SM2=1 时,当未收到有用的阻拦位,则不会对 RI 置位。异常 RI 也必须要靠软件扫除。

经常应用的串行口形式 1 是传输 10 个位的,1 位肇端位为 0,8 位数据位,低位在先,1 位阻拦 位为 1。它的波特率是可变的,其速率是取决于准时器 1 或准时器 2 的准市价(溢出速率)。 AT89c51 和 AT89C2051 等 51 系列芯片只需两个准时器,准时器 0 和准时器 1,而准时器 2

是 89C52 系列芯片才有的。

波特率    在应用串行口做通讯时,一个很主要的参数就是波特率,只需曲折位机的波特率 一样时才干阻拦正常通讯。波特率是指串行端口每秒内能传输的波特位数。有一些泉源学习 的同伙以为波特率是指每秒传输的字节数,如尺度  9600  会被误以为每秒种能传送  9600 个字节,而现实上它是指每秒能传送 9600 个二进位,而一个字节要 8 个二进位,如用串 口形式 1 来传输那么加上肇端位和阻拦位,每个数据字节就要占用 10 个二进位,9600 波特 率用形式 1 传输时,每秒传输的字节数是 9600÷10=960 字节。51 芯片的串行口使命形式 0 的波特率是结实的,为 fosc/12,以一个 12M 的晶体震惊器来盘算,那么它的波特率能到达 1M。 形式 2 的波特率是结着实 fosc/64 或 fosc/32,详细用那一种就取决于 PCON 存放器中的 SMOD 位,如 SMOD 为 0,波特率为 focs/64,SMOD 为 1,波特率为 focs/32。形式 1 和形式 3 的波 特率是可变的,取决于准时器 1 或 2(52 芯片)的溢出速率。那么我们怎样去盘算这两个模 式的波特率设置时相关的存放器的值呢?能用以下的公式去盘算。

波特率=(2SMOD÷32)×准时器 1 溢出速率

上式中如设置了 PCON 存放器中的 SMOD 位为 1 时便可以把波特率提升 2 倍。通常会应用 准时器 1 使命在准时器使命形式 2 下,这个时间准市价中的 TL1 做为计数,TH1 做为自动重装值    , 这个准时形式下,准时器溢出后,TH1 的值会自动装载到 TL1,再次泉源计数,这样能不 用软件去干预干与干与,使得准时更准确。在这个准时形式 2 下准时器 1 溢出速率的盘算公式以下:

溢出速率=(计数速率)/(256-TH1) 上式中的“计数速率”与所应用的晶体振荡器频率有关,在 51 芯片中准时器启动后会

在每个机械周期使准时存放器 TH 的值增添一,一个机械周期即是十二个振荡周期,以是

能得知 51 芯片的计数速率为晶体振荡器频率的 1/12,一个 12M 的晶体震惊器用在 51 芯片上, 那么 51 的计数速率就为 1M。通常用 11.0592M 晶体是为了取得尺度的无误差的波特率,那 么为何呢?盘算一下就知道了。如我们要取得 9600 的波特率,晶体震惊器为 11.0592M 和 12M,定 时器 1 为形式 2,SMOD 设为 1,划分看看那所请求的 TH1 为何值。代入公式:

11.0592M

9600=(2÷32)×((11.0592M/12)/(256-TH1))

TH1=250    //看看是不是和下面实例中的应用的数值一样?

12M

9600=(2÷32)×((12M/12)/(256-TH1)) TH1≈249.49

下面的盘算能看出应用 12M 晶体的时间盘算出来的 TH1 不为整数,而 TH1 的值只能取


 

整数,这样它就会有一定的误差存在不克不及发生准确的 9600 波特率。虽然一定的误差是能 在应用中被吸收的,就算应用 11.0592M 的晶体振荡器也会因晶体自己所存在的误差使波特

率发生误差,但晶体自己的误差对波特率的影响是很是之小的,能忽视不计。