请大家 帮忙看一下 我这个程序哪里有问题啊

2019-07-15 18:35发布

本帖最后由 l764583152 于 2014-9-4 20:17 编辑

#include<reg52.h>
#include<intrins.h>  //移位头文件
#define uint unsigned int
#define uchar unsigned char  //宏定义
sbit PWM = P2^7;                  //用来声明P2.7口为程序所要控制的端口,"sbit"是KEIL专门用来声明某位IO口


sbit ir=P3^3;  //红外数据接收

uchar irtime;           //红外时间
uchar startflag;   //开始接收标志位
uchar irdata[33];  //接收的数据  包括引导码一共33位
uchar bitnum;     //第几位数据
uchar irreceok;  //接收完毕标志位
uchar ircode[4];  //数据存放
uchar irprosok;           //解码完毕标志位
uchar PWM_ON ;                        //定义低电平时间
uchar CYCLE;
uchar vvalue;                                                                                          


void Delay(uint del)
{
        uint i,j;
        for(i=0; i<del; i++)
        for(j=0; j<450; j++)     //这个是通过软件仿真得出的数  
        ;
}


void Delay_1ms(uint i)        //定时子程序   定时1毫秒
{
        uchar x,j;
        for(j=0;j<i;j++)
        for(x=0;x<=148;x++)
        ;
}


void time0init0 (void) //定时器0初始化
{
        TMOD=0X02;  //工作方式定义  8位重装定时器
        TH0=0X00;  //高8位预装
        TL0=0X00;  //低8位预装
        //IE=0X82        //开启总中断及定时器0中断
        ET0=1;         //开定时器0中断
        EA=1;          //开总中断
        TR0=1;         //启动定时器
}

void Time1(void)
{
        TMOD=0x10;                  //定时器设置 1ms in 12M crystal
        TH0=(65536-1000)/256;
        TL0=(65536-1000)%256; //定时1mS
        IE=0x88;                            //打开中断
        TR1=1;                                  //定时器打开
}


void int1init(void)
{
        IT1=1; //定义外部中断1为下降沿触发
        EX1=1;           //开外部中断1
        EA=1;                 //开总中断
        //IE=0X84;        //开总中断及外部中断1
}


void display(void)
{
        if(vvalue==0x45)PWM_ON=0;
        else if(vvalue==0x46)PWM_ON=2;
    else if(vvalue==0x47)PWM_ON=4;        
        else if(vvalue==0x44)PWM_ON=6;
        else if(vvalue==0x40)PWM_ON=10;
        else PWM_ON=10;               
}        

void irpros(void) //数据解码
{
        uchar k,i,j;
        uchar value;
        k=17;
        for(i=0;i<8;i++)
    {        
                value=value>>1;                 
                if(irdata[k]>6)
                {
                        value=value | 0x80;        // 置1
                }
                        
                k++;        
        }
        vvalue=value;
        irprosok=1;  //解码完毕

}
                                                                                                                                
void main()
{
        time0init0();
        int1init();
        Time1();
        PWM = 1;
        while(1)
        {
                if(irreceok)
                {
                        irpros();
                        irreceok=0;
                }
                if(irprosok)
                {
                        irprosok=0;
                }
                display();        
        }
}        



void time0init () interrupt 1          //定时器0服务子程序
{
        irtime++;   //最大加到255
}


void int1 () interrupt 2   //外部中断1服务子程序
{
        if(startflag)
        {
                if(irtime>47)  //检测引导码
                {
                        bitnum=0;
                }
                irdata[bitnum]=irtime;        //装入引导码
                irtime=0;                           //定时器清0
                bitnum++;
                if(bitnum==33)         //数据接收完毕
                {
                        bitnum=0;
                        irreceok=1;               
                }

        }
        else
        {
                startflag=1;                //第一次进入中断后,因为定时器定时的irtime不为0,此时需要清0,标志位startflag定义后没初始化系统默认为0,那么if语句通不过,立即跳到else随即irtime清0,startflag置1.
                irtime=0;
        }                        
}



void tim(void) interrupt 1 using 1
{
        static unsigned char count;
        TH0=(65536-1000)/256;
        TL0=(65536-1000)%256;//定时1mS
        if(count==PWM_ON)
        {
                PWM = 0;                 //直流电机转
        }
        count++;
        if(count == CYCLE)
        {
                count=0;
                if(PWM_ON!=0)   //如果左右时间是0 保持原来状态
                {
                        PWM = 1;    //直流电机不转
                }
        }
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。