|
本帖最后由 51黑電子會(huì)員 于 2020-4-29 08:54 編輯
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit qiting=P3^0;//定義啟停按鍵
- uchar qitingnum;//定義啟停次數(shù)變量
- uchar wan,qian,bai,shi,ge;//定義拆字變量
- uint count,pulse;//聲明定時(shí)器0計(jì)時(shí)變量、脈沖計(jì)數(shù)變量
- unsigned long speed;//聲明速度變量
- uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f} ; //共陰數(shù)碼管段碼數(shù)字0~9字碼表,高電平點(diǎn)亮數(shù)碼管段碼數(shù)字0~9。
- /**ms級(jí)延時(shí)子程序**/
- void delay(uint x)
- {
- uint i,j;
- for(i=0;i<x;i++)
- for(j=0;j<110;j++);
- }
- void display(unsigned long speed)
- {
- if(speed<=99999)
- {
- // uchar wan,qian,bai,shi,ge;//定義拆字變量
- // wan=speed/10000;//轉(zhuǎn)速/10000得到萬(wàn)位
- // qian=speed%10000/1000;//轉(zhuǎn)速/10000的余數(shù)/1000得到千位
- // bai=speed%1000/100;//取得百位
- // shi=speed%100/10;//取得十位數(shù)字
- // ge=speed%10;//取得個(gè)位數(shù)字
-
- P2=0xfd;//數(shù)碼管萬(wàn)位顯示位
- P1=table[wan];//數(shù)碼管萬(wàn)位數(shù)值顯示
- delay(2);//延時(shí)
- P2=0xfb;//數(shù)碼管千位顯示位
- P1=table[qian];//數(shù)碼管千位數(shù)值顯示
- delay(2);//延時(shí)
- P2=0xf7;//數(shù)碼管百位顯示位
- P1=table[bai];//數(shù)碼管百位數(shù)值顯示
- delay(2);//延時(shí)
- P2=0xef;//數(shù)碼管十位顯示位
- P1=table[shi];//數(shù)碼管十位數(shù)值顯示
- delay(2);//延時(shí)
-
- P2=0xdf;//數(shù)碼管個(gè)位顯示位
- P1=table[ge];//數(shù)碼管個(gè)位數(shù)值顯示
- delay(2);//延時(shí)
- }
- }
- /**按鍵掃描程序**/
- void keyscan()//按鍵掃描函數(shù)
- {
- if(qiting==0)//判斷啟停鍵是否按下
- {
- // delay(5);
- display(speed);
- if(qiting==0)//判斷啟停鍵是否再次按下
- {
- qitingnum++;//啟停次數(shù)變量加加
- // while(!qiting);//等待啟停鍵松開(kāi)
- while(!qiting)//等待啟停鍵松開(kāi)
- display(speed);
- // lcd_init();//LCD1602液晶顯示器初始化函數(shù)
- }
- }
- if(qitingnum==1)//判斷啟停次數(shù)變量是否為1
- {
- display(speed);//顯示速度函數(shù)
- }
- if(qitingnum==2)//判斷啟停次數(shù)變量是否為2
- {
- // write_1602com(0x08);//關(guān)LCD1602液晶顯示器顯示
- P2=0xff;//關(guān)數(shù)碼管顯示位
- P1=0x00;//關(guān)數(shù)碼管數(shù)值顯示
- qitingnum=0;//啟停次數(shù)變量置0
- }
- }
- /**外部中斷0中斷服務(wù)子程序**/
- void Int0() interrupt 0
- {
- pulse++;
- }
- /**定時(shí)器0、外部中斷0初始化子程序**/
- void Time0_Time1_init()
- {
- TMOD=0X01;//模式選定時(shí)器0、計(jì)數(shù)器1,工作方式選定時(shí)器0定時(shí)模式1、計(jì)數(shù)器1計(jì)數(shù)模式1。
- TH0=(65536-50000)/256;//定時(shí)器0高8位定時(shí)50毫秒
- TL0=(65536-50000)%256;//定時(shí)器0低8位定時(shí)50毫秒
- // TH1=0;//計(jì)數(shù)器1高8位計(jì)數(shù)初值為0
- // TL1=0;//計(jì)數(shù)器1低8位計(jì)數(shù)初值為0
- EA=1;//打開(kāi)總中斷
- EX0=1;//開(kāi)外部中斷0
- IT0=1;//INT0負(fù)跳變觸發(fā)
- ET0=1;//打開(kāi)定時(shí)器0的中斷
- TR0=1;//打開(kāi)定時(shí)器0
- // ET1=1;//打開(kāi)計(jì)數(shù)器1的中斷
- // TR1=1;//打開(kāi)計(jì)數(shù)器1
- }
- void main()
- {
- Time0_Time1_init();//定時(shí)器0、計(jì)數(shù)器1初始化子程序
- while(1)
- {
- keyscan();//按鍵掃描函數(shù)
- }
- }
- /**定時(shí)器0中斷服務(wù)子程序**/
- void Timer0() interrupt 1
- {
- TH0=(65536-50000)/256;//重裝定時(shí)器0高8位定時(shí)50毫秒
- TL0=(65536-50000)%256;//重裝定時(shí)器0低8位定時(shí)50毫秒
- count++;//定時(shí)器0定時(shí)中斷次數(shù)變量加加
- if(count==20)//判斷定時(shí)器0定時(shí)中斷次數(shù)變量是否等于20,即1秒鐘。
- {
- count=0;//定時(shí)器0定時(shí)中斷次數(shù)變量清0
- 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。
- pulse=0;//脈沖個(gè)數(shù)變量清0,為下一次重新計(jì)數(shù)脈沖個(gè)數(shù)。
- wan=speed/10000;//轉(zhuǎn)速/10000得到萬(wàn)位
- qian=speed%10000/1000;//轉(zhuǎn)速/10000的余數(shù)/1000得到千位
- bai=speed%1000/100;//取得百位
- shi=speed%100/10;//取得十位數(shù)字
- ge=speed%10;//取得個(gè)位數(shù)字
- }
- }
復(fù)制代碼
668f4bb1d1d540308c7365b0278d028.png (96.32 KB, 下載次數(shù): 35)
下載附件
2020-4-29 08:54 上傳
|
評(píng)分
-
查看全部評(píng)分
|