智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 2463|回复: 8
打印 上一主题 下一主题

SCI问题

[复制链接]

58

主题

314

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
4665
威望
2430
贡献
705
兑换币
1501
注册时间
2013-3-24
在线时间
765 小时
跳转到指定楼层
1#
发表于 2013-4-19 21:27:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
xs128单片机中sci0和sci1的初始化 设置等方面有不同吗

4

主题

144

帖子

0

精华

高级会员

Rank: 4

积分
987
威望
580
贡献
203
兑换币
33
注册时间
2012-3-5
在线时间
102 小时
2#
发表于 2013-4-19 21:41:32 | 只看该作者
寄存器的名字和中断的序列号不同
回复 支持 反对

使用道具 举报

58

主题

314

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
4665
威望
2430
贡献
705
兑换币
1501
注册时间
2013-3-24
在线时间
765 小时
3#
 楼主| 发表于 2013-4-19 21:44:54 | 只看该作者
小椰 发表于 2013-4-19 21:41
寄存器的名字和中断的序列号不同

大神,可以具体一点吗
回复 支持 反对

使用道具 举报

4

主题

144

帖子

0

精华

高级会员

Rank: 4

积分
987
威望
580
贡献
203
兑换币
33
注册时间
2012-3-5
在线时间
102 小时
4#
发表于 2013-4-19 21:52:30 | 只看该作者
寄存器的名字和中断序列号不同,两个串口能同时用
下面是我自己写的xs128的程序,能调通

#include "sci.h"
uchar  UART1Buffer[BUFSIZE]; //缓存数组500,存放数据
unsigned long int UART1Count;

//设置串口0寄存器 GPRS无线 发送和接收
void SCI0_init(void)
{
  SCI0BD = 260;      //波特率=fBUS/(16*BD)
  SCI0CR1 = 0X00;  
  SCI0CR2_RIE = 1; //允许中断请求
  SCI0CR2_TE = 1;  //使用发送器
  SCI0CR2_RE = 1;  //使用接收器
  
}

  //设置串口1寄存器 GPS定位 接收
void SCI1_init(void)
{
  SCI1BD = 65;      //波特率=fBUS/(16*BD)
  SCI1CR1 = 0X00;  
  SCI1CR2_RIE = 1; //允许中断请求
  SCI1CR2_TE = 1;  //使用发送器
  SCI1CR2_RE = 1;  //使用接收器
}

//串口0发送一个字符
void Send_ASCII_SCI0(uchar a)
{
   while(!SCI0SR1_TDRE);
   SCI0DRL=a;        //发送数据寄存器
   //Delay_ms(5);
}

//串口0发送字符串
void Send_Str_SCI0(uchar *str)
{
  uchar *s;
  
  s=str;
  
  while(*s)
  {
    while(!SCI0SR1_TDRE);
    SCI0DRL=*s;        //发送数据寄存器
    s++;
  }
  
}

//串口0接收一个字符   在中断函数中接收
uchar  Rec_ASCII_SCI0(void)
{
  uchar ch;
  while(!(SCI0SR1&0x80));
  ch = SCI0DRL;
  
  return ch;
}



/*****************************清除串口0缓存数据函数*****************/
void CLR_Buf0(void)
{
   uint k;
    for(k=0;k<BUFSIZE;k++)          //将缓存内容清零
    {
  UART1Buffer[k] = 0x30;  //ununderstend  '0'
    }
    UART1Count = 0;              //接收字符串的起始存储位置 First_Int
}




//串口1发送一个字符
void Send_ASCII_SCI1(uchar a)
{
   while(!SCI1SR1_TDRE);
   SCI1DRL=a;        //发送数据寄存器
   //Delay_ms(5);
}

//串口1发送字符串
void Send_Str_SCI1(uchar *str)
{
   uchar *s;
   
   s=str;
  
   while(*s)
  {
    while(!SCI1SR1_TDRE);
    SCI1DRL=*s;        //发送数据寄存器
    s++;
  }
  
}
//串口1接收一个字符   在中断函数中接收
uchar  Rec_ASCII_SCI1(void)
{
  uchar ch;
  
  while(!(SCI1SR1&0x80));
  ch = SCI1DRL;
  
  return ch;
}


