如何用单片机51.或者52,采集格力空调红外码值?

2024-02-04 12:50

本文主要是介绍如何用单片机51.或者52,采集格力空调红外码值?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

问题来源:

请看下列链接:

格力空调红外编码解析

在了解前。需知道啥是红外?了解基本原理等。

好了,直接上我的代码;仅供参考,如不能正常接收空调红外数值,勿喷!

main.c

#include "reg52.h"			 //此文件中定义了单片机的一些特殊功能寄存器
#include <stdio.h>
typedef unsigned int u16;	  //对数据类型进行声明定义
typedef unsigned char u8;sbit IRIN=P3^2;u8 IrValue1[6];
u8 IrValue2[6];
u8 Time;//add
unsigned char Sec;
u8 thirty_five_data_flag=0;
bit flag_Ir;                         //红外接收完成标志位//延时函数,i=1时,大约延时10us
void delay(u16 i)
{while(i--);	
}void delay7us(void)   //误差 0us @12.0 Mhz
{unsigned char a;for(a=1;a>0;a--);
}
void delay100us(void)   //误差 0us @12.0 Mhz
{unsigned char a,b;for(b=19;b>0;b--)for(a=1;a>0;a--);
}void delay8ms(void)   //误差 0us @12.0 Mhz
{unsigned char a,b;for(b=205;b>0;b--)for(a=18;a>0;a--);
}//add
void DelayMS(unsigned int xms)
{unsigned char i, j;while(xms--){i = 2;j = 239;do{while (--j);} while (--i);}
}
void delay20ms(void)   //误差 0us
{unsigned char a,b;for(b=215;b>0;b--)for(a=45;a>0;a--);
}/*** @brief  串口初始化,4800bps@12.000MHz* @param  无* @retval 无*/
void UART_Init()
{SCON=0x40;PCON |= 0x80;TMOD &= 0x0F;		//设置定时器模式TMOD |= 0x20;		//设置定时器模式TL1 = 0xF3;		//设定定时初值TH1 = 0xF3;		//设定定时器重装值ET1 = 0;		//禁止定时器1中断TR1 = 1;		//启动定时器1
}/*** @brief  串口发送一个字节数据* @param  Byte 要发送的一个字节数据* @retval 无*/
void UART_SendByte(unsigned char Byte)
{SBUF=Byte;while(TI==0);TI=0;
}// void UsartInit()
// {
// 	SCON=0X50;			//设置为工作方式1
// 	TMOD|=0X20;			//设置计数器工作方式2
// 	PCON|=0X80;			//波特率加倍
// 	TH1=0XF3;			//计数器初始值设置,注意波特率是4800的
// 	TL1=0XF3;
// //	ES=1;				//打开接收中断
// //	EA=1;				//打开总中断
// 	TR1=1;				//打开计数器
// }void IrInit()
{IT0=1;//下降沿触发EX0=1;//打开中断0允许EA=1;	//打开总中断IRIN=1;//初始化端口flag_Ir = 0;                         //初始化接收完成标志位 add
}int main()
{		int i= 0;int j= 0;	UART_Init();			//串口初始化IrInit();while(1){if(Sec < 6){UART_SendByte(Sec);	//串口发送一个字节Sec++;				//Sec自增DelayMS(1000);		//延时1秒}if(flag_Ir){flag_Ir = 0;UART_SendByte(IrValue1[i]);UART_SendByte(IrValue1[i++]);UART_SendByte(IrValue1[i++]);UART_SendByte(IrValue1[i++]);UART_SendByte(IrValue1[i++]);UART_SendByte(IrValue2[j]);UART_SendByte(IrValue2[j++]);UART_SendByte(IrValue2[j++]);UART_SendByte(IrValue2[j++]);Sec = 0;i = 0;j = 0;}}return 0;
}void ReadIr() interrupt 0
{u8 j,k;u16 err;EA = 0;//addTime = 0;					 //delay(700);	//延时7ms,为判断9ms低电平起始码做准备delay8ms();//延时8ms,为判断9ms低电平起始码做准备if(IRIN==0)	//确认是否真的接收到正确的信号{//err=1000;//1000*10us=10ms,超过说明接收到错误的信号err=500;//500*10us=5ms,超过说明接收到错误的信号/*当两个条件都为真是循环,如果有一个条件为假的时候跳出循环,免得程序出错的时侯,程序死在这里*/	while((IRIN==0)&&(err>0))	//等待前面9ms的低电平过去  		{//delay(1);delay100us();err--;} if(IRIN==1)	//如果正确等到9ms低电平{err=500;while((IRIN==1)&&(err>0))	//等待4.5ms的起始高电平过去{//delay(1);delay100us();err--;}//35位数据码for(k=0;k<5;k++){for(j=0;j<8;j++){if(thirty_five_data_flag == 35){thirty_five_data_flag = 0;break;}thirty_five_data_flag++;err = 60;while ((IRIN == 0) && (err > 0)){delay100us();err--;}err = 500;while ((IRIN == 1) && (err > 0)){delay100us();Time++;err--;if(Time > 50){break;}}IrValue1[k] >>= 1;if(Time >= 8)IrValue1[k] |= 0x80;Time = 0;}}//add  connect code ....test2 -----------------//连接码:646us低电平 + 20000us高电平;err = 60;while((IRIN==0)&&(err>0))//等待信号前面的646us低电平过去{delay100us();err--;}err = 1980;while((IRIN==1)&&(err>0)){err--;}//add 32 位数据for(k=0;k<4;k++){for(j=0;j<8;j++){err = 60;while ((IRIN == 0) && (err > 0)){delay100us();err--;}err = 500;while ((IRIN == 1) && (err > 0)){delay100us();Time++;err--;if(Time > 50){EA = 1;break;}}IrValue2[k] >>= 1;if(Time >= 8)IrValue2[k] |= 0x80;Time = 0;}}}if(IrValue1[2] = ~IrValue1[3]){flag_Ir =1;}}EA  =1;			//add
}

以上代码;波特率4800, 使用STC52单片机,测试某空调红外遥控打印红外码值 成功。

代码逻辑是:接到红外码值后,打印5秒1.2.3.4.5,然后关闭打印  ,循坏

参考链接:

【智能电表】格力空调遥控器红外协议icon-default.png?t=M276https://blog.csdn.net/qq1518572311/article/details/8074750838KHz,NEC红外模拟发送和接收程序icon-default.png?t=M276https://www.1024sou.com/article/218998.html

这篇关于如何用单片机51.或者52,采集格力空调红外码值?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/677570

相关文章

day-51 合并零之间的节点

思路 直接遍历链表即可,遇到val=0跳过,val非零则加在一起,最后返回即可 解题过程 返回链表可以有头结点,方便插入,返回head.next Code /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}*

基于51单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机

认知杂谈52

今天分享 有人说的一段争议性的话 I I 1拓展人脉很重要** 咱们活在这世上啊,得明白一件事儿,知识、逻辑能力和实战经验虽然重要,但确实都不是最关键的。真正关键的是要懂得怎么和那些手里有资源的人打交道。人脉那可真是一笔无形的大财富呢。你想想看,有时候一个有影响力的人帮你一把,那效果可比你累死累活干一年都强得多。 I I 就比如说,你要是认识个行业里的大牛,他可能给你介绍个特别好的工

单片机毕业设计基于单片机的智能门禁系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍程序代码部分参考 设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订

Verybot之OpenCV应用一:安装与图像采集测试

在Verybot上安装OpenCV是很简单的,只需要执行:         sudo apt-get update         sudo apt-get install libopencv-dev         sudo apt-get install python-opencv         下面就对安装好的OpenCV进行一下测试,编写一个通过USB摄像头采

代码训练营 Day26 | 47.排序II | 51. N-皇后 |

47.排序II 1.跟46题一样只不过加一个树层去重 class Solution(object):def backtracking(self,nums,path,result,used):# recursion stopif len(path) == len(nums):# collect our setresult.append(path[:])return for i in range(

基于stm32的河流检测系统-单片机毕业设计

文章目录 前言资料获取设计介绍功能介绍具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机设计精品

代码随想录训练营day37|52. 携带研究材料,518.零钱兑换II,377. 组合总和 Ⅳ,70. 爬楼梯

52. 携带研究材料 这是一个完全背包问题,就是每个物品可以无限放。 在一维滚动数组的时候规定了遍历顺序是要从后往前的,就是因为不能多次放物体。 所以这里能多次放物体只需要把遍历顺序改改就好了 # include<iostream># include<vector>using namespace std;int main(){int n,m;cin>>n>>m;std::vector<i

VB和51单片机串口通信讲解(只针对VB部分)

标记:该篇文章全部搬自如下网址:http://www.crystalradio.cn/thread-321839-1-1.html,谢谢啦            里面关于中文接收的部分,大家可以好好学习下,题主也在研究中................... Commport;设置或返回串口号。 SettingS:以字符串的形式设置或返回串口通信参数。 Portopen:设置或返回串口

MCU5.51单片机的最小系统

1.最小系统的组成部分 晶振电路(时钟),复位电路,电源电路(控制电压,保持稳定),下载电路(外加的,用于烧录程序) 烧录: 通过下载电路,把程序下载到单片机中用于运行 2.晶振电路 电路图: 是晶振 是电容 为了防止晶振起振时产生影响,因此加电容 3.复位电路 电路图: 按按钮RSTK1(保持一段时间的高电平)即可实现STC芯片的复位 4.电源电路 电路图: