⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 51单片机开发板提供的参考程序
💻 C
字号:
/*copyright 2007,ShangHai  HaoTun Electronic Technology co.,Ltd
 *
 *This sample is used for control light by infrared .
 *
 *write by Shifang
 *
 *V1.1
 */
//该程序使用LCD1602显示
#include<reg52.h>
#include<stdio.h>
#include<intrins.h>

////////////////////////////////////////////////
#define TURE 1
#define FALSE 0

////////////////////////////////////////////////

sbit IR=P3^2;//红外接口标志
sbit RS = P2^4;//Pin4
sbit RW = P2^5; //Pin5
sbit E  = P2^6;//Pin6

#define Data  P0    //数据端口

unsigned int hour,minute,second,count;
char code Tab[16]="0123456789ABCDEF";

char data TimeNum[]="                ";
char data Test1[]="                  ";

////////////////////////////////////////////

unsigned char  irtime;//红外用全局变量

bit irpro_ok,irok;
unsigned char IRcord[4];
unsigned char   irdata[33];
void ShowString (unsigned char line,char *ptr);

//////////////////////////////////////////////

void Delay(unsigned char mS);
void Ir_work(void);
void Ircordpro(void);


////////////////////////////////////////////////////////////////
void Delay(unsigned char mS)//delay mS
{
 unsigned char us,usn;

 while(mS!=0)
  { 
   usn = 4;
   while(usn!=0)
    {
     us=0xf0;
     while (us!=0) {us--;};
     usn--;
    }

   mS--;

  }
}


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

void tim0_isr (void) interrupt 1 using 1//定时器0中断服务函数
{
  irtime++;
}

///////////////////////////////////////////////////////////////////////
void ex0_isr (void) interrupt 0 using 0//外部中断0服务函数
{
  static unsigned char  i;
  static bit startflag;

 if(startflag)
 {
   
    if(irtime<63&&irtime>=33)//引导码 TC9012的头码
            i=0;
     
    		irdata[i]=irtime;
    		irtime=0;
    		i++;
   			 if(i==33)
      			{
	  			 irok=1;
				 i=0;
	  			}
          }
	 
  	 else
		{irtime=0;startflag=1;}

}

////////////////////////////////////////////////////////////////////
void TIM0init(void)//定时器0初始化
{

  TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值
  TH0=0x00;//reload value
  TL0=0x00;//initial value
  ET0=1;//开中断
  TR0=1;
}
///////////////////////////////////////////////////////////////////
void EX0init(void)
{
 IT0 = 1;   // Configure interrupt 0 for falling edge on /INT0 (P3.2)
 EX0 = 1;   // Enable EX0 Interrupt
 EA = 1;  
}
/****************************************************************/

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

  void Ir_work(void)//红外键值散转程序
  {
       
       TimeNum[5] = Tab[IRcord[0]/16];
	   TimeNum[6] = Tab[IRcord[0]%16];
	   TimeNum[8] = Tab[IRcord[1]/16];
	   TimeNum[9] = Tab[IRcord[1]%16];
	   TimeNum[11] = Tab[IRcord[2]/16];
	   TimeNum[12] = Tab[IRcord[2]%16];
	   TimeNum[14] = Tab[IRcord[3]/16];
	   TimeNum[15] = Tab[IRcord[3]%16];
	 
       ShowString(1,TimeNum);

		  irpro_ok=0;

  }

/*****************************************************************/
void Ircordpro(void)//红外码值处理函数
{ 
  unsigned char i, j, k;
  unsigned char cord,value;

  k=1;
  for(i=0;i<4;i++)//处理4个字节
     {
      for(j=1;j<=8;j++) //处理1个字节8位
         {
          cord=irdata[k];
          if(cord>7)//大于某值为1
		    {
             value=value|0x80;
			}
          else 
		    {
             value=value;
			}
          if(j<8)
		    {
			 value=value>>1;
			}
           k++;
         }
     IRcord[i]=value;
     value=0;     
     } irpro_ok=1;//处理完毕标志位置1
    
}



/******************************************************************/
void DelayUs(unsigned char us)//delay us
{
 unsigned char uscnt;
 uscnt=us>>1;/* Crystal frequency in 12MHz*/
 while(--uscnt);
}
/******************************************************************/
void DelayMs(unsigned char ms)//delay Ms
{
 while(--ms)
   {
     DelayUs(250);
     DelayUs(250);
	 DelayUs(250);
	 DelayUs(250);
   }
}
void WriteCommand(unsigned char c)
{
 DelayMs(5);//short delay before operation
 E=0;
 RS=0;
 RW=0;
 _nop_();
 E=1;
 Data=c;
 E=0;
}
/****************************************************************/
void WriteData(unsigned char c)
{
 DelayMs(5);   //short delay before operation
 E=0;
 RS=1;
 RW=0;
 _nop_();
 E=1;
 Data=c;
 E=0;
 RS=0;
}
/*********************************************************************/
void ShowChar(unsigned char pos,unsigned char c)
{
 unsigned char p;
 if (pos>=0x10)
    p=pos+0xb0; //是第二行则命令代码高4位为0xc
 else 
    p=pos+0x80; //是第二行则命令代码高4位为0x8
 WriteCommand (p);//write command
 WriteData (c);   //write data
}
/*************************************************************************/
void ShowString (unsigned char line,char *ptr)
{
 unsigned char l,i;
 l=line<<4;
 for (i=0;i<16;i++)
 ShowChar (l++,*(ptr+i));//循环显示16个字符
}
/*********************************************************************/
void InitLcd()
{
 DelayMs(15);
 WriteCommand(0x38); //display mode
 WriteCommand(0x38); //display mode
 WriteCommand(0x38); //display mode
 WriteCommand(0x06); //显示光标移动位置
 WriteCommand(0x0c); //显示开及光标设置
 WriteCommand(0x01); //显示清屏

}


/////////////////////////////////////////////////////////////////

void main(void)
{
 EX0init(); // Enable Global Interrupt Flag
 TIM0init();

 InitLcd();//
 DelayMs(15);

 sprintf(Test1," www.haotun.com ");//the first line
 ShowString(0,Test1);

 sprintf(TimeNum,"Code            ");//the second line
 ShowString(1,TimeNum);


 while(1)//主循环
   {
    if(irok)
	  {   
	   Ircordpro();
 	   irok=0;
	  }

    if(irpro_ok)//step press key
	  {
	   Ir_work();
  	  }
   }
}
  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -