智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 1329|回复: 1
打印 上一主题 下一主题

[咨询] 这个串口程序有错吗,接受不了数据

[复制链接]

3

主题

96

帖子

0

精华

高级会员

Rank: 4

积分
929
威望
505
贡献
254
兑换币
245
注册时间
2012-9-18
在线时间
85 小时
跳转到指定楼层
1#
发表于 2013-1-21 14:51:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */
#define uint unsigned int
#define uchar unsigned char

/*void delay(uint time)   //延时函数
{
    uint i,j,k;
    for(i=0; i<125; i++)
    {
            for(j=0; j<125; j++)
            {
                    for(k=time; k>0; k--);
            }
    }

}         */

void clock_init(void)  //超频64Mhz
{   /*Fvco=2*fosc*(syrn+1)/(refdv+1)*/
        /*Fpll=fvoc/(2*postdiv),通常设postdiv为0*/
        /*Fbus=fpll/2总线时钟为锁相环时钟源的一半*/
        DisableInterrupts;        //关总中断
        CLKSEL=0x00;        //CLKSEL_PLLSEL置0,选择系统时钟源为外部晶振OSCCLK
        PLLCTL=0x80;   //PLLCTL_PLLON置0,关闭PLL时钟源
        SYNR = 0xc7;
        REFDV = 0x81;         //根据所需时钟频率设置SYNP和REFDV寄存器
        POSTDIV=0x00;  //可以不管,默认为0
        PLLCTL=0xc0;        //打开PLLON?开PLL时钟源
        while(!(CRGFLG & 0x08)); //判断PLL时钟源是否稳定,CRGFLG_LOCK=1时稳定
        CLKSEL_PLLSEL=1;        //选择PLL时钟源作为系统时钟源
        EnableInterrupts;
}


void sci_init()        //串口初始化
{
        SCI0BDH=0x01;
        SCI0BDL=0xa1;        //设置波特率为9600,SCI0BD=fbus/16/9600=417,总线位64MHZ
        SCI0CR1=0x00;        //设置工作方式为8位数据模式,无奇偶校验位
        SCI0CR2=0x2c;        //允许sci发送数据与接受收据,允许接收中断,收据有效,可以读取数据
}


uchar sci_receive(void) //读数据
{
        if(SCI0SR1_RDRF==1)
        {
                SCI0SR1_RDRF=1;        //rdrf=1时,开始顺序读取scisr1和scidr,并自动清除rdrf
                return SCI0DRL;
        }
        return 0;
}

void  sci_transmit(uchar sendchar)        //向发送保持器中写入数据
{
        while(!(0x80 & SCI0SR1));        //若TDRE=0,则一直执行
        SCI0DRH=0;        //先写发送数据寄存器高位
        SCI0DRL=sendchar;        //将低位赋予写入的字符
}

void main(void)
{
  /* put your own code here */
          clock_init();
    sci_init();
        EnableInterrupts;
        for(; ; )
        {}
//        while(1);
}

void interrupt 20 sci_re(void)         //接收中断?sci的中断向量号为20
{
       
        uchar ch;
        DisableInterrupts;        //关总中断
        ch=sci_receive();        //读数据寄存器准备好,开始读数据
//        asm nop;
//        asm nop;
        sci_transmit(ch);        //写数据寄存器空闲,写数据
        EnableInterrupts;        //开总中断
}


14

主题

295

帖子

0

精华

常驻嘉宾

打酱油出道。。。

Rank: 8Rank: 8

积分
5865

优秀会员奖章活跃会员奖章在线王奖章论坛元老奖章

威望
1727
贡献
1258
兑换币
1045
注册时间
2012-11-10
在线时间
1440 小时
2#
发表于 2013-1-24 15:42:46 | 只看该作者
没看出什么问题,注意你的接线
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-22 22:31 , Processed in 0.038904 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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