2017-04-12 15:43:40 zhoupian 阅读数 3646
  • 单片机控制第一个外设-LED灯-第1季第6部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第6个课程,主要讲解LED的工作原理和开发板原理图、实践编程等,通过学习目的是让大家学会给单片机编程控制LED灯,并且为进一步学习其他外设打好基础。

    3992 人正在学习 去看看 朱有鹏

目前的一个项目中,需要使用单片机的串口通讯,由于外部设备的串口电平为TTL电平,故在应用中,将单片机的串口IO与外部设备上直接相连的。

但是在后来的调试中,暂时不需要连接外部设备,发现单片机总是会莫名的进入串口中断,仔细检查后才发现单片机的串口IO直接从单片机中引出来,由于没有接设备,连接线直接悬空,也没有进行任何上拉或下拉的处理,从而导致电平信号不稳定,频繁进入中断。

2019-08-12 16:52:31 qq_42451281 阅读数 31
  • 单片机控制第一个外设-LED灯-第1季第6部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第6个课程,主要讲解LED的工作原理和开发板原理图、实践编程等,通过学习目的是让大家学会给单片机编程控制LED灯,并且为进一步学习其他外设打好基础。

    3992 人正在学习 去看看 朱有鹏

问题说明:

在我们使用51单片机时会发现他就只有一个RX跟TX,但是要实现一个完整的数据采集、上传与管理,一个串口是完全不够的(采集装置一般需要一对串口,而通讯装置也需要一对串口)那么问题就产生了,51单片机只提供一个串口,我们应该怎么办?

  1. 本文的模拟TTL串口是利用51单片机的IO口来实现串口模拟。我们知道单片机的所有IO口我们都能控制它的高低电平(1/0),而我们要通过它来模拟TTL串口,我们首先得知道TTL串口的工作原理
    TTL串口数据传输这如上图所示
    起始位:由1个逻辑 0 的数据位表示

    结束位:由 0.5、 1、 1.5 或 2 个逻辑 1 的数据位表示

    有效数据:在起始位后紧接着的就是有效数据,有效数据的长度常被约定为 5、 6、 7 或 8、9位

    校验位:可选,为的是数据的抗干扰性(没用过)

  2. 串口通信的波特率,说到底只是每位电平持续的时间,波特率越高,持续的时间越短。如波特率为9600bps,即每一位传送时间为1000ms/9600=0.104ms,即位与位之间的延时为0.104毫秒。

  3. 单片机常用11.0592M的的晶振,传感器一般也使用11.0592M的波特率来通讯。用此频率则每个指令周期(取出指令并执行的时间)的时间为(12/11.0592)us,波特率为9600的指令周期s=(1000000/9600)/(12/11.0592)=96,刚好为一整数。如此便于我们用程序指令实现较为准确的延时。

  4. 现在进入主题!模拟串口一般有三种方法,我们以11.0592M晶振 9600波特率为例。以下方法皆通过本人测试可用。

    方法一: 延时法
    该方法使用指令周期延时的方法来模拟波特率实现串口通讯,较为简单,使用较为广泛也适用于模拟多串口通讯,但是对采样的精确度要求较高,需要重复调试其指令周期的延时,本人在51实验测试通过,有时传输的数据会出错,不稳定,所以不推荐。
    通过上述计算大家知道,串口的每位需延时0.104秒,中间可执行96个指令周期

#include "reg52.h"
#define uchar unsigned char
#define RXD P1_0 //接收脚
#define TXD P1_1 //发送脚
#define WRDYN 44 //写延时
#define RDDYN 43 //读延时
//延时程序*
void Delay2cp(unsigned char i)
{
while(--i); //i=1,两个指令周期。
}
//往串口发送一个字节
void WByte(uchar input)
{
uchar i=8;
TXD=(bit)0; //发送启始位
Delay2cp(39);
//发送8位数据位
while(i--)
{
TXD=(bit)(input&0x01); //先传低位
Delay2cp(36);
input=input>>1;
}
//发送校验位(无)
TXD=(bit)1; //发送结束位
Delay2cp(46);
}
//从串口接收一个字节
uchar RByte(void)
{
uchar Output=0;
uchar i=8;
uchar temp=RDDYN;
//接收8位数据位
Delay2cp(RDDYN*1.5); //此处注意,等过起始位
while(i--)
{
Output >>=1;
if(RXD) Output |=0x80; //先收低位
Delay2cp(35); //(96-26)/2,循环共占用26个指令周期
}
while(--temp) //在指定的时间内搜寻结束位。
{
Delay2cp(1);
if(RXD)break; //收到结束位便退出
}
return Output;
}

