求助stc 单片机串口发送接收多个数据的程序

求助stc 单片机串口发送接收多个数据的程序,第1张

收/发一个数据会了,那收/多个的方法也相同。接收最好用中断方式,不影响其它程序执行。发送时,采用查询方式比较方便好写。发送多个,可用for循环控制,循环体内就是发送一个数据的程序,只是循环发送了。在循环发送前,把串口中断关了,ES=0;发送结束再打开中断,ES=1;

我觉得这里有两个问题,首先你得SCON配置为0x20,这样事实上你选择的串口工作方式是方式0通过移位寄存器发送和接收数据,而这种工作方式是不能像你在程序里这样直接传递数据的,最好是再看一看器件数据手册,把工作方式调整为方式1,第二个问题就是你用定时器配置好波特率发生器后,根本就没有启动,需要把寄存器TCON里面TR1位置1才能开始工作

#include <AT89X51H>//单片机51头文件,存放着单片机的寄存器

unsigned char dat; //用于存储单片机接收发送缓冲寄存器SBUF里面的内容

sbit gewei=P2^2; //个位选通定义

sbit shiwei=P2^3; //十位选通定义

unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67,0x77,0x7c,0x39,0x5e,0x79,0x71};

//{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67,};// 0, 1, 2, 3, 4, 5, 6, 7, 8, 9

void Delay(unsigned int tc) //延时程序

{

while( tc != 0 )

{unsigned int i;

for(i=0; i<100; i++);

tc--;}

}

void LED() //LED显示接收到的数据

{

shiwei=0;

P0=~table[dat/16];

Delay(8);

shiwei=1;

gewei=0;

P0=~table[dat%16];

Delay(5);

gewei=1;

}

void Init_Com(void)//功能:串口初始化,波特率9600,方式1

{

TMOD = 0x20;

PCON = 0x00;

SCON = 0x50;

TH1 = 0xFd;

TL1 = 0xFd;

TR1 = 1;

}

void main()//主程序功能:实现接收数据并把接收到的数据原样发送回去///////

{

Init_Com();//串口初始化

// P1=0xf0;

while(1)

{

if ( RI ) //扫描判断是否接收到数据,

{

dat = SBUF; //接收数据SBUF赋与dat

RI=0; //RI清零。

SBUF = dat; //在原样把数据发送回去

}

LED(); //显示接收到的数据

}

}

/

模拟串口试验

作者:lfc9861@163com QQ:77473067

CPU:89S52

晶振:110592MHz

功能:将模拟接收口数据通过模拟发送口发送,通信波特率9600Bps

建议:改成3线制方式,或者选择有中断引脚的CPU,这样可以大大减少CPU负担

测试用0x55,0x5A,0xA5,0xAA四个字节数据进行过实际验证

/

#include <reg52h>

sbit TxPin = P3^1; //设置发送引脚

sbit RxPin = P3^0; //设置接收引脚

unsigned char RxBuf[4]; //接收的数据缓冲区

unsigned char RxdP; //接收位置指针(字节)

unsigned char RxpTime; //接收间断时间监控

unsigned char RxEndBit; //接收完成标志

/

函数原型:void Delay(unsigned char Val)

函数作用:延时

输入参数:Val 延时参数

输出参数:无

注意:

/

void Delay(unsigned char Val)

{

while(Val--) ;

}

/

函数原型:void TxData(unsigned char Val)

函数作用:通过模拟串口引脚发送数据

输入参数:Val 待发送的数据(8Bit)

输出参数:无

注意: 发送中时序很关键,发送前必须关闭中断

/

void TxData(unsigned char Val)

{

unsigned char i;

TxPin = 0; //发送起动符

Delay(13);

for(i = 0x01; i != 0; i <<= 1)

{

if((Val & i) != 0)

{

TxPin = 1;

}

else

{

TxPin = 0;

}

Delay(12);

}

TxPin = 1; //发送停止符

Delay(14);

TxPin = 1;

}

/

函数原型:void Time0() interrupt 1

函数作用:定时监控接收引脚状态并接收数据

输入参数:无

输出参数:无

注意: 对CPU负担巨大

/

void Time0() interrupt 1

{ unsigned char i;

if(0 == RxPin) //找到启动符

{

TR0 = 0; //暂停定时器

RxBuf[RxdP] = 0;

Delay(15);

for(i = 0x01; i != 0 ; i <<= 1) //最低位开始接收

{

if(0 != RxPin)

{

RxBuf[RxdP] |= i;

}

Delay(12);

}

Delay(10);

RxpTime = 0;

TR0 = 1;

RxdP++;

if(RxdP >= 4)

{

RxdP = 0;

RxEndBit = 1; //接收完成,置标志

}

}

else

{

RxpTime++;

}

}

/

函数原型:unsigned int main(void)

函数作用:演示主程序

输入参数:无

输出参数:无

/

unsigned int main(void)

{

unsigned char i;

TxPin = 1; //发送端预置

RxEndBit = 0;

RxdP = 0;

TMOD = 0x02; //定时器初始化

TL0 = 0xd2; //48uS

TH0 = 0xd2;

ET0 = 1;

PT0 = 1;

TR0 = 1;

EA = 1;

while(1)

{

if(RxEndBit != 0) //有接收到完整数据

{

TR0 = 0;

for(i = 0; i < 4; i++) //将接收的4字节数据转发

{

TxData(RxBuf[i]);

}

RxEndBit = 0;

TR0 = 1;

}

else

{

if(RxpTime > 80)

{

RxpTime = 0;

RxdP = 0;

}

}

}

return 0;

}

对于编程来说,没什么区别,通过控制485的使能端该程序完全可以使用。唯一的区别就是你在发送的时候通过程序把485的控制脚拉高,接收的时候把他拉低就可以了。至于电气方面的区别:RS232是全双工,可以同时收发,RS485是半双工,不能同时收发,还有电平信号不一样,这个编程你就不要理了。

以上就是关于求助stc 单片机串口发送接收多个数据的程序全部的内容,包括:求助stc 单片机串口发送接收多个数据的程序、我写的串口发送数据 接收+1的程序 大家看看哪里错了、求一个基于51单片机的C语言程序,要求从串口接收一组数据,然后将其通过串口输出等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9344097.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存