STC89C52通过串口控制流水灯亮灭

发布者:逍遥游侠最新更新时间:2016-05-12 来源: eefocus关键字:STC89C52  串口控制  流水灯 手机看文章 扫描二维码
随时随地手机看文章
本次笔记包含两个方面:

1.只是控制LED的亮灭,不返回数值

2.控制LED的亮灭,并返回数值

看了几讲的视频,都是在讲串口的方式1。其他的还没接触,这里也只用串口的方式1实现这两个功能。串口里面需要计算的地方是根据所要使用的波特率求定时器的初始值。定时器使用的是方式2,可以自动装初始值,避免赋值语句装初始值时出现误差。

以9800bps,定时器使用方式2,串口使用方式1,晶振波特率为 11.0592MHZ,求TH1跟TL1的值。

方式1的波特率 = (2^SMOD/32)xT1溢出率。单片机复位后,电源管理寄存器PCON全部清零,SMOD作为其中一位自然也清零。

波特率已经知道了。这样就剩下T1溢出率了。

假设初值为X,则定时器每次计256-X个数溢出一次(定时器为8位,最大为255 。256时发生溢出)。每计一个数的时间为一个机器周期,机器周期 = T时钟周期 X 12 。于是溢出的时间为 = 个数X 每个时间 = ( 256 - X) * 12/Fosc . 那么基础率就是溢出时间的倒数。

于是结合公式“方式1的波特率 = (2^SMOD/32)xT1溢出率”,式子可以总结为:

9600 = 2^0 /32 * Fosc / (256 - X)*12     带入全部已知数据得到     9600 = 2^0 /32 * 11059200/ (256 - X)*12    =====》》》》  求得的X为: 253  .

在此基础上,如果把SMOD 设为1 ,则 求得波特率为  :

波特率 = (2^1/32) * 11059200 / (256 - 253 )  = 2 * [  1/32 * 11059200 / (256 - 253)] = 2 * 9600 =  19200  。即变为原来的两倍。

如果把晶振换成12MHZ再求初值,求得的X为: 252.744792…… 无穷小数。这样就会产生误差。以前一直感觉整数的晶振挺好,现在才知道为什么会有11.0592MHZ这种晶振的存在了,。

这样计算得到了初值,下面贴代码。

只是控制LED的亮灭,不返回数值

实现这个又分为查询和中断两种方法。

A。先用查询。感觉叫判断更好些,因为是用if判断来实现的

 

#include 

void main()
{  
		//设置参数
		TMOD = 0x20; //设定定时器1的工作方式为方式2
		TH1 = 0xfd;
		TL1 = 0xfd;	 //装载TH1、TL1
		TR1 = 1; //启动定时器1

		REN = 1; //允许串行接收位
		SM0 = 0;
		SM1 = 1; //设定串口工作方式为方式1
/*
*    	       EA = 1; //全局中断允许位
*		ES = 1; //串口中断允许位
*		此处使用的是查询法判断接收中断标志位,所以即便不开启中断允许位,也可以
*
*/
	while(1)
	{	 	
		//查询法检测RI
		if(RI == 1)//RI为接收中断标志位。硬件置为1,必须软件清0
		{
			P1 = SBUF;
			RI = 0;
		} 		
	}

}
B 中断法

 

 

#include  
void main()
{  
		//设置参数
		TMOD = 0x20; //设定定时器1的工作方式为方式2
		TH1 = 0xfd;
		TL1 = 0xfd;	 //装载TH1、TL1
		TR1 = 1; //启动定时器1

		REN = 1; //允许串行接收位
		SM0 = 0;
		SM1 = 1; //设定串口工作方式为方式1

		EA = 1; //全局中断允许位
		ES = 1; //串口中断允许位

		while(1) ;	//等待中断的发生
		
}

//中断检测RI
void ser() interrupt 4
{
	   P1 = SBUF;
	   RI = 0;
}

这两个除了代码,感觉就是是否开启中断允许了。因为RI置为1是硬件自动执行的。即便是不开启中断允许位,照样可以用if进行判断。

 

 

上面这两个是单方向的,再来个双向的。

 

/*
 *通过串口给下位机发送数据,并使之显示在P1口的流水灯上。
 *同时单片机返回接收到的数据,显示在串口助手上
 */
#include 

unsigned char flag;

