找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2776|回复: 1
收起左侧

51单片机串口通信程序,支持自定义协议

[复制链接]
ID:280056 发表于 2019-12-5 17:40 | 显示全部楼层 |阅读模式
51串口通信,支持自定义协议,代码注释非常全,求黑币
单片机源程序如下:
  1. #include"reg52.h" /*51串口通信by沸腾的冰块/不拼不活*/
  2. typedef unsigned int u16;
  3. typedef unsigned char u8;
  4. #define Data_SIZE 7     //存入数组RevBuf数据长度==uart_Data_SIZE-2
  5. #define uart_Data_SIZE 5//协议实际长度(一个汉字占两位)
  6. u8 RevBuf[Data_SIZE];       //数据接收缓冲区
  7. u8 indata[uart_Data_SIZE];  //防数据抵消缓冲区
  8. u16 data_count=0;   //数据长度,串口中断自增
  9. u16 temp_length=0;  //数据长度,协议长度中转
  10. u8 flished_flag=0;  //数据接收符合要求标志
  11. u8 uart_flished_flag=0;  //串口成功标志
  12. u8 i=0;//延时用
  13. u16 temp=0,count=0;//temp缓存,count用于判断是否接受到数据
  14. sbit LED1=P1^0;sbit k1=P2^0;
  15. sbit LED2=P1^1;sbit k2=P2^1;
  16. sbit LED3=P1^2;sbit k3=P2^2;
  17. sbit LED4=P1^3;sbit k4=P2^3;
  18. sbit LED5=P1^4;sbit k5=P2^4;
  19. sbit LED6=P1^5;sbit k6=P2^5;
  20. sbit LED7=P1^6;sbit k7=P2^6;
  21. sbit LED8=P1^7;sbit k8=P2^7;
  22. void InitUART(void)
  23. {
  24.         TMOD = 0x20;
  25.         SCON = 0x50;
  26.         TH1 = 0xFA;//在此修改波特率
  27.         TL1 = TH1;
  28.         PCON = 0x80;
  29.         EA = 1;
  30.         ES = 1;
  31.         TR1 = 1;
  32. }
  33. void delay(u16 i)
  34. {
  35.         while(i--);        
  36. }
  37. void keypros()//按键处理
  38. {
  39.         if(k1==0)
  40.         {        
  41.                 delay(1000);
  42.                 if(k1==0)
  43.                 {
  44.                         LED1=~LED1;
  45.                 }
  46.                 while(!k1);
  47.         }
  48.         if(k2==0)
  49.         {        
  50.                 delay(1000);
  51.                 if(k2==0)
  52.                 {
  53.                         LED2=~LED2;
  54.                 }
  55.                 while(!k2);
  56.         }
  57.         if(k3==0)
  58.         {        
  59.                 delay(1000);
  60.                 if(k3==0)
  61.                 {
  62.                         LED3=~LED3;
  63.                 }
  64.                 while(!k3);
  65.         }
  66.         if(k4==0)
  67.         {        
  68.                 delay(1000);
  69.                 if(k4==0)
  70.                 {
  71.                         LED4=~LED4;
  72.                 }
  73.                 while(!k4);
  74.         }
  75.         if(k5==0)
  76.         {        
  77.                 delay(1000);
  78.                 if(k5==0)
  79.                 {
  80.                         LED5=~LED5;
  81.                 }
  82.                 while(!k5);
  83.         }
  84.         if(k6==0)
  85.         {        
  86.                 delay(1000);
  87.                 if(k6==0)
  88.                 {
  89.                         LED6=~LED6;
  90.                 }
  91.                 while(!k6);
  92.         }
  93.         if(k7==0)
  94.         {        
  95.                 delay(1000);
  96.                 if(k7==0)
  97.                 {
  98.                         LED7=~LED7;
  99.                 }
  100.                 while(!k7);
  101.         }
  102.         if(k8==0)
  103.         {        
  104.                 delay(1000);
  105.                 if(k8==0)
  106.                 {
  107.                         LED8=~LED8;
  108.                 }
  109.                 while(!k8);
  110.         }
  111. }
  112. void UartSendByte(unsigned char c)//发送一个字符
  113. {
  114.         SBUF = c;
  115.         while(!TI);
  116.         TI = 0;
  117. }
  118. void UartSendString(u8 *string)//发送一个字符串
  119. {
  120.         while(*string)
  121.         {
  122.                  UartSendByte(*string++);
  123.         }
  124. }
  125. void main(void)
  126. {
  127.         InitUART();
  128.         UartSendString("Uart_test  is  OK \r\n");
  129.         while(1)
  130.   {
  131.                 keypros();
  132.                 if(count<data_count)
  133.                 {
  134.                         count=data_count;
  135.                         if(temp!='\n') //判断是否接收到结束符
  136.                         {
  137.                                 RevBuf[data_count-1]=temp;// 否,就存到RevBuf【】数组中
  138.                                 flished_flag=0;//未接收完
  139.                         }
  140.                         else
  141.                         {
  142.                                 temp_length=data_count;//是,记录其数据长度
  143.                                 data_count=count=0;
  144.                                 flished_flag=1;//接收完
  145.                         }
  146.                 }
  147.                 if(temp_length == Data_SIZE&&flished_flag==1)   //判断数据长度是否满足要求,是否接收完。
  148.                 {
  149.                         for(i=0;i<uart_Data_SIZE;i++)
  150.                         {
  151.                           indata[i]=RevBuf[i];  //缓冲区
  152.                         }
  153.                         uart_flished_flag=1;    //数据接收成功标志
  154.                         flished_flag=0;
  155.                 }
  156.                 if(uart_flished_flag==1)  //数据接收完整成功
  157.                 {
  158.                         UartSendString("你发送的是\r\n");
  159.                         for(i=0;i<uart_Data_SIZE;i++)
  160.                         {
  161.                                 SBUF = indata[i];
  162.                                 while(!TI);
  163.                                 TI=0;
  164.                         }
  165.                         UartSendString("\r\n");
  166.                         uart_flished_flag=0;
  167.                         if(indata[1]=='n')//发送:on :1
  168.                                 switch(indata[4])
  169.                                 {
  170.                                         case'1':LED1=0;break;
  171.                                         case'2':LED2=0;break;
  172.                                         case'3':LED3=0;break;
  173.                                         case'4':LED4=0;break;
  174.                                         case'5':LED5=0;break;
  175.                                         case'6':LED6=0;break;
  176.                                         case'7':LED7=0;break;
  177.                                         case'8':LED8=0;break;
  178.                                 }
  179.                                 if(indata[1]=='f')//发送:off:1
  180.                                 switch(indata[4])
  181.                                 {
  182.                                         case'1':LED1=1;break;
  183.                                         case'2':LED2=1;break;
  184.                                         case'3':LED3=1;break;
  185.                                         case'4':LED4=1;break;
  186.                                         case'5':LED5=1;break;
  187.                                         case'6':LED6=1;break;
  188.                                         case'7':LED7=1;break;
  189.                                         case'8':LED8=1;break;
  190.                                 }
  191.                 }
  192.   }
  193. }
  194. void UARTInterrupt(void) interrupt 4
  195. {
  196.         if(RI)
  197.         {
  198.                 temp=SBUF;
  199.                 data_count++;
  200.                 RI=0;
  201.         }
  202. }
