打印
[STM8]

众拳【STM8入门】第24讲 RS485串口接收数据控制LED

[复制链接]
3223|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 刘洋讲单片机 于 2017-1-11 14:51 编辑

第24讲.RS485串口接收数据控制LED.zip (355.69 KB)
众拳【剑齿虎STM8】开发板学习笔记分享
24讲   RS485串口接收数据控制LED


24.1 RS485概述
(1). RS-485的电气特性:采用差分信号负逻辑,逻辑"0”以两线间的电压差为+(2~6)V表示;逻辑"1"以两线间的电压差为-(2~6)V表示。接口信号电平比RS-232-C降低了,就不易损坏接口电路的芯片, 且该电平与TTL电平兼容,可方便与TTL电路连接。
(2). RS-485的数据最高传输速率为10Mbps
(3). RS-485接口是采用平衡驱动器和差分接收器的组合,抗共模干扰能力增强,即抗噪声干扰性好。
(4). RS-485最大的通信距离约为1219m,最大传输速率为10Mbps,传输速率与传输距离成反比,在100KbpS的传输速率下,才可以达到最大的通信距离,如果需传输更长的距离,需要加485中继器。RS-485总线一般最大支持32个节点,如果使用特制的485芯片,可以达到128个或者256个节点,最大的可以支持到400个节点。



