找回密码
 立即注册

QQ登录

只需一步,快速开始

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

问题在图片里,就是单片机串口通信的发送问题

[复制链接]
跳转到指定楼层
楼主
串口问题

  1. //#include<reg51.h>
  2. #include<reg52.h>
  3. #include<intrins.h>
  4. #include<stdio.h>
  5. #define uchar unsigned char
  6. #define uint unsigned int

  7. sbit  rs=P2^0;  
  8. sbit  rd=P2^1;
  9. sbit  lcden=P2^2;
  10. bit Flag = 0;
  11. uchar Counter = 0,Hdata = 0,Ldata = 0,Pulse = 0;
  12. uchar code asc[]="0123456789";
  13. /***********************延时子程序********************/
  14. void delay(uint xms)
  15. {
  16.         uint x;
  17.         while(xms--) for(x=0;x<120;x++);
  18. }


  19. //-----------------------------------------------------------------
  20. // 忙等待
  21. //-----------------------------------------------------------------
  22. void Busy_Wait()
  23. {
  24.         uchar LCD_Status;                                                //液晶状态字节变量
  25.         do
  26.         {
  27.          P0=0xff;
  28.          lcden=0;rs=0;rd=1;
  29.          lcden=1;LCD_Status=P0;
  30.          lcden=0;
  31.         } while (LCD_Status & 0x80);                        //液晶忙继续循环
  32. }

  33. void write_com(uchar com)
  34. {
  35.   Busy_Wait();
  36.   rs=0;
  37.   rd=0;
  38.   lcden=0;
  39.   P0=com;
  40.   delay(3);
  41.   lcden=1;
  42.   delay(3);
  43.   lcden=0;  
  44. }

  45. void write_date(uchar date)
  46. {
  47.   Busy_Wait();
  48.   rs=1;
  49.   rd=0;
  50.   lcden=0;
  51.   P0=date;
  52.   delay(3);
  53.   lcden=1;
  54.   delay(3);
  55.   lcden=0;  
  56. }  

  57. void Display_String(uchar *p,uchar com)
  58. {  uchar i;
  59.    write_com(com);
  60.    for(i=0;i<14;i++)
  61.    {
  62.    write_date(p[i]);
  63.   }
  64. }


  65. void XS(        unsigned long R)
  66. {
  67.         write_com(0xc0);
  68.                         write_date(0x20);
  69.                 write_date(0x20);
  70.                 write_date(0x20);
  71.          write_date(0x20);
  72.          write_date(asc[R/100000]);
  73.                 write_date(asc[R%100000/10000]);
  74.                 write_date(asc[R%10000/1000]);
  75.                 write_date(asc[R%1000/100]);
  76.                 write_date(asc[R%100/10]);
  77.                 write_date(asc[R%10]);
  78.                 //write_date(0x20);

  79. }

  80. void init_lcd()
  81. {
  82.   lcden=0;
  83.   write_com(0x38);
  84.   write_com(0x0c);//开显示光标
  85.   write_com(0x06);
  86.   write_com(0x01);//clear
  87.   write_com(0x80);
  88.   Display_String("  test result:",0x80);
  89.   //Display_String("  ID:1800800302  ",0xc0);
  90. }


  91. void init_time()
  92. {
  93.         TMOD=0x51;
  94.         TH0=0x40;
  95.         TL0=0x00;
  96.         TH1=0x00;
  97.         TL1=0x00;
  98.         ET0=1;
  99.         ET1=1;
  100.         EA=1;
  101.         ET2=1;
  102.         ES=1;
  103.         PT1=1;
  104.         TR0=1;
  105.         TR1=1;
  106. }
  107. void init_time2()
  108. {
  109.         SCON=0x50;//0101 0000;波特率9600bps
  110.         TL2=0xE8;
  111.         TH2=0xFF;
  112.         TH2=RCAP2H;
  113.         TL2=RCAP2L;
  114.         T2CON=0x34;
  115. }

  116. void Time0() interrupt 1
  117. {
  118. TL0 = 0x00;
  119. TH0 = 0x40;
  120. Counter++;
  121. if (Counter == 20)
  122.         {
  123. P1= 0XFE;
  124. TR0 = 0;
  125. TR1 = 0;
  126. Counter = 0;
  127. Flag = 1;
  128.         }
  129. }

  130. void Time1() interrupt 2
  131. {
  132. Pulse++;
  133. }
  134. void main()
  135. {
  136.         uint i;
  137.         uint j=0;
  138.         uchar dat[10];
  139.         unsigned long frequency;
  140.                 unsigned long R;
  141.         float t;
  142.         float R2;
  143.         float R1;
  144.         P3 = 0xFF;
  145.         init_time();
  146.         init_lcd();
  147. while(1)
  148. {
  149.         if (Flag)
  150.         {
  151.                 P1=0XFF;
  152.                 Hdata = TH1;
  153.                 Ldata = TL1;
  154.                 frequency = ((Pulse*65535)+(Hdata*256)+Ldata);
  155.                 t=1/(float)frequency;
  156.                 R2=t/0.69*1000000;
  157.                 R1=(R2-1000)/2;
  158.                 R=(        unsigned long )R1;
  159.                 //串口开始
  160.                 for(i=0;i<10;i++)
  161.                 dat[i]=R;
  162.                 i=0;
  163.                 init_time2();
  164.                 while(j<10)
  165.                 {
  166.                 SBUF=dat[i];
  167.                 while(TI)
  168.                 TI=0;
  169.                 j++;
  170.                 }
  171.                 j=0;
  172.                 //串口
  173.                 Flag = 0;
  174.                 Pulse = 0;
  175.                 TH1 = 0x00;
  176.                 TL1 = 0x00;
  177.                 TH0 = 0x40;//4c
  178.                 TL0 = 0x00;
  179.                 TR1 = 1;
  180.                 TR0 = 1;
  181.         //        write_com(0x01);//clear
  182.                         delay(5);
  183.         }
  184.                 XS(R);
  185.         delay(5);
  186.        
  187.         }
  188. }
