【单片机】红外(带检测)

ir.c

#include <reg52.h>
#include "./lcd/lcd.h"

unsigned int irtime = 0;
bit startflag = 0;
bit irok = 0;
bit irprocessok;
unsigned char irdata[33];
unsigned char disdata[8];
unsigned char ircode[8];

#if 0
void display(unsigned char num)
{
    lcd_dis_byte(1,1,num / 10 + '0');
	lcd_dis_byte(1,2,num % 10 + '0');
}
#endif

unsigned char irprocess()
{
    unsigned char i;
	unsigned char j;
	unsigned char k = 1;
	unsigned char temp;
	
	for(j = 0; j < 4; j++)
	{
	    for(i = 0; i < 8; i++)
		{
		    temp >>= 1;
			
			if(irdata[k] > 6)
			{
			    temp += 0x80;
			}
			
			k++;
		}	
		
		ircode[j] = temp;
	}
	
	switch(ircode[2])
	{
		case 0x45:
		case 0x46:
		case 0x47:
		case 0x44:
		case 0x40:
		case 0x43:
		case 0x07:
		case 0x15:
		case 0x09:
		case 0x19:
		case 0x0d:
		case 0x16:
		{
			return 0;
			break;
		}
		case 0x0c:
		{
			return 1;
			break;
		}
		case 0x18:
		{
			return 2;
		}
		case 0x5e:
		{
			return 3;
		}
		case 0x8:
		{
			return 4;
		}
		case 0x1c:
		{
			return 5;
		}
		case 0x5a:
		{
			return 6;
		}
		case 0x42:
		{
			return 7;
		}
		case 0x52:
		{
			return 8;
		}
		case 0x4a:
		{
			return 9;
		}
		default:
		{
			return 0xff;
		}
	}
	
	irprocessok = 1;
	return 0xff;
}

void lcd_display()
{
    unsigned char i;
	unsigned char x = 1;
	unsigned char y = 1;
	
	for(i = 0; i < 4; i++)
	{
	    if((ircode[i] / 16) > 9)
		{
		    lcd_dis_byte(x,y,ircode[i] / 16 + 0x37);
		}
		else
		{
		    lcd_dis_byte(x,y,ircode[i] / 16 + 0x30);
		}
		
		if((ircode[i] % 16) > 9)
		{
		    lcd_dis_byte(x,y + 1,ircode[i] % 16 + 0x37);
		}
		else
		{
		    lcd_dis_byte(x,y + 1,ircode[i] % 16 + 0x30);
		}
		
		y = y + 3;
	}
}

void timer0_init()
{
    EA = 1;
	TMOD |= 0x02;    //8位自动重装方式 TH0 = 0 , TL0 = 0
	TH0 = 0;
	TL0 = 0;         //256us = 0.256ms
	ET0 = 1;
	TR0 = 1;
}

void timer0_isr() interrupt 1
{
    irtime++;
}

void int0_init()
{
    EA = 1;
	IT0 = 1;          //下降沿触发
	EX0 = 1;
}

void int0_isr() interrupt 0
{
    static unsigned char bitnum = 0;
	
    if(1 == startflag)    //不是第一次进外部中断 13.5 / 0.256 = 53
	{
	    if((irtime > 40) && (irtime < 60))
		{
            bitnum = 0;
		}
		
		irdata[bitnum] = irtime;
		bitnum++;
		irtime = 0;
		
		if(33 == bitnum)
		{
		    irok = 1;
			bitnum = 0;
			startflag = 0;
		}
	}
	else
	{
		startflag = 1;
		irtime = 0;
	}
}

void main()
{
    unsigned char keynum;
    timer0_init();
	int0_init();
	lcd_init();
	
	while(1)
	{
	    if(1 == irok)
		{
		    irok = 0;

            keynum = irprocess();
			
			if(0xff != keynum)
			{
				lcd_display();
			}
		}
	}
}

lcd.c

#include <reg52.h>
#include "../delay/delay.h"
#include "lcd.h"

/*====================================================
                 判断写入命令/数据函数
=====================================================*/
void lcd_write(unsigned char byte, unsigned char flag)
{
    if(flag)
	{
	    RS = 1;        //选择数据寄存器
	}
	else
	{
	    RS = 0;        //选择指令寄存器
	}
	
	RW = 0;            //写
	E = 1;             //选中LCD
	LCDPORT = byte;
	delay_us(5);       //稳定
	E = 0;             //失能LCD
}

