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

📄 lesson8.c

📁 51光电编码器实现
💻 C
字号:
/*-------------------------------------------------------------/
//		    51接收光电旋钮信号 发送键值编码 
//按键中断  int0,1	
// 扫描旋钮扭动  
/*------------------------------------------------------------*/


#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define ulint unsigned long int


//键盘以及PS2接口   
sbit PS_DATA=P0^0;  //用P0。0	Z做数据线
sbit PS_CLK=P0^1;  //用p0.1做时钟线	


sbit key_an=P3^2;	//确定键 
sbit key_down=P3^3;	 //向上旋动 
sbit key_up=P3^4;	 //向下旋动 

sbit beep=P2^3;	 //蜂鸣器指示  

uint En_num; //按键时间间隔计数 
uchar key_flag;		 //按键时间差标志 循环次数标志   

uchar num,count,send_flag;
uint  n_flag,AD_count;


uchar  Plus_send();	 //发送脉冲  


void delayus(unsigned int us)	
{
    while(--us) ;
}

void Delay1ms(unsigned int x)//延时1ms
 {
   unsigned char j;
   while(x--)
    {
     for(j=0;j<125;j++)
      {;}
    }
  } 		 


//液晶初始化+++定时器+++中断  初始化  
void init()
{	
    send_flag=0;
    AD_count=0;
	n_flag=18;		 //脉宽量程 标志 

	num=0;
	count=0;
	key_flag=1;			  	
	En_num=0;	

   // 定时器+++中断  初始化  

   TMOD=0x22;//设置定时器1为工作方式2	(做串口波特率发生器  )    定时器T0工作方式 2(按键时间间隔)		  
	TH1=0xfd;  	//初值  波特率9600
	TL1=0xfd;
	TH0=0;		//计数256us  
	TL0=0;
	TR1=1;	   //启动定时器
	TR0=1;	   //启动定时器
	

	ET0=1;	
	EA=1;	//所有中断  允许	  
	EX0=1;	 //允许INT 0
	EX1=1;	 //允许INT 0
  
}


/****************************************************/
//PS/2发送函数 
// 发送一个编码  
/****************************************************/		  
void  PS_send(uchar x)
{
 
  uchar i,temp,char_temp;
  bit flag_check=1;		 //奇数偶校验位	    
  Delay1ms(3);
  temp=x;
  
  for(i=0;i<8;i++)
  {
  	  char_temp=temp&0x01;
	  if(char_temp==0x01)
	   {
	   	 flag_check=!flag_check; //获得奇偶校验位
	   
	   }
	   temp=temp>>1;
  }
  PS_CLK=1;
  while(!PS_CLK)
   {
   ;
   }
  PS_CLK=1;
  PS_DATA=1;
  if(PS_CLK==1)
  {
  	delayus(30);
  
  }
  ////提示发送开始
   if(PS_CLK==1&&PS_DATA==1)
  {
    PS_DATA=0;				   //起始位为0
	delayus(10);
	PS_CLK=0;
	delayus(5);
	temp=x;					
	for(i=0;i<8;i++)		   //发送8位数据位
	{
	
	  PS_CLK=1;
	  delayus(5);
	  char_temp=temp&0x01;

		if(char_temp==0x01)
		{PS_DATA=1;}
		else
		{PS_DATA=0;}
	
  	 delayus(10);
	 PS_CLK=0;
	 delayus(5);
	 temp=temp>>1;	
   }
  
  PS_CLK=1;
  delayus(5);
  PS_DATA=flag_check;     //发送奇偶校验    
  delayus(10);
  PS_CLK=0;
  delayus(5);
  PS_CLK=1;
  delayus(5);
  PS_DATA=1;				//发送停止位
  delayus(10);
  PS_CLK=0;
  delayus(5);
  PS_CLK=1;
  }
  delayus(30);
  PS_CLK=1;PS_DATA=1;
  if(PS_CLK==1&&PS_DATA==0)
  {
  	 return;     
  
  }
  	    
 }
void main()
{
	init();	  
	while(1)
	{ 
	  	if(key_up==1&key_down==1)
		 {
		    while(key_up);
			if(key_down==1)
			{
				PS_send(0xE0);   
	    		 PS_send(0x75);
		    }
			else
			{
			
				PS_send(0xE0);   
	    		 PS_send(0x72);
			  
			}

		 }

	}	   
	
}				
/**********************************/
//	  发送负脉冲   
//	n_flag 设定发送的量程    
/**********************************/
 void timer0() interrupt 1   //定时器0中断为中断1 
{
      
	 En_num++;
	 if(En_num>=1000) //1秒 
	 {
	 	En_num=0;
		key_flag=0;//表示超过了时间差   
	 }		 

}


//脉宽增加--按键中断  
void int_key_up() interrupt 0//外部中断0为中断0
{ 

  EX0=EX1=0;//先关外部中断0	 	   
  Delay1ms(10); 
  if(key_an==0) //延时消抖 key_up是按键	应管脚 。  		
  {	  
  	if(key_flag==0)    //时间间隔超过0.5S
	{ 
	 PS_send(0x0D); 		  //发送Tab
	   key_flag=1;
	   En_num=0;  	

	} 
	else
	{ 	 	
	 PS_send(0x5A); 		   //发送enter 	  5a 29
	 En_num=0;	  
	  
	 }
  }		
  while(!key_an);	  
   EX0=EX1=1;//重新开外部中断	
  }

//脉宽减少-按键中断  
void int_key_down() interrupt 2//外部中断1是中断2
{	
	

 
}	

⌨️ 快捷键说明

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