找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1304|回复: 2
收起左侧

我的单片机设计 红外汽车(固定距离)测速仿真,求助解决问题!

[复制链接]
ID:679068 发表于 2021-6-2 20:39 | 显示全部楼层 |阅读模式
刚刚做的程序,感觉没用好定时器测速,有protues仿真.含51单片机C源码。
求助大神,该如何解决引脚高电平启停定时器,在5m范围内测速并显示在1602上呢!!!main函数如下:
  1. #include"reg52.h"
  2. #include"stdio.h"
  3. #include"lcd.h"

  4. sbit yd0=P2^0;
  5. sbit yd1=P2^1;
  6. sbit yd2=P2^2;
  7. sbit yd3=P2^3;

  8. typedef unsigned char u8;
  9. u8 dis0[10];
  10. u8 dis1[]="sd:Unknow";               
  11. u8 dis2[]="Track is free";
  12. u8 dis3[]="Approach";
  13. u8 dis4[]="Arrived";

  14. unsigned long suCount=0;//计数
  15. float sudu;//速度

  16. //unsigned long time_50ms=0;                   //定时器计数
  17. //bit disFlag=0;//定时更新显示

  18. void Init_Timer0(void);        //函数声明
  19. void Init_Timer1(void);//
  20. //定时器0与定时器1的中断方式//

  21. void LCD_Write_String0()        // LCD区段空闲显示子程序
  22. {
  23.         u8 u;
  24.         u8 v;
  25.                 LcdInit();
  26.         for(u=0;u<13;u++)
  27.         {
  28.         LcdWriteData(dis2[u]);
  29.         }
  30.         LcdInit2();
  31.         for(v=0;v<10;v++)
  32.         {
  33.         LcdWriteData(dis1[v]);
  34.         }
  35.         Delay1ms(3000);
  36. }

  37. void LCD_Write_String1()        // LCD列车检测显示子程序
  38. {
  39.         u8 m;
  40.         u8 n;
  41.         LcdInit();
  42.         for(m=0;m<9;m++)
  43.         {
  44.                 LcdWriteData(dis3[m]);
  45.         }
  46.         LcdInit2();
  47.         for(n=0;n<10;n++)
  48.         {
  49.         LcdWriteData(dis0[n]);
  50.         }
  51.    Delay1ms(3000);
  52. }

  53. void LCD_Write_String2()
  54. {
  55.         u8 x;
  56.         u8 z;
  57.         LcdInit();
  58.         for(x=0;x<8;x++)
  59.         {
  60.                 LcdWriteData(dis4[x]);
  61.         }
  62.         LcdInit2();
  63.         for(z=0;z<10;z++)
  64.         {
  65.         LcdWriteData(dis0[z]);
  66.         }
  67.         Delay1ms(3000);
  68. }


  69. void Init_Timer0(void)
  70. {
  71.         TMOD=0x01;          //使用模式1,16位定时器                     
  72.         TH0=(65536-45872)/256;                  //重新赋值 50ms
  73.         TL0=(65536-45872)%256;
  74.         EA=1;            //总中断打开
  75.         ET0=1;           //开定时器0中断
  76.         TR0=1;           //启动定时器0
  77. }

  78. void Timer0_isr(void) interrupt 0
  79. {
  80.         TH0=(65536-45872)/256;                  //重新赋值 50ms
  81.         TL0=(65536-45872)%256;
  82.         suCount++;                //定时计数
  83. }

  84. void Init_Timer1(void)
  85. {
  86.         TMOD=0x01;          //使用模式1,16位定时器,                     
  87.         TH1=(65536-45872)/256;                  //重新赋值 50ms
  88.         TL1=(65536-45872)%256;
  89.         EA=1;            //总中断打开
  90.         ET1=1;           //开定时器1中断
  91.         TR1=1;           //启动定时器1
  92. }

  93. void Timer1_isr(void) interrupt 1
  94. {
  95.         TH1=(65536-45872)/256;                  //重新赋值 50ms
  96.         TL1=(65536-45872)%256;
  97.         suCount++;                //定时计数
  98. }


  99. void main()        //主程序(列车接近检测与列车到达检测)
  100. {                        
  101.      P2=0x00;         //传感器高电平输出,先置低电平
  102.          suCount=0;         //计数开始
  103.         Init_Timer0();        //定时器0初始化
  104.         TR0=0;
  105.         while(1)
  106. {
  107.          if(yd0==1) //列车接近区段首部压电传感器电平触发  高电平触发
  108.             {
  109.          //    suCount=0;         //计数开始
  110.               TR0=1;  //开启定时器0
  111.            if(yd1==1)//列车接近区段尾部压电传感器电平触发  高电平触发
  112.             {
  113.               TR0=0;  //停止定时器0
  114.              sudu=(5*3.6)/((float)(suCount*2)/(1000)); //设置距离为 5m
  115.                   sprintf(dis0,"sd:%fkm/h",sudu);//打印
  116.                 LCD_Write_String1();  //显示      
  117.             }
  118.         }
  119.         else if(yd2==1)                //列车到达区段检测
  120.         {
  121.         TR1=1;
  122.         if(yd3==1)
  123.         {
  124.         TR1=0;
  125.         sudu=(5*3.6)/((float)(suCount*2)/(1000)); //设置距离为 5m
  126.         sprintf(dis0,"sd:%fkm/h",sudu);//打印
  127.    LCD_Write_String2();  //显示  
  128.    }
  129.         }
  130. //区段空闲检测//
  131.         else         
  132.         {
  133.         LCD_Write_String0();
  134.         }
  135.         }
  136. }
复制代码


图片仿真11.png

rjcs.zip

44.11 KB, 下载次数: 3

回复

使用道具 举报

ID:679068 发表于 2021-6-2 21:00 | 显示全部楼层
可以yc解决。欢迎大神来帮助小弟一把吧拜托啦!!!!
回复

使用道具 举报

ID:679068 发表于 2021-6-2 21:19 | 显示全部楼层
我再具体描述一下吧!(求助丫~)
在两个固定距离(5米)的区域设置了4个传感器(传感器输出的是高电平有效),利用首尾传感器启停定时器。
然而,似乎速度无法测出来,放不进lcd1602显示屏。
显示部分是可以显示的,速度测不出来。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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