立即注册 登录
返回首页

uid:359331的个人空间

日志

51单片机串口接收发送字符串

热度 2已有 17014 次阅读2018-6-26 15:31 |个人分类:51单片机| 串口通信

因为课程需要做一个基于串口通信的实训,但本渣渣单片机没学好,在网上找了很多关于单片机串口通信的例子,但基本上都没有收发字符串的例子,即使有也达不到我的要求,所以本渣渣还是决定手撸51单片机串口收发字符串的代码。因为我个人习惯了ArduinoIDE的编程环境,所以这次我撸成了伪ArduinoIDE的代码。

手上只有一个普中的51单片机开发板,板子上用了让人郁闷的12M晶振,用过51单片机的人都知道12M的晶振在串口通信设置波特率的时候误差很明显,稍微不注意,这误差用让你抓耳挠腮拍大腿,你都找不到问题所在,编译没错误没警告,串口调试就是不出数据或者乱码。

下面开始编写程序吧!

  1. #include <reg52.h>
  2. #include <string.h>
  3. #include <stdio.h>

  4. #define uchar unsigned char
  5. #define uint unsigned int

  6. #define led P2

  7. uint buff_size = 15;   //设置缓存大小
  8. uint dat_count;    //单次接收数据总数
  9. uint buff_lenght;  //计算接收数据长
  10. bit buff_useful;  //是否接收到字符串

  11. uchar Read_buff[16];   //设置接收字符串缓存
  12. uchar *control = "";

  13. /*延时*/
  14. void delay(uint u)  
  15. {
  16.     unsigned char a,b;
  17.     for( ; u > 0 ; u --)
  18.         for(b=1;b>0;b--)
  19.             for(a=1;a>0;a--);
  20. }

  21. /*初始化中断*/
  22. void INIT_begin()
  23. {
  24.     SCON=0X50;   //设置为工作方式1,打开接收允许位
  25.     TMOD=0X20;   //设置计数器1,工作方式2
  26.     PCON=0X80;   //波特率加倍
  27.     TH1=0XF3;   //计数器初始值设置,注意波特率是4800的
  28.     TL1=0XF3;
  29.     ES=1;    //打开接收中断
  30.     EA=1;    //打开总中断
  31.     TR1=1;    //打开计数器

  32.     dat_count = 0;
  33.     buff_lenght = 0;
  34.     buff_useful = 0;
  35. }
  36. /*中断函数,中断函数完全用作了接收函数*/
  37. void serial()interrupt 4
  38. {
  39.     uchar temp;uint i;
  40.     if(RI == 1)
  41.     {
  42.         temp = SBUF;
  43.         RI = 0;
  44.         if(dat_count < buff_size && temp != '\r' && temp != '\n')  //判断接收结束
  45.        {
  46.             uint i;
  47.             if(dat_count == 0)
  48.                 for(i = 0; i < buff_size;i ++)        //清空接收缓存
  49.                     Read_buff[i] = ' ';
  50.             Read_buff[dat_count] = temp;              //将数据存入存储
  51.             buff_useful = 0;
  52.             dat_count ++;
  53.             buff_lenght = dat_count;                  //获取接收字符串长度
  54.        }
  55.         else
  56.         {
  57.             dat_count = 0;
  58.             buff_useful = 1;
  59.         }
  60.     }
  61. }
  62. /*为了与ArduinoIDE相似所以做了一下调整*/
  63. /*是否成功接收到字符串*/
  64. uint Serial_available()
  65. {
  66.     return buff_useful;
  67. }
  68. /*获取字符串*/
  69. uchar* Serial_Read()
  70. {
  71.     uchar *p="";
  72.     if(buff_useful)
  73.         p = Read_buff;
  74.     buff_useful = 0;
  75.     return p;
  76. }
  77. /*发送*/
  78. void Serial_write(uchar dat)
  79. {
  80.     ES=0;
  81.     SBUF = dat;
  82.     while(!TI);  //等待发送完成
  83.     TI = 0;
  84.      ES=1; 
  85. }
  86. /*发送字符串*/
  87. void Serial_println(uchar *STR)
  88. {
  89.     uchar *STR2 = "\r\n";        //回车做结束符
  90.     while(*STR)
  91.     {
  92.         Serial_write(*(STR++));
  93.     }
  94.     while(*STR2)
  95.     {
  96.         Serial_write(*(STR2++));   //发送回车做结束符
  97.     }
  98. }
  99. /**/
  100. void setup()
  101. {
  102.     INIT_begin();
  103. }
  104. /**/
  105. void loop()
  106. {
  107.     if(Serial_available())
  108.     {
  109.         control = Serial_Read();
  110.     }
  111.     if(strstr(control,"led_on") != NULL)
  112.          led = 0x00;
  113.     if(strstr(control,"led_off") != NULL)
  114.         led = 0xff;
  115. }
  116. void main()
  117. {
  118.     void setup();
  119.     while(1)
  120.          loop();
  121. }


路过

鸡蛋
2

鲜花

握手

雷人

刚表态过的朋友 (2 人)

评论 (0 个评论)

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

Powered by 单片机教程网

返回顶部