找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1952|回复: 4
收起左侧

求大神帮忙看一下,哪里出问题了,为什么不能完成双机通讯

[复制链接]
回帖奖励 50 黑币 回复本帖可获得 5 黑币奖励! 每人限 1 次
ID:201803 发表于 2017-5-24 15:07 | 显示全部楼层 |阅读模式
超声波检测停车位信息,传给另一个单片机显示信息,为什么仿真不出来,代码有问题吗?主机代码
  1. #include <REGX52.H>
  2. #include <stdio.h>
  3. #include<intrins.h>

  4. sbit csb=P1^0;                        // 第一路 Trig
  5. sbit csbint=P1^1;                // 第一路 Echo
  6. sbit csb1=P1^3;                   //  第二路 Trig
  7. sbit csbint1=P1^2;           //  第二路 Echo
  8. sbit csb2=P1^5;                   //  第三路 Trig
  9. sbit csbint2=P1^4;           //  第三路 Echo
  10. sbit csb3=P1^7;                   //  第四路 Trig
  11. sbit csbint3=P1^6;           //  第四路 Echo

  12. sbit RS = P0^7;   //定义端口
  13. sbit RW = P0^6;
  14. sbit EN = P0^5;

  15. #define RS_CLR RS=0
  16. #define RS_SET RS=1

  17. #define RW_CLR RW=0
  18. #define RW_SET RW=1

  19. #define EN_CLR EN=0
  20. #define EN_SET EN=1
  21.        
  22. unsigned char cc[]={' ',' ',' ',' ','T','o','t','a','l',':','4',' ',' ',' ',' ',' '};
  23. unsigned char dd[]={'F','r','e','e',':',' ',' ',' ',' ','B','u','s','y',':',' ',' '};
  24.                                          
  25. unsigned int a1,a2,a3,a4,s,j,s1,s2,s3,s4,kw;
  26. float csbc;

  27. void DelayUs2x(unsigned char t)
  28. {   
  29.         while(--t);
  30. }

  31. void DelayMs(unsigned char t)
  32. {
  33.           while(t--)                 //大致延时1mS
  34.         {
  35.              DelayUs2x(245);
  36.                  DelayUs2x(245);
  37.         }
  38. }
  39. void MasterUART_init(void)
  40. {
  41.     SCON = 0x50;
  42.     TMOD = 0x20;
  43.     TH1  = 0xFD;
  44.     TL1  = 0xFD;
  45.     TR1  = 1;
  46. }
  47. void Send(unsigned char dat)

  48. {

  49.         SBUF=dat;
  50.    while(TI==0)
  51.       ;                        //等待
  52.     TI=0;
  53. }
  54. void write_com(unsigned char com) //写命令
  55. {
  56.         RS_CLR;
  57.         RW_CLR;
  58.         P2=com;
  59.         DelayMs(2);
  60.         EN_SET;
  61.         DelayMs(2);
  62.         EN_CLR;
  63. }

  64. void write_data(unsigned char date)         //写一个字符
  65. {
  66.         RS_SET;
  67.         RW_CLR;
  68.         P2=date;
  69.         DelayMs(2);
  70.         EN_SET;
  71.         DelayMs(2);
  72.         EN_CLR;
  73. }

  74. void init()                        //初始化
  75. {
  76.         write_com(0x38);
  77.         write_com(0x0c);
  78.         write_com(0x06);
  79.         write_com(0x01);
  80. }

  81. /*------------------------------------------------
  82.               写入字符串函数
  83. ------------------------------------------------*/
  84. void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
  85. {     
  86.         if (y == 0)
  87.         {     
  88.                  write_com(0x80 + x);     
  89.         }
  90.         else
  91.         {     
  92.                 write_com(0xC0 + x);     
  93.         }        
  94.         while (*s)
  95.         {     
  96.                 write_data( *s);     
  97.                 s ++;     
  98.         }
  99. }
  100. main()
  101. {
  102.         TH0=0;
  103.         TL0=0;
  104.         TMOD=0X11;        //T1,T0为16位定时器
  105.         EA=0;
  106.         init();
  107.           while(1)
  108.         {
  109.                
  110. ///////////////////////////////////////////
  111. //                    第一路        测距模块                         //
  112. ///////////////////////////////////////////
  113.                   csb=0;                                             //启动一次模块
  114.                   _nop_();
  115.                   _nop_();
  116.                   _nop_();
  117.                   _nop_();
  118.                   _nop_();
  119.                   _nop_();
  120.                   _nop_();
  121.                   _nop_();
  122.                   _nop_();
  123.                   _nop_();
  124.                   _nop_();
  125.                   _nop_();
  126.                   _nop_();
  127.                   _nop_();
  128.                   _nop_();
  129.                   _nop_();
  130.                   _nop_();
  131.                   _nop_();
  132.                   _nop_();
  133.                   _nop_();
  134.                   _nop_();
  135.                   _nop_();
  136.                   _nop_();
  137.                   _nop_();
  138.                   _nop_();
  139.                   csb=1;
  140.                 ET0=1;        //启动计数器T0,用以计时
  141.                 TR0=1;
  142.                 EA=1;
  143.                 j=150;        //延时                 
  144.             while(j--)
  145.                 {
  146.                 }
  147.                 csbint=1;
  148.         j=0;
  149.                    while(csbint)                        //判断接收回路是否收到超声波的回波
  150.                 {
  151.                         j++;
  152.                         if(j>=2500)                        //如果达到一定时间没有收到回波,则将csbint置零,退出接收回波处理程序
  153.                         csbint=0;
  154.                 }
  155.                 TR0=0;
  156.                 s1=TH0*256+TL0;                        //读取时间数据
  157.                 TH0=0;
  158.                 TL0=0;
  159.                 csbc=0.034;
  160.                 csbc=csbc/2;
  161.                 s1=s1*csbc-8;

  162. ///////////////////////////////////////////
  163. //                    第二路        测距模块                         //
  164. ///////////////////////////////////////////
  165.                   csb1=0;                                             //启动一次模块
  166.                   _nop_();
  167.                   _nop_();
  168.                   _nop_();
  169.                   _nop_();
  170.                   _nop_();
  171.                   _nop_();
  172.                   _nop_();
  173.                   _nop_();
  174.                   _nop_();
  175.                   _nop_();
  176.                   _nop_();
  177.                   _nop_();
  178.                   _nop_();
  179.                   _nop_();
  180.                   _nop_();
  181.                   _nop_();
  182.                   _nop_();
  183.                   _nop_();
  184.                   _nop_();
  185.                   _nop_();
  186.                   _nop_();
  187.                   _nop_();
  188.                   _nop_();
  189.                   _nop_();
  190.                   _nop_();
  191.                   csb1=1;
  192.                 ET0=1;        //启动计数器T0,用以计时
  193.                 TR0=1;
  194.                 EA=1;
  195.                 j=150;        //延时                 
  196.             while(j--)
  197.                 {
  198.                 }
  199.                 csbint1=1;
  200.         j=0;
  201.                    while(csbint1)                        //判断接收回路是否收到超声波的回波
  202.                 {
  203.                         j++;
  204.                         if(j>=2500)                        //如果达到一定时间没有收到回波,则将csbint置零,退出接收回波处理程序
  205.                         csbint1=0;
  206.                 }
  207.                 TR0=0;
  208.                 s2=TH0*256+TL0;                        //读取时间数据
  209.                 TH0=0;
  210.                 TL0=0;
  211.                 csbc=0.034;
  212.                 csbc=csbc/2;
  213.                 s2=s2*csbc-8;

  214. ///////////////////////////////////////////
  215. //                    第三路        测距模块                         //
  216. ///////////////////////////////////////////

  217.                   csb2=0;                                             //启动一次模块
  218.                   _nop_();
  219.                   _nop_();
  220.                   _nop_();
  221.                   _nop_();
  222.                   _nop_();
  223.                   _nop_();
  224.                   _nop_();
  225.                   _nop_();
  226.                   _nop_();
  227.                   _nop_();
  228.                   _nop_();
  229.                   _nop_();
  230.                   _nop_();
  231.                   _nop_();
  232.                   _nop_();
  233.                   _nop_();
  234.                   _nop_();
  235.                   _nop_();
  236.                   _nop_();
  237.                   _nop_();
  238.                   _nop_();
  239.                   _nop_();
  240.                   _nop_();
  241.                   _nop_();
  242.                   _nop_();
  243.                   csb2=1;
  244.                 ET0=1;        //启动计数器T0,用以计时
  245.                 TR0=1;
  246.                 EA=1;
  247.                 j=150;        //延时                 
  248.             while(j--)
  249.                 {
  250.                 }
  251.                 csbint2=1;
  252.         j=0;
  253.                    while(csbint2)                        //判断接收回路是否收到超声波的回波
  254.                 {
  255.                         j++;
  256.                         if(j>=2500)                        //如果达到一定时间没有收到回波,则将csbint置零,退出接收回波处理程序
  257.                         csbint2=0;
  258.                 }
  259.                 TR0=0;
  260.                 s3=TH0*256+TL0;                        //读取时间数据
  261.                 TH0=0;
  262.                 TL0=0;
  263.                 csbc=0.034;
  264.                 csbc=csbc/2;
  265.                 s3=s3*csbc-8;
  266. ///////////////////////////////////////////
  267. //                    第四路        测距模块                         //
  268. ///////////////////////////////////////////

  269.                   csb3=0;                                             //启动一次模块
  270.                   _nop_();
  271.                   _nop_();
  272.                   _nop_();
  273.                   _nop_();
  274.                   _nop_();
  275.                   _nop_();
  276.                   _nop_();
  277.                   _nop_();
  278.                   _nop_();
  279.                   _nop_();
  280.                   _nop_();
  281.                   _nop_();
  282.                   _nop_();
  283.                   _nop_();
  284.                   _nop_();
  285.                   _nop_();
  286.                   _nop_();
  287.                   _nop_();
  288.                   _nop_();
  289.                   _nop_();
  290.                   _nop_();
  291.                   _nop_();
  292.                   _nop_();
  293.                   _nop_();
  294.                   _nop_();
  295.                   csb3=1;
  296.                 ET0=1;        //启动计数器T0,用以计时
  297.                 TR0=1;
  298.                 EA=1;
  299.                 j=150;        //延时                 
  300.             while(j--)
  301.                 {
  302.                 }
  303.                 csbint3=1;
  304.         j=0;
  305.                    while(csbint3)                        //判断接收回路是否收到超声波的回波
  306.                 {
  307.                         j++;
  308.                         if(j>=2500)                        //如果达到一定时间没有收到回波,则将csbint置零,退出接收回波处理程序
  309.                         csbint2=0;
  310.                 }
  311.                 TR0=0;
  312.                 s4=TH0*256+TL0;                        //读取时间数据
  313.                 TH0=0;
  314.                 TL0=0;
  315.                 csbc=0.034;
  316.                 csbc=csbc/2;
  317.                 s4=s4*csbc-8;

  318.                 if(s1>100) //测量值小于下限
  319.                 {
  320.                         a1=0;
  321.                 }
  322.                 else
  323.                 {
  324.                         a1=1;
  325.                 }


  326.                 if(s2>100) //测量值小于下限
  327.                 {
  328.                         a2=0;
  329.                 }
  330.                 else
  331.                 {
  332.                         a2=1;
  333.                 }

  334.                 if(s3>100) //测量值小于下限
  335.                 {
  336.                         a3=0;
  337.                 }
  338.                 else
  339.                 {
  340.                         a3=1;
  341.                 }


  342.                 if(s4>100) //测量值小于下限
  343.                 {
  344.                         a4=0;
  345.                 }
  346.                 else
  347.                 {
  348.                         a4=1;
  349.                 }

  350.                 kw=a1+a2+a3+a4;
  351.                 dd[14]=kw+'0';
  352.                 dd[5]=4-kw+'0';
  353.                 LCD_Write_String(0,0,cc);
  354.                 LCD_Write_String(0,1,dd);
  355.         }
  356.         MasterUART_init();
  357.         while(1)
  358.         {
  359.            Send(kw);        //发送数据i
  360.        DelayMs(2);
  361.          }
  362. }
