智能车制作

标题: 郁闷!求助 [打印本页]

作者: 安徽——菜鸟    时间: 2013-5-20 14:14
标题: 郁闷!求助
最近打算写个超声波测距,不知道为什么发数据的时候不是一直发,每次只发一次,有的时候会发2次,还有一个问题有时候会出现字符,如我测得距离是678.4cm,他有时候会显示 t78,‘cm 。这样乱七八招的只是偶尔会显示,我知道原因是这几句话的原因,我把这几句话屏蔽了,随便发个字符都可以一直发。:
while(!PORTA_PA0);                //当RX为零时等待                                      //开启定时器 PITCE_PCE0=1;         while(PORTA_PA0);                        //当RX为1。。  PITCE_PCE0=0;  
我觉得没有问题,跟居超声波的时序就是这样啊??



下面是代码,希望大家帮帮忙!!!谢谢
#include <hidef.h>    /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */



float j,i,s;
unsigned char m,n;
unsigned char buffer[8];




void sc_init()
   {
   PORTA_PA1=1;                        
           _asm(nop);                     //时序
      _asm(nop);
      _asm(nop);
      _asm(nop);
      _asm(nop);
PORTA_PA1=0;
   }




void pll_init()    //24m超p
  {
  REFDV=1;           //总线时钟=48/2=24MHz        
  SYNR=2;                    //2
  while(!(CRGFLG&0x08));
  CLKSEL=0x80;
  }


void PIT_init()
{

   PITCFLMT_PITE=0; //定时中断通道0关
    //PITCE_PCE0=1;//定时器通道0开启
    PITMTLD0=7;//位定时器初值设定。240分频,在24MHzBusClock下,100ms
    PITLD0=59;//16位定时器初值设定。PITTIME*0.1MS
    PITINTE_PINTE0=1;//定时器中断通道0中断使能
    PITCFLMT_PITE=1;//定时器通道0使能
}




void SciInit()
{
    SCI0BD=156;         //9600bps  Baud Rate=BusClock/(16*SCIBD)       156
    SCI0CR1=0;            //正常8位模式,无奇偶校验
    SCI0CR2=0X2C;         //发送允许   接受中断允许  
}
//----------------------读 接受SCI数据-----------------------------//
unsigned char SciRead()
{
    uchar result;
    while(!(SCI0SR1&0x20));     //表明数据从位移寄存器传输到SCI数据寄存器
    result=SCI0DRL;        //返回数据寄存器的数据
    return result;
}
//-----------------写 发送SCI数据---------------------------------//
void SciWrite(uchar sendchar)
{
    //uchar temp;
    //temp=SCI0SR1;
    while (!(SCI0SR1&0x80));    //TDRE,  0:SC0DR 处于忙状态  1:可以向发送保持器写入新的数据     
    SCI0DRL=sendchar;
}

///------------------------main----------------------------------//
void main(void)
{

DDRA|=0X02;  
DDRA=0Xfe;//配置输入输出
SciInit();
EnableInterrupts;
pll_init();
PIT_init();
for(;;)
   {
   sc_init();

  while(!PORTA_PA0);                //当RX为零时等待

                                     //开启定时器
PITCE_PCE0=1;
         while(PORTA_PA0);
                        //当RX为1。。
  PITCE_PCE0=0;  

   s=0.34*i;  //cm
    buffer[0]=(int)(s)/100+0x30;
    buffer[1]=(int)(s)%100/10+0x30;
    buffer[2]=(int)(s)%100%10+0x30;
    buffer[3]=46;
    buffer[4]=(int)(s*10)%1000%100%10+0x30;
    buffer[5]='C';
    buffer[6]='M';
    buffer[7]=' ';
          
          for(m=0;m<8;m++)
           {  
          SciWrite(buffer[m]);
          }
          _asm(nop);                     //时序
      _asm(nop);
      _asm(nop);
      _asm(nop);
           i=0;
    _FEED_COP();


          
    /* feeds the dog */
   }
   /* loop forever*/  

  /* please make sure that you never leave main */
}
#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 66 PIT0Interrupt(void)
{  
    PITTF_PTF0=1;
    i++;  
}







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