1. 1 /*-------------------------------------------
  2. 2 简单的串口通信
  3. 3 -------------------------------------------*/
  4. 4 #include<reg51.h>
  5. 5
  6. 6 #define uint unsigned int
  7. 7 #define uchar unsigned char
  8. 8
  9. 9
  10. 10 uchar flag,a,i; //标志接收串口中断标志,接收SBUF内容
  11. 11 uchar code table[]="I get ";
  12. 12 /*--------------------------------------------
  13. 13 延时函数
  14. 14 ---------------------------------------------*/
  15. 15 void delay_ms(uint z)
  16. 16 {
  17. 17 uint y;
  18. 18 while(z--)
  19. 19 for(y=110;y>0;y--);
  20. 20 }
  21. 21 /*--------------------------------------------
  22. 22 USAR初始函数
  23. 23 ---------------------------------------------*/
  24. 24 void USRT_init()
  25. 25 {
  26. 26 TMOD=0x20; //设置T1定时器工作方式2
  27. 27 TH1=0xfd; //T1定时器装初值
  28. 28 TL1=0xfd;
  29. 29 TR1=1; //启动T1定时器
  30. 30 REN=1; //允许串口中断接收
  31. 31 SM0=0; //设定串口工作方式
  32. 32 SM1=1;
  33. 33 EA=1; //开总中断
  34. 34 ES=1; //开串口中断
  35. 35 }
  36. 36 /*--------------------------------------------
  37. 37 串口中断程序
  38. 38 ---------------------------------------------*/
  39. 39 void ser()interrupt 4
  40. 40 {
  41. 41 RI=0;
  42. 42 a=SBUF;
  43. 43 flag=1;
  44. 44 }
  45. 45 /*--------------------------------------------
  46. 46 主函数
  47. 47 ---------------------------------------------*/
  48. 48 void main()
  49. 49 {
  50. 50 USRT_init();
  51. 51 while(1)
  52. 52 {
  53. 53 if(flag==1) //检测到串口中断。表示有数据传过来了
  54. 54 {
  55. 55 ES=0; //关闭串口中断,接下来要发送数据,如果不关闭每次发送之后串口中断都会执行又进入if(flag==1)那里,然后死循环
  56. 56 for(i=0;i<6;i++) //将table[]中的前6个发送出去
  57. 57 {
  58. 58 SBUF=table[i];
  59. 59 while(!TI); //每次等待发送完毕,再执行下一条
  60. 60 TI=0; //手动清0
  61. 61 }
  62. 62 SBUF=a; //将收到的数据发送出去
  63. 63 while(!TI);
  64. 64 TI=0;
  65. 65 ES=1;
  66. 66 flag=0;
  67. 67 }
  68. 68 }
  69. 69 }

 

版权声明:本文为zjutlitao原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/zjutlitao/p/3788696.html