复制代码
从机代码

  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #define uchar  unsigned char
  4. #define uint    unsigned int
  5. uchar code DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
  6. void delay_ms(uint t)
  7. {
  8.   uint m,n;
  9.   for (m=0;m<t;m++)
  10.    for (n=0;n<1000;n++);

  11. }
  12. void SlaveUART_init(void)
  13. {
  14.     SCON = 0x50;
  15.     TMOD = 0x20;
  16.     TH1  = 0xFD;
  17.     TL1  = 0xFD;
  18.     TR1  = 1;
  19. }
  20. unsigned char Receive(void)
  21. {
  22.           unsigned char dat;
  23.           while(RI==0)  
  24.          ;      //等待,直至接收完毕(RI=1)
  25.         RI=0;      //为了接收下一帧数据,需将RI清0
  26.     dat=SBUF;  //将接收缓冲器中的数据存于dat
  27.         return dat;
  28. }

  29. main()
  30. {
  31.     unsigned char tmp;
  32.     SlaveUART_init();
  33.     while(1);
  34.         {
  35.             tmp=Receive();
  36.                 P0=DSY_CODE[tmp];
  37.         }
  38. }
复制代码
电路图

QQ截图20170524150421.png
回复

使用道具 举报

ID:82765 发表于 2017-5-24 20:25 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

ID:201803 发表于 2017-5-25 12:42 | 显示全部楼层
cjjcjj1 发表于 2017-5-24 20:25
你好!你现在仿真的情况是怎么样?实现了什么,还存在什么问题

您好 情况已经解决了 谢谢
回复

使用道具 举报

ID:205012 发表于 2017-5-26 10:40 | 显示全部楼层
这么快就解决了
回复

使用道具 举报

ID:191910 发表于 2017-5-27 13:23 | 显示全部楼层
超声波检测在protues用的是哪个器件,请楼主分享一下,谢谢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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