找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STC8A8K64单片机+H1838红外解码程序

[复制链接]
跳转到指定楼层
楼主

  1.                                                  
  2. /*

  3. 此次开发 利用STC8A平台全面方面 实现了51单片机 学习 实验 设计 等功能

  4. 下面是接口整体介绍
  5. TFT驱动IC为  ILI9341

  6. tft
  7. 控制线:RS-P3^5;    WR-P3^6;   RD-P3^7;   CS-P4^4;   RST-P4^3
  8. 数据线: P7口低八位数据端口  P0口高八位数据端口(两个数据口都以选用 不可做其他)

  9. 触摸xpt2046
  10. SPI总线  MOSI-P2^3  MISO-P2^4  SCLK-P2^5
  11. CS-P6^2   PENIRQ-P6^3

  12.      红外解码实验
  13.      红外采用P3.2中断0口 读取H1838传来的红外信息并将其进行解码
  14.          
  15.          NEC 码的位定义:一个脉冲对应560us 的连续载波,
  16.          逻辑1 应该是560us 低+1680us 高,
  17.          逻辑0 应该是560us 低+560us 高。
  18.      
  19.          NEC 遥控指令的数据格式为:同步码头、地址码、地址反码、控制码、控制反码。
  20.          同步码 由一个9ms 的低电平和一个4.5ms 的高电平组成,地址码、地址反码、控制码、
  21.          控制反码均是 8  位数据格式。

  22.     具体解码过程请参考资料
  23.                     
  24. */


  25. #include  "stc8.h"                          //STC头文件
  26. #include  "def.h"                              //宏定义 常用函数
  27. #include  "delay.h"                                  //延时函数
  28. #include  "tft.h"                              //TFT IC底层驱动
  29. #include  "gui.h"
  30. #include  "xpt2046.h"
  31. #include  "spi.h"
  32. #include  "h1838.h"



  33. //真对 STC8A系列 IO口初始化
  34. //除P3 P5口外 其他IO默认准双向IO口 所以当用的P3 P5口是要进行初始化一下   
  35. void IO_init(void)
  36. {
  37.   P3M0 = 0X00;
  38.   P3M1 = 0X00;

  39.   P5M0 = 0X00;
  40.   P5M1 = 0X00;
  41. }





  42. void main()
  43. {         
  44.         IO_init();                                    //IO口初始化
  45.         Lcd_Init();                 //tft初始化
  46.         Init_SPI();                             //SPI初始化
  47.         GUI_Clear(White);                        //白色清屏
  48.     GUI_sprintf_hzstr16x(0,0,"infrared decoding test",White,1);
  49.     GUI_sprintf_hzstr16x(0,18,"IR-CODE: --H",Red,White);

  50.         hongw();                                         //红外解码测试函数

  51.           
  52. }

复制代码




#include  "stc15f2k60s2.h"
#include  "delay.h"
#include  "tft.h"
#include  "gui.h"
#include  "xpt2046.h"
#include  "h1838.h"
#include  "gui.h"



u8 ma[2];                              //红外解码数据
u8 hong=0;                                  //红外 标志位

void hongw(void)
{
   IT0=1;                            //边沿触发   
   EX0=1;               //外部中断0   P3.2口
   EA   = 1;            // 开总中断   

   while(1)
   {

    if(hong==1)                  //判断标志位 是否数据更新
    {
       GUI_sprintf_char(73,16,ma[0],White,Blue,0);                                  //显示解码值
       GUI_sprintf_char(81,16,ma[1],White,Blue,0);

           hong=0;              //清标志位等待下一次接收
     }  
   }

}




/////////////////////////////////
//////////////////////////////////
//红外解码  外部P32口边沿触发中断
//同步码 由一个9ms 的低电平和一个4.5ms 的高电平组成
//逻辑1 是560us 低+1680us 高,逻辑0 是560us 低+560us 高
void IR_IN() interrupt 0   
{
     u8 j,k,N=0;
     u8 IRCOM[4];
   EX0 = 0;                      //进入中断后关闭中断 进行解码
   delay_us(7700);                   //24M下大约7ms延时        9ms低电平前 检测P32状态
   if (IRIN==1)                    //如果非0 说明红外错误 返回
   { EX0 =1;
           return;
    }
                           //确认IR信号出现
   while(!IRIN);            //等IR变为高电平,跳过9ms的前导低电平信号。   

   for (j=0;j<4;j++)         //收集四组数据
   {
    for (k=0;k<8;k++)        //每组数据有8位
    {
     while (IRIN);            //等 IR 变为低电平,如果是第一次采集跳过4.5ms高电平信号。

     while (!IRIN);          //等 IR 变为高电平

     while (IRIN)            //计算IR高电平时长  犹豫单片机的运行 存在着计算时间
     {
       delay_us(280);      //27M下大约300+us
       N++;           
       if(N>=30)
            { EX0=1;                   //开中断
             return;}          //0.14ms计数过长自动离开。
     }                      //高电平计数完毕                 
     IRCOM[j]=IRCOM[j] >> 1;      //数据最高位补“0”
     if (N>=6)
     {IRCOM[j]=IRCOM[j] | 0x80;}  //数据最高位补“1”
     N=0;
    }
   }
   if (IRCOM[2]!=~IRCOM[3])        //控制码 控制反码进行比对 如果错误跳出
   { EX0=1;return; }

   ma[1]=IRCOM[2] & 0x0F;      //取键码的低四位
   ma[0]=IRCOM[2] >> 4;        //右移4位 取高四位值

   if(ma[1]>9)
     ma[1]=ma[1]+0x37;                    //A 从65开始 十六进制为0x41
   else
         ma[1]=ma[1]+0x30;

   if(ma[0]>9)
     ma[0]=ma[0]+0x37;
   else
         ma[0]=ma[0]+0x30;
   hong=1;                //打开标志位
   EX0 = 1;                           //开中断

}

Keil代码下载: 红外解码.zip (214.92 KB, 下载次数: 35)

评分

参与人数 1黑币 +30 收起 理由
admin + 30 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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