找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2266|回复: 1
打印 上一主题 下一主题
收起左侧

红外遥控小车

[复制链接]
跳转到指定楼层
楼主
ID:290235 发表于 2018-3-10 22:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#ifndef _CONFIG_H
#define _CONFIG_H

/*通用头文件包含*/
#include <STC12C5A60S2.h>
#include<intrins.h>

/*循迹模块相关引脚定义*/
#define P0_PORT P0
sbit D1=P0^0;
sbit D2=P0^1;
sbit D3=P0^2;
sbit D4=P0^3;
sbit D5=P0^4;
sbit D6=P0^5;
sbit D7=P0^6;
sbit D8=P0^7;

/*电机驱动模块相关引脚定义*/
sbit ENA=P1^3;                          //右侧电机使能
sbit IN1=P1^0;                          //右侧电机控制端口
sbit IN2=P1^1;
sbit ENB=P1^4;                          //左侧电机使能
sbit IN3=P1^5;                          //左侧电机控制端口
sbit IN4=P1^6;

/*红外接收头引脚定义*/
sbit Ird=P3^3;

/*晶振频率*/
#define FOSC 11059200UL

/*类型替换*/
typedef unsigned char      uint8;
typedef unsigned short int uint16;
typedef unsigned long int  uint32;
typedef signed char        int8;
typedef signed short int   int16;
typedef signed long int           int32;

#endif

#define _DELAY_C
#include"Config.h"
#include"Delay.h"

/*10ms延时函数*/
void Delay10ms(uint8 tt)
{
  uint8 i, j;
        while(tt--)
        {
                _nop_();
                _nop_();
                i = 108;
                j = 144;
                do
                {
                        while (--j);
                } while (--i);
        }
}

/*100ms延时函数*/
void Delay100ms(uint8 tt)                //@11.0592MHz
{
        uint8 i, j, k;
        while(tt--)
        {
                i = 5;
                j = 52;
                k = 195;
                do
                {
                        do
                        {
                                while (--k);
                        } while (--j);
                } while (--i);
  }
}

/*10us延时函数*/
void Delay10us(void)                //@11.0592MHz
{
        uint8 i;

        _nop_();
        _nop_();
        _nop_();
        i = 24;
        while (--i);
}

#ifndef _DELAY_H
#define _DELAY_H

extern void Delay10ms(uint8 tt);
extern void Delay100ms(uint8 tt);
extern void Delay10us(void);

#ifndef _DELAY_C

#endif
#endif

#define _INFRARED_C
#include"Config.h"
#include"Infrared.h"
#include"main.h"

uint8 IrdCode[4];
bit Irdflag=0;

/*红外按键扫描函数*/
void IrdScan (void)
{
        if (Irdflag)
        {
                Irdflag=0;
                IrdAction (IrdCode[2]);
        }
}
/*配置红外函数*/
void ConfigIrd (void)
{
        Ird=1;               //初始化引脚
        TMOD&=0x0F;         
        TMOD|=0x10;
        TL1=0;               
        TH1=0;
        TR1=0;               
        ET1=0;               //关闭T1中断
        IT1=1;               //设置外部中断1为下降沿触发方式
        EX1=1;               //使能外部1中断
}

/*获取低电平时间函数*/
uint16  GetLowTime (void)
{
        TH1=0;
        TL1=0;
        TR1=1;
        while (!Ird)
        {
                if (TH1>0x40)                              //防止因信号异常导致程序假死在这里
                {
                        break;
                }
        }
        TR1=0;
        return (TH1*256+TL1);
}

/*获取高电平时间函数*/
uint16 GetHighTime (void)
{
        TH1=0;
        TL1=0;
        TR1=1;
        while (Ird)
        {
                if (TH1>0x40)
                {
                        break;
                }
        }
        TR1=0;
        return (TH1*256+TL1);
}

/*外部中断1中断服务函数*/
void ExternalSubroutine (void) interrupt 2
{
        uint16 time;
        uint8 i;
        uint8 j;
       
        time=GetLowTime ();
        if ((time>8755)||(time<7833))
        {
                IE1=0;                                       //清零外部中断1中断标志,防止重复进入中断
                return ;
        }
        time=GetHighTime ();
        if ((time>4608)||(time<3686))
        {
                IE1=0;                                       //清零外部中断1中断标志,防止重复进入中断
                return ;
        }
        for (i=0;i<4;++i)
        {
                for (j=0;j<8;++j)
                {
                        time=GetLowTime ();
                        if ((time>718)||(time<313))
                        {
                                IE1=0;                              //清零外部中断1中断标志,防止重复进入中断
                                return ;
                        }
                        time=GetHighTime ();
                        if ((time<718)&&(time>313))
                        {
                                IrdCode[i]>>=1;
                        }
                        else if ((time>1345)&&(time<1751))
                        {
                                IrdCode[i]>>=1;
                                IrdCode[i]|=0x80;
                        }
                        else
                        {
                                IE1=0;                             //清零外部中断1中断标志,防止重复进入中断
                                return;
                        }
                }
        }
        Irdflag=1;
        IE1=0;                                        //清零外部中断1中断标志,防止重复进入中断
}

