找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于stc8系列单片机的红外解码程序

[复制链接]
跳转到指定楼层
楼主
ID:370605 发表于 2022-11-30 01:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


/**********************************************************************

LCD1602显示  rs P3^5  rw P3^6  ep P3^7  P0口 为数据输出口
1838的数据采集口为3.2口 为外部中断

***********************************************************************/



#include "stc8.h"

#define u8 unsigned char
#define u16  unsigned int

int i;

//void delay(uchar x);  //x*0.14MS

sbit IRIN = P3^2;         //红外接收器数据线

u8 IRCOM[7];

sbit rw=P3^6;    //1602 IO口定义  这里用的数据口是P0口
sbit rs=P3^5;
sbit ep=P3^7;

unsigned char code d[] =       {"  IR-CODE: --H  "};
unsigned char code cdis1[] =   {"  51 hei "};

unsigned char code a[] ={                       //汉字
0x04,0x1f,0x15,0x1f,0x15,0x1f,0x05,0x07,    //电
0x0f,0x02,0x04,0x1f,0x04,0x04,0x14,0xc,     //子
0x04,0x1f,0x15,0x1f,0x15,0x1f,0x05,0x07,    //电
0x0f,0x02,0x04,0x1f,0x04,0x04,0x14,0xc };   //子





/**************************** 延时函数 ***********************************/
void delay(unsigned int a)
{
while(a--);
}


void delay1(unsigned char x)    //x*0.14MS
{
unsigned char i;
  while(x--)
{
  for (i = 0; i<13; i++) {}
}
}



/*************************************************************************************/

/*************************************************************************************/

/*****************************     1602    *******************************************/
u8 lcd_busy()               //查忙 这部很重要 否则有的显示容易出现乱码                                             
{                                                                          
    u8 result;                                                            
    rs = 0;                                                            
    rw = 1;                                                            
    ep = 1;                                                            
    delay(50);                                                            
     result = P0&0x80;                                             
    ep = 0;                                                            
    return result;             //返回值                                            
}  







void lcd_com(unsigned char com)//  地址
{
while(lcd_busy());
rs=0;
ep=0;
rw=0;
P0=com;
delay(50);
ep=1;
delay(50);
ep=0;
}


void lcd_date(unsigned char date)//采集输出数据
{
while(lcd_busy());
rs=1;   //1是些数据 0是写指令
rw=0;    // 1是读  0是写
ep=0;    //E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令      
P0=date;
delay(5);
ep=1;
delay(5);
ep=0;
}



void lcd_pos(unsigned char pos)                                                   
{                                                                          
   lcd_com(pos|0x80);      //数据指针=80+地址变量                     
}     




void  writetab()             //  写 汉字函数
{  
    unsigned char m;
    lcd_com(0x40);            //写CGRAM  此处是指令
    for (m = 0; m< 32; m++)      
    lcd_date(a[m]);


}



void init()//1602初始化
{

lcd_com(0x38);
delay(50);                                                              
lcd_com(0x38);
delay(50);

lcd_com(0x38);
delay(50);
lcd_com(0x0c);
delay(50);
lcd_com(0x06);
delay(50);
lcd_com(0x01);

delay(1000);


writetab() ;        //   汉字初始化


}

/*******************************************************************************/
/*******************************************************************************/
/*******************************************************************************/




void hanzi()        //汉字显示
{

lcd_pos(0x00);      
lcd_date(0x00);

lcd_pos(0x01);
lcd_date(0x01);




}


/************************************************************************/



void IR_IN() interrupt 0
{
  unsigned char j,k,N=0;
     EX0 = 0;   
        // delay1(15);
     delay1(120);
         if (IRIN==1)
     { EX0 =1;
           return;
          }
                           //确认IR信号出现
  while (!IRIN)            //等IR变为高电平,跳过9ms的前导低电平信号。
    {delay1(8);}

for (j=0;j<4;j++)         //收集四组数据
{
  for (k=0;k<8;k++)        //每组数据有8位
  {
   while (IRIN)            //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
     {delay1(8);}
    while (!IRIN)          //等 IR 变为高电平
     {delay1(8);}
     while (IRIN)           //计算IR高电平时长
      {
    delay1(8);
    N++;           
    if (N>=30)
         { EX0=1;
         return;}                  //0.14ms计数过长自动离开。
      }                        //高电平计数完毕               
     IRCOM[j]=IRCOM[j] >> 1;                  //数据最高位补“0”
     if (N>=8)
      {IRCOM[j] = IRCOM[j] | 0x80;}  //数据最高位补“1”
     N=0;
  }
}

   if (IRCOM[2]!=~IRCOM[3])
   { EX0=1;
     return; }

   IRCOM[5]=IRCOM[2] & 0x0F;     //取键码的低四位
   IRCOM[6]=IRCOM[2] >> 4;       //右移4次,高四位变为低四位

   if(IRCOM[5]>9)
    { IRCOM[5]=IRCOM[5]+0x37;}
   else
          IRCOM[5]=IRCOM[5]+0x30;

   if(IRCOM[6]>9)
    { IRCOM[6]=IRCOM[6]+0x37;}
   else
          IRCOM[6]=IRCOM[6]+0x30;

     lcd_pos(0x4b);              
     lcd_date(IRCOM[6]);        //第一位数显示
     lcd_pos(0x4c);            
     lcd_date(IRCOM[5]);
    EX0 = 1;
}



/**********************************************************/







void main(void)
{  

    IE = 0x81;                 //允许总中断中断,使能 INT0 外部中断
    TCON = 0x01;               //触发方式为脉冲负边沿触发

    IRIN=1;                    //I/O口初始化


    init();                   //1602初始化

    hanzi() ;                 //显示汉字


delay(100);
lcd_pos(0x00);
i=0;
while(cdis1[i]!='\0')         //显示字母
{
lcd_date(cdis1[i]);
i++;
}

delay(100);
lcd_pos(0x40);
i=0;
while(d[i]!='\0')         //显示字母
{
lcd_date(d[i]);
i++;
}

while(1);


}






void test1()
{ unsigned char a,b,c;


   if(a>b)
     {
       c=0;

     }
   else

     {
      c=1;
     }

}

void test2()
{
while(i<10)
{
i=i+1;
}
}




评分

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

查看全部评分

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

使用道具 举报

沙发
ID:1054812 发表于 2022-11-30 16:44 | 只看该作者
正好在学习红外遥控,谢谢楼主
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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