标题: 单片机+开关霍尔元件测不出速度,数码管不显示,能帮我看看,交流一下嘛 [打印本页]

作者: JPSAKE    时间: 2019-12-28 13:18
标题: 单片机+开关霍尔元件测不出速度,数码管不显示,能帮我看看,交流一下嘛
  1. #include <reg52.h>
  2. #define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换
  3. typedef unsigned int u16;          //对数据类型进行声明定义
  4. typedef unsigned char u8;
  5. u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  6.                                         0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值
  7. u8 DisplayData[8];
  8. unsigned char Speed=2;
  9. int temp=0;                //定义变量
  10. int buf_min=1;
  11. int Speed1;

  12. sbit P1_0=P1^0;        //霍尔传感器接口
  13. sbit P1_7=P1^1;

  14. sbit LSA=P2^2; //位声明数码管
  15. sbit LSB=P2^3;
  16. sbit LSC=P2^4;

  17. sbit D1=P1^2; //直流电机接口
  18. sbit K1 = P3^1;
  19. sbit K2 = P3^0;

  20. sbit led0=P2^0;//led灯


  21. void Init_Timer0(void);
  22. unsigned char KeyScan(void);
  23. /*------------------------------------------------
  24. uS延时函数,含有输入参数 unsigned char t,无返回值
  25. unsigned char 是定义无符号字符变量,其值的范围是
  26. 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
  27. 长度如下 T=tx2+5 uS
  28. ------------------------------------------------*/
  29. void DelayUs2x(unsigned char t)
  30. {   
  31. while(--t);
  32. }
  33. /*------------------------------------------------
  34. mS延时函数,含有输入参数 unsigned char t,无返回值
  35. unsigned char 是定义无符号字符变量,其值的范围是
  36. 0~255 这里使用晶振12M,精确延时请使用汇编
  37. ------------------------------------------------*/
  38. void DelayMs(unsigned char t)
  39. {
  40.      
  41. while(t--)
  42. {
  43.      //大致延时1mS
  44.      DelayUs2x(245);
  45.          DelayUs2x(245);
  46. }
  47. }

  48. void WaitKeyFree(void){

  49.         while(1){
  50.                 while(K1==0);
  51.                 while(K2==0);

  52.                 DelayMs(10);

  53.                 while(K1==0);
  54.                 while(K2==0);
  55.                 break;
  56.         }
  57. }


  58. void DigDisplay()
  59. {
  60.         u8 i;
  61.         for(i=0;i<8;i++)
  62.         {
  63.                 switch(i)         //位选,选择点亮的数码管,
  64.                 {
  65.                         case(0):
  66.                                 LSA=1;LSB=1;LSC=1; break;//显示第7位
  67.                         case(1):
  68.                                 LSA=0;LSB=1;LSC=1; break;//显示第6位
  69.                         case(2):
  70.                                 LSA=1;LSB=0;LSC=1; break;//显示第5位
  71.                         case(3):
  72.                                 LSA=0;LSB=0;LSC=1; break;//显示第4位
  73.                         case(4):
  74.                                 LSA=1;LSB=1;LSC=0; break;//显示第3位
  75.                         case(5):
  76.                                 LSA=0;LSB=1;LSC=0; break;//显示第2位
  77.                         case(6):
  78.                                 LSA=1;LSB=0;LSC=0; break;//显示第1位
  79.                         case(7):
  80.                                 LSA=0;LSB=0;LSC=0; break;//显示第0位        
  81.                 }
  82.                 P0=DisplayData[ i];//发送段码
  83.                 DelayMs(1); //间隔一段时间扫描        
  84.                 P0=0x00;//消隐
  85.         }
  86. }


  87. void datapros()
  88. {
  89.         DisplayData[0]=smgduan[Speed/10];           //人为设定,第一个数码管        百位
  90.         DisplayData[1]=smgduan[Speed%10];                                                                //十位
  91.         DisplayData[2]=smgduan[0];                                                                                //个位

  92.         DisplayData[4]=smgduan[temp/100];           //霍尔测速,第5个数码管开始显示,百位
  93.         DisplayData[5]=smgduan[temp%100/10];                                                                           //十位
  94.         DisplayData[6]=smgduan[temp/100%10];                                                                           //个位

  95. }
  96. /*------------------------------------------------
  97.                     定时器初始化子程序
  98. ------------------------------------------------*/
  99. void Init_Timer0(void)
  100. {
  101. // TMOD |= 0x01;          //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响                     
  102. TH0=(65536-1000)/256;                  //重新赋值 1ms
  103. TL0=(65536-1000)%256;
  104. // EA=1;            //总中断打开
  105. // ET0=1;           //定时器中断打开
  106. // TR0=1;           //定时器开关打开
  107. // PT0=1;           //优先级打开
  108. }
  109. /*------------------------------------------------
  110.                  定时器中断子程序
  111. ------------------------------------------------*/
  112. void Timer0_isr(void) interrupt 1
  113. {
  114. static unsigned char times;
  115. TH0=(65536-1000)/256;                  //重新赋值 1ms
  116. TL0=(65536-1000)%256;
  117.         
  118.   if(times>(Speed-1))//最大值12
  119.         D1=0;
  120.   else
  121.           D1=1;
  122.   times++;
  123.   if(times==13)
  124.           times=0;

  125. }
  126. /*------------------------------------------------
  127.                     主函数
  128. ------------------------------------------------*/
  129. main()
  130. {
  131. Init_Timer0();
  132.         P1_0=0;
  133.         P1_7=0;
  134.         TMOD=0x11;
  135.         TH1=0;
  136.         TL1=0;                //T1初始化

  137.         EA=1;
  138.         ET0=1;
  139.         TR0=1;//开T0定时中断
  140.         TR1=1;//T1开始计数
  141.         Speed1=Speed*10;
  142. while(1)
  143.   {

  144.    if(buf_min==1000)        //定时达到1s后,开始处理数据
  145.        {
  146.                 if(P1_7==1)
  147.                 P1_7=0;
  148.                 else P1_7=1;

  149.                 TR1=0;                                //计数器1停止计数
  150.                 temp=(TH1*256+TL1);//单位为r/s
  151.                 TH1=0;
  152.                 TL1=0;                //T1初始化
  153.                 TR1=1;//计数器1开始计数
  154.                 buf_min=0;
  155.        }

  156.    if(K1==0)//第一个按键,速度等级增加
  157.       {
  158.            if(Speed<13)
  159.            Speed++;
  160.            WaitKeyFree();
  161.           }        
  162.    else if(K2==0)//第二个按键,速度等级减小
  163.       {
  164.            if(Speed>2)
  165.            Speed--;
  166.            WaitKeyFree();
  167.           }        

  168.           if(temp>Speed1)         //实际测速小于认为规定,则闪烁
  169.           {
  170.             led0=~led0;
  171.                 DelayMs(100);
  172.                 led0=~led0;
  173.          
  174.           }
  175.           else led0=0;//否则常亮
  176.                   DigDisplay();
  177.                          datapros();
  178.   }
  179. }
复制代码



作者: xianfajushi    时间: 2019-12-29 11:24
先送固定数值到数码管去显示,正常后再检查其他代码。
作者: JPSAKE    时间: 2019-12-29 17:14
xianfajushi 发表于 2019-12-29 11:24
先送固定数值到数码管去显示,正常后再检查其他代码。

试过了数码管没问题,问题应该出在霍尔元件的输入输出上,但我看了一下代码好像没什么问题,你能帮我看看吗,谢谢
作者: JPSAKE    时间: 2019-12-29 17:16
xianfajushi 发表于 2019-12-29 11:24
先送固定数值到数码管去显示,正常后再检查其他代码。

你能帮我看看霍尔部分的代码吗
作者: 51hei**1140    时间: 2020-1-1 21:22
你好!
测速的一般步骤是
1、确定传感器引入脚,等待计数
2、开启定时器,计时开始
3、计时周期结束,统计计数
4、根据计数算出速度(结合轮子周长)




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1