一个51单片机比较综合的程序(包括了串口通信,io控制,字符串处理,中断处理),仅供自己以后参考

#include <at89x51.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>

/*******************************************************
*宏定义数据类型
********************************************************/

#define UCHAR unsigned char
#define UINT unsigned int
#define TRUE 1
#define FALSE 0
#define ENABLE 1
#define DISABLE 0


/*******************************************************
*宏定义常量
********************************************************/

#define XTAL 11059200 	 
#define BAUTERATE	9600L
#define BUTTON_ACCESS 1
#define BUTTON_NOT_ACCESS 2
#define BUTTON_FLASHED 3
#define BUTTON_STOPED 4

/********************************************************
*宏定义名称
*********************************************************/

#define STATIONID S1

/********************************************************
*定义变量(永久变量区)
*********************************************************/

UINT Bt_R_State=ENABLE;
UINT Bt_A_State=DISABLE;
UINT Bt_C_State=DISABLE;
UINT Have_Bt_R_Pressed=FALSE;
UINT Have_Agree=FALSE;
UINT Have_Choiced=FALSE;

/********************************************************
*临时变量区
*********************************************************/
UCHAR code *message_request="DATA-2-S1-1-0-1-0-DATA";
UCHAR code *message_agree="DATA-2-S1-1-0-2-0-DATA";
UCHAR code *message_cancel="DATA-2-S1-1-0-3-DATA";
UCHAR code *next_line="\r\n";
UCHAR code *slider="-";
UCHAR code *slider2=",";
UCHAR re;
UCHAR string[30]={0};
UINT ledPre=0;
UINT type=0;
UINT request_type;
UCHAR data_seg[10]={0};

/********************************************************
*函数定义
*********************************************************/

//初始化串口
void InitUART(UINT bits);

//用串口发送一个字符串
void UartSend(UCHAR *Data, int Len);

//用串口接收一个字符串,收到"\0"说明字符串接收完毕
void UartRead();

//初始化中断
void initInterrupt();

UINT getDistancePre();

//普通延时函数
void Delay(UINT times);

//特殊延时函数
void SpecialDelay(UINT times);

//根据IO口编号和给定的操作数点亮或熄灭相应的LED状态灯
void OperateStatusLed(UINT io_num,UINT status);

//根据给定的距离对应的编号使相应的灯亮
void OperateDistanceLed(UINT distancePre);

//根据获取到的串口数据来获取请求类型和数据
void GetInfo(UCHAR *info);


//根据返回的数据取得请求类型
UINT getRequestType(UCHAR *message);

void FinishFlash();






/*********************************************************
*主函数
**********************************************************/


 void main(){
    P1=0x00;
    initInterrupt();
	IP=0x01;
	InitUART(9600);
    while(1){
	   Bt_R_State=ENABLE;
	   Bt_A_State=DISABLE;
	   Bt_C_State=DISABLE;
	   P1=0x00;
	   P2_3=0;
	   P2_4=0;
	   P2_5=0;
	   Have_Agree=FALSE;
	   Have_Choiced=FALSE;
	   Have_Bt_R_Pressed=FALSE;
	   while(!Have_Bt_R_Pressed);
	   Have_Bt_R_Pressed=FALSE;
	   UartSend(message_request,strlen(message_request));
	   UartRead();
	   UartSend("*",1);
	   UartSend(string,strlen(string));
	   GetInfo(string);
	   type=request_type;
	   if(type==1){	 
	      OperateStatusLed(1,1);
	   	  ledPre=getDistancePre();
		  OperateDistanceLed(ledPre);
		  Bt_A_State=ENABLE;
		  Bt_C_State=ENABLE;
		  SpecialDelay(10000);
		  Bt_A_State=DISABLE;
		  Bt_C_State=DISABLE;
		  if(Have_Agree){
		     UartSend(message_agree,strlen(message_agree));
			 FinishFlash();
		  }else{
		     UartSend(message_cancel,strlen(message_cancel));
			 FinishFlash();
		  }
	   }else if(type==2){
	      OperateStatusLed(2,1);
		  OperateDistanceLed(6);
		  FinishFlash();	
		  continue;
	   }else if(type==3){
		  FinishFlash();
	   }
	}
}




/*********************************************************
*函数实现
**********************************************************/

  //初始化中断
void initInterrupt(){
   EA=1;
   EX0=1;
   EX1=1;
}


void Delay(UINT t){
   int i=0;
   int m=0;
   for(i=0;i<110;i++){
      for(m=0;m<t;m++);
   }
}