方法二: 计数法
该方法通过单片机的时钟计数来产生准确的波特率来实现串口模拟。该方法较为准确,只要波特率正确就可以实现通讯。(只有发送部分)


void S2INI(void)
{
TMOD |=0x02; //计数器0,方式2
TH0=0xA0; //预值为256-96=140,十六进制A0
TL0=TH0;
TR0=1; //开始计数
TF0=0;
}//计数器初始化


void WaitTF0( void )
{
while(!TF0);
TF0=0;
}//查询计数器溢出标志位

//向串口发送一个字节数据,过程同上
void WByte(uchar input)
{
uchar i=8;
TR0=1;
TXD=(bit)0;
WaitTF0();
while(i--)
{
TXD=(bit)(input&0x01);
WaitTF0();
input=input>>1;
}
TXD=(bit)1;
WaitTF0();
TR0=0;
}

方法三:中断法
与计数法大同小异,就不解释了。(只有接收)

#define TM0_FLAG P1_2 //设传输标志位
//计数器及中断初始化
void S2INI(void)
{
TMOD |=0x02; //计数器0,方式2
TH0=0xA0; //预值为256-96=140,十六进制A0
TL0=TH0;
TR0=0; //在发送或接收才开始使用
TF0=0;
ET0=1; //允许定时器0中断
EA=1; //中断允许总开关
}
//接收一个字符
uchar RByte()
{
uchar Output=0;
uchar i=8;
TR0=1; //启动Timer0
TL0=TH0;
WaitTF0(); //等过起始位
//接收8位数据位
while(i--)
{
Output >>=1;
if(RXD) Output |=0x80; //先收低位
WaitTF0(); //位间延时
}
while(!TM0_FLAG) if(RXD) break;
TR0=0; //停止Timer0
return Output;
}
//中断1处理程序
void IntTimer0() interrupt 1
{
TM0_FLAG=1; //设置标志位。
}
//查询传输标志位
void WaitTF0( void )
{
while(!TM0_FLAG) ;
TM0_FLAG=0; //清标志位
}

声明:该代码是网上截取,非本人代码,但方法确实可用。本人在此只分享方法以及学习过程、若无法实现可以联系本人互相交流学习。

2019-03-26 21:08:46 HangzhouSpark 阅读数 510
  • 单片机控制第一个外设-LED灯-第1季第6部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第6个课程,主要讲解LED的工作原理和开发板原理图、实践编程等,通过学习目的是让大家学会给单片机编程控制LED灯,并且为进一步学习其他外设打好基础。

    3992 人正在学习 去看看 朱有鹏

网上转载的 :
利用红外发光管发射红外线,红外接收管接收此红外线,并将其放大、整流形成低电平信号当有人或物挡住红外光时,接收数码管没有接收到红外信号,放大器将输出高电平,同时将这个电平信号送入单片机进行控制计数,并且使数码管显示数值。这样就得到要统计的人或物的数量。

以单片机为主控芯片来进行软件控制,能正常进行数据计数。基于单片机构成的产品自动计数器研究的主要内容包括:如果构成检测电路、MCS-51单片机用何种方式对外部计数脉冲进行计数显示控制、LED显示驱动模块的选择、MCS-51单片机的扩展。在这个设计中主要需要解决的问题便是如何提高MCS-51单片机的抗干扰能力以及稳定性

本带马工会竭尽所能解决小白入坑的问题(手动笑哭)。评论会推送至邮箱,我看见了就会回复。可接私活。
也欢迎各位大佬详细交流。

2016-04-22 21:48:33 qq_28228693 阅读数 5220
  • 单片机控制第一个外设-LED灯-第1季第6部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第6个课程,主要讲解LED的工作原理和开发板原理图、实践编程等,通过学习目的是让大家学会给单片机编程控制LED灯,并且为进一步学习其他外设打好基础。

    3992 人正在学习 去看看 朱有鹏

在使用的单片机的串口与电脑的通信过程,以及硬件设计设计外部通信方式中经常会遇到TTL电平,RS232,RS485相互兼容等设计要求,下面来简单介绍一下RS485,RS232,TTL电平的区别和应用。

<一>简介

《1》TTL电平就是处理器控制的设备内部各部分之间通信的标准技术,以STM32F1x系列的单片机以3.3V作为逻辑“1”,0V等价于逻辑“0”。而且单片机常用的USART通信采用的就是TTL电平方式。

