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

📄 mcs51-项目开发经典.c

📁 高端数码管驱动芯片
💻 C
📖 第 1 页 / 共 2 页
字号:
// 串口UART操作相关程序
//=================================================================================================
//函数功能:串口发射1个字节
void uart_byte_out(uchar uart_data_out)
{ SBUF = uart_data_out;
  while(TI==0);
  TI=0;
}
//-------------------------------------------------------------------------------------------------
//函数功能:串口发射字符数组。通常将要发送的字符数组定义在CODE代码区。
void uart_string_out(char * char_array)
{  uchar i;
   for(i=0; i<strlen(char_array) ;i++)
     {
	  uart_byte_out(char_array[i]);
	 }
}
//-------------------------------------------------------------------------------------------------
//函数功能:串口输出数据十进制到PC机屏幕上
//形参:范围 0-65535 ;例如:data_to_out=12345(或0x3039),则计算机屏幕就显示12345
void uart_data_decimalist_out(uint data_to_out)
{  bit   entrance;
   uchar ge,shi,bai,qian,wan;
   wan  = (data_to_out/10000)     ;//拆分万位,并转化为ASKII码
   qian = (data_to_out%10000)/1000;//拆分千位,并转化为ASKII码
   bai  = (data_to_out%1000)/100  ;//拆分百位,并转化为ASKII码
   shi  = (data_to_out%100)/10    ;//拆分十位,并转化为ASKII码
   ge   = (data_to_out%10)        ;//拆分个位,并转化为ASKII码
   entrance=1;//开放个、十、百、千、万的判断传输入口
   if(wan && entrance)
     {uart_byte_out(change_hex_to_askii(wan));
	  uart_byte_out(change_hex_to_askii(qian));
	  uart_byte_out(change_hex_to_askii(bai));
	  uart_byte_out(change_hex_to_askii(shi));
	  uart_byte_out(change_hex_to_askii(ge));
	  entrance=0;//如果万位不为0,则不再判断其它位
	 }
   else if(qian && entrance)
     {uart_byte_out(change_hex_to_askii(qian));
	  uart_byte_out(change_hex_to_askii(bai));
	  uart_byte_out(change_hex_to_askii(shi));
	  uart_byte_out(change_hex_to_askii(ge));
	  entrance=0;//如果千位不为0,则不再判断其它位
	 }
   else if(bai && entrance)
     {uart_byte_out(change_hex_to_askii(bai));
	  uart_byte_out(change_hex_to_askii(shi));
	  uart_byte_out(change_hex_to_askii(ge));
	  entrance=0;//如果百位不为0,则不再判断其它位
	 }
   else if(shi && entrance)
     {uart_byte_out(change_hex_to_askii(shi));
	  uart_byte_out(change_hex_to_askii(ge));
	  entrance=0;//如果十位不为0,则不再判断其它位
	 }
   else
     {uart_byte_out(change_hex_to_askii(ge));
	 }
}
//-------------------------------------------------------------------------------------------------
// 函数功能:串口显示的回车换行
// 形参:newline_number 表示一共换几行
void uart_newline(uchar newline_number)
{ uchar i;
  for(i=0;i<newline_number;i++)
     {
	  uart_byte_out(0x0d);
      uart_byte_out(0x0a);
	 }
}
//-------------------------------------------------------------------------------------------------
// 函数功能:串口显示的空格
// 形参:space_number 表示空几个格
void uart_space(uchar space_number)
{ uchar i;
  for(i=0;i<space_number;i++)
     {
	  uart_byte_out(0x20);
	 }  
}
//=================================================================================================
// 数制转换相关程序
//=================================================================================================
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
}
//=================================================================================================
// 串口UART中断服务程序
// 可以自动接收格式为"@xxx...xxx#"的字符串,长度小于等于30
//=================================================================================================
void UART_interrupt (void) interrupt 4
{ RI=0;
  if( SBUF == '@' ) //判断头
    {uart_buffer_address = 0;
  	 uart_buffer[uart_buffer_address] = SBUF;
	 uart_buffer_address++;
     uart_receive_start = 1; //置uart0接收启动标志
     return;
    }
  if( uart_receive_start == 1 ) //接收中间数据
    {uart_buffer[uart_buffer_address] = SBUF;
     uart_buffer_address++; //每接收1字节缓冲区地址加1
    }
  if( (uart_receive_start == 1)&&(SBUF == '#') ) //判断尾
    {uart_buffer[uart_buffer_address] = 0;//置字符串结束符号 \0,为字符串处理函数提供标准格式
	 uart_buffer_address = 0; //清缓冲区地址指针
     uart_receive_start  = 0; //清uart0接收启动标志
	 uart_receive_ok     = 1; //置已接收完整串口命令标志
     return;
    }
  if(uart_buffer_address>39)  //uart0接收缓冲区地址溢出故障处理:
    {uart_buffer_address = 0; //清缓冲区地址指针
     uart_receive_start  = 0; //清uart0接收启动标志
     uart_receive_ok     = 0; //清已接收完整串口命令标志
    }
}

//=================================================================================================
// T1中断服务程序
//=================================================================================================
void T1_interrupt(void) interrupt 3
{   
    uchar key_value;
	TH1=0x4c;//11.0592M晶振时T1定时时间长度为50毫秒
	TL1=0x00;
	t1_delay_time++;//在需要延时的地方清空并判断该变量
    key_value=0xff;
//=================================================================================================
// 按住放手发射
//=================================================================================================
/*if(KEY_7279==0)
	{key_press_counter++;
	 if(key_press_counter==4)
		{key_value_previous=HD7279_GetKey();
		}
	}
else
	{if(key_press_counter>4)
		{key_value_main=key_value_previous;
		}
	 key_press_counter=0;
	}
*/
//=================================================================================================
//0.5秒延时发送
//=================================================================================================
if(KEY_7279==0)
  { key_press_timer++;
    if(key_press_counter==0)
  	  {key_value_previous=HD7279_GetKey();
	  }
	if(key_press_timer>10)
 	  {key_value=HD7279_GetKey();
	   if(key_value!=key_value_previous)
         {key_value_main=0xff;
		  key_value=0xff;
		  key_value_previous=0xff;
		  key_press_timer=0;
		  key_press_counter=0;
		 }
	   else
	     {key_value_main=key_value_previous;
		  key_press_timer=0;
		  key_press_counter=0;
		 }
      }
   }
//=================================================================================================
//老师给通用延时
//=================================================================================================

/* 	if(!KEY_7279)//如果有按键触发,则取出该键键值
       {key_value=HD7279_GetKey();
	   }
 	if(key_value!=0xff)//有键触发
	   {
	    if(key_press_counter==0)//如果上一次T1中断没发现按键触发,而本次T1中断发现了,做如下处理
		  {key_value_previous=key_value;//保存本次键值
		   key_press_counter+=1;//按键计数器加1
	      }
		else//如果再次T1中断时key_press_counter不为0且键值与上次键值相等,则按键完成了50毫秒延时消抖
		  {if(key_value_previous==key_value) 
		     {key_value_main=key_value;}//key_value_main中存储的键值在主程序中使用和清除
		  }
       }
    else//不管上次是否有键触发,只要本次无键触发就清空按键计数器,即如果按键时间不能持续50毫秒以上则重新判断
       {key_press_counter=0;
	   }
*/
}
//=================================================================================================
//                           end of the file 
//=================================================================================================

⌨️ 快捷键说明

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