找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2341|回复: 4
收起左侧

基于51单片机红外线发射接收管测速的项目工程

[复制链接]
ID:171036 发表于 2020-4-29 08:27 | 显示全部楼层 |阅读模式
本帖最后由 51黑电子会员 于 2020-4-29 08:54 编辑
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit qiting=P3^0;//定义启停按键
  5. uchar qitingnum;//定义启停次数变量
  6. uchar wan,qian,bai,shi,ge;//定义拆字变量
  7. uint count,pulse;//声明定时器0计时变量、脉冲计数变量
  8. unsigned long speed;//声明速度变量
  9. uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f} ; //共阴数码管段码数字0~9字码表,高电平点亮数码管段码数字0~9。
  10. /**ms级延时子程序**/
  11.   void delay(uint x)
  12. {
  13.    uint i,j;                       
  14.    for(i=0;i<x;i++)     
  15.     for(j=0;j<110;j++);
  16.   }
  17.   void display(unsigned long speed)
  18. {
  19.    if(speed<=99999)
  20. {
  21. //  uchar wan,qian,bai,shi,ge;//定义拆字变量
  22. //  wan=speed/10000;//转速/10000得到万位
  23. //  qian=speed%10000/1000;//转速/10000的余数/1000得到千位
  24. //  bai=speed%1000/100;//取得百位
  25. //  shi=speed%100/10;//取得十位数字
  26. //  ge=speed%10;//取得个位数字
  27.    
  28.     P2=0xfd;//数码管万位显示位
  29.     P1=table[wan];//数码管万位数值显示
  30.     delay(2);//延时

  31.     P2=0xfb;//数码管千位显示位
  32.     P1=table[qian];//数码管千位数值显示
  33.     delay(2);//延时

  34.     P2=0xf7;//数码管百位显示位
  35.     P1=table[bai];//数码管百位数值显示
  36.     delay(2);//延时

  37.     P2=0xef;//数码管十位显示位
  38.     P1=table[shi];//数码管十位数值显示
  39.     delay(2);//延时

  40.     P2=0xdf;//数码管个位显示位
  41.     P1=table[ge];//数码管个位数值显示
  42.     delay(2);//延时
  43.    }
  44. }
  45. /**按键扫描程序**/  
  46.   void keyscan()//按键扫描函数
  47. {
  48.    if(qiting==0)//判断启停键是否按下
  49. {
  50. //  delay(5);
  51.     display(speed);
  52.     if(qiting==0)//判断启停键是否再次按下
  53.   {
  54.      qitingnum++;//启停次数变量加加
  55. //   while(!qiting);//等待启停键松开
  56.      while(!qiting)//等待启停键松开
  57.      display(speed);
  58. //   lcd_init();//LCD1602液晶显示器初始化函数
  59.     }
  60.   }
  61.    if(qitingnum==1)//判断启停次数变量是否为1
  62. {
  63.     display(speed);//显示速度函数
  64.   }
  65.    if(qitingnum==2)//判断启停次数变量是否为2
  66. {
  67. //  write_1602com(0x08);//关LCD1602液晶显示器显示
  68.     P2=0xff;//关数码管显示位
  69.     P1=0x00;//关数码管数值显示
  70.     qitingnum=0;//启停次数变量置0
  71.    }
  72. }
  73. /**外部中断0中断服务子程序**/  
  74.   void Int0() interrupt 0
  75. {
  76.    pulse++;
  77.   }
  78. /**定时器0、外部中断0初始化子程序**/
  79.   void Time0_Time1_init()
  80. {
  81.    TMOD=0X01;//模式选定时器0、计数器1,工作方式选定时器0定时模式1、计数器1计数模式1。
  82.    TH0=(65536-50000)/256;//定时器0高8位定时50毫秒
  83.    TL0=(65536-50000)%256;//定时器0低8位定时50毫秒
  84. // TH1=0;//计数器1高8位计数初值为0
  85. // TL1=0;//计数器1低8位计数初值为0
  86.    EA=1;//打开总中断
  87.    EX0=1;//开外部中断0
  88.    IT0=1;//INT0负跳变触发
  89.    ET0=1;//打开定时器0的中断
  90.    TR0=1;//打开定时器0
  91. // ET1=1;//打开计数器1的中断
  92. // TR1=1;//打开计数器1
  93. }
  94.   void main()
  95. {
  96.    Time0_Time1_init();//定时器0、计数器1初始化子程序
  97.    while(1)
  98. {
  99.     keyscan();//按键扫描函数
  100.    }
  101.   }
  102. /**定时器0中断服务子程序**/                                      
  103.   void Timer0() interrupt 1
  104. {
  105.    TH0=(65536-50000)/256;//重装定时器0高8位定时50毫秒
  106.    TL0=(65536-50000)%256;//重装定时器0低8位定时50毫秒
  107.    count++;//定时器0定时中断次数变量加加
  108.    if(count==20)//判断定时器0定时中断次数变量是否等于20,即1秒钟。
  109. {
  110.    count=0;//定时器0定时中断次数变量清0
  111.    speed=pulse/3;//通过在小直流电机轴上套上一个白色圆盘(或白色圆形图纸),把白色圆盘分成6等份,其中三等份涂黑,余下三等份为白色。利用红外线照到黑色面时,反射光很弱,红外线接收端检测到的光线可以忽略,当照到白色面时,反射光强烈,发射端发射的红外线几乎被接收端全部接收的原理来测速。为什么是pluse/3,3是咋么来的?由于套在小直流电机轴上白色圆盘表面有3份白色面被红外线照射后反射回来3次,也就是3次高低电平脉冲,也产生了3次下降沿,这3次下降沿刚好是小直流电机转一圈。若算圈/秒就是pluse/3,算圈/分就是(pluse/3)/60,即pluse/20。
  112.    pulse=0;//脉冲个数变量清0,为下一次重新计数脉冲个数。
  113.    wan=speed/10000;//转速/10000得到万位
  114.    qian=speed%10000/1000;//转速/10000的余数/1000得到千位
  115.    bai=speed%1000/100;//取得百位                 
  116.    shi=speed%100/10;//取得十位数字
  117.    ge=speed%10;//取得个位数字
  118.   }
  119. }
复制代码
668f4bb1d1d540308c7365b0278d028.png

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:258520 发表于 2020-5-7 23:14 | 显示全部楼层
有没有源文件啊  仿真 求一份学习
回复

使用道具 举报

ID:171036 发表于 2020-5-8 20:17 | 显示全部楼层
makaichuang123 发表于 2020-5-7 23:14
有没有源文件啊  仿真 求一份学习

在理解程序的基础上去编写啊  仿真是一样的
回复

使用道具 举报

ID:258520 发表于 2020-5-19 02:49 | 显示全部楼层
51黑电子会员 发表于 2020-5-8 20:17
在理解程序的基础上去编写啊  仿真是一样的

大佬 ,我缺好多元器件 ,仿真没弄出来 行个方便发一下源文件吧
回复

使用道具 举报

ID:664656 发表于 2022-3-1 16:12 | 显示全部楼层
请问一下,这个系统是测转速还是物体经过的速度
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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