《2》RS232是串口通讯的一种标准接口和其所对应的通信方式。其标准接口有9个引脚 (DB-9) 或是25个引脚 (DB-25) 的型态出现。工业控制的RS-232口一般只使用RXD、TXD、GND三条线,便是单片机中的串口的形态。只是其逻辑1(MARK)范围为-3V~-15V范围为+3~+15V,需要电平转换芯片实现转换。

《3》RS485是串口通讯的一种标准接口和其所对应的通信方式。采用差分信号负逻辑,逻辑"0”以两线间的电压差为+(2~6)V表示;逻辑"1"以两线间的电压差为-(2~6)V表示。

<二>区别

  从本质上来说大多数的的单片机的串口通讯方式是TTL电平的RS232方式,其通信距离较短,传递速度较慢,且只能实现点对点通信。而RS485最高传输速率为10Mbps,传递速度快,半双工网络方式,能过实现主从间的切换。

    



2017-11-08 20:46:00 qq_30668481 阅读数 61502
  • 单片机控制第一个外设-LED灯-第1季第6部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第6个课程,主要讲解LED的工作原理和开发板原理图、实践编程等,通过学习目的是让大家学会给单片机编程控制LED灯,并且为进一步学习其他外设打好基础。

    3992 人正在学习 去看看 朱有鹏

注:串口发送数据(USART)是STM32调试中经常使用的功能,但是电脑USB的电平标准与串口所使用的TTL标准不同,所以需要一条USB转TTL线来完成它们之间的通信。

第一步.购买一条USB转TTL线,电脑安装驱动

这是我从淘宝上(https://detail.tmall.com/item.htm?id=41281767348)购买的一条USB转TTL数据线。这是它的照片:
USB转TTL数据线
可以看到,它一端连电脑USB口,一端引出四条杜邦线用于连接STM32的串口。
接下来将它插到电脑USB端口上,另一端不用接任何东西,开始安装驱动。
当你刚插上它时,电脑会默认弹出安装驱动的选项,此时你可以点击安装驱动(如果没有,去网上下一个驱动)。然后查看驱动是否正确安装—>右键“我的电脑”,点击“属性”,点击左侧“设备管理器”,在弹出窗口的“端口”这一栏下如果看到以下图标,那么恭喜你,你已经完成了USB转TTL线的驱动安装。
连接成功示意图
但是,如果你发现这个图标上有一个问号或感叹号的形状,那么说明驱动没有正确安装。别灰心,笔者当时也有这个情况,这是因为win10会自动更新驱动到最新版本,但最新版本的驱动有问题,导致无法正确连接。解决的办法如下:
首先进入“控制面板”,找到”设备和打印机下“的“更改设备安装设置”选项(直接在右上角搜索即可),点击它。
找到更改设备安装设置
将自动更新驱动关掉,如下图所示:
关闭自动更新驱动
然后去网上找一个USB转TTL的驱动,(可以去http://www.jb51.net/softs/368503.html下),然后一步步安装即可。最后,插上USB转TTL线,进设备管理器看看驱动是否正确安装了。

第二步.连接单片机串口与USB转TTL线

杜邦线端口示意图
观察转接线的末端,有四条颜色不同的杜邦线。它们分别是:
红色—>VCC
白色—>RX接收端
绿色—>TX发送端
黑色—>地

单片机上的串口一般是两个端口,一个是TX发送端,一个是RX接收端。
连接时要注意交叉互连,即把USB转TTL线的RX端接单片机的TX端,把TX端接单片机的RX端,剩下两脚不用接。如图:
连接示意图
这里笔者使用的单片机是一款STM32F103Z8型号的单片机,使用串口1与电脑通信,A9脚为TX端,A10脚为RX端。再次强调,使用不同的单片机时,都要注意端口要交叉互连!

第三步,编程+测试

写好串口的程序,这个网上的教程很多,而且不同的单片机程序不同,这里不再赘述。以下是笔者写好的部分代码,设置波特率为9600,将程序烧录到单片机:
代码截图
然后通过USB转TTL线连接好单片机和电脑,打开串口调试助手(这个网上有许多版本可以下载的)。
在串口调试助手中打开串口,设置波特率与软件中相同。然后就可以看到从单片机发来的数据:
结果示意图

END,谢谢观看!

单片机

阅读数 4764

51单片机入门了解

阅读数 1110

没有更多推荐了,返回首页