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

来源:互联网 发布:js点击图片弹出div 编辑:程序博客网 时间:2024/05/17 04:05
#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 BAUTERATE9600L#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;   }}