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

📄 mcs51-项目开发经典.c

📁 本人自己写的经典51程序完全好用。包括7279
💻 C
📖 第 1 页 / 共 5 页
字号:
  } 
 
/***********************************************************************/ 
/*名称: EWDS_93C46()           */ 
/*说明: 93C46的编程关闭.操作码(100  00XXXX)      */ 
/**********************************************************************/ 
void EWDS_93C46() 
  { 
   START_93C46(); 
   SEND_DATA_93C46(0X04,0X03); 
   SEND_DATA_93C46(0X00,0X06); 
   END_93C46();  
  }   
 
/***********************************************************************/ 
/*名称:READ()             */ 
/*说明:93C46的字读取程序           */ 
/*输入:要读取的字地址(6位)          */ 
/*输出:读取的字数值            */ 
/**********************************************************************/ 
uint READ_93C46(uchar address) 
  {data uchar temp1; 
   data uint  temp2; 
   START_93C46(); 
   SEND_DATA_93C46(0x06,0x03); 
   SEND_DATA_93C46(address,0x06); 
   temp2=0;//存放返回数据的缓冲先清零*
   for(temp1=0;temp1<16;temp1++)//循环读出16个数据
      {temp2=temp2<<1; 
       SK_93C46=1;
	   SK_93C46=0; 
       if(DO_93C46==1){temp2=temp2|0x0001;} 
      } 
   END_93C46(); 
   return temp2;  
  } 
 
/**********************************************************************/ 
/*名称:WRITE()               */ 
/*说明:93C46的字写入程序           */ 
/*输入: address 要写入的字地址(6位)         */ 
/*  op_data 要写入的数据(16位)         */ 
/*输出: 读取的字数值           */ 
/**********************************************************************/ 
uchar WRITE_93C46(uchar address,uint op_data) 
  {data uchar temp1; 
   data uint  temp2; 
   EWEN_93C46(); 
   START_93C46(); 
   SEND_DATA_93C46(0X05,0X03); 
   SEND_DATA_93C46(address,0X06); 
   SEND_DATA_93C46(op_data,0X10); 
   CS_93C46=0; 
   CS_93C46=1; 
   temp1=2; 
   temp2=50000;    /*设置一个最大延时等待数值.注意在不同的晶振下延时是不同的*/ 
   while(!DO_93C46)//DO_93C46为低电平,表示写操作正在进行
     {temp2=temp2-1;//最大等待延时后说明写操作失败
      if(temp2==0) 
        {temp1=0; 
         break;
        } 
     } 
   END_93C46(); 
   EWDS_93C46(); 
   return temp1; 
  }   
 
/***********************************************************************/ 
/*名称:ERASE()             */ 
/*说明:93C46的字擦除程序           */ 
/*输入: address 要擦除的字地址(6位)         */ 
/**********************************************************************/ 
/*
uchar ERASE(uchar address) 
  {data uchar temp1; 
   data uint  temp2; 
   EWEN_93C46(); 
   START_93C46(); 
   SEND_DATA_93C46(0X07,0X03); 
   SEND_DATA_93C46(address,0X06); 
   CS_93C46=0; 
   CS_93C46=1; 
   temp1=1; 
   temp2=50000; 
   while(!DO_93C46) 
     {temp2=temp2-1; 
      if(temp2==0) 
        {temp1=0; 
         break; 
        } 
     } 
   END_93C46();  
   EWDS_93C46();//返回表示擦除状态的特征
   return temp1; 
  }     
*/
/**********************************************************************/ 
/*名称:ERAL()             */ 
/*说明:93C46的全部擦除程序           */ 
/**********************************************************************/ 
uchar ERAL() 
  {data uchar temp1; 
   data uint  temp2; 
   EWEN_93C46(); 
   START_93C46(); 
   SEND_DATA_93C46(0X04,0X03); 
   SEND_DATA_93C46(0X20,0X06); 
   CS_93C46=0; 
   CS_93C46=1; 
   temp1=1; 
   temp2=50000; 
   while(!DO_93C46) 
     {temp2=temp2-1; 
      if(temp2==0) 
        {temp1=0; 
         break; 
        } 
     } 
   END_93C46();  
   EWDS_93C46();   /*返回表示擦除状态的特征*/ 
   return temp1; 
  }     
   
