金牌会员
- 积分
- 1093
- 威望
- 493
- 贡献
- 310
- 兑换币
- 288
- 注册时间
- 2014-10-16
- 在线时间
- 145 小时
|
2#
楼主 |
发表于 2015-1-3 14:31:03
|
只看该作者
#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */
#define TRING PORTA_PA1 //控制端
#define ECHO PTT_PTT7 //接收端
unsigned int edgup,edgdown,time=0,pitflag=0,timflag=0,distance,count,dis;
unsigned char buf[6]={0};
//----------------------PLL初始化------------------------//
void PLL_init(void)//24M
{
CLKSEL=0X00; // 初始化PLL前先使用外部晶振
PLLCTL_PLLON=1; // 开启 PLL
SYNR =0x00 | 0x02; // pllclock=2*osc*(1+SYNR)/(1+REFDV)=48MHz;
REFDV=0x80 | 0x01;
POSTDIV=0x00; //fPLL=fVOC
_asm(nop); // BUS CLOCK=24M
_asm(nop);
while(!(CRGFLG_LOCK==1)); //等待PLL稳定
CLKSEL_PLLSEL =1; //fBUS采用根据PLL频率设定
}
void PIT_init(void)
{
PITCFLMT_PITE = 0; //关闭PIT模块
PITCE = 0X00; //通道0 PIT模块禁止
PITINTE = 0x01; //通道0 中断使能
PITMUX = 0x00; //16位定时通道0使用0号8位微计数器,16位定时器1使用1号微计数器
PITMTLD0 =240-1; //8位定时器初值设定。240分频,在24MHzBusClock下,为0.1MHz。即10us.
PITLD0 =10000-1; //16位定时器初值设定,即定时100ms
PITCE = 0X01; //通道0 PIT模块使能
//PITCFLMT_PITE = 1;
}
void ECT_init(void)
{
TSCR1=0x00; //关定时器
TSCR2=0x80; //允许溢出中断,不分频 周期 1/24M
TIOS=0x00; //PT7为输入捕捉
TCTL3=0xC0; //输入捕捉7上升沿和下降沿均有效
TIE_C7I=1; //通道7输入捕捉中断允许
TCNT=0x00; //初始自由计数器
//PACTL=0X62; //开脉冲累加器 高电平,总线时钟64分频 允许溢出
//TSCR1=0x80; //使能定时器
// PACNT=0;
}
void IO_init(void)
{
DDRA=0x02; // A1输出
/********************B口输出(0、1、2、3)**********************************/
DDRB_DDRB0=1;
DDRB_DDRB1=1;
DDRB_DDRB2=1;
DDRB_DDRB3=1;
/********************E、T口输出(0、1、2、3)**********************************/
DDRE_DDRE2=1;
DDRE_DDRE3=1;
DDRT_DDRT0=1;
DDRT_DDRT1=1;
DDRT_DDRT2=1;
DDRT_DDRT3=1;
/***************(RDR寄存器)配置I/O口驱动能力(1:为减弱;0:正常输出)********************/
RDRT_RDRT0=0;
RDRT_RDRT1=0;
RDRT_RDRT2=0;
RDRT_RDRT3=0;
/**********************输入*****************************************/
DDRT_DDRT4=0;
DDRT_DDRT5=0;
/***************内部上拉********************/
PPST_PPST4=0;
PPST_PPST5=0;
/***************内部上拉使能********************/
PERT_PERT4=1;
PERT_PERT5=1;
}
void PORT_Update(void) //数码管输出更新
{
PORTE_PE2=1;
PORTE_PE3=1;
PTT_PTT0=1;
PTT_PTT1=1;
PTT_PTT2=1;
PTT_PTT3=1;
}
void delay(int z) //延时
{
int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void main(void)
{
/* put your own code here */
PLL_init();
PIT_init();
ECT_init();
IO_init();
EnableInterrupts;
for(;;)
{
PITCFLMT_PITE = 1; //打开PIT模块
if(pitflag==10)
{//-------------触发10us的脉冲信号---------------//
TRING=1;
delay(10);
TRING=0;
while(!ECHO)
{
edgup=TCNT;
}
while(ECHO)
{
edgdown=TCNT;
if(TCNT=65535)
{
TFLG2_TOF=1;
timflag++;
}
count=edgdown-edgup;
distance=((340*(count+65535*timflag)/24000000))*100;
dis=distance;
}
buf[0]=dis%10;
buf[1]=dis/10%10;
buf[2]=dis/100%10;
buf[3]=dis/1000%10;
buf[4]=dis/10000%10;
buf[5]=dis/100000;
timflag=0;
pitflag=0;
//PITCFLMT_PITE = 0; //关闭PIT
}
PORT_Update();
PORTB=PORTB&0XF0|buf[0];
PTT_PTT0=0;
delay(10);
PORT_Update();
PORTB=PORTB&0XF0|buf[1];
PORTE_PE3=0;
delay(10);
PORT_Update();
PORTB=PORTB&0XF0|buf[2];
PORTE_PE2=0;
delay(10);
PORT_Update();
PORTB=PORTB&0XF0|buf[3];
PTT_PTT3=0;
delay(10);
PORT_Update();
PORTB=PORTB&0XF0|buf[4];
PTT_PTT2=0;
delay(10);
PORT_Update();
PORTB=PORTB&0XF0|buf[5];
PTT_PTT1=0;
delay(10);
} /* loop forever */
/* please make sure that you never leave main */
}
#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt VectorNumber_Vpit0 PIT0(void) //通道0
{
pitflag++;
PITTF_PTF0=1; //清除PIT定时器0上的超时标志位,防止该位被挂起,为下一次中断发生做准备
}
void interrupt VectorNumber_Vtimch7 TIM7(void)
{
TFLG1_C7F=1;
}
#pragma CODE_SEG DEFAULT
又改了改,,,但是溢出超时设置还是不对 ,,,,:Q:Q:Q |
|