金牌会员
- 积分
- 1255
- 威望
- 590
- 贡献
- 349
- 兑换币
- 291
- 注册时间
- 2013-1-26
- 在线时间
- 158 小时
- 毕业学校
- 毕桥小学
|
最近打算写个超声波测距,不知道为什么发数据的时候不是一直发,每次只发一次,有的时候会发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++;
}
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|