回复 支持 反对

使用道具 举报

4

主题

144

帖子

0

精华

高级会员

Rank: 4

积分
987
威望
580
贡献
203
兑换币
33
注册时间
2012-3-5
在线时间
102 小时
5#
发表于 2013-4-19 21:58:23 | 只看该作者
原来不是我 发表于 2013-4-19 21:44
大神,可以具体一点吗

这是在中断部分中的程序,我是接收用中断,发送不用中断

//=====================SCI0中断 串口0接收数据 GPRS接收数据===========
#pragma CODE_SEG __NEAR_SEG NON_BANKED
void  interrupt 20 SCI0_ISR(void)
{
  
   UART1Buffer[UART1Count]=Rec_ASCII_SCI0();
   
   
   UART1Count++;
   if( UART1Count >= BUFSIZE-20 )
   {
      UART1Count=0;   
   }
}        



//=====================SCI1中断串口1接收数据 GPS定位============
#pragma CODE_SEG __NEAR_SEG NON_BANKED
void  interrupt 21 SCI1_ISR(void)
{
     uchar ch;
     while(!(SCI1SR1&0x80)) ;      
      ch = SCI1DRL;

}   
回复 支持 反对

使用道具 举报

58

主题

314

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
4665
威望
2430
贡献
705
兑换币
1501
注册时间
2013-3-24
在线时间
765 小时
6#
 楼主| 发表于 2013-4-19 22:01:08 | 只看该作者
小椰 发表于 2013-4-19 21:52
寄存器的名字和中断序列号不同,两个串口能同时用
下面是我自己写的xs128的程序,能调通

/*************************************************************/
/*                        初始化SCI                          */
/*************************************************************/
void INIT_SCI(void)
{
  SCI0BD = BUS_CLOCK/16/BAUD;   //设置SCI0波特率为9600
  SCI0CR1 = 0x00;       //设置SCI0为正常模式,八位数据位,无奇偶校验
  SCI0CR2 = 0x08;       //允许发送数据,禁止中断功能
}
/*************************************************************/
/*                       串口发送函数                        */
/*************************************************************/
void SCI_send(unsigned char data)
{
  while(!SCI0SR1_TDRE);       //等待发送数据寄存器(缓冲器)为空
  SCI0DRL = data;
}
如果把sci0改成sci1,其他地方该怎么变
回复 支持 反对

使用道具 举报

4

主题

144

帖子

0

精华

高级会员

Rank: 4

积分
987
威望
580
贡献
203
兑换币
33
注册时间
2012-3-5
在线时间
102 小时
7#
发表于 2013-4-19 22:05:54 | 只看该作者
原来不是我 发表于 2013-4-19 22:01
/*************************************************************/
/*                        初始化S ...

两个串口的初始化以及发送和接收函数都在上面了,如果只想用串口1的话,把串口0的内容删去就行了
回复 支持 反对

使用道具 举报

58

主题

314

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
4665
威望
2430
贡献
705
兑换币
1501
注册时间
2013-3-24
在线时间
765 小时
8#
 楼主| 发表于 2013-4-20 16:32:17 | 只看该作者
小椰 发表于 2013-4-19 22:05
两个串口的初始化以及发送和接收函数都在上面了,如果只想用串口1的话,把串口0的内容删去就行了

XS128单片机串口通信时发送和接收用的是M0和M1口,该怎样设置 PORTM
回复 支持 反对

使用道具 举报

4

主题

144

帖子

0

精华

高级会员

Rank: 4

积分
987
威望
580
贡献
203
兑换币
33
注册时间
2012-3-5
在线时间
102 小时
9#
发表于 2013-5-12 23:24:24 | 只看该作者
原来不是我 发表于 2013-4-20 16:32
XS128单片机串口通信时发送和接收用的是M0和M1口,该怎样设置 PORTM

串口0是S0和S1  串口1是S2和S3
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-10-3 06:25 , Processed in 0.051242 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表