24.1  RS485原理图
从原理图中可以看出,RS485有一点发送/接收置态控制端,如果CPU想发送数据,要把RS485置态控制端(PG6/485_DIR)拉高,如果想接收数据,要把RS485置态控制端(PG6/485_DIR)拉低。
24.2实验目的   
通过RS485通讯功能接收数据控制3个发光二极管的点亮和熄灭。计算机侧通过“蓝精灵多功能监控软件”串口调试窗口输入我们设计好的数字,发光二极管就会受我们发送的数据控制。
24.3程序文件设计24.3.1  lib文件中内容分析
我们在“Lib”文件夹,把需要引用系统本身定义好的库函数添加在其中,我们使用到哪个外设功能,直接引用到此文件夹中即可。
24.2 “Lib”文件夹更改内容
本节实验及以后的实验我们都是用到库文件,其中 stm8s_conf.h头文件包含了所有外设的声明头文件,在本试验中我们使用到时钟外设和GPIO端口外设。所以#include "stm8s_clk.h"、#include "stm8s_uart3.h"和#include "stm8s_gpio.h"需要“打开”(就是把语句前面的双斜线注释符号删除即可,参考图17.1)。Stm8s_gpio.c库函数包含了所有管脚初始化功能和具体的执行操作;Stm8s_clk.c库函数主要包含了内部时钟和外部时钟设置,在主函数中规定了具体的执行方法,在这个函数中就有具体相关的执行步骤;Stm8s_uart3.c库函数主要包含了串口3相关寄存器设置和uart3库函数具体执行过程。
24.3.2  main.c文件中的程序
主程序就实现初始化和调用驱动程序,这样主程序控制思路清晰,流程简单。要想了解全面详实的程序,请大家参考光盘(网盘)中程序及程序注释。
/***********************************************************************
*   说    明: RS485通讯控制LED发光或者熄灭
*   开发平台: 剑齿虎STM8开发板        

*   关注微信公众平台微信号:"zxkj-ly",免费获取STM8资料。
*   STM8技术交流QQ群【335123291】
*   哈尔滨卓恩科技开发有限公司
*
*   作    者: 刘洋 张殿东
*   版    本: V1.0
*   日    期: 2016-05-03   
*
*   IAR开发环境    版本 V2.20.1
*   ST库函数       版本 V2.2.0
***********************************************************************/
#include "pbdata.h"//引入自定义公共头文件
void BSP_Configuration(void);//硬件初始化函数声明
/***********************************************************************
*   函 数 名: main
*   功能说明: c程序入口
*   形    参:无
*   返 回 值: 错误代码(无需处理)
***********************************************************************/
int main(void)
{
  BSP_Configuration();//硬件驱动初始化函数

  while(1)//主程序循环,反复执行循环体里的语句
  {
    UART3_Control_LED();//RS485接收数据控制LED灯
  }
}
/***********************************************************************
*   函 数 名: BSP_Configuration
*   功能说明: 初始化硬件设备。只需要调用一次。该函数配置CPU寄存器和外设的寄存器并初始化一些全局变量。
*   形    参:无
*   返 回 值: 无
***********************************************************************/
void BSP_Configuration(void)
{  
  CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);//时钟速度为内部16M,1分频,
  UART3_Congfiguration();
  LED_Init();//调用LED初始化函数
  rim();//打开总中断
}
/*断言函数:它的作用是在编程的过程中为程序提供参数检查*/
#ifdef USE_FULL_ASSERT
void assert_failed(u8* file,u32 line)
{
  while(1)
  {
  }
}
#endif
24.3.3  uart3.c文件中的程序
#include "pbdata.h"
u8 uart3_gs=0;// UART3接收数据指针
u8 uart3_try[20];// UART3接收数据存放的数组
/***************************************************************************
*   函 数 名: UART3_Congfiguration
*   功能说明: UART3 配置函数
*   形    参:无
*   返 回 值: 无
***************************************************************************/
void UART3_Congfiguration(void)
{
    //配置串口参数为:波特率9600,8位数据位,1位停止位,无校验,允许接收发送    UART3_Init((u32)9600,UART3_WORDLENGTH_8D,UART3_STOPBITS_1,UART3_PARITY_NO,UART3_MODE_TXRX_ENABLE);
    UART3_ITConfig(UART3_IT_RXNE_OR, ENABLE);//使能接收中断
    UART3_Cmd(ENABLE);//使能UART3
    GPIO_Init(RS485_PORT, RS485_PIN, GPIO_MODE_OUT_PP_LOW_SLOW);//初始化485控制端  低电平接收数据  高电平发送数据
}
/***************************************************************************
*   函 数 名: UART3_Send_Byte
*   功能说明: UART3发送数据函数
*   形    参:u8 byte  一次发送一个字节
*   返 回 值: 无
***************************************************************************/
void UART3_Send_Byte(u8 byte)
{
    UART3_SendData8(byte);//UART1发送8位数据
    while(UART3_GetFlagStatus(UART3_FLAG_TXE)==RESET);//等待发送完成
}
/***************************************************************************
*   函 数 名: UART3_Send_Str
*   功能说明: RS485串口转发函数
*   形    参:无
*   返 回 值: 无
***************************************************************************/
void UART3_Send_Str(void)
{
    u8 i=0;
    if(uart3_gs>0)//如果大于 0  证明串口接收到数据了
    {
        delay_ms(20);//延时等待接收后面的字节
        RS485_DIR_H;//485准备发送数据
        delay_ms(2);//等待485控制端稳定
        for(i=0;i<uart3_gs;i++)//发送所有接收到的数据
        {
            UART3_Send_Byte(uart3_try);
        }
        delay_ms(2);//等待数据发送完成
        RS485_DIR_L;//切换至接收状态
        uart3_gs=0;//接收指针清零,指向数组的第0个位置。下次再有数据接收时从第0个位置装入。
    }
}
/**************************************************************************
*   函 数 名: UART3_Control_LED
*   功能说明: RS485接收数据控制LED灯
*   形    参:无
*   返 回 值: 无
**************************************************************************/
void UART3_Control_LED(void)
{
    if(uart3_gs>0)//如果大于 0  证明串口接收到数据了
    {
       delay_ms(10);//延时等待接收后面的字节
       if(uart3_gs==3)
       {
            if(uart3_try[0]==0x01) LED1_L;//发光
            if(uart3_try[0]==0x02) LED1_H;//熄灭
            if(uart3_try[0]==0x03) LED1_R;//状态取反

            if(uart3_try[1]==0x01) LED2_L;//发光
            if(uart3_try[1]==0x02) LED2_H;//熄灭
            if(uart3_try[1]==0x03) LED2_R;//状态取反

            if(uart3_try[2]==0x01) LED3_L;//发光
            if(uart3_try[2]==0x02) LED3_H;//熄灭
            if(uart3_try[2]==0x03) LED3_R;//状态取反
       }
      uart3_gs=0;//指针复位
    }
}
24.3.4  uart3.h文件中的程序
/***********************************************************************
*    剑齿虎STM8开发板硬件连接
*    PD6/UART3_RXD         
*    PD5/UART3_TXD         
************************************************************************/
#ifndef _UART3_H //宏定义,定义文件名称
#define _UART3_H
/*--------------------------头文件引用------------------------------------*/
#include "stm8s.h"
/*--------------------------宏定义声明------------------------------------*/
#define RS485_PIN GPIO_PIN_6  //定义GPIO_PIN_6引脚为RS485_PIN,相当于重新命名。
#define RS485_PORT GPIOG  //定义GPIOG端口为RS485_PORT,相当于重新命名。
#define RS485_DIR_L GPIO_WriteLow(RS485_PORT,RS485_PIN); //定义RS485_DIR_L,调用RS485_DIR_L命令,PG6引脚输出低电平
#define RS485_DIR_H GPIO_WriteHigh(RS485_PORT,RS485_PIN);//定义RS485_DIR_H,调用RS485_DIR_H命令,PG6引脚输出低高平
/*--------------------------变量声明-------------------------------------*/
extern u8 uart3_gs;// UART3接收数据指针
extern u8 uart3_try[20];// UART3接收数据存放的数组
/*--------------------------函数声明-------------------------------------*/
void UART3_Congfiguration(void);//UART3 配置函数
void UART3_Send_Byte(u8 byte);//UART3发送数据函数
void UART3_Send_Str(void);//RS485串口转发函数
void UART3_Control_LED(void);//RS485接收数据控制LED灯
#endif//定义文件名称结束
24.3.5  stm8s_it.c文件中的程序
中断和中断处理子程序建立关系必须在stm8s_it.c文件中对应位置中建立。关于串口1的中断处理子程序要写在事先定义好的入口之内。“INTERRUPT_HANDLER(UART3_RX_IRQHandler, 21)”,所以中断处理子程序入口地址必须放在uart3中断处理中,请看下面程序语句。
INTERRUPT_HANDLER(UART3_RX_IRQHandler, 21)
{
    if(uart3_gs<20)
    {
        uart3_try[uart3_gs++]=UART3_ReceiveData8();
    }
    else
    {
        uart3_gs=0;
    }
}
24.3.6  补充说明
我们自定义的最简单的一个通讯协议,实际在项目中我们设计的通讯协议通讯协议比这复杂的多,比如在工业控制中使用的modbus协议。
串口3没有同步模式,配置是请注意。
我们采用RS485转USB通讯模块与开发板进行通讯,开发板一侧使用双绞线连接在接线端子上。在开发板上有清晰的485A、485B标识。详细接线方式请参考视频资料。

沙发
渔夫的烟斗| | 2017-1-14 15:28 | 只看该作者
主从机都一个样的代码?

使用特权

评论回复
板凳
刘洋讲单片机|  楼主 | 2017-1-15 13:50 | 只看该作者
渔夫的烟斗 发表于 2017-1-14 15:28
主从机都一个样的代码?

我们这个是

使用特权

评论回复
地板
渔夫的烟斗| | 2017-1-16 08:16 | 只看该作者
485中的多机 怎么理解?

使用特权

评论回复
5
笑谈| | 2017-6-16 14:15 | 只看该作者
请问可以在RXD 和TXD上各上拉一个电阻 + LED 到电源,用作通讯指示吗?

使用特权

评论回复
6
zhongs98| | 2017-6-16 21:38 | 只看该作者
谢谢分享好东西

使用特权

评论回复
7
刘洋讲单片机|  楼主 | 2017-6-17 11:33 | 只看该作者

使用特权

评论回复
8
yiyigirl2014| | 2017-6-17 20:00 | 只看该作者
楼主厉害了,这么给力的STM8教程,STM32应该给你来个锦旗+500元红包。。哈哈

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

148

主题

499

帖子

64

粉丝