STC8G1K08单片机接收485发送的不等长混合数据

这篇具有很好参考价值的文章主要介绍了STC8G1K08单片机接收485发送的不等长混合数据。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

	在自动化领域,随着分布式控制系统的发展,迫切需要一种总线能适合远距离的数字通信。在rs-422标准的基础上,eia研究出了一种支持多节点、远距离和接收高灵敏度的rs-485总线标准。  
	rs-485标准采用平衡式发送,差分式接收的数据收发器来驱动总线,具体规格要求:  
	1. 接收器的输入电阻rin≥12kΩ  
	2. 驱动器能输出±7v的共模电压  
	3.输入端的电容≤50pf  
	4. 在节点数为32个,配置了120Ω的终端电阻的情况下,驱动器至少还能输出电压1.5v(终端电阻的大小与所用双绞线的参数有关)  
	5.接收器的输入灵敏度为200mv即(v+)-(v-)≥0.2v,表示信号"0";(v+)-(v-)≤-0.2v,表示信号"1"  
	因为rs-485的远距离、多节点(32个)以及传输线成本低的特性,使得eia rs-485成为工业应用中数据传输的首选标准。基于此,rs-485的自动化领域的应用非常广泛。

提示:以下是本篇文章正文内容,下面案例可供参考

一、RS485引脚功能

这里以芯力特的485芯片为例如图1:stc8g1k08,笔记,单片机,51单片机,硬件工程,嵌入式硬件
引脚功能:
1.接收器输出端(接单片机的RXD引脚)
2.接收器输出使能控制(接收器输出使能控制。当/RE 接低电平时RO 输出有效;当/RE 接高电平时RO 为高阻态)
3.驱动器输出使能控制(DE 接高电平时驱动器输出有效,DE 为低电平时输出为高阻态)
4.DI驱动器输入(接单片机的TXD引脚)
5.接地
6.接收器同相输入和驱动器同相输出端
7.接收器反相输入和驱动器反相输出端
8.接电源

二、RS485驱动程序

1.串口初始化程序

void Uart()
{											
	EA   = 1;				                //打开总中断
	ES   = 1;				                //打开串口中断
	TR1  = 1;			          	        //打开定时器1
	REN  = 1;								//允许串口接收
	SCON = 0X50;			                //串口1    可变波特率8位数据方式
	TMOD = 0X20;			                //定时器1  8位自动重装模式
	TL1  = 0XDC;			                //
	TH1  = 0XDC;			                //波特率9600
	PCON = 0X00;			                //波特率不加倍
	AUXR = 0X40;			                //辅助寄存器   时钟不分频
}

2.串口中断服务程序

代码如下(示例):

void UartIsr()interrupt 4	
{
											
	if(TI == 1)			     	            //发送标志位是否为1 
	{
		TI = 0;				                //置位发送标志位
		sending=0; 							//置0发送标志位
	}
	if(RI == 1)								//接收标志位是否为1
	{		
		RI = 0;								//置位接收标志位
		num[ix++] = SBUF;					//将接收到的数据赋给num数组的第ix++个
		if(ix > 8)							//判断ix是否加到8之上了  代表已经接收完成
		{
			ix = 0;							//置0  ix标志位
		}		
	}
} 

这里的num[ ]数组用来接收RS485发送过来的数据,定义为全局变量num[30],这里定义长度为30,因为不确定长度所以尽量定义长一点。

2.RS485解码程序

代码如下(示例):

void Read_Rs485()
{
	if(num[0] == 'x' && num[5] == 'y' && num[ix-1] == '\n')		 //判断接收到的第1位和第5位和第ix-1位是否分别为“x”,“y”,“\n”
	{															 //ix-1位是要适配不等长的数据,因为前面用的是i++,所以ix-1才是最后一位
		switch(num[1])											 //判断接收到的第二个数据    车速的百位
		{
			case '0' : LD_Sd[0] = 0; break;						 //如果是字符串“0” 那么LD_Sd[0]就为0
			case '1' : LD_Sd[0] = 100; break;					 //如果是字符串“1” 那么LD_Sd[0]就为100
		}
		switch(num[2])											 //判断接收到的第三个数据	 车速的十位
		{
			case '0' : LD_Sd[1] = 0; break;						 //如果是字符串“0” 那么LD_Sd[1]就为0
			case '1' : LD_Sd[1] = 10; break;					 //如果是字符串“1” 那么LD_Sd[1]就为10
			case '2' : LD_Sd[1] = 20; break;					 //如果是字符串“2” 那么LD_Sd[1]就为20
			case '3' : LD_Sd[1] = 30; break;					 //如果是字符串“3” 那么LD_Sd[1]就为30
			case '4' : LD_Sd[1] = 40; break;					 //如果是字符串“4” 那么LD_Sd[1]就为40
			case '5' : LD_Sd[1] = 50; break;					 //如果是字符串“5” 那么LD_Sd[1]就为50
			case '6' : LD_Sd[1] = 60; break;					 //如果是字符串“6” 那么LD_Sd[1]就为60
			case '7' : LD_Sd[1] = 70; break;					 //如果是字符串“7” 那么LD_Sd[1]就为70
			case '8' : LD_Sd[1] = 80; break;					 //如果是字符串“8” 那么LD_Sd[1]就为80
			case '9' : LD_Sd[1] = 90; break;					 //如果是字符串“9” 那么LD_Sd[1]就为90
		}
		switch(num[3])											 //判断接收到的第四个数据	 车速的个位
		{
			case '0' : LD_Sd[2] = 0; break;						 //如果是字符串“0” 那么LD_Sd[2]就为0
			case '1' : LD_Sd[2] = 1; break;						 //如果是字符串“1” 那么LD_Sd[2]就为1
			case '2' : LD_Sd[2] = 2; break;						 //如果是字符串“2” 那么LD_Sd[2]就为2
			case '3' : LD_Sd[2] = 3; break;						 //如果是字符串“3” 那么LD_Sd[2]就为3
			case '4' : LD_Sd[2] = 4; break;						 //如果是字符串“4” 那么LD_Sd[2]就为4
			case '5' : LD_Sd[2] = 5; break;						 //如果是字符串“5” 那么LD_Sd[2]就为5
			case '6' : LD_Sd[2] = 6; break;						 //如果是字符串“6” 那么LD_Sd[2]就为6
			case '7' : LD_Sd[2] = 7; break;						 //如果是字符串“7” 那么LD_Sd[2]就为7
			case '8' : LD_Sd[2] = 8; break;						 //如果是字符串“8” 那么LD_Sd[2]就为8
			case '9' : LD_Sd[2] = 9; break;						 //如果是字符串“9” 那么LD_Sd[2]就为9
		}
		for(q=0; q<ix; q++)										 //清除接收到的数据
		{
			num[q] = 0;											 //清除num第q个数据
		}														 
		ix = 0;													 //置0  ix标志位
	}	
}

因为我接收的是24G毫米波雷达发过来的车辆速度值,所以定义了一个数组LD_Sd[4]用来存放解码后得到的数据。在接收完成后一定要把接收数组里面的数据清除,并且将ix标志位清零。具体原理都在程序注释里面。

3.RS485发送程序

void send(unsigned char d)		            //发送一个字节的数据,形参d即为待发送数据。
{											 
	 SBUF=d;                                //将数据写入到串口缓冲
	 sending=1;	                            //设置发送标志
	 while(sending);                        //等待发送完毕
}

/************************************************************************************************/
/*函数名:发送字符串函数																		    */
/*功能:使用串口发送字符串																		*/
/************************************************************************************************/
void sendc(unsigned char * pd)			
{
	 while((*pd)!='\0')                     //发送字符串,直到遇到0才结束
	 {
		  send(*pd);                        //发送一个字符
		  pd++;                             //移动到下一个字符
	 }
}

/************************************************************************************************/
/*函数名:雷达初始化函数																		    */
/*功能:设置雷达模块的初值,灵敏度/刷新率/速度方向,带加解锁									    */
/************************************************************************************************/
void Send_Start()
{
	RS485 = 1;													 //拉高485控制接口,选择为发送数据
	sendc(Unlock);											     //解锁
	Delay(10);													 //延时10毫秒
	sendc(Lmd);											         //灵敏度    设置为5
	Delay(10);													 //延时10毫秒
	sendc(Sxl);											         //刷新率    设置为0
	Delay(10);													 //延时10毫秒
	sendc(Fx);											         //方向      设置为仅来向
	Delay(10);													 //延时10毫秒
	sendc(lock);											     //加锁
	Delay(20);													 //延时20毫秒
	RS485 = 0;													 //拉低485控制接口,选择为接收数据
}

这里的RS485为接收/发送,当RS485为0的时候,是接收数据,当RS485为1的时候,是发送数据。


总结

以上RS485接收不等长混合数据的代码,然后对一个24G毫米波雷达发送的数据进行解码和修改参数,每段代码都打上了注释,很好理解的。文章来源地址https://www.toymoban.com/news/detail-603405.html

到了这里,关于STC8G1K08单片机接收485发送的不等长混合数据的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 单片机STC8H入门

      STC8H系列单片机是不需要外部晶振和外部复位的单片机。在相同的工作频率下,STC8H系列单片机比传统的8051快约12倍,是宽电压/高速/高可靠/低功耗/强抗静电/较强干扰的新一代8051单片机。 用常用的C51版的keil安装,可以进入下面链接下载: https://download.csdn.net/download/wei

    2024年02月02日
    浏览(33)
  • 51单片机(STC8) -- 开发环境搭建(Keil C51)

    STC8H3K系列芯片概述 文章中所用的芯片选型为STC8H3K64S4,后续STC8案例均以该芯片展开 内核 • 超高速 8051 内核(1T),比传统 8051 约快 12 倍以上,指令代码完全兼容传统8051 • 21个中断源,4 级中断优先级 • 支持在线仿真 工作电压 • 1.9V~5.5V 工作温度 • -40℃~85℃ Flash 存储

    2024年01月25日
    浏览(39)
  • STC8H8K64U单片机PWM配置

    STC8H8K64U单片机配置PWM的通道1、通道2、通道7、通道8。STC8可以分为两组PWM,PWMA和PWMB,在使用时,如果同时使用了两组,那么两组的寄存器需要同时配置。 边沿对齐 PWM输出频率 = 系统工作频率 / (PWMx_PSCR + 1) * (PWMx_ARR + 1); 中间对齐 PWM输出频率 = 系统工作频率 / (PWMx_PSCR + 1) *

    2024年02月11日
    浏览(27)
  • STC8H系列单片机IAP实现不停电下载(通过串口)

    在使用串口往STC单片机烧录程序时,需要冷启动,先点击下载再上电。这样做有一定的缺点。首先,一些特殊的外围电路要求一直保持有电状态,有些客户需求我们能远程操控设备就可以升级程序,而不需要去现场断电设备。其次,频繁的断电上电操作也比较麻烦。 STC 单片

    2024年02月03日
    浏览(54)
  • STC8H8K64U单片机-ADC采集数

    配置单片机的ADC时一定要将IO口配置成高阻输入模式, 以下是单片机引脚对应的ADC通道  

    2024年02月07日
    浏览(32)
  • STC8H系列单片机入门教程之GPIO基本知识(一)

    IO口即输入输出口,STC8H系列单片机支持四种工作模式, 即准双向口、推挽输出、高阻输入、开漏输出,每个IO通过两个寄存器进行配置,如下图所示,注:n = 0,1,2,3,4,5,6,7。 PnM1 PnM0 I/O 口工作模式 0 0 准双向口(弱上拉),灌电流可达 20mA ,拉电流 150-270uA 0 1 推挽输出,强上拉

    2024年04月14日
    浏览(54)
  • STC8H系列单片机入门教程之ADC基础知识(四)

    目录 一、A/D转换过程 二、ADC转换流程图 三、采样定理 四、ADC基本参数 4.1、分辨率 4.2、采样速率 4.3、转换时间 4.4、量程  4.5、最低有效位 五、静态参数 5.1、微分非线性 5.2、积分非线性 六、逐次逼近型模数转换器 七、ADC常用分压电路 八、示例代码 ADC即模数转换器,用来

    2024年04月11日
    浏览(42)
  • STC89C52单片机利用DHT11温湿度模块以及HC-08蓝牙模块实现测量温湿度

    下面将介绍如何利用STC89C52单片机和DHT11温湿度模块以及HC-08蓝牙模块实现测量温湿度。以及各模块的使用方法。 利用DHT11温湿度模块测量温湿度,利用HC-08蓝牙模块将数据传到手机上。 1.1DHT11温湿度模块外观 1.2DHT11温湿度模块使用方法简介 1.2.1DHT11温湿度模块工作的过程 用户

    2024年02月02日
    浏览(39)
  • STC8h1k28六个基本实验

    实验内容: 项目1: 参考原理图,设计1位闪烁灯程序,每次亮、灭时长均为500ms。 项目2: 参考原理图,设计三色流转灯程序,GRB三种颜色的LED轮番点亮,每次只亮一盏,每次点亮时长为500ms。 原理图: 实验原理: (共阳)LED负极接单片机IO口(P00P01P02),当IO口输出低电

    2024年02月04日
    浏览(36)
  • 价值 1k 嵌入式面试题-单片机 main 函数之前都做了啥?

            请说下单片机(Arm)在运行到 main() 函数前,都做了哪些工作? 系统初始化工作,太泛泛 硬件初始化,比较不具体         这道题应该从两方面回答,一个是比较表面的硬件的初始化(价值 200),另一个比较深层次的 C 环境的初始化,这也是加分比较多的一点(价

    2024年02月14日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包