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

📄 hongwai.c

📁 这是通过单片机PWM来控制直流电机 同时可以通过红外来控制
💻 C
字号:
/******************************************************************
/*                                                                *
/* OK200E单片机开发系统演示程序 							      *
/*                                                                *
/* 版本: V2.0 (2007/11/20)                                       *
/* 作者: 高山流水 (Email: aoke999@sohu.com)                      *
/* 网站: www.aokemcu.cn(奥科电子)                                *
/*                                                                *
/*                                                                *
/******************************************************************/

#include <reg52.h>       //51芯片管脚定义头文件
#include <intrins.h>	 //内部包含延时函数 _nop_();

#define uchar unsigned char
#define uint  unsigned int

//#define	DELAYNUM	40	//该数值可以调节显示的速度
sbit  SDATA_595=P1^5;   //串行数据输入
sbit  SCLK_595 =P1^6;   //移位时钟脉冲
sbit  RCK_595  =P1^7;   //输出锁存器控制脉冲
sbit  CS_LED8   =P1^1;   //片选
sbit  CS_1302   =P1^4;
sbit  IRIN = P3^2;         //红外接收器数据线
sbit  BEEP = P3^7;         //蜂鸣器驱动线
sbit  DCMOTO = P3^4;         //直流电机驱动线


//uchar code table[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e};
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar IRCOM[]={0x00,0x00,0x00,0x00,0x10,0x10};
uchar  dis[8];

void delay(unsigned char x);
void  display();
void beep();


/*******************************************************
*                                                      *
* 主函数                                               *
*                                                      *
*******************************************************/
main(void)
{
//	uchar k;
	TMOD|=0x01;
	TH0=0Xfc;
	TL0=0X66;
	TR0=1;
	EA=1;
	ET0=1;
	EX0=1;
	IP=0X01;
	CS_1302=0;
	DCMOTO=0;
	while(1)
	{
		dis[7]=table[IRCOM[4]];
		dis[6]=table[IRCOM[5]];
//		display();
		if(IRCOM[2]==0x01)		DCMOTO=~DCMOTO;			//启动电机
		if(IRCOM[2]==0x02)		DCMOTO=0;				//停止电机
	}

} //end of main()

void timer0(void)	interrupt 1
{
	TH0=0Xfc;
	TL0=0X66;
	display();
}

/*******************************************************
*                                                      *
* 显示函数                                    *
*                                                      *
*******************************************************/

void display()
{
	uchar num,c,i;
	for(i=0;i<8;i++)
	{
		num=dis[i];
		CS_LED8=0;
		for(c=0;c<8;c++)
		{
			SCLK_595=0;
			num=num<<1;
			SDATA_595=CY;
			SCLK_595=1;
			SCLK_595=0;
		}
		num=~(1<<i);
		for(c=0;c<8;c++)
		{
			SCLK_595=0;
			num=num>>1;
			SDATA_595=CY;
			SCLK_595=1;
			SCLK_595=0;
		}
		RCK_595=0;
		_nop_();
		_nop_();
		RCK_595=1; 
		_nop_();
		_nop_();
		RCK_595=0;
		delay(1);
		CS_LED8=1;
	}
}


void IR_IN() interrupt 0 //using 0
{
	unsigned char j,k,N=0;
	EA = 0;   
	delay(10);
	
	if (IRIN==1) 
	{
		EA =1;
		return;
	} 
                        //确认IR信号出现
	while (!IRIN)            //等IR变为高电平,跳过9ms的前导低电平信号。
	{
		delay(1);
	}
	while (IRIN)            //等IR变为高电平,跳过9ms的前导低电平信号。
	{
		delay(1);
	}
	for (j=0;j<4;j++)         //收集四组数据
	{ 
		for (k=0;k<8;k++)        //每组数据有8位
		{
			while (IRIN)            //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
			{
				delay(1);
			}
			while (!IRIN)          //等 IR 变为高电平
			{
				delay(1);
			}
			while (IRIN)           //计算IR高电平时长
			{
				delay(1);
				N++;   
			}                        //高电平计数完毕     
   			if (N>=30)
			{ 
				EA=1;
				return;                  //0.14ms计数过长自动离开。
			}
			IRCOM[j]=IRCOM[j] >> 1;                  //数据最高位补“0”
			if (N>7) 
			{
				IRCOM[j] = IRCOM[j] | 0x80;
			}  						//数据最高位补“
			N=0;
		}//end for k
	}//end for j
	/*
	if (IRCOM[2]!=~IRCOM[3])   //接收时间是否正确
    { 
      EA=1;
      return; 
    }
	
	if(IRCOM[0]!=0x00)         //比较用户码
    { 
      EA=1;
      return; 
    }*/
	IRCOM[4]=IRCOM[2] & 0x0F;     //取键码的低四位
	IRCOM[5]=IRCOM[2] >> 4;       //右移4次,高四位变为低四位

	beep();

	EA = 1; 
} 

/**********************************************************/
void beep()
{
  unsigned char i;
  for (i=0;i<180;i++)
   {
     delay(6);
     BEEP=!BEEP;                 //BEEP取反
   } 
  BEEP=1;                      //关闭蜂鸣器
}
/**********************************************************/
void delay(unsigned char x)    //x*0.14MS
{
 unsigned char i;
  while(x--)
 {
  for (i = 0; i<13; i++) {}
 }
}

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

⌨️ 快捷键说明

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