/*====================================================
                    LCD初始化函数
=====================================================*/
void lcd_init()
{
    delay_ms(15);
	lcd_write(0x38,LCD_WRITE_COM);    //显示8位数据接口,两行显示,5*7点阵字符
	delay_ms(5);
	lcd_write(0x38,LCD_WRITE_COM);
	delay_ms(5);
	lcd_write(0x38,LCD_WRITE_COM);
	delay_ms(5);
	lcd_write(0x38,LCD_WRITE_COM);
	delay_ms(5);
	lcd_write(0x08,LCD_WRITE_COM);    //关闭显示,关闭光标的闪烁
	delay_ms(5);
	lcd_write(0x01,LCD_WRITE_COM);    //清屏
	delay_ms(5);
	lcd_write(0x06,LCD_WRITE_COM);    //设置指针方式,画面不平移
	delay_ms(5);
	lcd_write(0x0c,LCD_WRITE_COM);    //打开显示
	delay_ms(5);
}

/*====================================================================================
                                 写入字符函数
函数原型:void lcd_dis_byte(unsigned char x, unsigned char y, unsigned char byte);
说明:x为行(1——2),y为列(1——8)。
=====================================================================================*/
void lcd_dis_byte(unsigned char x, unsigned char y, unsigned char byte)
{
    unsigned char add;
	
    if(((0 == x) || (x > 2)) || ((0 == y) || (y > 16)))
	{
	    return ;
	}
	
    add = 0x80 + (x - 1) * 0x40 + (y - 1);
	
	lcd_write(add,LCD_WRITE_COM);	     
	lcd_write(byte,LCD_WRITE_DATA);
}

#if 0
/*====================================================================================
                                  写入字符串函数
函数原型:void lcd_dis_str(unsigned char x, unsigned char y, unsigned char *disdata);
说明:x为行(1——2),y为列(1——8)。
=====================================================================================*/
void lcd_dis_str(unsigned char x, unsigned char y, unsigned char *disdata)
{
    unsigned char add;
	
    if(((0 == x) || (x > 2)) || ((0 == y) || (y > 16)))
	{
	    return ;
	}
	
    add = 0x80 + (x - 1) * 0x40 + (y - 1);
	lcd_write(add,LCD_WRITE_COM);
	
    while(*disdata != '\0')
	{	    
	    lcd_write(*disdata,LCD_WRITE_DATA);
		disdata++;
	}
}


/*===========================================================================
                                时间显示函数
============================================================================*/
void lcd_dis_time()
{
    lcd_write(0x80 + 4,LCD_WRITE_COM);
	lcd_write((hour / 10) + 0x30,LCD_WRITE_DATA);
	lcd_write((hour % 10) + 0x30,LCD_WRITE_DATA);
	lcd_write((min / 10) + 0x30,LCD_WRITE_DATA);
	lcd_write((min % 10) + 0x30,LCD_WRITE_DATA);
	lcd_write((sec / 10) + 0x30,LCD_WRITE_DATA);
	lcd_write((sec % 10) + 0x30,LCD_WRITE_DATA);
}
#endif

delay.c

/*==============================================
                  us延时函数
延时时间:time = 2 * t + 12
===============================================*/
void delay_us(unsigned char t)
{
    while(--t);
}

/*==============================================
                  ms延时函数
===============================================*/
void delay_ms(unsigned char t)
{
    while(t--)
    {
        delay_us(245);
        delay_us(245);
    }
}

#if 0
/*==============================================
                  s延时函数
===============================================*/
void delay_s(unsigned char t)
{
    while (t--)
    {
        delay_ms(200);
        delay_ms(200);
        delay_ms(200);
        delay_ms(200);
        delay_ms(200);
    }
}
#endif

delay.h

#ifndef _DELAY_H_
#define _DELAY_H_

extern void delay_us(unsigned char t);

extern void delay_ms(unsigned char t);

extern void delay_s(unsigned char t);

#endif

lcd.h

#ifndef _LCD_H_
#define _LCD_H_

#define LCDPORT P0
#define LCD_WRITE_DATA 1
#define LCD_WRITE_COM 0

sbit RS = P2^4;
sbit RW = P2^5;
sbit E = P2^6;

extern void lcd_write(unsigned char byte, unsigned char flag);
extern void lcd_init();
extern void lcd_dis_str(unsigned char x, unsigned char y, unsigned char *disdata);
extern void lcd_dis_byte(unsigned char x, unsigned char y, unsigned char byte);
extern void lcd_dis_time();

#endif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值