#ifndef _INFRARED_H
#define _INFRARED_H

extern void IrdScan (void);
extern void ConfigIrd (void);

#ifndef _INFRARED_C

#endif
#endif

#define _MAIN_C
#include"Config.h"
#include"main.h"
//#include"Delay.h"
#include"PWM.h"

void Self_Tracing (void);
void Stop (void);

/*主函数*/
void main (void)
{       
        InitPCA ();                                          //初始化PWM模块
        EA=1;
        while (1)
        {
                Self_Tracing ();
        }
}

/*慢左转函数*/
void SlowTurnLeft (void)
{
        IN3=0;                                               //左侧停
        IN4=0;
        IN1=0;                                               //右侧运动       
        IN2=1;
        CCAP0L=CCAP0H=0xFF;                                  //占空比
        PCA_PWM0=0x03;
        CCAP1L=CCAP1H=0;                                     //占空比
        PCA_PWM1=0;
}

/*慢右转函数*/
void SlowTurnRight (void)
{
        IN3=0;                                               //左侧运动
        IN4=1;
        IN1=0;                                               //右侧停
        IN2=0;
        CCAP0L=CCAP0H=0;                                     //占空比
        PCA_PWM0=0;
        CCAP1L=CCAP1H=0xFF;                                  //占空比
        PCA_PWM1=0x03;
}

/*快左转函数*/
void FastTurnLeft (void)
{
        IN3=1;                                               //左侧向相反方向运动
        IN4=0;
        IN1=0;                                               //右侧运动       
        IN2=1;
        CCAP0L=CCAP0H=70;                                     //占空比
        PCA_PWM0=0;
        CCAP1L=CCAP1H=70;                                     //占空比
        PCA_PWM1=0;
}

/*快右转函数*/
void FastTurnRight (void)
{
        IN3=0;                                               //左侧运动
        IN4=1;
        IN1=1;                                               //右侧向相反方向运动
        IN2=0;
        CCAP0L=CCAP0H=70;                                     //占空比
        PCA_PWM0=0;
        CCAP1L=CCAP1H=70;                                     //占空比
        PCA_PWM1=0;
}

/*后退函数*/
void Backward (void)
{
        IN1=1;
        IN2=0;
        IN3=1;
        IN4=0;
        CCAP0L=CCAP0H=70;                                     //占空比
        PCA_PWM0=0x00;
        CCAP1L=CCAP1H=70;                                     //占空比
        PCA_PWM1=0x00;
}       

/*前进函数*/
void Forward (void)
{
        IN1=0;
        IN2=1;
        IN3=0;
        IN4=1;
        CCAP0L=CCAP0H=70;                                     //占空比
        PCA_PWM0=0x00;
        CCAP1L=CCAP1H=70;                                     //占空比
        PCA_PWM1=0x00;
}

/*停止函数*/
void Stop (void)
{
        IN1=0;
        IN2=0;
        IN3=0;
        IN4=0;
        CCAP0L=CCAP0H=0xFF;                                    //占空比0%,即低电平,失能
        PCA_PWM0=0x03;
        CCAP1L=CCAP1H=0xFF;                                    //占空比0%,即低电平,失能
        PCA_PWM1=0x03;
}

///*开关函数*/
//void Off_On (void)
//{        
//        if (Switch_Flag)
//        {
//                 Stop ();
//        }
//        Switch_Flag=~Switch_Flag;
//}
//
//void Continue (void)
//{
//        switch (Backup)
//        {
//                case 0x40: SlowTurnLeft ();break;
//                case 0x43: SlowTurnRight ();break;
//                case 0x15: Backward ();break;
//                case 0x09: Forward ();break;
//                case 0x08: FastTurnLeft ();break;
//                case 0x5A: FastTurnRight ();break;
//        }
//}
//
//void IrdAction (uint8 IrdCode)
//{
//        switch (IrdCode)
//        {
//                case 0x45: Off_On ();break;
//                case 0x40: if (Switch_Flag)
//                                   {
//                                                SlowTurnLeft ();
//                                                Backup=IrdCode;
//                                                Pause_Flag=0;
//                                   };break;
//                case 0x43: if (Switch_Flag)
//                                   {
//                                                SlowTurnRight ();
//                                                Backup=IrdCode;
//                                                Pause_Flag=0;
//                                   };break;
//                case 0x15: if (Switch_Flag)
//                                   {
//                                                Backward ();
//                                                Backup=IrdCode;
//                                                Pause_Flag=0;
//                                   };break;
//                case 0x09: if (Switch_Flag)
//                                   {
//                                                Forward ();
//                                                Backup=IrdCode;
//                                                Pause_Flag=0;
//                                   };break;
//                case 0x08: if (Switch_Flag)
//                                   {
//                                                FastTurnLeft ();
//                                                Backup=IrdCode;
//                                                Pause_Flag=0;
//                                   };break;
//                case 0x5A: if (Switch_Flag)
//                                   {
//                                                FastTurnRight ();
//                                                Backup=IrdCode;
//                                                Pause_Flag=0;
//                                   };break;
//                case 0x044: if (Switch_Flag)
//                                   {
//                                                   Pause_Flag=~Pause_Flag;
//                                                if (Pause_Flag)
//                                                {
//                                                        Stop ();
//                                                }
//                                                else
//                                                {
//                                                         Continue ();
//                                                }
//                                   };break;
//                default :break;
//        }
//}

/*循迹函数*/
void Self_Tracing (void)
{       
        switch (P0_PORT)
        {
                case 0x0F:FastTurnLeft ();break;
                case 0x1F:FastTurnLeft ();break;
                case 0x2F:FastTurnLeft ();break;
                case 0x3F:FastTurnLeft ();break;
                case 0x4F:FastTurnLeft ();break;
                case 0x5F:FastTurnLeft ();break;
                case 0x6F:FastTurnLeft ();break;
                case 0x7F:FastTurnLeft ();break;
                case 0x8F:FastTurnLeft ();break;
                case 0x9F:FastTurnLeft ();break;
                case 0xAF:FastTurnLeft ();break;
                case 0xBF:FastTurnLeft ();break;
                case 0xCF:FastTurnLeft ();break;
                case 0xDF:FastTurnLeft ();break;
                case 0xEF:FastTurnLeft ();break;
               
                case 0xF0:FastTurnRight();break;
                case 0xF1:FastTurnRight();break;
                case 0xF2:FastTurnRight();break;
                case 0xF3:FastTurnRight();break;
                case 0xF4:FastTurnRight();break;
                case 0xF5:FastTurnRight();break;
                case 0xF6:FastTurnRight();break;
                case 0xF7:FastTurnRight();break;
                case 0xF8:FastTurnRight();break;
                case 0xF9:FastTurnRight();break;
                case 0xFA:FastTurnRight();break;
                case 0xFB:FastTurnRight();break;
                case 0xFC:FastTurnRight();break;
                case 0xFD:FastTurnRight();break;
                case 0xFE:FastTurnRight();break;
               
                case 0xE7:Forward();break;
                case 0xFF:Stop ();break;
                default :Forward();break;
        }
}

#ifndef _MAIN_H
#define _MAIN_H

//extern void IrdAction (uint8 IrdCode);

#ifndef _MAIN_C

#endif
#endif

#define _PWM_C
#include"Config.h"
#include"PWM.h"

/*配置PCA模块函数,使其工作在PWM模式*/
void InitPCA (void)
{
        CMOD=0x0C;                                    //PCA 计数器脉冲源为11.0592MHz/6溢出
        CCAPM0=0x42;                                  //PWM模块1为普通8位PWM, 无中断
        CCAPM1=0x42;                                  //PWM模块2为普通8位PWM, 无中断
        CCAP0L=CCAP0H=0xFF;                           //初始化时使其(P1^3)输出恒为0
        PCA_PWM0=0x03;
        CCAP1L=CCAP1H=0xFF;                           //初始化时使其(P1^4)输出恒为0
        PCA_PWM1=0x03;
        CR=1;                                         //允许 PCA 计数器计数
}

#ifndef _PWM_H
#define _PWM_H

extern void InitPCA (void);

#ifndef _PWM_C

#endif
#endif

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:291594 发表于 2018-3-14 08:38 | 只看该作者
新来的,看到这个资料,很实用,虽然不懂,但给你点赞!最好能注解一下,谢谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表