找回密码
 立即注册

QQ登录

只需一步,快速开始

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

霍尔元件+单片机的测速仪程序和电路原理图

[复制链接]
ID:445575 发表于 2019-5-30 18:58 | 显示全部楼层 |阅读模式
360截图20190530184812202.jpg IMG_20190111_112254.jpg

单片机系统程序:
//说明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 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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