void main()
{  
		//设置参数
		TMOD = 0x20; //设定定时器1的工作方式为方式2
		TH1 = 0xfd;
		TL1 = 0xfd;	 //装载TH1、TL1
		TR1 = 1; //启动定时器1

		
		SM0 = 0;
		SM1 = 1; //设定串口工作方式为方式1
		REN = 1; //允许串行接收位

    	EA = 1; //全局中断允许位
		ES = 1; //串口中断允许位

	while(1)
	{	
		/* 刚开始单片机缓冲寄存器为空,无数据可以显示
		 * 先从串口接收数据,再返回该数据
		 * 在中断中接收数据,同时将flag标志位置为1.说明接收到了数据
		 * 若接收到数据(flag == 1),说明接收到了;否则说明未接收到数据,不显示。继续判断flag数值
		 */
		
		if(flag == 1) 
		{						
			//发送数据
			ES = 0; //关闭串口中断,发送数据
			SBUF = P1; //数据写入SBUF寄存器
			while(!TI); //等待
			TI = 0;
			ES = 1; 
			flag = 0;
		
		}		
	}

}

void ser() interrupt 4
{
	//接收数据
	P1 = SBUF;
	flag = 1;
	RI = 0;
}

主函数里面那个flag = 0  。 一定不能少了。否则只要一小会儿的功能,串口助手就卡了。。。。

 

这个例子里还有两条语句比较关键:

P1 = SBUF;//把SBUF寄存器中的数值赋给P1

SBUF = P1;//把P1的数值写入到SBUF

SBUF是这么写的:SBUF 串行数据缓冲寄存器,一个发送缓冲寄存器,一个接收缓冲寄存器。两个公用一个地址99H,但在物理上是两个独立的寄存器。那么如何区分是发送还是接收呢?就用语句来区分了。

控制流水灯的话,需要发送十六进制格式的。

比如发送FB(1111,1011)。在我的开发板上是L2灯亮。如果发送字符,就不太好控制了。如果用2中的例程,以字符方式发送“fb”,单片机返回串口助手并用十六进制显示为“62” .这个,嗯,目前不会算 :P

 

没啥值得纪念的图片,还是几个流水灯。不过此时的流水灯,非彼时的流水灯。现在的流水灯,可是我从电脑上就能控制开发板上的了:D

只是不知道下次自己写个上位机是什么时候了,

关键字:STC89C52  串口控制  流水灯 引用地址:STC89C52通过串口控制流水灯亮灭

上一篇:基于51单片机的步进电机驱动器
下一篇:单片机之旅——中断之流水灯

推荐阅读最新更新时间:2024-03-16 14:53

