注册会员
- 积分
- 15
- 威望
- 10
- 贡献
- 5
- 兑换币
- 4
- 注册时间
- 2017-10-11
- 在线时间
- 0 小时
- 毕业学校
- 西南交通大学
|
/*---------------------------------------------------------*/
/************************************************************
飞翔科技MC9S12XS128智能车开发平台
E-mail: 2008f.d@163.com
淘宝店:http://fxfreefly.taobao.com
************************************************************/
/*---------------------------------------------------------*/
#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */
#include "OLED.h"
#define BUS_CLOCK 32000000 //总线频率,改变总线频率直接在此处修改
#define OSC_CLOCK 16000000 //晶振频率
#define TRIG1 PTM_PTM6
#define ECHO1 PTIH_PTIH2
#define TRIG1_dir DDRM_DDRM6
#define ECHO1_dir DDRH_DDRH2
unsigned int a,b;
unsigned int k=0;
unsigned int distance1; //障碍物的距离,单位cm
/*************************************************************/
/* 初始化锁相环 */
/*************************************************************/
void INIT_PLL(void)
{
CLKSEL &= 0x7f; //set OSCCLK as sysclk
PLLCTL &= 0x8F; //Disable PLL circuit
CRGINT &= 0xDF;
#if(BUS_CLOCK == 40000000)
SYNR = 0x44;
#elif(BUS_CLOCK == 32000000)
SYNR = 0x43;
#elif(BUS_CLOCK == 24000000)
SYNR = 0x42;
#endif
REFDV = 0x81; //PLLCLK=2×OSCCLK×(SYNDIV+1)/(REFDIV+1)=64MHz ,fbus=32M
PLLCTL =PLLCTL|0x70; //Enable PLL circuit
asm NOP;
asm NOP;
while(!(CRGFLG&0x08)); //PLLCLK is Locked already
CLKSEL |= 0x80; //set PLLCLK as sysclk
}
/************************************************************/
/* 初始化ECT模块 */
/************************************************************/
void initialize_ect(void){
TSCR1_TFFCA = 1; // 定时器标志位快速清除
TSCR1_TEN = 1; // 定时器使能位. 1=允许定时器正常工作; 0=使主定时器不起作用(包括计数器)
TIOS = 0xff; //指定所有通道为输出比较方式
TCTL1 = 0x00; // 后四个通道设置为定时器与输出引脚断开
TCTL2 = 0x00; // 前四个通道设置为定时器与输出引脚断开
TIE = 0x00; // 禁止所有通道定时中断
TSCR2 = 0x07; // 预分频系数pr2-pr0:111,,时钟周期为4us,
TFLG1 = 0xff; // 清除各IC/OC中断标志位
TFLG2 = 0xff; // 清除自由定时器中断标志位
}
/*************************************************************/
/* 初始化超声波函数 */
/*************************************************************/
void init_CS(void)
{
TRIG1_dir=1;
ECHO1_dir=0;
TRIG1=0;
}
/*************************************************************/
/* 通过超声波模块测距 */
/*************************************************************/
void chufa_CS1(void)
{
a=TCNT;
TRIG1=1; //产生触发信号
for(;;)
{
if(TCNT-a>=3) //信号持续12us
break;
}
TRIG1=0;
while(ECHO1==0); //等待返回信号
a=TCNT;
while(ECHO1==1)
{
if(TCNT-a>1470) //所测距离大于1米
break;
}
b=TCNT-a; //计算测距的时长
//b的单位为4us
//则距离可以表达为4*b*0.000001*340*100/2cm
distance1=17*b/250;
}
/*************************************************************/
/* 在OLED上显示数据 */
/*************************************************************/
void play_data(void)
{
unsigned char temp[8];
if(distance1>=100)
{
temp[0]='>';
temp[1]='=';
temp[2]='1';
temp[3]='0';
temp[4]='0';
temp[5]='c';
temp[6]='m';
temp[7]=0;
}
else
{
temp[0]=distance1/10+48;
temp[1]=distance1%10+48;
temp[2]='c';
temp[3]='m';
temp[4]=' ';
temp[5]=' ';
temp[6]=' ';
temp[7]=0;
}
OLED_6x8Str(18,3,temp);
}
/*************************************************************/
/* 主函数 */
/*************************************************************/
void main(void)
{
DisableInterrupts;
INIT_PLL();
initialize_ect();
OLED_Init();
init_CS();
EnableInterrupts;
OLED_PutString(0, 0, "飞翔科技开发板"); //显示16x16汉字
OLED_6x8Str(0,3,"d1:");
TFLG1_C7F = 1; //清除标志位
TC7 = TCNT + 2500; //设置输出比较时间为10ms
for(;;)
{
if(TFLG1_C7F==1)
{
TFLG1_C7F = 1; //清除标志位
TC7 = TCNT + 2500; //设置输出比较时间为10ms
k+=1;
if(k>=4)
{
k=0;
chufa_CS1();
play_data();
}
}
}
}
|
|