C51单片机程序进不了中断函数,SBUF接收不到数据,求大神指教,急急急! 100
#include<stdio.h>#include<reg52.h>#include<string.h>voidUart_Init(void){TMOD=0x20;//定...
#include<stdio.h>
#include<reg52.h>
#include <string.h>
void Uart_Init(void)
{
TMOD = 0x20;//定时器1工作方式2
SCON=0x50;
PCON=0x00;//波特率不增加
TH1=0xfa;// 4800波特率,11.0592M
TL1=0xfa;//
RI=0;
EA=1; //开总中断
ES=1; //串口中断允许
TR1=1;
}
void main(void)
{
Uart_Init(); //初始化串口
while(1);
}
void inter() interrupt 4
{
unsigned char ch;
ES=0;
if (RI)
{
ch = SBUF;
}
RI=0;
ES=1;
} 展开
#include<reg52.h>
#include <string.h>
void Uart_Init(void)
{
TMOD = 0x20;//定时器1工作方式2
SCON=0x50;
PCON=0x00;//波特率不增加
TH1=0xfa;// 4800波特率,11.0592M
TL1=0xfa;//
RI=0;
EA=1; //开总中断
ES=1; //串口中断允许
TR1=1;
}
void main(void)
{
Uart_Init(); //初始化串口
while(1);
}
void inter() interrupt 4
{
unsigned char ch;
ES=0;
if (RI)
{
ch = SBUF;
}
RI=0;
ES=1;
} 展开
5个回答
展开全部
串口收到的数据,应该送到接口,当场显示。
试试如下程序:
#include<reg52.h>
void main(void)
{
//初始化串口
PCON = 0x00; //波特率不增加
SCON = 0x50;
TMOD = 0x20; //定时器1工作方式2
TH1 = 0xfa; //4800波特率,11.0592M
TL1 = 0xfa; //
TR1 = 1;
ES = 1; //串口中断允许
EA = 1; //开总中断
while(1);
}
void inter() interrupt 4
{
unsigned char ch;
if (RI) {
RI = 0;
ch = SBUF;
P1 = ch; //用P1口当场显示
}
}
试试如下程序:
#include<reg52.h>
void main(void)
{
//初始化串口
PCON = 0x00; //波特率不增加
SCON = 0x50;
TMOD = 0x20; //定时器1工作方式2
TH1 = 0xfa; //4800波特率,11.0592M
TL1 = 0xfa; //
TR1 = 1;
ES = 1; //串口中断允许
EA = 1; //开总中断
while(1);
}
void inter() interrupt 4
{
unsigned char ch;
if (RI) {
RI = 0;
ch = SBUF;
P1 = ch; //用P1口当场显示
}
}
更多追问追答
追问
我是用GPS模块发送数据的,接收到的数据正常的话应该是$GPRMC,073740.891,V,3018.9681,N,12022.9420,E,,0.00,030513,,,N*6B这种格式,没法在P1口显示。。。。
追答
呵呵,这么多数据呀 !
要从中分离出:经度、纬度、时间、...,这可得编写一个大程序了。
你现在,连一个数据都收不到,还弄那个GPS干吗?
路,得一步一步的走。
应该先用 PC 机,运行串口助手软件,和单片机通信。
把我写的程序,弄好了,能够收取数据了,再研究GPS。
----
在证明了单片机的串口工作正常之后,再为了GPS,修改接收程序如下:
在接收中断程序中,每次中断,仅仅接收一个字符,应该存入一个数组。
收到了$,就存到第一个元素。以后的每次中断,就依次存放数据。
当中断了多少多少次之后,才收齐了《经度》数据,这时,才能去显示。
……
你现在,连一个数据都收不到,还弄那个GPS干吗?
路,得一步一步的走。
展开全部
你要定义一个全局变量,然后在中断函数中对全局变量进行赋值。不然的话,你在man()中没有办法将接受到的数据显示出来。局部变量在函数执行完毕后会被释放。
更多追问追答
追问
能麻烦帮我修改下吗?我把unsigned char ch;放到#include 后面了,还是不行,万分感谢!
追答
我认为你的程序是对的,要不是你测试方法不对,进了中断,但是你不知道,这种情况建议你在中断程序里面控制一个LED指示灯闪烁,这样一旦进中断,你就能看出来。还有一种情况就是你给这个单片机发送的数据不正确,或是波特率不对应,比如你用另一个单片机给他发送9600波特率的数据,就可能接受不到。还有一种情况,就是你接线接错了,你要注意,串口线是要交叉相接的,这个单片机的Tx接另一个单片机的Rx,还有一种情况就是你两个系统没有共地,如果两个系统采用分别供电,不共地也会偶尔出现这种情况。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
在这个函数里面void inter() interrupt 4
{
unsigned char ch;
ES=0;
if (RI)
{
ch = SBUF;
}
RI=0;
ES=1;
}
需要再对定时器进行赋值,并且启动定时器
{
unsigned char ch;
ES=0;
if (RI)
{
ch = SBUF;
}
RI=0;
ES=1;
}
需要再对定时器进行赋值,并且启动定时器
追问
能麻烦帮我修改下吗?我是菜鸟,什么都不会,好人一生平安!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你的程序,应该可以进中断,你是怎么测试进不了中断的?!
更多追问追答
追问
我调试,结果SBUF和ch始终为0,不知道为什么,并且串口调试助手能收到数据,但是程序这里就是没反应
追答
如果你是用仿真器的话,可以在中断里面下个断点试试。
SBUF是随时变化的,ch你定义的局部变量,直接看变量不一定准确。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询