复制代码


R.rar

58.23 KB, 下载次数: 8

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

使用道具 举报

沙发
ID:123289 发表于 2021-7-10 08:45 | 只看该作者
本帖最后由 yzwzfyz 于 2021-7-10 09:01 编辑

会不会是被仿对象中没有T2?
旧式51,T2CON定义在C8H,
现在的STC-51的C8H,定义为P5。
不知道系统会如何编译T2CON。
回复

使用道具 举报

板凳
ID:777603 发表于 2021-7-10 11:05 | 只看该作者
yzwzfyz 发表于 2021-7-10 08:45
会不会是被仿对象中没有T2?
旧式51,T2CON定义在C8H,
现在的STC-51的C8H,定义为P5。

有的
回复

使用道具 举报

地板
ID:94031 发表于 2021-7-10 15:03 | 只看该作者
uchar dat[10];,unsigned long R;,让 dat[i]=R;就有问题。
回复

使用道具 举报

5#
ID:777603 发表于 2021-7-10 15:08 来自触屏版 | 只看该作者
xuyaqi 发表于 2021-7-10 15:03
uchar dat[10];,unsigned long R;,让 dat=R;就有问题。

我知道类型不同,但我调试发现是有值的,但是发送不成功,dat有值,但SBUF一直都是0。
回复

使用道具 举报

6#
ID:777603 发表于 2021-7-10 15:09 来自触屏版 | 只看该作者
xuyaqi 发表于 2021-7-10 15:03
uchar dat[10];,unsigned long R;,让 dat=R;就有问题。

我只是想随便试试能不能发送
回复

使用道具 举报

7#
ID:777603 发表于 2021-7-10 15:10 来自触屏版 | 只看该作者
黄冬梅 发表于 2021-7-10 15:08
我知道类型不同,但我调试发现是有值的,但是发送不成功,dat有值,但SBUF一直都是0。

加个好友教教我?孩子调不出来了
回复

使用道具 举报

8#
ID:94031 发表于 2021-7-10 19:48 | 只看该作者
黄冬梅 发表于 2021-7-10 15:10
加个好友教教我?孩子调不出来了

你是protus仿真,还是有硬件调试,如果protus仿真,我劝你不要搞得怎么复杂,想复杂直接焊硬件调试,protus仿真lcd显示全用软件模拟跟实际差得远,就不要浪费时间了。
回复

使用道具 举报

9#
ID:777603 发表于 2021-7-11 19:06 | 只看该作者
xuyaqi 发表于 2021-7-10 19:48
你是protus仿真,还是有硬件调试,如果protus仿真,我劝你不要搞得怎么复杂,想复杂直接焊硬件调试,prot ...

我怕把硬件做回来电路板就固定了,到时出问题更加难改
回复

使用道具 举报

10#
ID:951931 发表于 2021-7-11 22:13 | 只看该作者
第37行你可以看一下
回复

使用道具 举报

11#
ID:161164 发表于 2021-7-12 00:45 | 只看该作者
R.rar里的Simulate.DSN不知到用什么开
不知你硬件怎么接
纯推理
先假设R得到的值是正确的
把174~184行代码
  1.                 for(i=0;i<10;i++)
  2.                 dat[i]=R;
  3.                 i=0;
  4.                 init_time2();
  5.                 while(j<10)
  6.                 {
  7.                 SBUF=dat[i];
  8.                 while(TI)
  9.                 TI=0;
  10.                 j++;
  11.                 }
复制代码
改为
  1.     for(i = 0;i <10 ;i++)
  2.     {
  3.         dat[i] = R % 10;
  4.         R = R / 10;
  5.     }
  6.     bit SkipZero = 0;
  7.     for(i = 9;i >=0;i--)
  8.     {
  9.         if(dat[i] != 0 || SkipZero)
  10.         {
  11.             SkipZero = 1;
  12.             SBUF=dat[i];
  13.             while(TI)
  14.             TI=0;
  15.         }
  16.     }
复制代码
试试看

评分

参与人数 1黑币 +40 收起 理由
admin + 40 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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