51单片机入门经验分享3-通过流水灯讲解for循环语句
接上一篇帖子,继续来看,既然我们会点亮一个小灯,并可以让其闪烁了,那么我们就尝试着点亮流水灯好了,让8个小灯,从左到右,从右往左来回流动,还是在上一个程序的基础上来修改,很简单依次赋值即可实现。 while(1) { P2 = 0XFE;//1111_1110; Delay500ms();//500ms延时 11.0592MHZ P2 = 0XFD;//1111_1101; Delay500ms();//500ms延时 11.0592MHZ P2 = 0XFB;//1111_1011; Delay500ms();//
[单片机]
单片机控制串口通信
串口通信的内容比较重要,大家一定要掌握,工业上应用非常多,其中232总线、485总线以及以它们为基础建成的ModBus网络工业通信系统都需要用到串口,下面我来为大家一步步介绍串口通信的相关知识。 一、通信数据的发送方式简介 通信是机器与机器之间数据交换的桥梁,按数据发送方式分为串口通信和并口通信也可以叫串行通信和并行通信。 串行通信: 串口通信是指外设和计算机间,通过数据信号线 、地线、控制线等,按位进行传输数据的一种通讯方式。这种通信方式使用的数据线少,在远距离通信中可以节约通信成本,但其传输速度比并行传输低。 注意: 串口用于ASCII码字符的传输,通信使用3根线完成,分别是地线、发送、接收。 由于串口通信是异步的,端口能
[单片机]
stm32 LED 流水灯剖析(库函数版)
基于stm32 F401 discovery 库函数点亮LED 3,4,5,6 一.附原理图一张: 分别对应的GPIO为PD12,PD13,PD14,PD15 二.Memory and bus architecture #define PERIPH_BASE ((uint32_t)0x40000000) /*! Peripheral base address in the aliasregion #define APB1PERIPH_BASE PERIPH_BASE #define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000) #define AHB1P
[单片机]
stm32 LED <font color='red'>流水灯</font>剖析(库函数版)
51单片机STC89C52控制LED闪烁(使用for语句实现延时)
/*-----------------------包含头文件区域-------------------------*/ #include reg52.h //单片机头文件 /*-----------------------端口/引脚定义区域----------------------*/ sbit LED=P2^0; //位定义P2.0引脚名为LED /*-----------------------主函数区域-----------------------------*/ void main() { unsigned int i; //定义无符号整形变量i(范围为0~65535) while(1)
[单片机]
基于MSP430系列微控制串口通信时的波特率自动检测的实现
  通常微控制器通过串行接口与其它终端进行通信时,两个终端需要通讯波特率一致才能达到准确与可靠的通讯效果,串行波特率的自动检测(ABR)可以解决通信终端的波特率自动匹配问题,从而实现微控制器与PC或其它主机的串行通信。本文主要介绍 MSP 430系列微控制器实现串口通信时的波特率自动检测。   1.概述   当MCU需要同时与几个不同波特率值的系统进行通信时,ABR检测功能则显得很重要。ABR检测在检测波特率值的同时可以自动调整波特率值。在执行ARB检测算法时,当主机波特率在115200~74400之间时,MCU必须从主机接收到一个预先设置的特定字符,如 CR 字符;当主机波特率在9600~1200之间时,MCU则需从主机接收到第
[单片机]
基于MSP430系列微<font color='red'>控制</font>器<font color='red'>串口</font>通信时的波特率自动检测的实现
基于STC89C52的智能印章机的设计方案
在银行、政府、学校等机构存在大量文件需要盖章,当需要盖章文件数量过大时则需要消耗大量的人力和时间,本文中设计的智能印章机能明显缩短印章时间并且节约大量人力,满足日常办公所需。并且具有手动设置功能,可通过手动设置盖章的延时时间,和盖章的数量本文设计的智能印章机控制电路的主要组成部分由:供电电路、电机驱动电路、传感器电路、数据存储电路、数据显示电路、手动控制电路组成。 1 系统总体框图 智能印章机盖章的工作原理是通过安装在机器底部的光电传感器检测是否有纸张的信号来开启单片机对电机的控制,通过一系列的传动结构带动印章运动完成盖章动作。盖章动作前可以通过手动控制面板对盖章数量、盖章延时进行调节。同时在印章机工作时,印章机所盖的纸张数会被数
[电源管理]
基于<font color='red'>STC89C52</font>的智能印章机的设计方案
基于单片机SPI器件的串口控制
   0 引 言   串行外设接口(Serial Peripheral InteRFace,SPI)是一种高速同步串行输入/输出端口,近年来广泛应用于移位寄存器、D/A转换器、A/D转换器、串行E2PROM、LED显示驱动器等外部设备的扩展。SPI接口可以共享,便于组成带多个SPI接口器件的系统。其传送速率可编程,连接线少,具有良好的扩展性。    1 SPI接口介绍   SPI是摩托罗拉公司推出的一种同步串行通信接口,用于微处理器、微控制器和外围扩展芯片之间的串行连接,现已发展成为一种工业标准。目前,各半导体公司推出了大量的带有SPI接口的具有各种各样功能的芯片,如RAM,E2PROM,FLASH ROM,A/D转换器、D
[单片机]
基于STC89C52的程控恒流源的设计
高精度的程控恒流电源在仪器仪表、传感器技术和测试领域中有着广泛的应用。以往程控恒流源电路大都采用PWM脉冲方式,虽便于控制和调节,但精度难以保证,并且PWM方式的波形占空比调节范围有限,难以满足连续可调大电流的要求。本文介绍一种采用STC89C52单片机控制压控恒流源并通过扩流电路来实现恒流源程序控制的方案,其输出电流值可达2A。 程控恒流源的构成和工作原理 程控恒流源电路由压控电路、扩流电路和数控电路组成,结构如图1所示。 图1 程控恒流源电路的组成框图 本恒流源电路采用STC89C52控制D/A转换电路产生电压控制信号,通过1个精密线性压控电流源和扩流电路输出所需的电流值;取样电路采样后经A/D转换由数控电路读出,然
[工业控制]
基于<font color='red'>STC89C52</font>的程控恒流源的设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved