51单片机红外遥控小风车

今天结束了51单片机的学习,明天开始学习stm32
我是学习江科大的视频一步一步完成的 ,他讲的非常好,非常好 特别通俗易懂
学习复刻他的作品我也自己创作了一些
但是现在暂时脱离这块板子了
以后可能会更新一个应用51单片机制作的智能小车
我特别想开一个小车的坑 谢谢大家

main.c

#include <REGX52.H>
#include "Delay.h"
#include "Key.h"
#include "Nixie.h"
#include "Motor.h"
#include "IR.h"unsigned char Command,Speed;void main()
{Motor_Init();IR_Init();while(1){if(IR_GetDataFlag())   //如果收到数据帧{Command=IR_GetCommand();     //获取遥控器命令码if(Command==IR_0){Speed=0;}        //根据遥控器命令码设置速度if(Command==IR_1){Speed=1;}if(Command==IR_2){Speed=2;}if(Command==IR_3){Speed=3;}if(Speed==0){Motor_SetSpeed(0);}  //速度输出if(Speed==1){Motor_SetSpeed(50);}if(Speed==2){Motor_SetSpeed(75);}if(Speed==3){Motor_SetSpeed(100);}}Nixie(1,Speed);                        //数码管显示速度}
}

Delay.c

void Delay(unsigned int xms)
{unsigned char i, j;while(xms--){i = 2;j = 239;do{while (--j);} while (--i);}
}

Delay.h

#ifndef __DELAY_H__
#define __DELAY_H__void Delay(unsigned int xms);#endif

Key.c

#include <REGX52.H>
#include "Delay.h"/*** @brief  获取独立按键键码* @param  无* @retval 按下按键的键码,范围:0~4,无按键按下时返回值为0*/
unsigned char Key()
{unsigned char KeyNumber=0;if(P3_1==0){Delay(20);while(P3_1==0);Delay(20);KeyNumber=1;}if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);KeyNumber=2;}if(P3_2==0){Delay(20);while(P3_2==0);Delay(20);KeyNumber=3;}if(P3_3==0){Delay(20);while(P3_3==0);Delay(20);KeyNumber=4;}return KeyNumber;
}

Key.h

#ifndef __KEY_H__
#define __KEY_H__unsigned char Key();#endif

Nixie.c

#include <REGX52.H>
#include "Delay.h"unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};void Nixie(unsigned char Location,Number)
{switch(Location){case 1:P2_4=1;P2_3=1;P2_2=1;break;case 2:P2_4=1;P2_3=1;P2_2=0;break;case 3:P2_4=1;P2_3=0;P2_2=1;break;case 4:P2_4=1;P2_3=0;P2_2=0;break;case 5:P2_4=0;P2_3=1;P2_2=1;break;case 6:P2_4=0;P2_3=1;P2_2=0;break;case 7:P2_4=0;P2_3=0;P2_2=1;break;case 8:P2_4=0;P2_3=0;P2_2=0;break;}P0=NixieTable[Number];Delay(1);P0=0x00;
}

Nixie.h

#ifndef __NIXIE_H__
#define __NIXIE_H__void Nixie(unsigned char Location,Number);#endif

Timer1.c

#include <REGX52.H>/*** @brief  定时器1初始化,100us@12.000MHz* @param  无* @retval 无*/
void Timer1_Init(void)
{TMOD &= 0x0F;     //设置定时器模式TMOD |= 0x10;     //设置定时器模式TL1 = 0x9C;       //设置定时初值TH1 = 0xFF;        //设置定时初值TF1 = 0;       //清除TF1标志TR1 = 1;      //定时器1开始计时ET1=1;EA=1;PT1=0;
}/*定时器中断函数模板
void Timer1_Routine() interrupt 3
{static unsigned int T1Count;TL1 = 0x9C;       //设置定时初值TH1 = 0xFF;        //设置定时初值T1Count++;if(T1Count>=1000){T1Count=0;}
}
*/

Timer1.h

#ifndef __TIMER1_H__
#define __TIMER1_H__void Timer1_Init(void);#endif

Motor.c

