关于单片机串口通信的问题
单片机是STC15W204S,采用485通讯,将以下程序烧录到单片机内,用串口助手发送数据,经过示波器测试,P3.0/RXD管脚有输入信号,但是不知为何程序没有进入到串口...
单片机是STC15W204S,采用485通讯,将以下程序烧录到单片机内,用串口助手发送数据,经过示波器测试,P3.0/RXD管脚有输入信号,但是不知为何程序没有进入到串口中断。期间在串口中断函数那里, interrupt 4 using 0到using 3均实验过,情况还是一样。硬件上没有问题,求高人指点
#include <STC15W204S.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
//uint q;
bit x=0;
sbit LED1=P1^0;
sbit LED2=P1^1;
sbit Receive_E=P3^2;
/******************************************************************
延时函数//@11.0592MHz
Delay1ms()延时1毫秒
Delay(uint count)延时count毫秒
******************************************************************/
void Delay1ms(void) //@11.0592MHz
{
unsigned char i, j;
_nop_();
_nop_();
_nop_();
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
}
void Delay(uint count)
{
while(count--)
{
Delay1ms();
}
}
/******************************************************************
串口初始化函数
波特率9600,定时器1,工作方式2
******************************************************************/
void UartInit(void) //9600bps@11.0592MHz
{
PCON = 0x00; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
TMOD = 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xFD; //设定定时初值
TH1 = 0xFD; //设定定时器重装值
TR1 = 1; //启动定时器1
EA=1; //开启中断
ES=1; //开启串口中断
}
/******************************************************************
主函数
******************************************************************/
void main(void)
{
UartInit();
Receive_E=0; //允许接收
while(1)
{
if(x==1)
{
LED1=1;
Delay(1000);
LED1=0;
Delay(1000);
x=0;
}
}
}
/******************************************************************
串口中断函数
******************************************************************/
void serial() interrupt 4
{
if(RI)
{
ES=0; //关串口中断
x=1;
RI=0;
}
ES=1; //开串口中断
} 展开
#include <STC15W204S.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
//uint q;
bit x=0;
sbit LED1=P1^0;
sbit LED2=P1^1;
sbit Receive_E=P3^2;
/******************************************************************
延时函数//@11.0592MHz
Delay1ms()延时1毫秒
Delay(uint count)延时count毫秒
******************************************************************/
void Delay1ms(void) //@11.0592MHz
{
unsigned char i, j;
_nop_();
_nop_();
_nop_();
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
}
void Delay(uint count)
{
while(count--)
{
Delay1ms();
}
}
/******************************************************************
串口初始化函数
波特率9600,定时器1,工作方式2
******************************************************************/
void UartInit(void) //9600bps@11.0592MHz
{
PCON = 0x00; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
TMOD = 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xFD; //设定定时初值
TH1 = 0xFD; //设定定时器重装值
TR1 = 1; //启动定时器1
EA=1; //开启中断
ES=1; //开启串口中断
}
/******************************************************************
主函数
******************************************************************/
void main(void)
{
UartInit();
Receive_E=0; //允许接收
while(1)
{
if(x==1)
{
LED1=1;
Delay(1000);
LED1=0;
Delay(1000);
x=0;
}
}
}
/******************************************************************
串口中断函数
******************************************************************/
void serial() interrupt 4
{
if(RI)
{
ES=0; //关串口中断
x=1;
RI=0;
}
ES=1; //开串口中断
} 展开
5个回答
展开全部
问题可能出在波特率上,波特率不对。下载程序时,内部时钟频率的选择是否正确?T1定时器的时间常数计算与定时工作在1T或12T的模式有关,用STC最新的下载软件V6.58的,里面可以自动生成串口通信的代码。很方便的。
追问
追答
用示波器测试,P3.0/RXD管脚有输入信号,不代表接收的数据正确。485与电脑连接是用的232转485的模块吗,能保证这个转换模块是好的吗?让单片机发送一个数据,看电脑能否收到数据,这样来判断这个模块的好坏。还有单片机上用的RS485芯片是什么型号的,能保证是好的吗,看来要从硬件上找原因了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你不是要看 你示波器有没有信号
而是要看 你示波器测出来的 信号 是不是正确?
是不是你要输入的信号 ?自己读一下。。
如果不对,
你的硬件都是用的是什么 485 ?485 转232?有木有问题?
而是要看 你示波器测出来的 信号 是不是正确?
是不是你要输入的信号 ?自己读一下。。
如果不对,
你的硬件都是用的是什么 485 ?485 转232?有木有问题?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你是用定时器T1来产生波特率的吧,那么你就不能使用中断。T1的中断优先级比串口的高,把EA=1;ES=1;去掉,在main里边if(x==1)改成if(RI)使用查询方式。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
是不是硬件电路有问题呢
程序好像没问题
程序好像没问题
追问
硬件电路应该没问题吧,之前是没用串口中断,while(1)里面直接是LED亮灭的程序,灯是能正常亮灭的。后来用了串口中断,用示波器测试P3.0/RXD引脚,数据发送进来时有电平变化,不知道问题出在哪里
追答
这个单片机的资料一定要看全面,寄存器的配置一定要正确,否则会有问题呢
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询