一个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; }}