📄 main.c
字号:
#include <hidef.h> /* common defines and macros */
#include <mc9s12dg128.h> /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"
/**********************************/
/* 车速模块 */
/**********************************/
void Motor_init(void)
{
DDRM_DDRM4=1;//设置M口4引脚为输出
PTM_PTM4=1;//先将M口4脚设为高电平
//设置PP3
DDRP_DDRP3=1;//设置P口3脚为输出
PTP_PTP3=0;//设置3脚为低电平,如果2脚为高电平,则正转
//先将PP2置为低电平
DDRP_DDRP2=1;
PTP_PTP2=0;
//设置PP2为方波输出模式
PWMCAE_CAE2=0;//选择模式为左对齐
PWMCNT2=0;//计数器清零
PWMPOL_PPOL2=1;//先输出高电平
PWMPRCLK_PCKB=3;//clockB8分频,即为1MHz
PWMCLK_PCLK2=0;//选择B为时钟源
PWMPER2=255;//
PWME_PWME2=0;//不允许2输出脉冲
}
void Motor_set(byte n_motor)
{
PWMDTY2=n_motor; //设置高电平时间
PWME_PWME2=1;//允许2输出脉冲
}
/**********************************/
/* 伺服模块 */
/**********************************/
void Servo_init(void)
{
PWMCTL_CON01=1;//0与1通道联合成16位PWM
PWMCAE_CAE1=0;//选择模式为左对齐
PWMCNT01=0;//计数器清零
PWMPOL_PPOL1=1;//先输出高电平
PWMPRCLK_PCKA=0;//clockA二分频,即为8MHz
PWMSCLA=4;//clockSA8分频,clockSA=1MHz
PWMCLK_PCLK1=1;//选择SA为时钟源
PWMPER01=20000;//周期为20ms,50Hz
PWMDTY01=1520;//高电平时间为1520us,大于左转,小于右转
PWME_PWME1=1;//允许1输出脉冲
}
void Servo_set(word n_servo)
{
PWMDTY01=n_servo;
}
/**********************************/
/* 路况采集模块 */
/**********************************/
struct
{
byte led0;
byte led1;
byte led2;
byte led3;
byte led4;
byte led5;
byte led6;
byte led7;
byte led8;
byte led9;
byte led10;
byte led11;
}road={1,1,1,1,1,1,1,1,1,1,1,1};
void Led_init()
{
DDRH_DDRH7=0; //LED0定义为输入
DDRH_DDRH6=0; //LED1
DDRH_DDRH5=0; //LED2
DDRH_DDRH4=0; //LED3
DDRJ_DDRJ1=0; //LED4
DDRJ_DDRJ0=0; //LED5
DDRK_BIT5=0; //LED6
DDRK_BIT4=0; //LED7
DDRK_BIT3=0; //LED8
DDRK_BIT2=0; //LED9
DDRK_BIT1=0; //LED10
DDRK_BIT0=0; //LED11
}
void Led_get()
{
road.led0=PTH_PTH7;
road.led1=PTH_PTH6;
road.led2=PTH_PTH5;
road.led3=PTH_PTH4;
road.led4=PTJ_PTJ1;
road.led5=PTJ_PTJ0;
road.led6=PORTK_BIT5;
road.led7=PORTK_BIT4;
road.led8=PORTK_BIT3;
road.led9=PORTK_BIT2;
road.led10=PORTK_BIT1;
road.led11=PORTK_BIT0;
}
void Led_on()
{
DDRM_DDRM0=1;//设置0为输出
PTM_PTM0=1;//设为高电平,开三极管
}
void Led_off()
{
PTM_PTM0=0;//关三极管
}
/**********************************/
/* 时间中断模块 */
/**********************************/
void Timer_init(void)
{
MCCTL_MCEN=1; //开启减法计数器
MCCTL_MODMC=1; //减到零后自动置位,循环计数方式
MCCTL_MCZI=1; //允许减法计数器中断
MCCTL_MCPR=2;//总线8分频,即为1MHz
MCCNT=1000;//1ms溢出一次,触发一次中断
MCFLG=0X80;//清空中断标志寄存器
}
/**********************************/
/* 主程序 */
/**********************************/
byte bstart=1;
byte demand=0;
void main(void)
{
byte speed_motor=100;//电机速度
word angle_servo=1520;//舵机转动角度
DDRM_DDRM6=0; //调试用
Motor_init();
Servo_init();
Led_init();
Timer_init();
EnableInterrupts;//允许中断
while(bstart) ;//延时两秒
while(1)
{
if(demand)
{
if(road.led0==1) {speed_motor=50; angle_servo=1570;}
if(road.led1==1) {speed_motor=60; angle_servo=1560;}
if(road.led2==1) {speed_motor=70; angle_servo=1550;}
if(road.led3==1) {speed_motor=80; angle_servo=1540;}
if(road.led4==1) {speed_motor=90; angle_servo=1530;}
if(road.led5==1) {speed_motor=100;angle_servo=1520;}
if(road.led6==1) {speed_motor=100;angle_servo=1520;}
if(road.led7==1) {speed_motor=90; angle_servo=1510;}
if(road.led8==1) {speed_motor=80; angle_servo=1500;}
if(road.led9==1) {speed_motor=70; angle_servo=1490;}
if(road.led10==1){speed_motor=60; angle_servo=1480;}
if(road.led11==1){speed_motor=50; angle_servo=1470;}
demand=0;
Motor_set(speed_motor);
Servo_set(angle_servo);
}
if(PTM_PTM6==1) {while(PTM_PTM6);Motor_set(1);MCCTL_MCZI=0; } //测试用
}
}
/**********************************/
/* 中断程序 */
/**********************************/
#pragma CODE_SEG NON_BANKED
interrupt 26 void timer_interrupt(void)
{
static word timecnt=0;
static byte time=1;
timecnt++;
if(time) //这段的作用是暂停两秒
{
if(timecnt==2000)
{
DDRB=0xFF;
PORTB=0;
bstart=0;
time=0;timecnt=0;
Led_on();//Led开启
}
}
if(!time) //这段的作用是每40ms采集一次路面数据
{
if(timecnt==40)
{
DDRB=0xFF;
PORTB=0xFF;
Led_get();
timecnt=0;
demand=1;//开始数据处理
}
}
MCFLG=0x80;
}
#pragma CODE_SEG DEFAULT
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -