找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

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

基于51單片機(jī)紅外線(xiàn)發(fā)射接收管測(cè)速的項(xiàng)目工程

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
本帖最后由 51黑電子會(huì)員 于 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;//定義啟停次數(shù)變量
  6. uchar wan,qian,bai,shi,ge;//定義拆字變量
  7. uint count,pulse;//聲明定時(shí)器0計(jì)時(shí)變量、脈沖計(jì)數(shù)變量
  8. unsigned long speed;//聲明速度變量
  9. uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f} ; //共陰數(shù)碼管段碼數(shù)字0~9字碼表,高電平點(diǎn)亮數(shù)碼管段碼數(shù)字0~9。
  10. /**ms級(jí)延時(shí)子程序**/
  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;//轉(zhuǎn)速/10000得到萬(wàn)位
  23. //  qian=speed%10000/1000;//轉(zhuǎn)速/10000的余數(shù)/1000得到千位
  24. //  bai=speed%1000/100;//取得百位
  25. //  shi=speed%100/10;//取得十位數(shù)字
  26. //  ge=speed%10;//取得個(gè)位數(shù)字
  27.    
  28.     P2=0xfd;//數(shù)碼管萬(wàn)位顯示位
  29.     P1=table[wan];//數(shù)碼管萬(wàn)位數(shù)值顯示
  30.     delay(2);//延時(shí)

  31.     P2=0xfb;//數(shù)碼管千位顯示位
  32.     P1=table[qian];//數(shù)碼管千位數(shù)值顯示
  33.     delay(2);//延時(shí)

  34.     P2=0xf7;//數(shù)碼管百位顯示位
  35.     P1=table[bai];//數(shù)碼管百位數(shù)值顯示
  36.     delay(2);//延時(shí)

  37.     P2=0xef;//數(shù)碼管十位顯示位
  38.     P1=table[shi];//數(shù)碼管十位數(shù)值顯示
  39.     delay(2);//延時(shí)

  40.     P2=0xdf;//數(shù)碼管個(gè)位顯示位
  41.     P1=table[ge];//數(shù)碼管個(gè)位數(shù)值顯示
  42.     delay(2);//延時(shí)
  43.    }
  44. }
  45. /**按鍵掃描程序**/  
  46.   void keyscan()//按鍵掃描函數(shù)
  47. {
  48.    if(qiting==0)//判斷啟停鍵是否按下
  49. {
  50. //  delay(5);
  51.     display(speed);
  52.     if(qiting==0)//判斷啟停鍵是否再次按下
  53.   {
  54.      qitingnum++;//啟停次數(shù)變量加加
  55. //   while(!qiting);//等待啟停鍵松開(kāi)
  56.      while(!qiting)//等待啟停鍵松開(kāi)
  57.      display(speed);
  58. //   lcd_init();//LCD1602液晶顯示器初始化函數(shù)
  59.     }
  60.   }
  61.    if(qitingnum==1)//判斷啟停次數(shù)變量是否為1
  62. {
  63.     display(speed);//顯示速度函數(shù)
  64.   }
  65.    if(qitingnum==2)//判斷啟停次數(shù)變量是否為2
  66. {
  67. //  write_1602com(0x08);//關(guān)LCD1602液晶顯示器顯示
  68.     P2=0xff;//關(guān)數(shù)碼管顯示位
  69.     P1=0x00;//關(guān)數(shù)碼管數(shù)值顯示
  70.     qitingnum=0;//啟停次數(shù)變量置0
  71.    }
  72. }
  73. /**外部中斷0中斷服務(wù)子程序**/  
  74.   void Int0() interrupt 0
  75. {
  76.    pulse++;
  77.   }
  78. /**定時(shí)器0、外部中斷0初始化子程序**/
  79.   void Time0_Time1_init()
  80. {
  81.    TMOD=0X01;//模式選定時(shí)器0、計(jì)數(shù)器1,工作方式選定時(shí)器0定時(shí)模式1、計(jì)數(shù)器1計(jì)數(shù)模式1。
  82.    TH0=(65536-50000)/256;//定時(shí)器0高8位定時(shí)50毫秒
  83.    TL0=(65536-50000)%256;//定時(shí)器0低8位定時(shí)50毫秒
  84. // TH1=0;//計(jì)數(shù)器1高8位計(jì)數(shù)初值為0
  85. // TL1=0;//計(jì)數(shù)器1低8位計(jì)數(shù)初值為0
  86.    EA=1;//打開(kāi)總中斷
  87.    EX0=1;//開(kāi)外部中斷0
  88.    IT0=1;//INT0負(fù)跳變觸發(fā)
  89.    ET0=1;//打開(kāi)定時(shí)器0的中斷
  90.    TR0=1;//打開(kāi)定時(shí)器0
  91. // ET1=1;//打開(kāi)計(jì)數(shù)器1的中斷
  92. // TR1=1;//打開(kāi)計(jì)數(shù)器1
  93. }
  94.   void main()
  95. {
  96.    Time0_Time1_init();//定時(shí)器0、計(jì)數(shù)器1初始化子程序
  97.    while(1)
  98. {
  99.     keyscan();//按鍵掃描函數(shù)
  100.    }
  101.   }
  102. /**定時(shí)器0中斷服務(wù)子程序**/                                      
  103.   void Timer0() interrupt 1
  104. {
  105.    TH0=(65536-50000)/256;//重裝定時(shí)器0高8位定時(shí)50毫秒
  106.    TL0=(65536-50000)%256;//重裝定時(shí)器0低8位定時(shí)50毫秒
  107.    count++;//定時(shí)器0定時(shí)中斷次數(shù)變量加加
  108.    if(count==20)//判斷定時(shí)器0定時(shí)中斷次數(shù)變量是否等于20,即1秒鐘。
  109. {
  110.    count=0;//定時(shí)器0定時(shí)中斷次數(shù)變量清0
  111.    speed=pulse/3;//通過(guò)在小直流電機(jī)軸上套上一個(gè)白色圓盤(pán)(或白色圓形圖紙),把白色圓盤(pán)分成6等份,其中三等份涂黑,余下三等份為白色。利用紅外線(xiàn)照到黑色面時(shí),反射光很弱,紅外線(xiàn)接收端檢測(cè)到的光線(xiàn)可以忽略,當(dāng)照到白色面時(shí),反射光強(qiáng)烈,發(fā)射端發(fā)射的紅外線(xiàn)幾乎被接收端全部接收的原理來(lái)測(cè)速。為什么是pluse/3,3是咋么來(lái)的?由于套在小直流電機(jī)軸上白色圓盤(pán)表面有3份白色面被紅外線(xiàn)照射后反射回來(lái)3次,也就是3次高低電平脈沖,也產(chǎn)生了3次下降沿,這3次下降沿剛好是小直流電機(jī)轉(zhuǎn)一圈。若算圈/秒就是pluse/3,算圈/分就是(pluse/3)/60,即pluse/20。
  112.    pulse=0;//脈沖個(gè)數(shù)變量清0,為下一次重新計(jì)數(shù)脈沖個(gè)數(shù)。
  113.    wan=speed/10000;//轉(zhuǎn)速/10000得到萬(wàn)位
  114.    qian=speed%10000/1000;//轉(zhuǎn)速/10000的余數(shù)/1000得到千位
  115.    bai=speed%1000/100;//取得百位                 
  116.    shi=speed%100/10;//取得十位數(shù)字
  117.    ge=speed%10;//取得個(gè)位數(shù)字
  118.   }
  119. }
復(fù)制代碼

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:258520 發(fā)表于 2020-5-7 23:14 | 只看該作者
有沒(méi)有源文件啊  仿真 求一份學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

板凳
ID:171036 發(fā)表于 2020-5-8 20:17 | 只看該作者
makaichuang123 發(fā)表于 2020-5-7 23:14
有沒(méi)有源文件啊  仿真 求一份學(xué)習(xí)

在理解程序的基礎(chǔ)上去編寫(xiě)啊  仿真是一樣的
回復(fù)

使用道具 舉報(bào)

地板
ID:258520 發(fā)表于 2020-5-19 02:49 | 只看該作者
51黑電子會(huì)員 發(fā)表于 2020-5-8 20:17
在理解程序的基礎(chǔ)上去編寫(xiě)啊  仿真是一樣的

大佬 ,我缺好多元器件 ,仿真沒(méi)弄出來(lái) 行個(gè)方便發(fā)一下源文件吧
回復(fù)

使用道具 舉報(bào)

5#
ID:664656 發(fā)表于 2022-3-1 16:12 | 只看該作者
請(qǐng)問(wèn)一下,這個(gè)系統(tǒng)是測(cè)轉(zhuǎn)速還是物體經(jīng)過(guò)的速度
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表