A. 51单片机数据处理问题。串口接收到浮点数(如6.228)存在数组hs[5]中
存在数组中的格式是否是ACSII码格式取决于发送端的格式,要统一。如果发送端发送的是ASCII码,你就可以这样存,但计算时还得进行转换。如果发送端发送的就是浮点数,你接受也可存放数组,使用时按浮点数规定格式使用就是了。
将这个浮点数乘以1000然后除以200000,直接除以200就完了。
B. 51单片机串口接收数组数据并存储
在使用51单片机进行串口接收数组数据时,可以采用开辟一个接收缓冲区的方法来存储数据。具体代码如下:
首先,定义一个数组变量和一个计数器变量:
#include
#define uchar unsigned char
uchar buf[16], num;
接着,设置中断服务函数,用于处理串口接收到的数据:
void ser_isr() interrupt 4 {
if(RI) {
RI = 0;
buf[num] = SBUF;
num++;
num &= 0x0f;
}
}
在主函数中,进行初始化设置:
TMOD = 0x20;
SCON = 0x50;
TH1 = TL1 = 0xfd;
TR1 = 1;
ES = 1;
EA = 1;
while(1);
其中,TMOD、SCON、TH1、TL1、TR1、ES、EA是用于配置单片机相关寄存器的参数。
TMOD寄存器用于设置定时/计数器的工作模式。
SCON寄存器用于设置串口通信模式,0x50表示模式1,8位数据位,1位停止位,偶校验。
TH1和TL1寄存器用于设置定时/计数器1的初始值,0xfd表示设置为定时模式,定时周期为64ms。
TR1用于启动定时/计数器1。
ES用于使能串口中断。
EA用于使能总中断。
这样的配置能够确保单片机正确接收并存储串口数据。
需要注意的是,num变量的更新方式可以防止数组越界,通过与0x0f进行按位与操作,可以确保num的值始终在0到15之间。
整个程序通过不断循环运行,等待新的串口数据到来,并将其存储到数组buf中。
这种方式适用于需要接收和处理一定数量串口数据的应用场景。
在实际应用中,可以根据具体需求调整数组buf的大小,以及配置定时/计数器的值,以适应不同的通信速率和数据处理需求。
C. 51单片机串口通讯,在接收一端某处我用xdata就很正常,用data或idata程序就不太稳定请问问题可能出在哪
你使用xdata区存放接收的数据时表现正常,但在使用data或idata区时程序不稳定,这可能是因为内存不足。51单片机的内存仅有128字节,包括工作寄存器区和堆栈区,如果存放的数据较多,很容易导致内存溢出。
假设你的程序占用105个字节,那么留给数据存储的空间就非常有限了。如果你使用的是扩展外部数据存储器,那么idata区可以扩展到256字节。将接收数组放在0x80区,可以有效利用这部分空间。例如,声明变量如下:
unsigned char idata buf[80] _at_ 0x80;
这样,可以确保你的数据不会溢出,并且程序运行更加稳定。
在工程设置中选择AT89C52单片机型号,可以增加idata区的大小,从而提供更多的存储空间。同时,确保程序逻辑合理,避免不必要的变量和函数调用,以减少内存占用。
综上所述,内存不足是导致程序不稳定的主要原因。通过合理分配内存空间,优化程序逻辑,可以有效解决这一问题。