#include <REGX52.H>
#include "Timer1.h"//引脚定义
sbit Motor=P1^0;unsigned char Counter,Compare;/*** @brief  电机初始化* @param  无* @retval 无*/
void Motor_Init(void)
{Timer1_Init();
}/*** @brief  电机设置速度* @param  Speed 要设置的速度,范围0~100* @retval 无*/
void Motor_SetSpeed(unsigned char Speed)
{Compare=Speed;
}//定时器1中断函数
void Timer1_Routine() interrupt 3
{TL1 = 0x9C;       //设置定时初值TH1 = 0xFF;        //设置定时初值Counter++;Counter%=100;  //计数值变化范围限制在0~99if(Counter<Compare)  //计数值小于比较值{Motor=1;        //输出1}else              //计数值大于比较值{Motor=0;        //输出0}
}

Motor.h

#ifndef __MOTOR_H__
#define __MOTOR_H__void Motor_Init(void);
void Motor_SetSpeed(unsigned char Speed);#endif

Int0.c

#include <REGX52.H>/*** @brief  外部中断0初始化* @param  无* @retval 无*/
void Int0_Init(void)
{IT0=1;IE0=0;EX0=1;EA=1;PX0=1;
}/*外部中断0中断函数模板
void Int0_Routine(void) interrupt 0
{}
*/

Int0.h

#ifndef __INT0_H__
#define __INT0_H__void Int0_Init(void);#endif

Timer0.c

#include <REGX52.H>/*** @brief  定时器0初始化* @param  无* @retval 无*/
void Timer0_Init(void)
{TMOD &= 0xF0;     //设置定时器模式TMOD |= 0x01;     //设置定时器模式TL0 = 0;      //设置定时初值TH0 = 0;       //设置定时初值TF0 = 0;       //清除TF0标志TR0 = 0;      //定时器0不计时
}/*** @brief  定时器0设置计数器值* @param  Value,要设置的计数器值,范围:0~65535* @retval 无*/
void Timer0_SetCounter(unsigned int Value)
{TH0=Value/256;TL0=Value%256;
}/*** @brief  定时器0获取计数器值* @param  无* @retval 计数器值,范围:0~65535*/
unsigned int Timer0_GetCounter(void)
{return (TH0<<8)|TL0;
}/*** @brief  定时器0启动停止控制* @param  Flag 启动停止标志,1为启动,0为停止* @retval 无*/
void Timer0_Run(unsigned char Flag)
{TR0=Flag;
}

Timer0.h

#ifndef __TIMER0_H__
#define __TIMER0_H__void Timer0_Init(void);
void Timer0_SetCounter(unsigned int Value);
unsigned int Timer0_GetCounter(void);
void Timer0_Run(unsigned char Flag);#endif

IR.c

#include <REGX52.H>
#include "Timer0.h"
#include "Int0.h"unsigned int IR_Time;
unsigned char IR_State;unsigned char IR_Data[4];
unsigned char IR_pData;unsigned char IR_DataFlag;
unsigned char IR_RepeatFlag;
unsigned char IR_Address;
unsigned char IR_Command;/*** @brief  红外遥控初始化* @param  无* @retval 无*/
void IR_Init(void)
{Timer0_Init();Int0_Init();
}/*** @brief  红外遥控获取收到数据帧标志位* @param  无* @retval 是否收到数据帧,1为收到,0为未收到*/
unsigned char IR_GetDataFlag(void)
{if(IR_DataFlag){IR_DataFlag=0;return 1;}return 0;
}/*** @brief  红外遥控获取收到连发帧标志位* @param  无* @retval 是否收到连发帧,1为收到,0为未收到*/
unsigned char IR_GetRepeatFlag(void)
{if(IR_RepeatFlag){IR_RepeatFlag=0;return 1;}return 0;
}/*** @brief  红外遥控获取收到的地址数据* @param  无* @retval 收到的地址数据*/
unsigned char IR_GetAddress(void)
{return IR_Address;
}/*** @brief  红外遥控获取收到的命令数据* @param  无* @retval 收到的命令数据*/
unsigned char IR_GetCommand(void)
{return IR_Command;
}//外部中断0中断函数,下降沿触发执行
void Int0_Routine(void) interrupt 0
{if(IR_State==0)              //状态0,空闲状态{Timer0_SetCounter(0); //定时计数器清0Timer0_Run(1);         //定时器启动IR_State=1;             //置状态为1}else if(IR_State==1)      //状态1,等待Start信号或Repeat信号{IR_Time=Timer0_GetCounter();   //获取上一次中断到此次中断的时间Timer0_SetCounter(0);  //定时计数器清0//如果计时为13.5ms,则接收到了Start信号(判定值在12MHz晶振下为13500,在11.0592MHz晶振下为12442)if(IR_Time>12442-500 && IR_Time<12442+500){IR_State=2;          //置状态为2}//如果计时为11.25ms,则接收到了Repeat信号(判定值在12MHz晶振下为11250,在11.0592MHz晶振下为10368)else if(IR_Time>10368-500 && IR_Time<10368+500){IR_RepeatFlag=1;   //置收到连发帧标志位为1Timer0_Run(0);     //定时器停止IR_State=0;         //置状态为0}else                    //接收出错{IR_State=1;         //置状态为1}}else if(IR_State==2)     //状态2,接收数据{IR_Time=Timer0_GetCounter(); //获取上一次中断到此次中断的时间Timer0_SetCounter(0);  //定时计数器清0//如果计时为1120us,则接收到了数据0(判定值在12MHz晶振下为1120,在11.0592MHz晶振下为1032)if(IR_Time>1032-500 && IR_Time<1032+500){IR_Data[IR_pData/8]&=~(0x01<<(IR_pData%8));    //数据对应位清0IR_pData++;          //数据位置指针自增}//如果计时为2250us,则接收到了数据1(判定值在12MHz晶振下为2250,在11.0592MHz晶振下为2074)else if(IR_Time>2074-500 && IR_Time<2074+500){IR_Data[IR_pData/8]|=(0x01<<(IR_pData%8));  //数据对应位置1IR_pData++;          //数据位置指针自增}else                 //接收出错{IR_pData=0;         //数据位置指针清0IR_State=1;          //置状态为1}if(IR_pData>=32)        //如果接收到了32位数据{IR_pData=0;          //数据位置指针清0if((IR_Data[0]==~IR_Data[1]) && (IR_Data[2]==~IR_Data[3]))    //数据验证{IR_Address=IR_Data[0];  //转存数据IR_Command=IR_Data[2];IR_DataFlag=1;    //置收到连发帧标志位为1}Timer0_Run(0);        //定时器停止IR_State=0;         //置状态为0}}
}

IR.h

#ifndef __IR_H__
#define __IR_H__#define IR_POWER        0x45
#define IR_MODE         0x46
#define IR_MUTE         0x47
#define IR_START_STOP   0x44
#define IR_PREVIOUS     0x40
#define IR_NEXT         0x43
#define IR_EQ           0x07
#define IR_VOL_MINUS    0x15
#define IR_VOL_ADD      0x09
#define IR_0            0x16
#define IR_RPT          0x19
#define IR_USD          0x0D
#define IR_1            0x0C
#define IR_2            0x18
#define IR_3            0x5E
#define IR_4            0x08
#define IR_5            0x1C
#define IR_6            0x5A
#define IR_7            0x42
#define IR_8            0x52
#define IR_9            0x4Avoid IR_Init(void);
unsigned char IR_GetDataFlag(void);
unsigned char IR_GetRepeatFlag(void);
unsigned char IR_GetAddress(void);
unsigned char IR_GetCommand(void);#endif

