请教STC15串口1与485问题
本帖最后由 dongfang 于 2024-5-28 10:08 编辑我用一个485自动收发模块与stc15串口连接,使用串口1出现不能接收数据问题,但可以发送数据,(我在89c52串口1,stc15的串口2上实验收发正常)。我考虑P3.0,P3.1,可能连接着下载电路的问题,更换串口端口问题同样,请教高人看看下面是源程序
#include <STC15.H>
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
unsigned char code TXDATA = {0x03,0x03,0x00,0x05,0x00,0x02,0xd5,0xe8};
uchar flag,num=1;
#define FOSC 11059200L //系统频率
#define BAUD 115200 //串口波特率
#define S1_S0 0x40 //P_SW1.6
#define S1_S1 0x80 //P_SW1.7
bit busy;
void delayms(uint ms)
{
uint i,j;
for(i=ms;i>0;i--)
for(j=845;j>0;j--);
}
void allinit()
{
P0M0=0X00;P0M1=0X00;
P1M0=0X00;P1M1=0X00;
P2M0=0X00;P2M1=0X00;
P3M0=0X00;P3M1=0X00;
P4M0=0X00;P4M1=0X00;
}
void UartInit(void) //9600bps@11.0592MHz
{
ACC = P_SW1;
ACC &= ~(S1_S0 | S1_S1); //S1_S0=1 S1_S1=0
ACC |= S1_S0; //(P3.6/RxD_2, P3.7/TxD_2)
P_SW1 = ACC;
SCON = 0x50; //8位可变波特率
T2L = 0xE0; //设置定时初始值
T2H = 0xFE; //设置定时初始值
AUXR = 0x14; //T2为1T模式, 并启动定时器2
AUXR |= 0x01; //选择定时器2为串口1的波特率发生器
ES = 1; //使能串口1中断
EA = 1;
}
void main()
{
allinit() ;
UartInit();
while(1)
{
if (num==1)
{
SBUF=TXDATA;
delayms(2);
while(busy);
SBUF=TXDATA;
delayms(2);
while(busy);
SBUF=TXDATA;
delayms(2);
while(busy);
SBUF=TXDATA;
delayms(2);
while(busy);
SBUF=TXDATA;
delayms(2);
while(busy);
SBUF=TXDATA;
delayms(2);
while(busy);
SBUF=TXDATA;
delayms(2);
while(busy);
SBUF=TXDATA;
num=0;
}
}
}
/*----------------------------
UART 中断服务程序
-----------------------------*/
void Uart() interrupt 4
{
if (RI)
{
RI = 0; //清除RI位
num = SBUF; //P0显示串口数据
}
if (TI)
{
TI = 0; //清除TI位
busy = 0; //清忙标志
}
}
简单扫了眼您的主程序,
先进行端口初始化,然后串口初始化,
进入wihie循环,判断NUM是否为1,
在中断里只有接收没有发送,说明是采用中断接收,
那您的发送在哪?
{:4_167:}
我好像没用过判忙这个法子。
Yim_Hom 发表于 2024-5-28 10:47
简单扫了眼您的主程序,先进行端口初始化,然后串口初始化,进入wihie循环,判断NUM是否为1,在中断里只有 ...
发射在主程序while循环里收到时1时发送
if (num==1)
{
SBUF=TXDATA;
delayms(2);
while(busy);
SBUF=TXDATA;
delayms(2);
while(busy);
SBUF=TXDATA;
delayms(2);
while(busy);
SBUF=TXDATA;
delayms(2);
while(busy);
SBUF=TXDATA;
delayms(2);
while(busy);
SBUF=TXDATA;
delayms(2);
while(busy);
SBUF=TXDATA;
delayms(2);
while(busy);
SBUF=TXDATA;
num=0; uchar flag,num=1; 前面的uchar flag,num=1;
中断里 num = SBUF; //P0显示串口数据
主程序里 if (num==1) 我就奇了怪,你说485模块有问题吧,使用串口2收发正常,你说串口1有问题吧,用板子上带下载程序ch340直径与电脑串口连接,收发正常 有什么奇怪的,列举出来的还没看明白?开头num直接等于1,所以就一直发送啊。 仔细检查一下,看看程序哪里不对,硬件没有损坏 Yim_Hom 发表于 2024-5-28 12:19
有什么奇怪的,列举出来的还没看明白?开头num直接等于1,所以就一直发送啊。 ...
这个老师,你和我说说下面的num=0,是干什么的
if (num==1)
{
SBUF=TXDATA;
delayms(2);
while(busy);
SBUF=TXDATA;
delayms(2);
while(busy);
SBUF=TXDATA;
delayms(2);
while(busy);
SBUF=TXDATA;
delayms(2);
while(busy);
SBUF=TXDATA;
delayms(2);
while(busy);
SBUF=TXDATA;
delayms(2);
while(busy);
SBUF=TXDATA;
delayms(2);
while(busy);
SBUF=TXDATA;
num=0; 小飞侠 发表于 2024-5-28 14:53
仔细检查一下,看看程序哪里不对,硬件没有损坏
前面我说奇怪吗,你说硬件损坏,使用串口2可以,你说程序不对,使用下载线连接串口与电脑连接功能可以实现,串口发送1,单片机发送一串数据,我用的是自动发送接收的485模块,使用可以把485看成透明与平常使用串口无异,
页:
[1]
2