找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1689|回復: 4
打印 上一主題 下一主題
收起左側(cè)

單片機+開關(guān)霍爾元件測不出速度,數(shù)碼管不顯示,能幫我看看,交流一下嘛

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:675990 發(fā)表于 2019-12-28 13:18 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. #include <reg52.h>
  2. #define DataPort P0 //定義數(shù)據(jù)端口 程序中遇到DataPort 則用P0 替換
  3. typedef unsigned int u16;          //對數(shù)據(jù)類型進行聲明定義
  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; //位聲明數(shù)碼管
  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延時函數(shù),含有輸入?yún)?shù) 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延時函數(shù),含有輸入?yún)?shù) 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)         //位選,選擇點亮的數(shù)碼管,
  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];//發(fā)送段碼
  83.                 DelayMs(1); //間隔一段時間掃描        
  84.                 P0=0x00;//消隱
  85.         }
  86. }


  87. void datapros()
  88. {
  89.         DisplayData[0]=smgduan[Speed/10];           //人為設(shè)定,第一個數(shù)碼管        百位
  90.         DisplayData[1]=smgduan[Speed%10];                                                                //十位
  91.         DisplayData[2]=smgduan[0];                                                                                //個位

  92.         DisplayData[4]=smgduan[temp/100];           //霍爾測速,第5個數(shù)碼管開始顯示,百位
  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;           //定時器開關(guān)打開
  107. // PT0=1;           //優(yōu)先級打開
  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.                     主函數(shù)
  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開始計數(shù)
  141.         Speed1=Speed*10;
  142. while(1)
  143.   {

  144.    if(buf_min==1000)        //定時達到1s后,開始處理數(shù)據(jù)
  145.        {
  146.                 if(P1_7==1)
  147.                 P1_7=0;
  148.                 else P1_7=1;

  149.                 TR1=0;                                //計數(shù)器1停止計數(shù)
  150.                 temp=(TH1*256+TL1);//單位為r/s
  151.                 TH1=0;
  152.                 TL1=0;                //T1初始化
  153.                 TR1=1;//計數(shù)器1開始計數(shù)
  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)         //實際測速小于認為規(guī)定,則閃爍
  169.           {
  170.             led0=~led0;
  171.                 DelayMs(100);
  172.                 led0=~led0;
  173.          
  174.           }
  175.           else led0=0;//否則常亮
  176.                   DigDisplay();
  177.                          datapros();
  178.   }
  179. }
復制代碼


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:332444 發(fā)表于 2019-12-29 11:24 | 只看該作者
先送固定數(shù)值到數(shù)碼管去顯示,正常后再檢查其他代碼。
回復

使用道具 舉報

板凳
ID:675990 發(fā)表于 2019-12-29 17:14 | 只看該作者
xianfajushi 發(fā)表于 2019-12-29 11:24
先送固定數(shù)值到數(shù)碼管去顯示,正常后再檢查其他代碼。

試過了數(shù)碼管沒問題,問題應該出在霍爾元件的輸入輸出上,但我看了一下代碼好像沒什么問題,你能幫我看看嗎,謝謝
回復

使用道具 舉報

地板
ID:675990 發(fā)表于 2019-12-29 17:16 | 只看該作者
xianfajushi 發(fā)表于 2019-12-29 11:24
先送固定數(shù)值到數(shù)碼管去顯示,正常后再檢查其他代碼。

你能幫我看看霍爾部分的代碼嗎
回復

使用道具 舉報

5#
ID:648281 發(fā)表于 2020-1-1 21:22 | 只看該作者
你好!
測速的一般步驟是
1、確定傳感器引入腳,等待計數(shù)
2、開啟定時器,計時開始
3、計時周期結(jié)束,統(tǒng)計計數(shù)
4、根據(jù)計數(shù)算出速度(結(jié)合輪子周長)
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表