智能车制作

标题: 这个串口程序有错吗,接受不了数据 [打印本页]

作者: 736421469    时间: 2013-1-21 14:51
标题: 这个串口程序有错吗,接受不了数据
#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;        //开总中断
}



作者: 杀手王旭    时间: 2013-1-24 15:42
没看出什么问题,注意你的接线




欢迎光临 智能车制作 (http://dns.znczz.com/) Powered by Discuz! X3.2