📄 main.c
字号:
#include <hidef.h> /* common defines and macros */
#include <MC9S12XS128.h> /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12xs128"
/*********************************************************
宏定义
*********************************************************/
#define Signal PORTA //信号采集
#define Sensor PWMDTY1 //传感器驱动信号
#define Speed PWMDTY3 //速度控制
#define Direction PWMDTY67 //方向控制
#define Mainsignal PORTB_PB7 //中间的传感器
#define Brake PORTB_PB1 //制动信号
#define LowSpeed1 35
#define LowSpeed2 30
#define HighSpeed1 55
#define HighSpeed2 50
#define uchar unsigned char
#define uint unsigned int
/********************************************************
全局变量定义
********************************************************/
/************************************************************
子函数申明
************************************************************/
void Pwminitial(void); //PWM初始化函数
void SystemInitial(); //系统初始化
void Start(); //启动
void Gostraight(); //直线
void LeftTurn(); //左转
void RightTurn(); //右转
void Derailment(); //出轨
void CrossDail(); //交叉
void delay(uint time); //延时
/*************************************************************
主函数开始
*************************************************************/
void main(void)
{
SystemInitial(); //系统初始化
Start(); //启动
for(;;)
{
if(Mainsignal==0&&Signal==0XFF) //判断中间传感器是否在黑线上
Gostraight(); //中间传感器在黑线上,走直线
else if(Signal==0XEF||Signal==0XDF||Signal==0XBF||Signal==0X7F) //小车偏右
LeftTurn(); //左转
else if(Signal==0XF7||Signal==0XFB||Signal==0XFD||Signal==0XFE) //小车偏左
RightTurn(); //右转
else if(Signal==0XFF) //小车出轨
Derailment(); //出轨处理
else if(Signal==0X00) //遇到十字路口
CrossDail(); //处理交叉情况
}
EnableInterrupts;
for(;;) {} /* wait forever */
/* please make sure that you never leave this function */
}
/************************************************************
子函数定义
************************************************************/
void SystemInitial() //系统初始化
{
Pwminitial();
DDRA=0X00; //PORTA设置为输入
DDRB_DDRB1=1; //制动信号位设置为输出
DDRB_DDRB7=0; //中间传感器设置为输入
Direction=1500; //控制舵机转角的占空比寄存器,初始化时输出高电平时间为1.5ms,舵机处于平衡位置;
Speed=0; //控制速度的占空比寄存器,占空比初始为0 Duty is 50%,and PWM waveform's frequent is 16
Sensor=49; //控制发射管驱动脉冲的寄存器,占空比初始为50% Duty is 50%,and PWM waveform's frequent is 16
Brake=0; //关闭刹车信号
}
void Start() //启动
{
static uchar i;
for(i=0;Speed<30;i++) //起始时让速度逐渐增加
{
Speed+=5;
delay(1);
}
}
void Gostraight() //直线
{
Direction=1500; //舵机处于平衡位置
Speed=HighSpeed1; //速度为最高速度
}
void LeftTurn() //左转
{
if(Signal==0XEF)
{
Direction=1410;
Speed=LowSpeed1;
} else if(Signal==0XDF)
{
Direction=1320;
Speed=LowSpeed1;
} else if(Signal==0XBF)
{
Direction=1060;
Speed=LowSpeed2;
} else if(Signal==0X7F)
{
Direction=1000;
Speed=LowSpeed2;
}
}
void RightTurn() //右转
{
if(Signal==0XF7)
{
Direction=1590;
Speed=LowSpeed1;
} else if(Signal==0XFB)
{
Direction=1780;
Speed=LowSpeed1;
} else if(Signal==0XFD)
{
Direction=1940;
Speed=LowSpeed2;
} else if(Signal==0XFE)
{
Direction=2000;
Speed=LowSpeed2;
}
}
void Derailment() //出轨
{
Brake=1; //刹车
}
void CrossDail() //交叉
{
Direction=1500; //舵机处于平衡位置
Speed=LowSpeed2; //速度为低速度
}
void Pwminitial(void) //PWM初始化函数
{
PWMCTL_CON67=1; //6和7联合成16位PWM;
PWMPOL=0X8A; //PWMPOL是PWM极性选择寄存器。输出波形开始极性为1 output waveform which high first then low when the duty counter is reached
PWMCAE=0x00; //PWMCAE是PWM波形对齐寄存器。左对齐输出模式 output left align waveform
PWMCLK=0X0A; //PWMCLK是PWM时钟选择寄存器。PWM时钟源为ClockSA SAClock SA is the clock source for PWM channel 1
PWMPRCLK=0X33; //PWMPRCLK是PWM预分频寄存器。将总线时钟8分频
//Clock A is 8MHz/8=1MHz;Clock B is 8MHz/8=1MHz,
PWMSCLA=0X09; //PWMSCLA是分频寄存器。时钟SA为1MHz/9/2 Clock SA is 1MHz/9/2=56KHz
PWMSCLB=0X01; //PWMSCLB是分频寄存器。时钟SB为1MHz/1/2 Clock SB is 1MHz/1/2=500KHz
PWMPER67 = 20000; //周期20ms; 50Hz;(可以使用的范围:50-200hz)
PWMPER3=99; //PWMPER3是PWM通道周期寄存器。设定输出周期=通道时钟周期*100
PWMPER1=99; //PWMPER0是PWM通道周期寄存器。设定输出周期=通道时钟周期*100
PWME=0X8A; //使能通道67,1,3
}
void delay(uint time)
{
static uint i,j,k;
for(i=time;i>0;i--)
for(j=1000;j>0;j--)
for(k=1000;k>0;k--);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -