⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gsm-

📁 GSM室温监控系统
💻
字号:
/*********************************************
		Writed By XianQiYuan
			2009.11.5
	小毛@SCUT Electronic Engineering
*********************************************/
#ifndef _RED_INCLUDED_
#define _RED_INCLUDE
#include "common.h"
sbit RDATA=P3^2;  	//红外接口
uchar key=255;  	//红外摇控的键值,无键按下时为255

uchar redchange(uchar rednum);

//红外初始化
void Red_Init(void)
{
	RDATA=1;		//P3^2输出高电平	
	EX0=1;			//开启红外中断 P3^2
}

//检测脉冲宽度
uchar check(void)
{
    uchar t=0;uchar a=0;
    while(RDATA)
    {
        t++;
		for(a=0;a<4;a++);	//
        if(t==250)return t; //超时溢出
    }
    return t;
}     
/*-------------------------协议--------------------------
开始拉低9ms,接着是一个4.5ms的高脉冲,通知器件开始传送数据了
接着是26位前导脉冲,用于识别该型号的摇控。
然后是发送8位数据的原码,接着又发送8位数据的反码.
最后是一个长脉冲,和开始位一样,拉低9ms和一个4.5ms脉冲表示结束。
每个按键不同这处只在于那8位数据的原码和反码,因些只须要识别
8位原码就可以识别按键了
---------------------------------------------------------*/
/****** 外部中断0服务程序,按键处理 ******/
void exter0() interrupt 0	
{ 
    uchar res=0; uint aa=0;           
    bit OK=0; 
    bit RODATA=0; 
    while(1)
    {        
        if(RDATA)//有高脉冲出现
        {
            res=check();//获得此次高脉冲宽度     
            if(res==250)break;//非有用信号
            if(res>=200&&res<250)OK=1; //获得前导位(4.5ms) 
            
            else if(res>=70&&res<100)  //如果是宽脉冲,则RODATA=1
            {
                aa++;
                RODATA=1;//1.5ms                
            }
            else if(res>=10&&res<50)  //如果是窄脉冲,则RODATA=0      
            {
                aa++;
                RODATA=0;//500us              
            }
            //舍去26位前导脉冲,从第27位开始接着的8位是数据的正码,再后8位是反码
            //获取正码
            if(OK&&(aa>=27)&&(aa<35))
            {
                key<<=1;
                key=key+(uchar)RODATA;
            } 
            if(aa==42) 
            {
                key=redchange(key);
            } 

        }    
    } 
}  
//经测试:KD-29的全部解码如下(正码)
//静音:104   电源:72   数字1:128   数字2:64
//数字3:192   数字4:32   数字5:160  数字6:96
//数字7:224   数字8:16  数字9:144
//-/--:80    数字0:0    交替:88
//SLEEP:56   S.SYS:248   CALL:216
//P.P:152    TV/AV:208
//上:200    下:232    左:40     右:8
//MENU:24  SCAN:240   GAME:48
  
//把红外数据进行转换
uchar redchange(uchar rednum)
{
    switch(rednum)
    {
        case 0  :return 0;
        case 128:return 1;
        case 64 :return 2;
        case 192:return 3;
        case 32 :return 4;
		case 160:return 5;
        case 96 :return 6;
        case 224:return 7;
        case 16 :return 8;
        case 144:return 9;
        case 200:return 10;//上
        case 232:return 11;//下
        case 40 :return 12;//左
        case 8  :return 13;//右
        case 24 :return 14;//MENU 
        case 104:return 15;//静音  
        case 80 :return 16;//-/--  
        case 208:return 17;//TV/AV  
        case 240:return 18;
    }
}      

#endif                  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -