关于单片机串口通信的问题

单片机是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; //开串口中断
}
展开
 我来答
透明的存在
2014-07-02 · TA获得超过650个赞
知道小有建树答主
回答量:416
采纳率:0%
帮助的人:152万
展开全部
STC15W204S的两个定时器是定时器0和定时器2,不能用定时器1作为波特率发生器,因为没有定时器1,你要用定时器2。
lycdl
高粉答主

2013-09-07 · 醉心答题,欢迎关注
知道大有可为答主
回答量:2万
采纳率:94%
帮助的人:4978万
展开全部
问题可能出在波特率上,波特率不对。下载程序时,内部时钟频率的选择是否正确?T1定时器的时间常数计算与定时工作在1T或12T的模式有关,用STC最新的下载软件V6.58的,里面可以自动生成串口通信的代码。很方便的。
追问

下载时内部时钟频率是选11.0592MHz。用STC-ISP V6.58 里的波特率计算器生成的串口初始化,我再加了EA=1;ES=1;这两句烧录进去后,用串口助手随便发个数据还是没有进入到串口中断

追答
用示波器测试,P3.0/RXD管脚有输入信号,不代表接收的数据正确。485与电脑连接是用的232转485的模块吗,能保证这个转换模块是好的吗?让单片机发送一个数据,看电脑能否收到数据,这样来判断这个模块的好坏。还有单片机上用的RS485芯片是什么型号的,能保证是好的吗,看来要从硬件上找原因了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
摆渡人生_2012
2013-09-07 · TA获得超过878个赞
知道小有建树答主
回答量:607
采纳率:50%
帮助的人:282万
展开全部
你不是要看 你示波器有没有信号
而是要看 你示波器测出来的 信号 是不是正确?
是不是你要输入的信号 ?自己读一下。。
如果不对,
你的硬件都是用的是什么 485 ?485 转232?有木有问题?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友17be5e9
2013-09-07
知道答主
回答量:33
采纳率:0%
帮助的人:22.9万
展开全部
你是用定时器T1来产生波特率的吧,那么你就不能使用中断。T1的中断优先级比串口的高,把EA=1;ES=1;去掉,在main里边if(x==1)改成if(RI)使用查询方式。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
一万光年MEGn0
2013-09-07 · TA获得超过3712个赞
知道大有可为答主
回答量:4602
采纳率:67%
帮助的人:1082万
展开全部
是不是硬件电路有问题呢

程序好像没问题
追问
硬件电路应该没问题吧,之前是没用串口中断,while(1)里面直接是LED亮灭的程序,灯是能正常亮灭的。后来用了串口中断,用示波器测试P3.0/RXD引脚,数据发送进来时有电平变化,不知道问题出在哪里
追答
这个单片机的资料一定要看全面,寄存器的配置一定要正确,否则会有问题呢
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式