返回列表 发帖

51 IO口模拟串口通讯C源程序

  1. #include <reg51.h>
  2. sbit BT_SND =P1^0;
  3. sbit BT_REC =P1^1;
  4. /**********************************************

  5. IO 口模拟232通讯程序

  6. 使用两种方式的C程序 占用定时器0

  7. **********************************************/

  8. #define MODE_QUICK

  9. #define F_TM F0

  10. #define TIMER0_ENABLE TL0=TH0; TR0=1;
  11. #define TIMER0_DISABLE TR0=0;

  12. sbit ACC0= ACC^0;
  13. sbit ACC1= ACC^1;
  14. sbit ACC2= ACC^2;
  15. sbit ACC3= ACC^3;
  16. sbit ACC4= ACC^4;
  17. sbit ACC5= ACC^5;
  18. sbit ACC6= ACC^6;
  19. sbit ACC7= ACC^7;

  20. void IntTimer0() interrupt 1
  21. {
  22. F_TM=1;
  23. }
  24. //发送一个字符
  25. void PSendChar(unsigned char inch)
  26. {
  27. #ifdef MODE_QUICK
  28. ACC=inch;

  29. F_TM=0;
  30. BT_SND=0; //start bit
  31. TIMER0_ENABLE; //启动
  32. while(!F_TM);

  33. BT_SND=ACC0; //先送出低位
  34. F_TM=0;
  35. while(!F_TM);

  36. BT_SND=ACC1;
  37. F_TM=0;
  38. while(!F_TM);

  39. BT_SND=ACC2;
  40. F_TM=0;
  41. while(!F_TM);

  42. BT_SND=ACC3;
  43. F_TM=0;
  44. while(!F_TM);

  45. BT_SND=ACC4;
  46. F_TM=0;
  47. while(!F_TM);

  48. BT_SND=ACC5;
  49. F_TM=0;
  50. while(!F_TM);

  51. BT_SND=ACC6;
  52. F_TM=0;
  53. while(!F_TM);

  54. BT_SND=ACC7;
  55. F_TM=0;
  56. while(!F_TM);

  57. BT_SND=1;
  58. F_TM=0;
  59. while(!F_TM);


  60. TIMER0_DISABLE; //停止timer
  61. #else
  62. unsigned char ii;

  63. ii=0;

  64. F_TM=0;
  65. BT_SND=0; //start bit
  66. TIMER0_ENABLE; //启动
  67. while(!F_TM);

  68. while(ii<8)
  69. {
  70. if(inch&1)
  71. {
  72. BT_SND=1;
  73. }
  74. else
  75. {
  76. BT_SND=0;
  77. }
  78. F_TM=0;
  79. while(!F_TM);
  80. ii++;
  81. inch>>=1;
  82. }
  83. BT_SND=1;
  84. F_TM=0;
  85. while(!F_TM);

  86. #endif
  87. TIMER0_DISABLE; //停止timer
  88. }
  89. //接收一个字符
  90. unsigned char PGetChar()
  91. {
  92. #ifdef MODE_QUICK

  93. TIMER0_ENABLE;
  94. F_TM=0;
  95. while(!F_TM); //等过起始位
  96. ACC0=BT_REC;

  97. TL0=TH0;

  98. F_TM=0;
  99. while(!F_TM);
  100. ACC1=BT_REC;

  101. F_TM=0;
  102. while(!F_TM);
  103. ACC2=BT_REC;

  104. F_TM=0;
  105. while(!F_TM);
  106. ACC3=BT_REC;

  107. F_TM=0;
  108. while(!F_TM);
  109. ACC4=BT_REC;

  110. F_TM=0;
  111. while(!F_TM);
  112. ACC5=BT_REC;

  113. F_TM=0;
  114. while(!F_TM);
  115. ACC6=BT_REC;

  116. F_TM=0;
  117. while(!F_TM);
  118. ACC7=BT_REC;

  119. F_TM=0;

  120. while(!F_TM)
  121. {
  122. if(BT_REC)
  123. {
  124. break;
  125. }
  126. }
  127. TIMER0_DISABLE; //停止timer
  128. return ACC;
  129. #else
  130. unsigned char rch,ii;
  131. TIMER0_ENABLE;
  132. F_TM=0;
  133. ii=0;
  134. rch=0;
  135. while(!F_TM); //等过起始位

  136. while(ii<8)
  137. {
  138. rch>>=1;
  139. if(BT_REC)
  140. {
  141. rch|=0x80;
  142. }
  143. ii++;
  144. F_TM=0;
  145. while(!F_TM);

  146. }
  147. F_TM=0;
  148. while(!F_TM)
  149. {
  150. if(BT_REC)
  151. {
  152. break;
  153. }

  154. }
  155. TIMER0_DISABLE; //停止timer
  156. return rch;

  157. #endif

  158. }
  159. //检查是不是有起始位
  160. bit StartBitOn()
  161. {
  162. return (BT_REC==0);

  163. }
  164. void main()
  165. {
  166. unsigned char gch;

  167. TMOD=0x22; /*定时器1为工作模式2(8位自动重装),0为模式2(8位
  168. 自动重装) */
  169. PCON=00;

  170. TR0=0; //在发送或接收才开始使用
  171. TF0=0;
  172. TH0=(256-96); //9600bps 就是 1000000/9600=104.167微秒 执行的
  173. timer是
  174. //
  175. 104.167*11.0592/12= 96
  176. TL0=TH0;
  177. ET0=1;
  178. EA=1;

  179. PSendChar(0x55);
  180. PSendChar(0xaa);
  181. PSendChar(0x00);
  182. PSendChar(0xff);

  183. while(1)
  184. {
  185. if(StartBitOn())
  186. {
  187. gch=PGetChar();
  188. PSendChar(gch);
  189. }
  190. }

  191. }
复制代码

返回列表

最新关注 关闭


关于论坛注册,最新修改,请网友们注意

由于最近大量垃圾信息出现在我们的论坛,为了营造一个良好的氛围,目前论坛只开发邀请注册,你可以点击以下链接自动邀请注册(如果有人使用了点击下一个试一试) ...


查看
珩源工控论坛热诚欢迎您联系我们进行合作!

Powered by Discuz! 7.2© 2001-2009 Comsenz Inc.

珩源工控论坛 ( 桂ICP备19004328号) |论坛统计|WAP| 客服中心-www.hymcu.com
  

GMT+8, 2024-11-24 16:31, Processed in 1.066064 second(s), 5 queries, Gzip enabled.