找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3801|回复: 0
收起左侧

51单片机多机通信源码

[复制链接]
ID:359331 发表于 2018-7-16 12:05 | 显示全部楼层 |阅读模式
单片机源程序如下:
  1. #include <reg52.h>
  2. #include <string.h>
  3. #include <stdio.h>

  4. #define uchar unsigned char
  5. #define uint unsigned int
  6.        
  7. #define addr1 0x00     //本机地址
  8. #define led P2

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


  13. uchar Read_buff[16];   //设置接收字符串
  14. uchar *control = "";   //控制LED

  15. bit getAddr = 0;       //判断连接

  16. void Serial_write(uchar dat);
  17. void Serial_print(uchar *STR);
  18. void Serial_println(uchar *STR);
  19. uint Serial_available();
  20. uchar* Serial_Read();
  21. void setup();
  22. void loop();
  23. void controlLED();

  24. /*******************************************************************************
  25. * 函数名         : delay10us(uint u)
  26. * 函数功能                 : 延时u*10 us
  27. * 输入           : uint u
  28. * 输出                  : 无
  29. *******************************************************************************/
  30. void delay10us(uint u)   //误差 0us
  31. {
  32.     unsigned char a,b;
  33.         for( ; u > 0 ; u --)
  34.                 for(b=1;b>0;b--)
  35.                          for(a=1;a>0;a--);
  36. }
  37. /*******************************************************************************
  38. * 函数名         : delay(uint u)
  39. * 函数功能                 : 延时ums
  40. * 输入           : uint u
  41. * 输出                  : 无
  42. *******************************************************************************/
  43. void delay(uint u)                       //延时ums 12M晶振误差 0us
  44. {
  45.    unsigned char a,b;
  46.    for( ; u > 0 ; u --)         
  47.                 for(b=199;b>0;b--)
  48.                         for(a=1;a>0;a--);
  49. }
  50. /*******************************************************************************
  51. * 函数名         : setup()
  52. * 函数功能                 : 初始化串口中断
  53. * 输入           : 无
  54. * 输出                  : 无
  55. *******************************************************************************/
  56. void beginINIT()
  57. {
  58.         SCON=0Xf0;                        //设置为工作方式3,打开接收允许位
  59.         TMOD=0X20;                        //设置计数器1,工作方式2
  60.         PCON=0X80;                        //波特率加倍
  61.         TH1=0XF3;                        //计数器初始值设置,注意波特率是4800的
  62.         TL1=0XF3;
  63.         ES=1;                                //打开接收中断
  64.         EA=1;                                //打开总中断
  65.         TR1=1;                                //打开计数器
  66.         dat_count = 0;
  67.         buff_lenght = 0;
  68.         buff_useful = 0;
  69. }
  70. /*******************************************************************************
  71. * 函数名         : serial()
  72. * 函数功能                 : 串口中断,读取串口数据
  73. * 输入           : 无
  74. * 输出                  : 无
  75. *******************************************************************************/
  76. void serial()interrupt 4
  77. {       
  78.         uchar temp;
  79.        
  80.         if(RI == 1)
  81.         {
  82.                 temp = SBUF;
  83.                 RI = 0;
  84.                 if(RB8)
  85.                 {
  86.                         if(temp == addr1)                        //从机1
  87.                         {
  88.                                 Serial_write(addr1);
  89.                                 getAddr = 1;
  90.                         }
  91.                 }
  92.                 else if(getAddr)
  93.                 {
  94.                         getAddr = 0;
  95.                         if(dat_count < buff_size && temp != '\r' && temp != '\n')  //判断接收结束
  96.                         {
  97.                                 uint i;
  98.                                 if(dat_count == 0)
  99.                                         for(i = 0; i < buff_size;i ++)        //清空接收缓存
  100.                                                 Read_buff[i] = ' ';
  101.                                 Read_buff[dat_count] = temp;              //将数据存入存储
  102.                                 buff_useful = 0;
  103.                                 dat_count ++;
  104.                                 buff_lenght = dat_count;                  //获取接收字符串长度
  105.                         }
  106.                         else
  107.                         {               
  108.                                 dat_count = 0;
  109.                                 buff_useful = 1;
  110.                         }       
  111.                 }               
  112.         }               
  113. }

  114. /*******************************************************************************
  115. * 函数名         : Serial_write(uchar dat)
  116. * 函数功能                 : 串口发送一个字节数据
  117. * 输入           : uchar dat
  118. * 输出                  : 无
  119. *******************************************************************************/
  120. void Serial_write(uchar dat)
  121. {
  122.         ES=0;
  123.         SBUF = dat;
  124.         while(!TI);  //等待发送完成
  125.         TI = 0;
  126.         ES=1;
  127. }
  128. /*******************************************************************************
  129. * 函数名         : Serial_print(uchar *STR)
  130. * 函数功能                 : 串口发送字符串
  131. * 输入           : uchar *STR
  132. * 输出                  : 无
  133. *******************************************************************************/
  134. void Serial_print(uchar *STR)
  135. {
  136.         while(*STR)
  137.         {
  138.                 Serial_write(*(STR++));
  139.         }
  140. }
  141. /*******************************************************************************
  142. * 函数名         : Serial_println(uchar *STR)
  143. * 函数功能                 : 串口发送字符串,并加上回车
  144. * 输入           : uchar *STR
  145. * 输出                  : 无
  146. *******************************************************************************/
  147. void Serial_println(uchar *STR)
  148. {
  149.         uchar *STR2 = "\r\n";        //回车做结束符
  150.         while(*STR)
  151.         {
  152.                 Serial_write(*(STR++));
  153.         }
  154.        
  155.         while(*STR2)
  156.         {
  157.                 Serial_write(*(STR2++));   //发送回车做结束符
  158.         }
  159. }
  160. /*******************************************************************************
  161. * 函数名         : Serial_available()
  162. * 函数功能                 : 判断串口是否接收数据
  163. * 输入           : buff_useful
  164. * 输出                  : 无
  165. *******************************************************************************/
  166. uint Serial_available()
  167. {
  168.         return buff_useful;
  169. }
  170. /*******************************************************************************
  171. * 函数名         : Serial_Read()
  172. * 函数功能                 : 读取串口是接收的一个字节数据
  173. * 输入           : temp
  174. * 输出                  : 无
  175. *******************************************************************************/
  176. uchar* Serial_Read()
  177. {
  178.         uchar *p="";
  179.         if(buff_useful)
  180.                 p = Read_buff;
  181.         buff_useful = 0;

  182.         return p;
  183. }


  184. /*******************************************************************************
  185. * 函数名         : main()
  186. * 函数功能                 : 程序入口
  187. * 输入           : 无
  188. * 输出                  : 无
  189. *******************************************************************************/
  190. void main()
  191. {
  192.         setup();
  193.         while(1)
  194.                 loop();
  195. }
  196. /*******************************************************************************
  197. * 函数名         : controlLED()
  198. * 函数功能                 : 串口控制LED函数
  199. * 输入           : 无
  200. * 输出                  : 无
  201. *******************************************************************************/
  202. void controlLED()
  203. {
  204.         if(buff_useful)
  205.                 control = Serial_Read();
  206.         if(strstr(control,"led_on") != NULL)
  207.                 led = 0x00;
  208.        
  209.         if(strstr(control,"led_off") != NULL)
  210.                 led = 0xff;
  211. }
  212. /*******************************************************************************
  213. * 函数名         : setup()
  214. * 函数功能                 : 初始化函数
  215. * 输入           : 无
  216. * 输出                  : 无
  217. *******************************************************************************/
  218. void setup()
  219. {
  220.         beginINIT();
  221. }
  222. /*******************************************************************************
  223. * 函数名         : loop()
  224. * 函数功能                 : 功能函数
  225. * 输入           : 无
  226. * 输出                  : 无
  227. *******************************************************************************/
  228. void loop()
  229. {
  230.         controlLED();
  231. }
复制代码

所有资料51hei提供下载:
单片机多机通信程序.rar (54.53 KB, 下载次数: 44)


评分

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

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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