单片机C语言教程LED彩灯串行控制器制作.docx

上传人:b****5 文档编号:11745823 上传时间:2023-03-31 格式:DOCX 页数:16 大小:158.72KB
下载 相关 举报
单片机C语言教程LED彩灯串行控制器制作.docx_第1页
第1页 / 共16页
单片机C语言教程LED彩灯串行控制器制作.docx_第2页
第2页 / 共16页
单片机C语言教程LED彩灯串行控制器制作.docx_第3页
第3页 / 共16页
单片机C语言教程LED彩灯串行控制器制作.docx_第4页
第4页 / 共16页
单片机C语言教程LED彩灯串行控制器制作.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

单片机C语言教程LED彩灯串行控制器制作.docx

《单片机C语言教程LED彩灯串行控制器制作.docx》由会员分享,可在线阅读,更多相关《单片机C语言教程LED彩灯串行控制器制作.docx(16页珍藏版)》请在冰豆网上搜索。

单片机C语言教程LED彩灯串行控制器制作.docx

单片机C语言教程LED彩灯串行控制器制作

LED彩灯串行控制器制作

知识目标

掌握串行口各个特殊功能寄存器使用方法;

掌握串行口通信编程方法。

技能目标

会设定串行口各个特殊功能寄存器;

会编写串行口通信程序。

任务一 单片机外部结构

任务导论

设定串行口各个特殊功能寄存器是初学者较易出错的地方之一,设定出错串行通信不会成功,会造成不知是硬件问题还是程序编写问题,通信不成功牵涉到三方面问题,硬件、程序和设定,实践中发现不工作往往是特殊功能寄存器设定出错。

任务分析

串行口通信技术是实际应用较多的技术之一,通信技术牵涉到通信协议、各个特殊功能寄存器设定和硬件设计,单片机与PC机通信时,因为PC机是采用232通信方式,因而单片机要外加232芯片才能通信成功。

232芯片的通信距离只有十几米远,最长距离不会超过16米,若远距离通信时,工业上常用485通信方式。

串口还有一个主要应用方面,就是外接串转并接口芯片。

相关知识

一、串行口控制寄存器

MCS-51单片机内部的串行接口是全双工的,即能同时发送和接收数据。

发送缓冲器只能写入不能读出,接收缓冲器只能读出不能写入。

串行口还有接收缓冲作用,即从接收寄存器中读出前一个已收到的字节之前就能开始接收第二字节。

两个串行口数据缓冲器(实际上是两个寄存器)通过特殊功能寄存器SBUF来访问。

写入SBUF的数据储存在发送缓冲器,用于串行发送,从SBUF读出的数据来自接收缓冲器。

两个缓冲器共用一个地址99H(特殊功能寄存器SBUF的地址)。

控制串行口的寄存器有两个特殊功能寄存器:

即串行口控制寄存器SCON和电源控制器PCON(下面将分别对其进行介绍)。

1.PCON中的波特率选择位

电源控制器PCON是一个特殊功能寄存器,如图8-6所示。

PCON没有位寻址功能,字节地址为87H。

D7D6D5D4D3D2D1D0

SMOD

无定义位

图9-6PCON寄存器

如图8-6中所示D7位(SMOD)为波特率选择位(波特率定义可参见本书相应的章节),其他位均无意义。

复位时的SMOD值为0,可用MOVPCON,#80H或MOV87H,#80H指令使该位置“1”。

当SMOD=1时,在串行口方式1、2或3情况下,波特率将提高一倍。

2.串行口控制寄存器SCON

串行口控制寄存器SCON用于定义串行口的操作方式和控制它的某些功能。

其字节地址为98H。

寄存器中各位内容如图8-7所示。

D7D6D5D4D3D2D1D0

SM0

SM1

SM2

REN

TB8

RB8

T1

R1

图9-7SCON寄存器

①SM0,SM1:

串行口操作方式选择位,两个选择位对应于4种状态,所以串行口能以4种方式工作,如表8-1所示。

②SM2:

允许方式2和3的多机通信使能位。

在方式2或3中,如果SM2置为“1”,且接收到的第9位数据(RB8)为0,则接收中断标志RI不会被激活。

在方式1中,如果SM2=1,则只有收到有效的停止位时才会激活RI。

在方式0中,SM2必须置为“0”。

3REN:

允许串行接收位。

由软件置位或清零,使允许接收或禁止接收。

4TB8:

是在方式2和3中要发送的第9位数据,可按需要由软件置位或复位。

5RB8:

是方式2和3中已接收到的第9位数据。

在方式1中,如果SM2=0,RB8是接收到的停止位。

在方式0中,不使用RB8位。

6TI:

发送中断标志。

在方式0中,当串行发送完第8位数据时由硬件置位。

在其他方式中,在发送停止位的开始时由硬件置位。

当TI=1时,申请中断,CPU响应中断后,发送下一帧数据。

在任何方式中,该位都必须由软件清0。

7RI:

接收中断标志。

在方式0中,串行接收到第8位结束时由硬件置位。

在其他方式中,在接收到停止位的中间时刻由硬件置位。

RI=1时申请中断,要求CPU取走数据。

但在方式1中,当SM2=1时,如果未接收到有效的停止位,则不会对RI置位。

在任何工作方式中,该位都必须由软件清0。

在系统复位时,SCON中的所有位都被清0。

表8-1串行口方式选择

SM0SM1

方式

功能说明

波特率

00

0

移位寄存器方式

fosc/12

01

1

8位UART

可变

10

2

9位UART

fosc/64或fosc/32

11

3

9位UART

可变

二、串行接口工作方式

串行口的操作方式由SM0,SM1定义,编码与功能如表8-1所示,下面将针对方式0、1、2、3进行介绍。

1.方式0

串行口的工作方式0为移位寄存器输入输出方式,可外接移位寄存器,以扩展I/O口,也可外接同步输入输出设备。

①方式0输出(发送)

串行数据通过RXD引脚输出,而在TXD引脚输出移位时钟,作移位脉冲输出端。

当一个数据写入串行口数据缓冲器时,就开始发送。

在此期间,发送控制器送出移位信号,使发送移位寄存器的内容右移一位,直至最高位(D7位)数字移出后,停止发送数据和移位时钟脉冲。

完成发送一帧数据的过程,置TI为“1”,申请中断,如果CPU响应中断,则从0023H单元开始执行串行口中断服务程序。

②方式0输入(接收)

当串行口定义为方式0时,RXD端为数据输入端,TXD端为同步脉冲信号输出端。

接收器以振荡频率的1/12的波特率接收TXD端输入的数据信息。

REN(SCON.4)为串行口接收器允许接收控制位。

当REN=0时,禁止接收;当REN=1时,允许接收。

当串行口置为方式0,且满足REN=1和RI(SCON.0)=0的条件时,就会启动一次接收过程。

在机器周期的S6P2时刻,接收控制器向输入移位寄存器写入11111110,并使移位时钟由TXD端输出。

从RXD端(P3.0引脚)输入数据,同时使输入移位寄存器的内容左移一位,在其右端补上刚由RXD引脚输入的数据。

这样,原先在输入移位寄存器中的“1”就逐位从左端移出,而在RXD引脚上的数据就逐位从右端移入。

当写入移位寄存器中的最右端的一个0移到最左端时,其右边已经接收了7位数据。

这时,将通知接收控制器进行最后一次移位,并把所接收的数据装入SBUF。

在启动接收过程开始后的第10个机器周期的S1P1时刻,SCON中的RI位被置位,从而发出中断申请。

至此,完成了一帧数据的接收过程,如果CPU响应中断,则去执行由0023H作为入口地址的中断服务程序。

MCS-51单片机串行口可以外接串行输入并行输出移位寄存器作为输出口,也可以外接并行输入串行输出移位寄存器作为输入口。

方式0发送或接收完8位数据后由硬件置位,并发送中断标志TI或接收中断标志RI。

但CPU响应中断请求转入中断服务程序时并不将TI或RI清口。

因此,中断标志TI或RI必须由用户在程序中清0(可用CLRTI或CLRRI;也可以用ANLSCON,#0FEH或ANLSCON,#0FDH等指令)。

2.方式1

串行口工作于方式1时,被控制为波特率可变的8位异步通信接口。

传送一帧信息为10位,即1位起始位(0),8位数据位(低位在先)和1位停止位

(1)。

数据位由TXD发送,由RXD接收。

波特率是可变的,取决于定时器1或2的溢出速率。

①方式1发送

CPU执行任何一条以SBUF为目标寄存器的指令,就启动发送。

先把起始位输出到TXD,然后把移位寄存器的输出位送到TXD,接着发出第一个移位脉冲(SHIFT),使数据右移一位,并从左端补入0。

此后数据将逐位由TXD端送出,而其左端不断补入0。

当发送完数据位时,置位中断标志位TI。

②方式1接收

串行口以方式1输入时,当检测到RXD引脚上由1到0的跳变时开始接收过程,并复位内部16分频计数器,以实现同步。

计数器的16个状态把1位时间等分成16份,并在第7,8,9个计数状态时采样RXD的电平,因此每位数值采样三次,当接收到的三个值中至少有两个值相同时,这两个相同的值才被确认接收,这样可排除噪声干扰。

如果检测到起始位的值不是0,则复位接收电路,并重新寻找另一个1到0的跳变。

当检测到起始位有效时,才把它移入移位寄存器并开始接收本帧的其余部分。

一帧信息也是10位,即1位起始位,8位数据位(先低位),1位停止位。

在起始位到达移位寄存器的最左位时,它使控制电路进行最后一次移位。

在产生最后一次移位脉冲时能满足下列两个条件:

①RI=0;②接收到的停止位为1或SM2=0时,停止位进入RB8,8位数据进入SBUF,且置位中断标志RI。

3.方式2和方式3

串行工作于方式2和方式3时,被自定义为9位的异步通信接口,发送(通过TXD)和接收(通过RXD)一帧信息都是11位,1位起始位(0),8位数据位(低位在先),1位可编程位(即第9位数据)和1位停止位

(1)。

方式2和方式3的工作原理相似,唯一的差别是方式2的波特率是固定的,为fosc/32或fosc/64。

方式3的波特率是可变的,利用定时器T1或定时器T2作波特率发生器。

①方式2和方式3发送

方式2和方式3的发送过程是由执行任何一条以SBUF作为目的寄存器的指令来启动的。

由“写入SBUF”信号把8位数据装入SBUF,同时还把TB8装到发送移位寄存器的第9位位置上(可由软件把TB8赋予0或1),并通知发送控制器要求进行一次发送。

发送开始后,把一个起始位(0)放到TXD端,经过一位时间后,数据由移位寄存器送到TXD端,通过第一位数据,出现第一个移位脉冲。

在第一次移位时,把一个停止位“1”由控制器的停止位送入移位寄存器的第9位。

此后,每次移位时,把0送入第9位。

因此,当TB8的内容移到移位寄存器的输出位置时,其左面一位是停止位“1”,再往左的所有位全为“0”。

这种状态由零检测器检测到后,就通知发送控制器作最后一次移位,然后置TI=1,请求中断。

第9位数据(即SCON中的TB8的值)由软件置位或清零,可以作为数据的奇偶校验位,也可以作为多机通信中的地址,即数据标志位。

如果把TB8作为奇偶校验位,可以在发送中断服务程序中,在数据写入SBUF之前,先将数据的奇偶位写入TB8。

②方式2和方式3接收

方式2和方式3的接收过程与方式1类似。

数据从RXD端输入,接收过程由RXD端检测到负跳变时开始(CPU对RXD不断采样,采样速率为所建立的波特率的16倍),当检测到负跳变,16分频计数器就立即复位,同时把1FFH写入输入移位寄存器,计数器的16个状态把一位时间等分成16份,在每一位的第7,8,9个状态时,位检测器对RXD端的值采样。

如果所接收到的起始位不是0,则复位接收电路等待另一个负跳变的来到,如果起始位有效(=0),则起始位移入移位寄存器,并开始接收这一帧的其余位。

当起始位0移到最左面时,通知接收控制器进行最后一次移位。

把8位数据装入接收缓冲器,第9位数据装入SCON中的RB8,并置中断标志RI=1。

数据装入接收缓冲器和RB8,并置位RI,只在产生最后一个移位脉冲时,并且要满足两个条件:

①RI=0,SM2=0;②接收到的第9位数据为1时,才会进行。

三波特率

在串行通信中,一个重要的指标是波特率,通信线上传送的所有信号都保持一致的信号持续时间,每一位的信号持续时间都由数据传送速度确定,而传送速度是以每秒多少个二进制位来衡量的,将串行口每秒钟发送(或接收)的位数称为波特率。

假设发送一位数据所需要的时间为T,则波特率为

它反映了串行通信的速率,也反映了对于传输通道的要求。

波特率越高,要求传输通道的频带越宽。

如果数据以300个二进制位每秒在通信线上传送,那么传送速度为300波特(通常记为300b/s)。

MCS-51单片机的异步通信速度一般在50b/s~9600b/s之间。

由于异步通信双方各用自己的时钟源,要保证捕捉到的信号正确,最好采用较高频率的时钟,一般选择时钟频率比波特率高16倍或64倍。

如果时钟频率等于波特率,则频率稍有偏差便会产生接收错误。

在异步通信中,收、发双方必须事先规定两件事:

一是字符格式,即规定字符各部分所占的位数、是否采用奇偶校验以及校验的方式(偶校验还是奇校验)等通信协议;二是采用的波特率以及时钟频率和波特率的比例关系。

串行口以方式0工作时,波特率固定为振荡器频率的1/12。

以方式2工作时,波特率为振荡器频率的1/64或1/32,它取决于特殊功能寄存器PCON中的SMOD位的状态。

如果SMOD=0(复位时SMOD=0),波特率为振荡器频率的1/64;如果SMOD=1,波特率为振荡器频率的1/32。

方式1和3的波特率由定时器1的溢出率所决定。

当定时器T1作波特率发生器时,波特率由下式确定:

波特率=(定时器T1溢出率)/n

上式中,定时器T1溢出率=定时器T1的溢出次数/秒,n为32或16,取决于特殊功能寄存器PCON中的SMOD位的状态。

如果SMOD=0,则n=32。

如果SMOD=1,则n=16。

对于定时器的不同工作方式,得到的波特率的范围是不一样的,这主要由定时器1的计数位数不同所决定。

对于非常低的波特率,应选择16位定时器方式(即TMOD.5=0,TMOD.4=1),并且在定时器T1中断程序中实现时间常数重新装入。

在这种情况下,应该允许定时器T1中断(IE.3=1)。

在任何情况下,如果定时器T1的C/

=0,则计数率为振荡器频率的1/12。

如果C/

=1,则计数率为外部输入频率,它的最大可用值为振荡器频率的1/24。

任务实施

实例1PC机与单片机串行接口通信模块制作。

串行口通讯调试是比较困难的工作,因为只有当通讯双方的硬件和软件都正确无误时才能实现成功的通讯。

可以采用分别调试的方法,即按通讯规约双方各自调试好,然后再联调。

1.原理图设计

原理图如图9-8所示,用MAX232芯片,外加9芯串口插座,组成与PC机通信接口电路。

先用PC终端来进行单片机通讯口的调试。

只要方式设置正确,一般通信会成功。

因为PC终端已具有正常的通讯功能,如果通讯不正常便是单片机部分引起的,这样便于查出存在的故障。

2.硬件制作

自己购买器件,用万能板焊接电路。

3.程序编写

下面给出的串行口调试程序,其功能是对串行口的工作方式编程,然后在串行口上输出字符串:

‘MCS-51Microcomputer’,接着从串行口上输入字符,又将输入的字符从串行口上输出,将PC终端键盘上输入的字符在屏幕上显示出来。

这个功能实现以后,串行口的硬件和串行口的编程部分就调试成功,接着便可以按通讯规约,实现单片机和终端之间串行通讯,完成通讯软件的调试工作。

图9-8串行口通讯口调试电路

编写程序如下:

#include

#defineucharunsignedchar

#defineuintunsignedint

ucharcodeasab[]={'M','S','C','-','M','i','c','r','o','c','o','m','p','u','t','e','r',0x0a,0x0d,0};

voidmain()

{

uchari,temp;

TMOD=0x20;//定时器1方式2

TL1=0xe8;

TH1=0xe8;

SCON=0xda;

TR1=1;

i=0;

next:

temp=asab[i];

if(temp==0)

{

loop:

while(RI==0);

RI=0;

temp=SBUF;

while(TI==0);

TI=0;

SBUF=temp;

gotoloop;

}

else

{

while(TI==0);

TI=0;

SBUF=temp;

i++;

}

gotonext;

}

在KeilC中输入以上程序汇编通过后,全速运行该程序,仿真时,打开(Peripherale/Serial)串行口通道(SerialChannel)如图9-9所示。

图9-9串行口调试图

由上图可见串行口通道窗口中有各种标志位,程序每次运行到TSO3时,要在TI前的复选框选中“√”,程序才继续运行。

将A中数送到串口缓冲器(SBUF)中,可在SBUF文本框中看到传入的数据。

每选中一次“√”传送一个数。

4.Proteus软件仿真

在图9-8基础上添加虚拟终端,如图9-10所示。

VSM虚拟终端允许用户通过PC的键盘和屏幕与仿真微处理器系统收发RS232异步串行数据。

在显示用户编写程序产生的调试/跟踪信息时非常有用。

图9-10Proteus软件串口仿真

导入第3步所生成的HEX文件,全速运行后,出现如图9-10所示结果,在虚拟终端显示转输的数据。

但是数据进行了转换,与程序中的字符不一致。

实例2LED彩灯串口控制器制作。

1.电路原理图设计

利用串行口的方式0输出,可以扩展多个移位寄存器,作为并行输出口,这种扩展方法接口简单,单片机和移位寄存器之间信息传输线少,适用于远距传送的输出设备(例如智能显示屏与状态显示板)。

如果在一个MCS-51单片机的应用系统中,在串行口上扩展两个移位寄存器74LS164,作为16路状态指示灯接口,如图9-11所示。

2.硬件制作

自己购买器件,用万能板焊接电路。

3.程序编写

设计一个输出程序,其功能为:

将内部40H、41H单元的状态缓冲器中内容输出到移位寄存器。

每当系统中状态变化时,首先改变状态缓冲器中相应状态,然后调用该子程序,状态指示即实时地发生变化。

图9-11状态指示灯接口板

编写程序如下:

#include

#defineucharunsignedchar

#defineuintunsignedint

ucharx0,x1;

voidmain()

{

SCON=0x00;

TI=0;

SBUF=x0;

while(TI==0);

TI=0;

SBUF=x1;

}

4.Proteus软件仿真

⑴在Proteus中设计原理图,如图9-12所示,图中为图9-11的一个完整全图。

⑵硬件制作

自己购买器件,用万能板焊接电路。

⑶软件编写

本题利用表格的方式,建立一组数据,利用UART发送至8BIT串入并出的IC74164。

这组数据将使74164的8个LED左移2次,右移2次,闪烁2次。

这是另一种编程控制方式。

图9-12Proteus软件串口仿真

程序如下:

#include

#defineucharunsignedchar

#defineuintunsignedint

ucharcodetable[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,

0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,

0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01,

0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01,

0x00,0xff,0x00,0xff,0x03};

voiddelay()

{

uintj;

for(j=0;j<20000;j++);

}

voidmain()

{

uchari,temp;

SCON=0x00;

i=0;

loop:

temp=table[i];

if(temp!

=0x03)

{

temp=~temp;

SBUF=temp;

while(TI==0);

TI=0;

delay();

i++;

}

elsei=0;

gotoloop;

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1