📄 main.c
字号:
#include <hidef.h> /* for EnableInterrupts macro */
#include "MC68HC908JL3.h" /* include peripheral declarations */
#define MiddleLight PTD_PTD5 /* 前进方向指示灯控制变量 */
#define LeftLight PTD_PTD4 /* 左转方向指示灯控制变量 */
#define RightLight PTD_PTD2 /* 右转方向指示灯控制变量 */
#define On 0 /* 指示灯为共阳接法 */
#define Off 1 /* 指示灯为共阳接法 */
#define True 1 /* */
#define False 0 /* */
#define SoundControl PTD_PTD0 /* 蜂鸣器的控制变量 */
#define LA PTA_PTA3 /* 左电机LA */
#define LB PTA_PTA2 /* 左电机LB */
#define RA PTD_PTD7 /* 右电机LA */
#define RB PTD_PTD6 /* 右电机LB */
#define FrontSensor PTA_PTA5//PTA_PTA5 /* 前端传感器,0:有障碍物 */
#define BackSensor PTB_PTB0 /* 后端传感器,0:有障碍物 */
#define FrontLeftInfrared PTB_PTB1 /* 左前红外传感器,0:有障碍物 */
#define FrontRightInfrared PTB_PTB2 /* 右前红外传感器,0:有障碍物 */
#define FrontMiddleInfrared PTB_PTB3 /* 右后红外传感器,0:有障碍物 */
#define BackLeftInfrared PTB_PTB4 /* 左后红外传感器,0:有障碍物 */
//定义变量=================================================================
uchar cont_10ms; //为得到10ms时间平台计数器
uchar AD_buf;//保存AD转换值
//蜂鸣器相关变量==========================================================
uchar beef_daley;//响蜂鸣持续时间
uchar beef_figer;//响蜂鸣器标记
uchar beef_time; //设置响蜂鸣器次数的变量
//=======================================================================
uchar ch;
uint flag1;
uint flag2;
uchar FlagRun;
uchar a[7];
uchar run_mode;
//遥控相关的变量===========================================================
uchar rest_time;//遥控接收时间计数器计数时间平台0.125ms
uchar rxtime_buf;//暂存遥控接收时间计数器数据的变量
uchar rx_figer; //头码接收标记
uchar RCV_STEP; //接收阶段
uchar RCV_CONT; //接收数据位数计数变量
uchar rx_data;//遥控返回的得到内码
uchar RCV_BUF[4]={0};//接收数据缓冲数组
uchar RCV_CODE[9]={0x1a,0x13,0x0a,0x0b,0x0f,0x02,0xfc,0x0e,0x12 };//查遥控内码表
//以下为用户程序编写区 ============================================================
//初始化AD==================================================================
void initAd(void)
{
ADICLK = 0x30; //设置AD转换器的时钟源及分频系数
ADSCR=ch; //设置AD转换器的启动,中断允许及转换通道
}
//AD管理=====================================================================
void AD_porm(void) //每次调用该函数则启动一次AD转换,该AD通道为1
{ initAd();
for(;;)
{
if(0x80==(ADSCR&0x80)) //等待转换结束
{ a[ch-1]=ADR; //将AD转换得到值保存在AD_buf里
ch++;
if(ch>7)
ch=1;
break;
}
}
}
//蜂鸣器管理================================================================
void beef_conr(void)
{ if(beef_daley==0) //若蜂鸣器工作时间结束,
{ if(beef_figer==1)//若已响过蜂鸣则要关掉蜂器
{
beef_daley=20;//送蜂鸣器间隔时间
beef_figer=0;//清响蜂鸣器标记
}
else
{if(beef_time>0)//若前面没有响蜂鸣且还没有达到要响次数则继续响
{beef_figer=1; //允许响蜂鸣器
beef_time--; //响的次数减1
beef_daley=20;//响蜂鸣器的时间
}
}
}
}
//溢出中断==================================================================
interrupt 6 void Timer_Interrupt(void)
{
TSC=TSC&0x7f; //清溢出中断标记
TMODH = 0;
TMODL = 250;
rest_time++;
if(rest_time>159)
{ rx_figer=0;
RCV_STEP=0;
RCV_CONT=0;
rest_time=0;
}
//蜂鸣器驱动===========================================
if(beef_figer==1)
PTD=PTD^1;//对PTD的第0位引脚取反产生振荡信号
else
PTD=PTD&0xfe;
//=====================================================
cont_10ms++; //为得到10ms计数器,每隔0.125ms计数一次
if(cont_10ms>79)
{
//10ms时间平台====================================
cont_10ms=0;
if(beef_daley>0)
beef_daley--; //对自减响蜂鸣的时间
/****************************************/
flag1++;
flag2++;
if(flag1 < 100) {
FlagRun = 1;
}
else if(flag1 < 300) {
FlagRun = 0;
} else if(flag1 < 600){
FlagRun = 3;
} else if(flag1 < 900){
FlagRun = 4;
}
else{
FlagRun = 0;
}
/****************************************/
}
}
//外中断=====================================================================
//外中断主要负责遥控接收每按一次遥控器键盘时返回一个遥控内码保存在rx_data变量里
interrupt 2 void IRQ_Interrupt(void)
{
char i;
rxtime_buf=rest_time;
rest_time=0;
if(rx_figer&1)
{ if((rxtime_buf>4)&&(rxtime_buf<23))
{ if(rxtime_buf<=13)
{
RCV_CONT++;
RCV_BUF[RCV_STEP]=RCV_BUF[RCV_STEP]>>1;
RCV_BUF[RCV_STEP]=RCV_BUF[RCV_STEP]|0x80;
}
else
if(rxtime_buf>=14)
{
RCV_BUF[RCV_STEP]=RCV_BUF[RCV_STEP]>>1;
RCV_BUF[RCV_STEP]=RCV_BUF[RCV_STEP]&0x7f;
RCV_CONT++;
}
if(RCV_CONT==8)
{
RCV_STEP++;
RCV_CONT=0;
}
if(RCV_STEP>3)
{
rx_figer=0;
RCV_STEP=0;
RCV_CONT=0;
for(i=0;i<10;i++)
{ if(RCV_BUF[3]==RCV_CODE[i])
{
beef_time=1;
rx_data=i;
break;
}
}
;
}
}
}
else
{ if((rxtime_buf>104)&&(rxtime_buf<112))
{
rx_figer=1;
RCV_STEP=0;
RCV_CONT=0;
}
}
}
//外中断初始化=============================================================
void init_IRQ(void)
{ INTSCR=0x00;//设置外中断信号为下降沿触发
}
//定时器初始化==============================================================
void InitTimer(void)
{
TMODH = 0; //设置定时器预置寄存器的高8位值为0
TMODL = 250; //设置定时器预置寄存器的低8位值为250
TSC=0x40; //
}
//软件延时==================================================================
void daley(int x)
{
int c;
for(c=0;c<x;c++)
;
}
//MCU初始化================================================================
void MCU_init(void)
{ CONFIG1=1;
PTD=0x00;
PTB=0xff;
PTA=0;
DDRA=0xff;
DDRD=0xff; //PTD口作为输出
DDRB=0x00; //PTB口作为输入
InitTimer(); //定时器初始化
init_IRQ();
EnableInterrupts//开总断
}
//=========================================================================
/********* 停止模块 ***********/
void RunStop(void)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -