51单片机红外遥控程序是什么?

51单片机红外遥控程序是什么?,第1张

#include\x0d\x0a#include\x0d\x0a#define uchar unsigned char\x0d\x0a#define uint unsigned int\x0d\x0asbit lcden = P2^7\x0d\x0asbit lcdrs = P2^6\x0d\x0asbit lcdwr = P2^5\x0d\x0asbit IR = P3^2\x0d\x0auchar IRCOM[6]//数组,用于存储红外编码\x0d\x0auchar code table1[] = "remote control"\x0d\x0auchar code table2[] = "CODE:"\x0d\x0avoid delayms(uchar x)// 延时x*0.14ms\x0d\x0a{\x0d\x0auchar i\x0d\x0awhile(x--)\x0d\x0afor(i=0i//延时xms\x0d\x0a{\x0d\x0auchar i,j\x0d\x0afor(i=xi>0i--)\x0d\x0afor(j=110j>0j--)\x0d\x0a}\x0d\x0a/****************************LCD部分***********************************************/\x0d\x0avoid write_com(uchar com)\x0d\x0a{\x0d\x0alcden = 0\x0d\x0alcdrs = 0\x0d\x0alcdwr = 0\x0d\x0aP0 = com\x0d\x0adelay(5)\x0d\x0alcden = 1\x0d\x0adelay(5)\x0d\x0alcden = 0//别忘了lcden拉低\x0d\x0a}\x0d\x0avoid write_date(uchar date)\x0d\x0a{\x0d\x0alcden = 0\x0d\x0alcdrs = 1\x0d\x0alcdwr = 0\x0d\x0aP0 = date\x0d\x0adelay(5)\x0d\x0alcden = 1\x0d\x0adelay(5)\x0d\x0alcden = 0\x0d\x0a}\x0d\x0avoid lcd_init(void)\x0d\x0a{\x0d\x0alcden = 0\x0d\x0alcdrs = 0\x0d\x0alcdwr = 0\x0d\x0adelay(5)\x0d\x0awrite_com(0x38)\x0d\x0awrite_com(0x0c)\x0d\x0awrite_com(0x06)\x0d\x0awrite_com(0x01)\x0d\x0a}\x0d\x0a/*****************main()************************/\x0d\x0avoid main(void)\x0d\x0a{\x0d\x0auchar count=0\x0d\x0aIR = 1\x0d\x0alcd_init()\x0d\x0awrite_com(0x80)\x0d\x0awhile(table1[count]!='\0')\x0d\x0a{\x0d\x0awrite_date(table1[count])\x0d\x0acount++\x0d\x0adelay(5)\x0d\x0a}\x0d\x0acount = 0\x0d\x0awrite_com(0x80+0x40)\x0d\x0awhile(table2[count]!='\0')\x0d\x0a{\x0d\x0awrite_date(table2[count])\x0d\x0acount++\x0d\x0adelay(5)\x0d\x0a}\x0d\x0a\x0d\x0aIE = 0x81//开中断\x0d\x0aTCON = 0x01//脉冲负边沿触发\x0d\x0awhile(1)\x0d\x0a\x0d\x0a}\x0d\x0a/*********************红外中断**************************/\x0d\x0avoid IR_time() interrupt 0 \x0d\x0a{\x0d\x0auchar i,j,TimeNum=0//TimeNum用来计IR高电平次数 从而判断是0还是1\x0d\x0aEX0 = 0//关闭中断\x0d\x0adelayms(5)\x0d\x0aif(1 == IR)\x0d\x0a{\x0d\x0aEX0 = 1\x0d\x0areturn\x0d\x0a}\x0d\x0awhile(!IR) //跳过9ms前导低电平\x0d\x0adelayms(1)\x0d\x0afor(i=0i{\x0d\x0afor(j=0j{\x0d\x0awhile(IR) //跳过4.5ms的前导高电平\x0d\x0adelayms(1)\x0d\x0awhile(!IR) //跳过0.56ms的低电平\x0d\x0adelayms(1)\x0d\x0a\x0d\x0awhile(IR) \x0d\x0a{\x0d\x0aTimeNum++//计时高电平时间从而判断读取的是0还是1\x0d\x0adelayms(1)\x0d\x0a}\x0d\x0aif(TimeNum>=30)//按键按下时间过长 跳过\x0d\x0a{\x0d\x0aEX0 = 1\x0d\x0areturn\x0d\x0a}\x0d\x0aIRCOM[i] = IRCOM[i]>>1\x0d\x0aif(TimeNum >= 8) //8*0.14ms 这时读取的是1;\x0d\x0a{\x0d\x0aIRCOM[i] = IRCOM[i]|0x80\x0d\x0a}\x0d\x0aTimeNum = 0\x0d\x0a}\x0d\x0a}\x0d\x0aif(IRCOM[2]!=~IRCOM[3])//判断八位数据和八位数据反码是否相等\x0d\x0a{\x0d\x0aEX0 = 1\x0d\x0areturn\x0d\x0a}\x0d\x0aIRCOM[4] = IRCOM[2]&0x0f//取低四位\x0d\x0aIRCOM[5] = IRCOM[2]>>4//IRCOM[5]取IRCOM[2]高四位\x0d\x0aif(IRCOM[4] >9) //转换成字符\x0d\x0a{\x0d\x0aIRCOM[4] = IRCOM[4] + 0x37\x0d\x0a}\x0d\x0aelse\x0d\x0aIRCOM[4] = IRCOM[4] + 0x30\x0d\x0aif(IRCOM[5] >9)\x0d\x0a{\x0d\x0aIRCOM[5] = IRCOM[5] + 0x37\x0d\x0a}\x0d\x0aelse\x0d\x0aIRCOM[5] = IRCOM[5] + 0x30\x0d\x0adelay(5)\x0d\x0awrite_com(0x80 + 0x40 + 5)\x0d\x0awrite_date(IRCOM[5])\x0d\x0awrite_date(IRCOM[4])\x0d\x0aEX0 = 1//重新开启外部中断\x0d\x0a}

sbit IR_OUT = P3^2

unsigned char SigInfo[4]//存储红外按键编码,SigInfo[2]为按键值

void Cmd_Require(void)

void INT_Ext0() interrupt 1  //外部中断0

{

    u8 i, j

    u16 time = 8000

    

    EA = 0

    

    for (i=0 i<10 i++) {

        delay0_7ms ()

        if (IR_OUT) {

            EA = 1

            return

        }

    }

    while (!IR_OUT)

    delay2_5ms ()

    if (!IR_OUT) {

        EA = 1

        return

    }

    while (IR_OUT&&time) {

        time--

    }

    time = 8000

    for (i=0 i<4 i++) {

        for (j=0 j<8 j++) {

            SigInfo[i] >>= 1

            while (!IR_OUT)

            delay0_7ms ()

            if (IR_OUT) {

                SigInfo[i] |= 0x80

                while (IR_OUT&&time) {

                    time--

                }

                time = 8000

            }

        }

    }

    

    Cmd_Require()

    EA = 1

}

void Cmd_Require(void)

{

    switch(SigInfo[2]) {

    case 0x0c:

        //此处代码随意

        break

    case 0x18:

        //...

        break

    //...

    default:

        break

    }

}

延时没写,因单片机而异的,要精确点才能解码。

#include<reg52.h>

#include<intrins.h>

#define uchar unsigned char

#define uint unsigned int

sbit lcden = P2^7

sbit lcdrs = P2^6

sbit lcdwr = P2^5

sbit IR = P3^2

uchar IRCOM[6]//数组,用于存储红外编码

uchar code table1[] = "remote control"

uchar code table2[] = "CODE:"

void delayms(uchar x)// 延时x*0.14ms

{

uchar i

while(x--)

for(i=0i<13i++){}

}

void delay(uchar x) //延时xms

{

uchar i,j

for(i=xi>0i--)

for(j=110j>0j--)

}

/****************************LCD部分***********************************************/

void write_com(uchar com)

{

lcden = 0

lcdrs = 0

lcdwr = 0

P0 = com

delay(5)

lcden = 1

delay(5)

lcden = 0 //别忘了lcden拉低

}

void write_date(uchar date)

{

lcden = 0

lcdrs = 1

lcdwr = 0

P0 = date

delay(5)

lcden = 1

delay(5)

lcden = 0

}

void lcd_init(void)

{

lcden = 0

lcdrs = 0

lcdwr = 0

delay(5)

write_com(0x38)

write_com(0x0c)

write_com(0x06)

write_com(0x01)

}

/*****************main()************************/

void main(void)

{

uchar count=0

IR = 1

lcd_init()

write_com(0x80)

while(table1[count]!='\0')

{

write_date(table1[count])

count++

delay(5)

}

count = 0

write_com(0x80+0x40)

while(table2[count]!='\0')

{

write_date(table2[count])

count++

delay(5)

}

IE = 0x81//开中断

TCON = 0x01//脉冲负边沿触发

while(1)

}

/*********************红外中断**************************/

void IR_time() interrupt 0

{

uchar i,j,TimeNum=0//TimeNum用来计IR高电平次数 从而判断是0还是1

EX0 = 0//关闭中断

delayms(5)

if(1 == IR)

{

EX0 = 1

return

}

while(!IR) //跳过9ms前导低电平

delayms(1)

for(i=0i<4i++)

{

for(j=0j<8j++)

{

while(IR) //跳过4.5ms的前导高电平

delayms(1)

while(!IR) //跳过0.56ms的低电平

delayms(1)

while(IR)

{

TimeNum++//计时高电平时间从而判断读取的是0还是1

delayms(1)

}

if(TimeNum>=30)//按键按下时间过长 跳过

{

EX0 = 1

return

}

IRCOM[i] = IRCOM[i]>>1

if(TimeNum >= 8) //8*0.14ms 这时读取的是1;

{

IRCOM[i] = IRCOM[i]|0x80

}

TimeNum = 0

}

}

if(IRCOM[2]!=~IRCOM[3])//判断八位数据和八位数据反码是否相等

{

EX0 = 1

return

}

IRCOM[4] = IRCOM[2]&0x0f//取低四位

IRCOM[5] = IRCOM[2]>>4 //IRCOM[5]取IRCOM[2]高四位

if(IRCOM[4] >9) //转换成字符

{

IRCOM[4] = IRCOM[4] + 0x37

}

else

IRCOM[4] = IRCOM[4] + 0x30

if(IRCOM[5] >9)

{

IRCOM[5] = IRCOM[5] + 0x37

}

else

IRCOM[5] = IRCOM[5] + 0x30

delay(5)

write_com(0x80 + 0x40 + 5)

write_date(IRCOM[5])

write_date(IRCOM[4])

EX0 = 1//重新开启外部中断

}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12132904.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存