微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 用stc89c52的单片机设计红外遥控,运行后没反应 跪求大神指点

用stc89c52的单片机设计红外遥控,运行后没反应 跪求大神指点

时间:10-02 整理:3721RD 点击:
用stc89c52的单片机设计红外遥控,运行后没反应 跪求大神指点 本人在校学生,在赶毕业设计,程序是参考网上的,自己写的。
程序的意思是p2.0口输出PWM波,中断0接红外接收口,附上遥控器的码值图,任务是按“+”“-”键使pwm波的占空比发生变化。 程序如下
#include<reg51.h>
#define uchar unsigned char
#define uint  unsigned int
sbit pwm0=P2^0;
sbit hwx=P3^2;
uchar lsd=0xfe;
uchar n=0,pwm=1,q=50;
uchar recv[4];                                                                               
/*****************************产生PWM波*************************************/
void delay140us(uchar x)
{
        unsigned char k;
        while(x--)
        {
                for(k=0;k<13;k++){}
        }
}
void tset()
{
        TMOD=0x01;
        TH0=(65536-10)/256;
        TL0=(65536-10)%256;
        EA=1;
        ET0=1;
        TR0=1;
}
void PWMout() interrupt 1
{
        TH0=(65536-10)/256;
        TL0=(65536-10)%256;
        n++;       
        if(n<=q)
        {
                pwm=1;
        }
        else
        {
                pwm=0;
        }
        if(n==101)
        {
                n=0;
        }
}
   /*****************************产生PWM波***************************************/
/*********************************** 红外线接收*******************************************/
void Irecv() interrupt 0
{
        unsigned char i,j,c=0;
        EX0=0;
        delay140us(15);
        if(hwx==1)
        {
                EX0=1;
                return;
        }
        while(!hwx)
        {
                delay140us(1);       
        }
        for(i=0;i<4;i++)
        {
                for(j=0;j<8;j++)
                {
                        while(hwx)
                        {
                                delay140us(1);
                        }
                        while(!hwx)
                        {
                                delay140us(1);
                        }
                        while(hwx)
                        {
                                c++;
                                if(c>=30)
                                {
                                        EX0=1;
                                        return;
                                }
                        }
                        recv[i]=recv[i]>>1;
                        if(c>=8)
                        {
                                recv[i]=recv[i]|0x80;
                        }
                        c=0;
                }         
        }
        if(recv[2]!=~recv[3])
        {
                EX0=1;
                return;
        }
        switch(recv[2])
        {
                        case 0x07:q++;break;
                        case 0x15:q--;break;
        }
        EX0=1;
}
/***************************************红外线接收************************************/
void main()
{
        EA=1;
        EX0=1;
        IT1=1;
        tset();
        hwx=1;
        while(1)
        {
                pwm0=pwm;
        }
}


你要是有开发板的话,可以用开发板上的红外程序,当年我就是那么做的。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top