/***********************************************************************/ 
/*名称:WRAL()             */ 
/*说明:93C46的写全部程序           */ 
/*输入: op_data 要写入的数据(16位)         */ 
/*输出: 读取的字数值           */ 
/***********************************************************************/ 
/*
uchar WRAL(uint op_data) 
  {data uchar temp1; 
   data uint  temp2; 
   EWEN_93C46(); 
   START_93C46(); 
   SEND_DATA_93C46(0X04,0X03); 
   SEND_DATA_93C46(0X10,0X06); 
   SEND_DATA_93C46(op_data,0X10); 
   CS_93C46=0; 
   CS_93C46=1; 
   temp1=1; 
   temp2=50000;//设置一个最大延时等待数值.注意在不同的晶振下延时是不同的
   while(!DO_93C46) 
     {temp2=temp2-1; 
      if(temp2==0) 
        {temp1=0; 
         break; 
        } 
     } 
   END_93C46(); 
   EWDS_93C46(); 
   return op_data; 
  }   
*/
//=================================================================================================
// L297驱动程序
// 形参:cw_ccw =1正转,0反转
//           hf =1全步,0半步
//   step_delay 步进脉冲时间间隔,10的整数倍,单位是毫秒
//=================================================================================================


//=================================================================================================
// 直流电机控制程序
//=================================================================================================
// 函数功能:正转
void dc_motor_z(void)
{ TURN_Z_DCMOTOR=OPEN;
  TURN_F_DCMOTOR=CLOSE;
}
//------------------------------
// 函数功能:反转
void dc_motor_f(void)
{ TURN_Z_DCMOTOR=CLOSE;
  TURN_F_DCMOTOR=OPEN;
}
//------------------------------
// 函数功能:停止
void dc_motor_stop(void)
{ TURN_Z_DCMOTOR=CLOSE;
  TURN_F_DCMOTOR=CLOSE;
}
//=================================================================================================
// 数制转换相关程序
//=================================================================================================
uchar change_bcd_to_hex(uchar shu)//转换BCD码成十进制数
{ uchar shu_h;
  uchar shu_l;
  shu_l=shu&0x0f;
  shu_h=shu&0xf0;
  shu_h=shu_h>>4;
  return (shu_h*10+shu_l);
}
//-------------------------------------------------------------------------------------------------
uchar change_hex_to_bcd(uchar shu)//转换十进制数成BCD码
{ uchar shu_h;
  uchar shu_l;
  shu_l=shu%10;
  shu_h=shu/10;
  return ((shu_h<<4)|shu_l);
}
//-------------------------------------------------------------------------------------------------
uchar change_askii_to_hex(uchar askii)//转换ASKII码成HEX,实参范围:30-39、41-46
{ if(askii<=0x39) return(askii-0x30);
  else return(askii-0x37);
}
//-------------------------------------------------------------------------------------------------
uchar change_hex_to_askii(uchar data_hex)//HEX转换成ASKII,实参范围:0-9、A-F
{ if(data_hex<=0x09) return(data_hex+0x30);
  else return(data_hex+0x37);
}
//=================================================================================================
// 函数功能:将格式为"data1,data2,...datan#" 的字符串中的data数据全部取出,并存储于temporary_data[]
//=================================================================================================
void get_data(uchar * how_much_data)
{ 
  uchar i;
  uchar j=0;
  uchar k=0;
  uchar how_much_temp_askii=0;
  uchar temp_askii[5];
  uint  return_data;

  for(i=0; i<strlen(how_much_data); i++)
    {
	 if( (how_much_data[i] != ',') && (how_much_data[i] != '#') )
	   {
	    temp_askii[j] = how_much_data[i];
   		j=j+1;
        how_much_temp_askii=how_much_temp_askii+1;
	   }
	 else
	   {j=0;
	    switch (how_much_temp_askii)
		  {case 1:{return_data = change_askii_to_hex(temp_askii[0]);
				   break;
				  }
		   case 2:{return_data = change_askii_to_hex(temp_askii[0])*10+
	                             change_askii_to_hex(temp_askii[1]);
				   break;
				  }
		   case 3:{return_data = change_askii_to_hex(temp_askii[0])*100+
		                         change_askii_to_hex(temp_askii[1])*10 +
							     change_askii_to_hex(temp_askii[2]);
				   break;
				  }
		   case 4:{return_data = change_askii_to_hex(temp_askii[0])*1000+
	                             change_askii_to_hex(temp_askii[1])*100 +
							     change_askii_to_hex(temp_askii[2])*10  +
							     change_askii_to_hex(temp_askii[3]);
				   break;
				  }
		   case 5:{return_data = change_askii_to_hex(temp_askii[0])*10000+
	                             change_askii_to_hex(temp_askii[1])*1000 +
								 change_askii_to_hex(temp_askii[2])*100  +
								 change_askii_to_hex(temp_askii[3])*10   +
								 change_askii_to_hex(temp_askii[4]);
				   break;
				  }
		   default:break;
		  }
	    temporary_data[k] = return_data;
		k=k+1;
	    how_much_temp_askii=0;
	   }
    }
}
//=================================================================================================
// 函数功能:字符串匹配函数
//=================================================================================================
char * strstr(char * haystack, char * needle)
{  char *ptr1, *ptr2;
   weizhi=0;
   // Protect against NULL pointer
   if (*needle == 0) return(haystack);
   for( ; *haystack; haystack++ ,weizhi++)
	 {// Look for needle in haystack.  If there is a
      // match then this will continue all the way
      // until ptr1 reaches the NULL at the end of needle 
	  for(ptr1 = needle, ptr2 = haystack; *ptr1 && (*ptr1 == *ptr2); ++ptr1, ++ptr2);
	  // If there is a match then return pointer to needle in haystack
      if(*ptr1 == 0) return(haystack);
	 }
   return NULL;// no matching string found
}
//=================================================================================================
// 液晶ST7920驱动程序
//=================================================================================================
// 函数功能:液晶模块初始化
void init_lcd (void)
{
  write_lcd (comm,0x30);  //6 功能设定:使用基本指令动作,8位控制接口

  write_lcd (comm,0x01);  //1 清屏:DDRAM全部写20H,地址指针指向00H
  write_lcd (comm,0x02);  //2 地址归位:地址指针指向00H
  write_lcd (comm,0x06);  //3 点设定:置光标右移,AC自动加 1,整体显示不移动
  write_lcd (comm,0x0c);  //4 显示状态设定:置整体显示开,光标关,光标位置不反白闪烁
  write_lcd (comm,0x14);  //5 光标或显示移位控制:光标右移,AC加 1
}
//--------------------------------------------------
// 函数功能:显示汉字或字符
// 12232C液晶模块的显示结构为:共2行显示,每行可显示15个字符或7个半汉字
// 显示内容可以字符和汉字混排,方法如下:
// 即一个汉字为2字节,一个字符1字节,汉字字符可以穿插,只要保证每行15字节就可正确显示
void chinese_or_character_display (uchar code *char_name)
{
  uchar i;
  write_lcd (comm,0x30);

  write_lcd (comm,0x80);//设定DDRAM地址到地址计数器AC,即第一行显示首址
  for (i=0;i<15;i++)
    {write_lcd (dat,char_name[i]);//显示第一行内容,要显示字符串

⌨️ 快捷键说明

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