找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2439|回复: 0
打印 上一主题 下一主题
收起左侧

主从机多机通信模型类似云台解码器一样用跳线设置从机地址

[复制链接]
跳转到指定楼层
楼主
ID:72008 发表于 2015-1-11 20:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include //STC12C5AxxS2系列单片机头文件
  2. #define uchar unsigned char//宏定义
  3. #define uint unsigned int//宏定义

  4. uchar DZ;//地址号,为接线方便本程序占用P1口用做手工地址设置后面的控制会对P1口无效
  5. //一帧标准数据帧
  6. int D=0; //缓冲区指针标志
  7. uchar DATA[3]; //数据帧格式为【地址】【请求OR设置标志(1为请求2为设置,请求时数据位为空数据)】【IO口号0对应P0,1对应P1.....】【数据】

  8. /*********************************************************************************************
  9. 函数名:毫秒级CPU延时函数
  10. 调 用:DELAY_MS (?);
  11. 参 数:1~65535(参数不可为0)
  12. 返回值:无
  13. 结 果:占用CPU方式延时与参数数值相同的毫秒时间
  14. 备 注:应用于1T单片机时i<600,应用于12T单片机时i<125
  15. /*********************************************************************************************/
  16. void DELAY_MS (unsigned int a){
  17. unsigned int i;
  18. while( a-- != 0){
  19. for(i = 0; i < 600; i++);
  20. }
  21. }
  22. /*********************************************************************************************/

  23. /*********************************************************************************************
  24. 函数名:UART串口初始化函数
  25. 调 用:UART_init();
  26. 参 数:无
  27. 返回值:无
  28. 结 果:启动UART串口接收中断,允许串口接收,启动T/C1产生波特率(占用)
  29. 备 注:振荡晶体为12MHz,PC串口端设置 [ 4800,8,无,1,无 ]
  30. /**********************************************************************************************/
  31. void UART_init (void){
  32. EA = 1; //允许总中断(如不使用中断,可用//屏蔽)
  33. ES = 1; //允许UART串口的中断

  34. TMOD = 0x20; //定时器T/C1工作方式2
  35. SCON = 0x50; //串口工作方式1,允许串口接收(SCON = 0x40 时禁止串口接收)
  36. TH1 = 0xF3; //定时器初值高8位设置
  37. TL1 = 0xF3; //定时器初值低8位设置
  38. PCON = 0x80; //波特率倍频(屏蔽本句波特率为2400)
  39. TR1 = 1; //定时器启动
  40. }
  41. /**********************************************************************************************/

  42. /*********************************************************************************************
  43. 函数名:UART串口接收中断处理函数
  44. 调 用:[SBUF收到数据后中断处理]
  45. 参 数:无
  46. 返回值:无
  47. 结 果:UART串口接收到数据时产生中断,用户对数据进行处理(并发送回去)
  48. 备 注:过长的处理程序会影响后面数据的接收
  49. /**********************************************************************************************/
  50. void UART_R (void) interrupt 4 using 1{ //切换寄存器组到1
  51. unsigned char UART_data; //定义串口接收数据变量
  52. if(RI&&D<=3){
  53. RI = 0; //令接收中断标志位为0(软件清零)
  54. UART_data = SBUF; //将接收到的数据送入变量 UART_data
  55. DATA[D]=UART_data;
  56. D++;
  57. }
  58. }
  59. /**********************************************************************************************/


  60. /*********************************************************************************************
  61. 函数名:UART串口发送函数
  62. 调 用:UART_T (?);
  63. 参 数:需要UART串口发送的数据(8位/1字节)
  64. 返回值:无
  65. 结 果:将参数中的数据发送给UART串口,确认发送完成后退出
  66. 备 注:
  67. /**********************************************************************************************/
  68. void UART_T (unsigned char UART_data){ //定义串口发送数据变量
  69. SBUF = UART_data; //将接收的数据发送回去
  70. while(TI == 0); //检查发送中断标志位
  71. TI = 0; //令发送中断标志位为0(软件清零)
  72. }
  73. /**********************************************************************************************/

  74. /*********************************************************************************************
  75. 函数名:UART串口发送字符串函数
  76. 调 用:UART_TC (?);
  77. 参 数:需要UART串口发送的数据(8位/1字节)
  78. 返回值:无
  79. 结 果:向串口发送一个字符串,长度不限。
  80. 备 注:例:UART_TC("d9887321$"); 此函数需要#include 头文件支持。
  81. /**********************************************************************************************/
  82. void UART_TC (unsigned char *str){
  83. while(*str != '\0'){
  84. UART_T(*str);
  85. *str++;
  86. }
  87. *str = 0;
  88. }
  89. /**********************************************************************************************/

  90. /*********************************************************************************************
  91. 函数名:主函数
  92. 调 用:无
  93. 参 数:无
  94. 返回值:无
  95. 结 果:程序开始处,无限循环
  96. 备 注:
  97. /**********************************************************************************************/
  98. void main (void)
  99. {
  100. uint x;
  101. //地址初始化
  102. DZ=P1;
  103. //串口初始化
  104. UART_init ();
  105. while(1)
  106. {
  107. //地址初始化
  108. DZ=P1;
  109. if(D>3)
  110. {
  111. //已经收到一帧控制数据
  112. if(DATA[0]==DZ)
  113. {
  114. if(DATA[1]==1)
  115. {
  116. //返回IO口状态数据
  117. switch( DATA[2])
  118. {
  119. case 0:
  120. DATA[3]=P0;
  121. for(x=0;x<=3;x++)
  122. {
  123. UART_T(DATA[x]);
  124. }
  125. break;
  126. case 2:
  127. DATA[3]=P2;
  128. for(x=0;x<=3;x++)
  129. {
  130. UART_T(DATA[x]);
  131. }
  132. break;
  133. }
  134. }else if(DATA[1]==2)
  135. {
  136. //设置IO口状态
  137. switch( DATA[2])
  138. {
  139. case 0:
  140. P0=DATA[3];
  141. break;
  142. case 2:
  143. P2=DATA[3];
  144. break;
  145. }
  146. }
  147. }
  148. D=0;
  149. }
  150. }

  151. }
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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