复制代码


51串口通信带协议.rar

1.41 KB, 下载次数: 21, 下载积分: 黑币 -5

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:280056 发表于 2019-12-7 10:11 | 显示全部楼层
  1. #include"reg52.h" /*51串口通信高级版by沸腾的冰块/不拼不活*/
  2. typedef unsigned int u16;
  3. typedef unsigned char u8;
  4. #define Data_SIZE 7     //存入数组RevBuf数据长度==协议长度-2
  5. u8 RevBuf[Data_SIZE];   //数据接收缓冲区
  6. u8 indata[2*Data_SIZE]; //防数据抵消缓冲区
  7. u16 data_count=0;   //数据长度,串口中断自增
  8. u16 temp_length=0;  //数据长度,协议长度中转
  9. u8 flished_flag=0;  //数据接收符合要求标志
  10. u8 uart_flished_flag=0;  //串口成功标志
  11. u8 i=0;//延时用,循环用
  12. u8 sign;//协议开头标志位
  13. u16 temp=0,count=0;//temp缓存,count用于判断是否接受到数据
  14. sbit LED1=P1^0;sbit k1=P2^0;
  15. sbit LED2=P1^1;sbit k2=P2^1;
  16. sbit LED3=P1^2;sbit k3=P2^2;
  17. sbit LED4=P1^3;sbit k4=P2^3;
  18. sbit LED5=P1^4;sbit k5=P2^4;
  19. sbit LED6=P1^5;sbit k6=P2^5;
  20. sbit LED7=P1^6;sbit k7=P2^6;
  21. sbit LED8=P1^7;sbit k8=P2^7;
  22. void InitUART(void)
  23. {
  24.         TMOD = 0x20;
  25.         SCON = 0x50;
  26.         TH1 = 0xFA;//在此修改波特率
  27.         TL1 = TH1;
  28.         PCON = 0x80;
  29.         EA = 1;
  30.         ES = 1;
  31.         TR1 = 1;
  32. }
  33. void delay(u16 i)
  34. {
  35.         while(i--);       
  36. }
  37. void keypros()//按键处理
  38. {
  39.         if(k1==0)
  40.         {       
  41.                 delay(1000);
  42.                 if(k1==0)
  43.                 {
  44.                         LED1=~LED1;
  45.                 }
  46.                 while(!k1);
  47.         }
  48.         if(k2==0)
  49.         {       
  50.                 delay(1000);
  51.                 if(k2==0)
  52.                 {
  53.                         LED2=~LED2;
  54.                 }
  55.                 while(!k2);
  56.         }
  57.         if(k3==0)
  58.         {       
  59.                 delay(1000);
  60.                 if(k3==0)
  61.                 {
  62.                         LED3=~LED3;
  63.                 }
  64.                 while(!k3);
  65.         }
  66.         if(k4==0)
  67.         {       
  68.                 delay(1000);
  69.                 if(k4==0)
  70.                 {
  71.                         LED4=~LED4;
  72.                 }
  73.                 while(!k4);
  74.         }
  75.         if(k5==0)
  76.         {       
  77.                 delay(1000);
  78.                 if(k5==0)
  79.                 {
  80.                         LED5=~LED5;
  81.                 }
  82.                 while(!k5);
  83.         }
  84.         if(k6==0)
  85.         {       
  86.                 delay(1000);
  87.                 if(k6==0)
  88.                 {
  89.                         LED6=~LED6;
  90.                 }
  91.                 while(!k6);
  92.         }
  93.         if(k7==0)
  94.         {       
  95.                 delay(1000);
  96.                 if(k7==0)
  97.                 {
  98.                         LED7=~LED7;
  99.                 }
  100.                 while(!k7);
  101.         }
  102.         if(k8==0)
  103.         {       
  104.                 delay(1000);
  105.                 if(k8==0)
  106.                 {
  107.                         LED8=~LED8;
  108.                 }
  109.                 while(!k8);
  110.         }
  111. }
  112. void UartSendByte(unsigned char c)//发送一个字符
  113. {
  114.         SBUF = c;
  115.         while(!TI);
  116.         TI = 0;
  117. }
  118. void UartSendString(u8 *string)//发送一个字符串
  119. {
  120.         while(*string)
  121.         {
  122.                  UartSendByte(*string++);
  123.         }
  124. }
  125. void main(void)
  126. {
  127.         InitUART();
  128.         UartSendString("Uart_test  is  OK \r\n");
  129.         while(1)
  130.   {
  131.                 keypros();
  132.                 if(count<data_count)
  133.                 {
  134.                         count=data_count;
  135.                         if(temp!='\n') //判断是否接收到结束符
  136.                         {
  137.                                 RevBuf[data_count-1]=temp;//否,存到RevBuf【】数组中
  138.                                 flished_flag=0;//未接收完
  139.                         }
  140.                         else
  141.                         {
  142.                                 temp_length=data_count;//是,记录其数据长度
  143.                                 data_count=count=0;
  144.                                 flished_flag=1;//接收完
  145.                         }
  146.                 }
  147.                 if(temp_length >= Data_SIZE&&flished_flag==1) //判断数据长度是否满足要求,是否接收完。
  148.                 {
  149.                         for(i=0;i<(temp_length-2);i++)
  150.                         {
  151.                           indata[i]=RevBuf[i];  //缓冲区
  152.                         }
  153.                         uart_flished_flag=1;    //数据接收成功标志
  154.                         flished_flag=0;
  155.                 }
  156.                 if(uart_flished_flag==1)  //数据接收完整成功
  157.                 {
  158.                         UartSendString("你发送的是\r\n");
  159.                         for(i=0;i<(temp_length-2);i++)
  160.                         {
  161.                                 SBUF = indata[i];
  162.                                 while(!TI);
  163.                                 TI=0;
  164.                         }
  165.                         UartSendString("\r\n");
  166.                         uart_flished_flag=0;
  167.                         for(i=0;i<(temp_length-2);i++)//定位协议头
  168.                         {
  169.                                 if(indata[i]=='o')
  170.                                 {
  171.                                         sign=i;break;
  172.                                 }
  173.                         }
  174.                         if(indata[sign]=='o'&&indata[sign+1]=='n')//发送:on :1
  175.                                 switch(indata[sign+4])
  176.                                 {
  177.                                         case'1':LED1=0;break;
  178.                                         case'2':LED2=0;break;
  179.                                         case'3':LED3=0;break;
  180.                                         case'4':LED4=0;break;
  181.                                         case'5':LED5=0;break;
  182.                                         case'6':LED6=0;break;
  183.                                         case'7':LED7=0;break;
  184.                                         case'8':LED8=0;break;
  185.                                 }
  186.                                 if(indata[sign]=='o'&&indata[sign+1]=='f'&&indata[sign+2]=='f')//发送:off:1
  187.                                 switch(indata[sign+4])
  188.                                 {
  189.                                         case'1':LED1=1;break;
  190.                                         case'2':LED2=1;break;
  191.                                         case'3':LED3=1;break;
  192.                                         case'4':LED4=1;break;
  193.                                         case'5':LED5=1;break;
  194.                                         case'6':LED6=1;break;
  195.                                         case'7':LED7=1;break;
  196.                                         case'8':LED8=1;break;
  197.                                 }
  198.                 }
  199.   }
  200. }
  201. void UARTInterrupt(void) interrupt 4
  202. {
  203.         if(RI)
  204.         {
  205.                 temp=SBUF;
  206.                 data_count++;
  207.                 RI=0;
  208.         }
  209. }
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表