#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;
}
}
一个51单片机比较综合的程序(包括了串口通信,io控制,字符串处理,中断处理),仅供自己以后参考
最新推荐文章于 2022-11-29 03:18:36 发布