欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4164|回復: 0
打印 上一主題 下一主題
收起左側

霍爾元件+單片機的測速儀程序和電路原理圖

[復制鏈接]
跳轉到指定樓層
樓主


單片機系統程序:
//說明1:P00---P07:a-----dp   P27---P24:com1-----com4   P34切換顯示   P32---INT0  一個磁鋼
//說明2:此程序針對車輪周長為207cm,其他型號周長,可改變參數就行
//說明3:數碼管從左至右  高------低
  1. #include<reg51.h>
  2. #include"juxun001.h"
  3. //====================================主函數=========================================================
  4. void main()
  5. {
  6.    time0_int0_init();//定時器0和外部中斷0的初始化
  7.    while(!TR0)  //上電一直未切割時就顯示  0.0.0.0
  8.    {
  9.       init_display();
  10.    }
  11.    while(1)
  12.    {
  13.       if(!change)//按下切換按鍵顯示里程
  14.       {
  15.           delay1m(5);
  16.           if(!change)
  17.           {
  18.              flag= ~flag;
  19.           }
  20.           while(!change);     
  21.       }
  22.    
  23.    }
  24. }

  25. //==================================定時器0中斷函數================================
  26. void time0_interrupt()interrupt 1
  27. {
  28.    TL0 = (65536 -5000) % 256;// 12M晶振,5ms定時
  29.    TH0 = (65536 -5000) / 256;
  30.    display_function();
  31.    time_counter++;
  32.    time_counter8++;
  33.    if(time_counter8>= 1600)//大于8s沒切割,車子視為停下了,速度為:0,但里程還記著
  34.    {
  35.       time_counter8= 0;
  36.       speed =0;//速度為 0
  37.       point1 = 0;
  38.       buf1[3] =speed%10;buf1[2] = speed/10%10;
  39.       buf1[1] =speed/100%10;buf1[0] = speed/1000%10;
  40.    }
  41. }
  42. //==================================外部中斷0中斷函數=========================
  43. void int0_interrupt()interrupt 0
  44. {  
  45.    
  46.    external_counter++;
  47.    if(external_counter==1 )TR0 = ~TR0;//第一次切割打開定時器0
  48.    if(external_counter== 65535)external_counter = 0;
  49.    time_counter8= 0; //只要8秒內有切割,車子就任在運行
  50.    
  51.    if(external_counter% 2 == 0)//切割2次 更新下速度
  52.    {                             //*5是因為中斷一次是5MS
  53.       if(flag1==0){speed=((ulong)(36000)*zhouchang)/(time_counter * 5);flag1=1;}
  54.       elseif(flag1==1){speed =((ulong)(36000)*2*zhouchang)/(time_counter * 5);}//速度:單位為 m/h ,*1000的目的是不出現浮點數
  55.       
  56.       if((speed>= 100)&&(speed < 1000)) //100 ---- 1000       3位整數
  57.       {
  58.           point1= 1;buf1[3] = speed%10;buf1[2] = speed/10%10;
  59.           buf1[1]= speed/100%10;buf1[0] = 0;}
  60.       elseif((speed >= 1000)&&(speed < 10000))   //1000 ---- 10000        4位整數
  61.       {
  62.           point1= 1;speed = (uint)speed;
  63.           buf1[3]= speed%10;buf1[2] = speed/10%10;
  64.           buf1[1]= speed/100%10;buf1[0] = speed/1000%10;}
  65.       elseif((speed >= 10000)&&(speed < 100000))    //10000 ----- 100000      5位整數
  66.       {
  67.          point1 = 2;
  68.           buf1[3]= speed/10%10;buf1[2] = speed/100%10;
  69.           buf1[1]= speed/1000%10;buf1[0] = speed/10000%10;}
  70.       elseif((speed >= 100000)&&(speed < 1000000))  //100000 ------ 1000000    6位整數
  71.       {
  72.           point1= 3;
  73.           buf1[3]= speed/100%10;buf1[2] = speed/1000%10;
  74.           buf1[1]= speed/10000%10;buf1[0] = speed/100000%10;}
  75.       time_counter= 0;
  76.    }
  77.    if(external_counter% 8 == 0)//每切割8次 更新下里程
  78.    {
  79.       s =(ulong)external_counter * zhouchang;  //里程:單位為   cm
  80.       if((s >=1000)&&(s < 10000))
  81.       {
  82.           point2= 1;                                        //  0.012    001212
  83.           buf2[3]= s/100%10;buf2[2] = s/1000%10;
  84.           buf2[1]= 0;buf2[0] = 0;}//   4位整數
  85.       else if((s>= 10000)&&(s < 100000))
  86.       {
  87.           point2= 1;
  88.           buf2[3]= s/100%10;buf2[2] = s/1000%10;
  89.           buf2[1]= s/10000%10;buf2[0] = 0;}//     5位整數    0.123  012345
  90.       else if((s>= 100000)&&(s < 1000000))
  91.       {
  92.           point2= 1;
  93.           buf2[3]= s/100%10;buf2[2] = s/1000%10;
  94.           buf2[1]= s/10000%10;buf2[0] = s/100000%10;} //   6位整數 1.234    1234 56
  95.        else if((s >= 1000000)&&(s <10000000))
  96.       {
  97.           point2= 2;
  98.           buf2[3]= s/1000%10;buf2[2] = s/10000%10;
  99.           buf2[1]= s/100000%10;buf2[0] = s/1000000%10;}//    7位整數   1234 567
  100.       else if((s>= 10000000)&&(s < 100000000))
  101.       {
  102.           point2= 3;
  103.           buf2[3]= s/10000%10;buf2[2] = s/100000%10;
  104.           buf2[1]= s/1000000%10;buf2[0] = s/10000000%10;} //    8位整數      1234 5678
  105.    }
  106. }
  107. //==================================開電源就顯示的數據,初始顯示速度========================
  108. void init_display()
  109. {
  110.    uchar i;
  111.    for(i = 0;i< 4;i++)  
  112.    {
  113.       wei =bitcode[num - 1];
  114.       led =display1[buf1[num--]];
  115.       delay1m(4);
  116.       if(num ==0)num = 4;
  117.    }
  118. }
  119. //====================================顯示函數===================================
  120. void display_function()
  121. {
  122.    if(flag ==0)//顯示速度
  123.    {
  124.       switch(point1)
  125.       {
  126.           case0:wei = bitcode[num-1];led = display1[buf1[num-1]];num--;break;//速度顯示 0
  127.           case1:if(num == 1){ wei = bitcode[num-1];led = 0x7f&display1[buf1[num-1]];num--;}
  128.                 else { wei = bitcode[num-1];led =display1[buf1[num-1]];num--;}break;//最高位小數點亮
  129.          
  130.           case2:if(num == 2){ wei = bitcode[num-1];led = 0x7f&display1[buf1[num-1]];num--;}
  131.                 else { wei = bitcode[num-1];led =display1[buf1[num-1]];num--;}break;//第二高位小數點亮
  132.          
  133.           case3:if(num == 3){ wei = bitcode[num-1];led =0x7f&display1[buf1[num-1]];num--;}
  134.                 else { wei = bitcode[num-1];led =display1[buf1[num-1]];num--;}break;//第三高位小數點亮
  135.           default:break;   
  136.          
  137.       }
  138.       if(num ==0)num = 4;
  139.    }
  140.    else if(flag== 1)//顯示里程
  141.    {
  142.       switch(point2)
  143.       {
  144.           case0:wei = bitcode[num-1];led = display1[buf2[num-1]];num--;break;//里程顯示 0
  145.          
  146.           case1:if(num == 1){ wei = bitcode[num-1];led =0x7f&display1[buf2[num-1]];num--;}
  147.                 else { wei = bitcode[num-1];led =display1[buf2[num-1]];num--;}break;//最高位小數點亮
  148.          
  149.           case2:if(num == 2){ wei = bitcode[num-1];led =0x7f&display1[buf2[num-1]];num--;}
  150.                 else { wei = bitcode[num-1];led =display1[buf2[num-1]];num--;}break;//第二高位小數點亮
  151.       
  152.           case3:if(num == 3){ wei = bitcode[num-1];led =0x7f&display1[buf2[num-1]];num--;}
  153.                 else { wei = bitcode[num-1];led =display1[buf2[num-1]];num--;}break;//第三高位小數點亮
  154.           default:break;   
  155.          
  156.       }
  157.       if(num ==0)num = 4;
  158.    }
  159. }
  160. //=================================定時器0和外部中斷0的初始化函數=================
  161. void time0_int0_init()
  162. {
  163.    TMOD |= 0x01;
  164.    TMOD &=0xfd;//定時器0工作于方式1
  165.    TL0 = (65536 -5000) % 256;//12M晶振,5ms定時
  166.    TH0 = (65536 -5000) / 256;
  167.    IT0 = 1;//外部中斷0,負跳變觸發方式
  168.    TR0 = 0;
  169.    ET0 = 1;
  170.    EX0 = 1;
  171.    EA = 1;
  172. }
  173. //====================================ms 級延時函數===========================
  174. void delay1m(uchar x)
  175. {
  176.     uchar i,j;
  177.    for(i=0;i<x;i++)      //連數x次,約 x ms
  178.        for(j=0;j<120;j++);   //數120 次,約1 ms
  179. }



復制代碼

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

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