打印
[ZLG-MCU]

p89lpc952的串口1问题

[复制链接]
1994|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
linhai1986|  楼主 | 2009-9-23 01:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
为什么使用串口1发送数据的时候,总是调用串口0的中断函数啊,
还有为什么lpc952的头文件中,只定义了sfr S0BUF = 0x99;而没有S1BUF啊,谢谢

#include "reg952.h"
#include "string.h"
#include "HI2C_C51.H"
void main()
{
mcuinit(); //单片机初始化
while(1)
{

if(t0flag==1) //检测是否有定时器中断
{
t0flag=0;
sendstr0("ni hao\r\n");
delay_time(10);
sendstr1("wo bu hao\r\n");
delay_time(10);
}

}
}
static void timer0() interrupt 1
{

t0flag=1;
}
static void uart0int() interrupt 4
{
if (RI_0==1)
{
RI_0=0;
buf0[ptr1_0++]=S0BUF;
if (ptr1_0>=BUFLEN0)
{
ptr1_0=0;
}
}
}

相关帖子

沙发
linhai1986|  楼主 | 2009-9-23 01:04 | 只看该作者
void uart1int() interrupt 17
{
if (S1CON&0x01)
{
S1CON=S1CON&0xFE;
buf1[ptr1_1++]=S1BUF;
if (ptr1_1>=BUFLEN1)
{
ptr1_1=0;
}
}
}

void sendstr0(char* dat)
{
int j=0;
while(dat[j]) // send string
{
TI_0=0; // clear transmit interrupt flag
S0BUF=dat[j]; // start sending one byte
while (!TI_0); // wait until sent
j++;
}
}

void sendstr1(char* dat)
{
int j=0;
while(dat[j]) // send string
{
S1CON=S1CON&0xFD; //clear transmit interrupt flag
S1BUF=dat[j]; // start sending one byte
while (!(S1CON|0xfd)); // wait until sent
j++;
}
}

使用特权

评论回复
板凳
xiaoxin1986| | 2009-9-23 01:05 | 只看该作者
952的串口中断问题,看它的英文数据手册更好。

使用特权

评论回复
地板
xiaoxin1986| | 2009-9-23 01:06 | 只看该作者
我仔细看了一下:怎么可能没对串口1的定义呢。如没有,只有可能是你把头损坏了,这两个串口是完全独立的呀

使用特权

评论回复
5
linhai1986|  楼主 | 2009-9-24 00:13 | 只看该作者
中文资料上果然译漏了啊,
头文件也损坏了,重新DOWN了一个

谢谢,可是还是没搞定,串口0正常,可是串口1就不行了,interrupt 17 程序中一直没有调用

使用特权

评论回复
6
xiaoxin1986| | 2009-9-24 00:19 | 只看该作者
你看下这个了

使用特权

评论回复
7
xiaoxin1986| | 2009-9-24 00:19 | 只看该作者
#include "REG952.H"

main()
{
P4M1=0x00; //P1.0,P.1.1为TXD和RXD,要设为准双向
P4M2=0x00;
S1CON=0x50; //使能接收选择串口模式1
BRGCON_1 =0x00; //清零初始化
S1STAT=0x00; //选择组合的Tx/Rx 中断
BRG0_1=0x61; //9600 baud @ 6MHz
BRG1_1=0x02;
BRGCON_1 =0x03; //使能BRG
EA = 1;
IEN2 |=0X4; //使能中断
while(1)
;

}

void comport(void) interrupt 17
{
unsigned char ac;

if(S1CON & 0x01)//请问RI_1怎样定义
{
S1CON=S1CON & 0xFE;//RI_1清0
ac=S1BUF;
S1BUF = ac; //返回接收到的数据
}
if(S1CON & 0x02)
S1CON=S1CON & 0xFD;//TI_1清0

}

使用特权

评论回复
8
linhai1986|  楼主 | 2009-9-24 11:29 | 只看该作者
看起来不错哦,先谢了哈

使用特权

评论回复
9
linhai1986|  楼主 | 2009-9-24 11:29 | 只看该作者
我使用的是外部12M晶振,所以把

BRG0_1=0x61; //9600 baud @ 6MHz
BRG1_1=0x02;

改成了

BRG0_1=0x70; //9600 baud extinal 12MHz
BRG1_1=0x04;

但是,向串口发送1234567时,串口接收到的是1312413124啊,

我怀疑接收每完成就又发送导致,后面数据覆盖前面数据而导致,于是分别在

"S1BUF = ac; //返回接收到的数据" 后面加了一个delay_time();小延时程序,接受变成12121212了,真不容易搞

使用特权

评论回复
10
linhai1986|  楼主 | 2009-9-24 11:30 | 只看该作者
我怀疑是前面数据还没有发送完成,后面数据又发送过来的话,可能是后面数据覆盖前面而造成,

于是在"S1BUF = ac; //返回接收到的数据"后面加了一delay_time();延时小程序,可接收就变成1212121212了,真不容易搞懂啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

172

主题

1451

帖子

0

粉丝