void SpecialDelay(UINT t){
   	int i=0;
	int m=0;
	for(i=0;i<110 && Have_Choiced==FALSE;i++){
	     P1_7=1;
	   	 for(m=0;m<t;m++);
		 P1_7=0;
	}
}


void InitUART(UINT bits)//串口初始化程序,设置不同的波特率bits
{
	SBUF=0;
    TMOD=0X20;
	if(bits==9600){TH1=0XFD;TL1=0XFD; }
	if(bits==4800){TH1=0XFA;TL1=0XFA; }
	if(bits==2400){TH1=0XF4;TL1=0XF4; }
	if(bits==1200){TH1=0XE8;TL1=0XE8; }
	//设置波特率9600 bit/s (0XFD)   波特率4800 bit/s(0XFA) 波特率2400 bit/s (0XF4) 波特率1200 bit/s(0XE8)
	PCON=0X00;  //
	TR1=1;
	SCON=0X50;	//
	ES=1;
}


void UartSend(UCHAR *Data, int len)	 //Data为数据指针,len为要发送的数据长度	
{
    UCHAR c_send=0;
    UINT i_send=0;
 	for(i_send=0;i_send<len;i_send++)
	{
		c_send=Data[i_send];	 
		SBUF = c_send; // 要发送的字符放入缓冲区 
		while(TI == 0); 
		TI = 0; 
	}		
}

void UartRead(){
	int m=0;
	memset(string,0,30);
	while(1){
	   while(RI==0);
	   RI=0;
	   if((SBUF=='\n' || SBUF=='\r' || SBUF==0)&&(strlen(string)>10)) break;
	   re=SBUF;
	   string[m]=re;
	   m++;
	}
}

void OperateStatusLed(UINT io_num,UINT status){
    if(status==0){
	    if(io_num==0) P2_3=0;
		if(io_num==1) P2_4=0;
		if(io_num==2) P2_5=0;
	}else{
	   	if(io_num==0) P2_3=1;
		if(io_num==1) P2_4=1;
		if(io_num==2) P2_5=1;
	}
}


void GetInfo(UCHAR *message){
    UCHAR *result_type="";
    strtok(message,slider);
	strtok(NULL,slider);
	strtok(NULL,slider);
	strtok(NULL,slider);
	strtok(NULL,slider);
	result_type=strtok(NULL,slider);
	if(result_type[0]=='1'){  
	   request_type=1;
	}else if(result_type[0]=='2'){
	   request_type=2;
	}else{
	   request_type=3;
	}
	strcpy(data_seg,strtok(NULL,slider));
}


UINT getDistancePre(){ 
   UCHAR *result_dis=""; 
   int dis=0; 
   strtok(data_seg,slider2);
   result_dis=strtok(NULL,slider2);
   dis=atoi(result_dis);
   if(dis<=1000){
    return 0;
	}
   if(dis>1000 && dis<=2000){
    return 1;
	}
   if(dis>2000 && dis<=3000){
    return 2;
	}
   if(dis>3000 && dis<=4000){
    return 3;
	}
   if(dis>4000 && dis<=5000){
    return 4;
	}
   if(dis>5000){
    return 5;
	}
   return 6;
}


void OperateDistanceLed(UINT distancePre){
    switch(distancePre){
	   case 0:
	       P1=0x01;
		   break;
	   case 1:
	       P1=0x02;
		   break;
	   case 2:
	       P1=0x04;
		   break;
	   case 3:
	       P1=0x08;
		   break;
	   case 4:
	       P1=0x10;
		   break;
	   case 5:
	       P1=0x20;
		   break;
	   case 6:
	       P1=0xFF;
		   break;
	   case 7:
	       P1=0x00;
		   break;
	   default:
	       break;
	}
}


void FinishFlash(){
  	UINT i2=0;
    for(i2=0;i2<15;i2++){
		P1=0xFF;
		Delay(200);
		P1=0x00;
		Delay(200);
	}
}

/******************************
*中断
*******************************/
void deal() interrupt 0
{
   
   if(P2_0==0 && Bt_R_State==ENABLE){
       Bt_R_State=DISABLE;
	   Have_Bt_R_Pressed=TRUE;
	   OperateStatusLed(0,1);
   }
   if(P2_1==0 && Bt_A_State==ENABLE){
       Bt_A_State=DISABLE;
	   Have_Agree=TRUE;
	   Have_Choiced=TRUE;
   }
   if(P2_2==0 && Bt_A_State==ENABLE){
       Bt_C_State=DISABLE;
	   Have_Agree=FALSE;
	   Have_Choiced=TRUE;
   }
}








  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值