【【51单片机红外遥控小风车】】相关推荐

  1. 基于51单片机红外遥控人体感应自动车库门控制设计(程序+Proteus仿真+原理图+PCB图+参考论文+开题报告+任务书等)

    一.硬件方案 单片机的红外遥控人体感应自动门控制系统设计的实现主要有电源5V供电.单片机最小系统.红外感应遥控模块,红外一体接收头,按键电路,步进电机驱动电路,指示灯电路组成.. 二.设计功能 1.如 ...

  2. 63、基于51单片机红外遥控人体感应自动门控制系统设计

    毕设帮助.开题指导.技术解答(有偿)见文末. 目录 摘要 一.硬件方案 二.设计功能 三.实物图 四.原理图 五.PCB图 六.Protues仿真 七.程序 部分代码 八.资料包括 摘要 伴随着电气技 ...

  3. 基于51单片机+红外遥控解码+LCD1602显示

    红外遥控解码(NEC) 基本介绍 什么是红外线? 红外线系统的组成 发射管和接收管 红外遥控发射(载波频率) 重要介绍 NEC协议 数据格式(必看) 位定义(必看) 编写程序思路(2种) 方式一 方式 ...

  4. 51单片机——红外遥控 C语言入门编程

    目录 红外发射装置: NEC码: 红外接收设备: 1.红外遥控:数码管上显示红外解码遥控器键值 红外遥控方法一:外部中断+延时 2.红外遥控:红外遥控控制LCD1602画面上的值 红外遥控方法二:外部 ...

  5. 51单片机 驱动步进电机 C语言 lcd,51单片机红外遥控控制步进电机的LCD显示源程序...

    /******************************************************************************* * 实验名              ...

  6. (毕业设计资料)基于51单片机红外无线遥控智能家电控制系统设计

    基于51单片机红外遥控定时开关智能家电插座设计 本系统由STC8C52单片机电路+时钟DS1302电路+LCD1602液晶显示电路+按键电路+继电器控制电路+蜂鸣器报警电路+红外传感器电路+电源电路组 ...

  7. 51单片机红外通信及控制LED灯(LCD1602显示)

    51单片机红外通信及控制LED灯(LCD1602显示) 大家好,又和大家见面了,离上一次DS18B20传感器的文章已经过去了一个星期了,这期我将给大家带来,基于STC89C52芯片和HS0038红外接 ...

  8. 51单片机红外电子密码锁【红外对管矩阵键盘数码管LCD1602显示模块】

    系统功能 51单片机红外电子密码锁系统主要由红外线编码电路.红外线解码开锁电路.掉电保护电路.声光提示报警电路.键盘及显示电路等组成,编写相应的程序代码并进行结果测试和仿真演示. 利用红外遥控技术和单 ...

  9. 51单片机-红外计算器

    51单片机-红外计算器 1.硬件:普中-A2开发板 使用哪些硬件资源? 1.1.LCD1602液晶显示器 1.2.红外接收头 1.3.红外遥控器 2.软件介绍: 2.1.共分为8个.c文件. 2.1. ...

最新文章

  1. 路易斯·罗森伯格与「群体智能」
  2. Hadoop详解(九):Hadoop Streaming和Pipes原理和实现
  3. pytorch载入预训练模型后,训练指定层
  4. 【转】Linux将composer的bin目录放到PATH环境变量中
  5. LeetCode 1247. 交换字符使得字符串相同
  6. web浏览器_Web上的分享(Share)API
  7. C语言逻辑填空题——审问嫌疑犯
  8. iOS 14惊现iPhone 12 Pro设计图细节:大失所望!
  9. 洛谷 P1074 靶形数独 Label:search 不会
  10. 《统计学习方法》——朴素贝叶斯法
  11. 我来谈谈为啥企业QQ下线
  12. Head First Java 中文版 (第 2 版) PDF 下载
  13. edittext 内容长度
  14. 迅雷thunder://协议解密
  15. “System.ComponentModel.Win32Exception配额不足,无法处理此命令。”问题
  16. 为什么女程序员那么少,我觉得程序员应该是最适合女性的职位
  17. php实现简单的留言板
  18. iOS中内存管理方案
  19. 买车容易行路难-买车
  20. 坚果云和百度云的对比

热门文章

  1. hosts文件修改,重启生效
  2. 教你用css做好看的轮播图
  3. Vue路由传递params参数
  4. Web前端程序设计作业--天安门
  5. C++两个函数可以相互递归吗_C语言(7)- 递归
  6. 数据库四级知识点总结
  7. (无坑、直接的C++小代码)空间三点计算平面方程参数
  8. android 预置 app,AOSP 预置 APP
  9. 找出让硬盘狂转的元凶
  10. CUFFS超经典作品推荐 アメサラサ ~雨と、不思議な君に、恋をする~ (下载,介绍,攻略,存档)