找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2073|回复: 0
收起左侧

51单片机支持的超声波测距程序和光电测速程序组合到一起 求助

[复制链接]
ID:313044 发表于 2018-6-3 14:39 | 显示全部楼层 |阅读模式
500黑币
这个程序是将 51单片机支持的超声波测距程序和光电测速程序组合到一起 ,但是组合起来之后 不能用 求大神帮忙数码管管脚程序中有定义,,,没有仿真图 我是用单片机直接调试的
求大神帮忙 跪求
超声波测距源程序
TRIG管脚接在单片机的P20口,ECHO管脚接在单片机的P21口
  1. /*   超声波模块的TRIG管脚接在单片机的P20口,ECHO管脚接在单片机的P21口 其他的电源管脚接在单片机
  2.                 开发板上电源口即可。      */


  3. #include"reg51.h"
  4. #include <intrins.h>
  5. sbit RX=P2^1;
  6. sbit TX=P2^0;
  7. unsigned int  time=0;
  8. unsigned int  timer=0;
  9. unsigned char posit=0;
  10. unsigned long S=0;
  11. typedef unsigned int u8;          //对数据类型进行声明定义
  12. typedef unsigned char u16;
  13. bit      flag =0;
  14. //--定义使用的IO--//
  15. #define GPIO_DIG P0

  16. sbit LSA=P2^2;
  17. sbit LSB=P2^3;
  18. sbit LSC=P2^4;

  19. //--定义全局变量--//
  20. char code smgduan[17]={
  21. 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  22. 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
  23. //0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码
  24. unsigned char disbuff[4]           ={ 0,0,0,0,};
  25. char DisplayData[8];
  26. /*******************************************************************************
  27. * 函 数 名         : delay
  28. * 函数功能                   : 延时函数,i=1时,大约延时10us
  29. *******************************************************************************/
  30. void delay(u16 i)
  31. {
  32.         while(i--);        
  33. }
  34. /*******************************************************************************
  35. * 函 数 名         : DigDisplay
  36. * 函数功能                   : 使用数码管显示
  37. * 输    入         : 无
  38. * 输    出         : 无
  39. *******************************************************************************/
  40. void DigDisplay()
  41. {
  42.         u8 i;
  43.         for(i=0;i<8;i++)
  44.         {
  45.                 switch(i)         //位选,选择点亮的数码管,
  46.                 {
  47.                         case(0):
  48.                                 LSA=0;LSB=0;LSC=0; break;//显示第0位
  49.                         case(1):
  50.                                 LSA=1;LSB=0;LSC=0; break;//显示第1位
  51.                         case(2):
  52.                                 LSA=0;LSB=1;LSC=0; break;//显示第2位
  53.                         case(3):
  54.                                 LSA=1;LSB=1;LSC=0; break;//显示第3位
  55.                         case(4):
  56.                                 LSA=0;LSB=0;LSC=1; break;//显示第4位
  57.                         case(5):
  58.                                 LSA=1;LSB=0;LSC=1; break;//显示第5位
  59.                         case(6):
  60.                                 LSA=0;LSB=1;LSC=1; break;//显示第6位
  61.                         case(7):
  62.                                 LSA=1;LSB=1;LSC=1; break;//显示第7位        
  63.                 }
  64.                 P0=DisplayData[i];//发送段码
  65.                 delay(10); //间隔一段时间扫描        
  66.                 P0=0x00;//消隐
  67.         }
  68. }
  69. /********************************************************/
  70.     void Conut(void)
  71.         {
  72.          time=TH0*256+TL0;
  73.          TH0=0;
  74.          TL0=0;
  75.         
  76.          S= (long)(time*0.17);     //算出来是CM
  77.         
  78.          {
  79.           DisplayData[7]=smgduan[S%10000/1000];
  80.           DisplayData[6]=smgduan[S%1000/100];
  81.           DisplayData[5]=smgduan[S%100/10];
  82.           DisplayData[4]=smgduan[S%10/1];
  83.          }
  84.         }

  85.    void  zd3()  interrupt 3                  //T1中断用来扫描数码管和计800MS启动模块
  86.   {
  87.          TH1=0xf8;
  88.          TL1=0x30;
  89.          DigDisplay();
  90.          timer++;
  91.          if(timer>=100)
  92.          {
  93.           timer=0;
  94.           TX=1;                                        //800MS  启动一次模块
  95.           _nop_();
  96.           _nop_();
  97.           _nop_();
  98.           _nop_();
  99.           _nop_();
  100.           _nop_();
  101.           _nop_();
  102.           _nop_();
  103.           _nop_();
  104.           _nop_();
  105.           _nop_();
  106.           _nop_();
  107.           _nop_();
  108.           _nop_();
  109.           _nop_();
  110.           _nop_();
  111.           _nop_();
  112.           _nop_();
  113.           _nop_();
  114.           _nop_();
  115.           _nop_();
  116.           TX=0;
  117.          }
  118.   }
  119. /*********************************************************/

  120.         void  main(  void  )

  121.   {  
  122.     TMOD=0x11;                   //设T0为方式1,GATE=1;
  123.         TH0=0;
  124.         TL0=0;         
  125.         TH1=0xf8;                   //2MS定时
  126.         TL1=0x30;
  127.         ET0=1;             //允许T0中断
  128.         ET1=1;                           //允许T1中断
  129.         TR1=1;                           //开启定时器
  130.         EA=1;                           //开启总中断

  131.         while(1)
  132.         {
  133.          while(!RX);                //当RX为零时等待
  134.          TR0=1;                            //开启计数
  135.          while(RX);                        //当RX为1计数并等待
  136.          TR0=0;                                //关闭计数
  137.      Conut();                        //计算
  138.         }

  139.   }
复制代码
光电测速程序
DO口接35
  1. #include<REG52.H>                 
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. #define ulong unsigned long
  5. char DisplayData[8];
  6. typedef unsigned int u8;          //对数据类型进行声明定义
  7. typedef unsigned char u16;
  8. #define LED_DAT P0
  9. sbit pin_SpeedSenser = P3^5; //速度传感器脉冲信号输出端接在T1上
  10. #define TIME_CYLC 100 //12M晶振,定时器10ms 中断一次 我们1秒计算一次转速,1000ms/10ms = 100
  11. #define PLUS_PER 2 //码盘的齿数 ,这里假定码盘上有2个齿,即传感器检测到2个脉冲,认为1圈
  12. #define K 1.0   //校准系数
  13. sbit LSA=P2^2;
  14. sbit LSB=P2^3;
  15. sbit LSC=P2^4;
  16. char code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  17.                                         0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值                    
  18. uint Tcounter = 0;   //时间计数器
  19. bit Flag_Fresh = 0; // 刷新标志
  20. bit Flag_clac = 0; //计算转速标志
  21. bit Flag_Err = 0; //超量程标志
  22. //在数码管上显示一个四位数
  23. void DigDisplay();

  24. //计算转速,并把结果放入数码管缓冲区
  25. void ClacSpeed();

  26. //初始化定时器
  27. void init_timer();



  28. void it_timer0() interrupt 1 //定时器0中断的响应函数
  29. {
  30. TF0 = 0;       //定时器 T0用于数码管的动态刷新      
  31. TH0 = 0xD8;            //初始化
  32. TL0 = 0xF0;
  33. Flag_Fresh = 1;
  34. Tcounter++;
  35. if(Tcounter>TIME_CYLC)
  36. {
  37.    Flag_clac = 1;//周期到,该重新计算转速了
  38. }
  39. }
  40. void it_timer1() interrupt 3 //中断地址是0x001b
  41. {
  42. TF1 = 0;   //定时器T1用于单位时间内收到的脉冲数,要速度不是很快,T1永远不会益处
  43. Flag_Err = 1;   //如果速度很高,我们应考虑另外一种测速方法:脉冲宽度算转速
  44. }

  45. /*******************************************************************************
  46. * 函 数 名         : delay
  47. * 函数功能                   : 延时函数,i=1时,大约延时10us
  48. *******************************************************************************/
  49. void delay(u16 i)
  50. {
  51.         while(i--);        
  52. }


  53. void main(void)
  54. {
  55. init_timer();
  56. while(1)
  57. {
  58.   LSA=1;                                
  59.   LSB=0;
  60.   LSC=1;
  61.   delay(30);
  62.   LSC=0;
  63.   delay(170);
  64.   
  65. if(Flag_Fresh)
  66.    {
  67.     Flag_Fresh = 0;
  68.     DigDisplay();    // 定时刷新数码管显示
  69.    }

  70.    if(Flag_clac)
  71.    {
  72.             Flag_clac = 0;
  73.             ClacSpeed(); //计算转速,并把结果放入数码管缓冲区  
  74.             Tcounter = 0;//周期定时清零
  75.             TH1=TL1 = 0x00;//脉冲计数清零
  76.     }
  77.    if(Flag_Err)        //超量程处理
  78.    {
  79.             //数码管显示字母'EEEE',开机时初始化为0000
  80.             DisplayData[0] = 0x79;
  81.             DisplayData[1] = 0x79;
  82.             DisplayData[2] = 0x79;
  83.             DisplayData[3] = 0x79;
  84.     while(1)
  85.     {
  86.      DigDisplay();//等待复位,不再测速
  87.     }
  88.    }
  89. }
  90. }
  91. /*******************************************************************************
  92. * 函 数 名         : DigDisplay
  93. * 函数功能                   : 数码管动态扫描函数,循环扫描8个数码管显示
  94. *******************************************************************************/
  95. void DigDisplay()
  96. {
  97.         u8 i;
  98.         for(i=0;i<8;i++)
  99.         {
  100.                 switch(i)         //位选,选择点亮的数码管,
  101.                 {
  102.                         case(0):
  103.                                 LSA=0;LSB=0;LSC=0; break;//显示第0位
  104.                         case(1):
  105.                                 LSA=1;LSB=0;LSC=0; break;//显示第1位
  106.                         case(2):
  107.                                 LSA=0;LSB=1;LSC=0; break;//显示第2位
  108.                         case(3):
  109.                                 LSA=1;LSB=1;LSC=0; break;//显示第3位
  110.                
  111.                 }
  112.                 P0=DisplayData[i];//发送段码
  113.                 delay(100); //间隔一段时间扫描        
  114.                 P0=0x00;//消隐
  115.         }
  116. }


  117. //计算转速,并把结果放入数码管缓冲区
  118. void ClacSpeed()
  119. {
  120.          uint speed ;
  121.          ulong PlusCounter;
  122.          PlusCounter = TH1*256 + TL1;
  123.          speed = K*(PlusCounter/PLUS_PER);//K是校准系数,如速度不准,调节K的大小
  124.          DisplayData[3] = smgduan[speed/1000%10];
  125.          DisplayData[2] = smgduan[speed/100%10];
  126.          DisplayData[1] = smgduan[speed/10%10];
  127.          DisplayData[0] = smgduan[speed%10];

  128. }

  129. void init_timer()                 //初始化
  130. {
  131.          TMOD = 0x51; //定时10毫秒,TOT1选择软件门方式1,T0定时,T1计数,96页可查
  132.          TH0 = 0xD8;            //T0初始化
  133.          TL0 = 0xF0;  
  134.          ET0=1;                     //T0中断允许
  135.          EA=1;               //T0中断
  136.          TR0=1;               //TO运行
  137.          TH1 = 0x00;            //T1初始化
  138.          TL1 = 0x00;  
  139.          ET1=1;                     //T1中断允许
  140.          TR1=1;               //T1运行
  141.          LSA=1;
  142.          LSB=0;
  143. }
  144.                         
复制代码





回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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