欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
基于51單片機定時器0計時外部中斷0計數(shù)的霍爾傳感器精確測速數(shù)碼管顯示測速的項目工程
[打印本頁]
作者:
51黑電子會員
時間:
2020-4-24 20:55
標題:
基于51單片機定時器0計時外部中斷0計數(shù)的霍爾傳感器精確測速數(shù)碼管顯示測速的項目工程
本帖最后由 51黑電子會員 于 2020-4-28 14:32 編輯
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit qiting=P3^0;//定義啟停按鍵
uchar qitingnum,flag_1s;//定義啟停次數(shù)變量、1s標志位變量清零
uint count,pulse,quan;//定時器0定時中斷次數(shù)變量、脈沖個數(shù)變量、圈數(shù)變量
unsigned long speed;//轉(zhuǎn)速變量
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f} ; //共陰數(shù)碼管段碼數(shù)字0~9字碼表,高電平點亮數(shù)碼管段碼數(shù)字0~9。
/**ms級延時子程序**/
void delay(uint x)
{
uint i,j;
for(i=0;i<x;i++)
for(j=0;j<110;j++);
}
/**轉(zhuǎn)速顯示函數(shù)**/
void display(unsigned long speed)
{
if(speed<=99999)
{
uchar wan,qian,bai,shi,ge;//定義拆字變量
wan=speed/10000;//轉(zhuǎn)速/10000得到萬位
qian=speed%10000/1000;//轉(zhuǎn)速/10000的余數(shù)/1000得到千位
bai=speed%1000/100;//取得百位
shi=speed%100/10;//取得十位數(shù)字
ge=speed%10;//取得個位數(shù)字
P2=0xfd;//數(shù)碼管萬位顯示位
P1=table[wan];//數(shù)碼管萬位數(shù)值顯示
delay(2);//延時
P2=0xfb;//數(shù)碼管千位顯示位
P1=table[qian];//數(shù)碼管千位數(shù)值顯示
delay(2);//延時
P2=0xf7;//數(shù)碼管百位顯示位
P1=table[bai];//數(shù)碼管百位數(shù)值顯示
delay(2);//延時
P2=0xef;//數(shù)碼管十位顯示位
P1=table[shi];//數(shù)碼管十位數(shù)值顯示
delay(2);//延時
P2=0xdf;//數(shù)碼管個位顯示位
P1=table[ge];//數(shù)碼管個位數(shù)值顯示
delay(2);//延時
}
}
/**按鍵掃描程序**/
void keyscan()//按鍵掃描函數(shù)
{
if(qiting==0)//判斷啟停鍵是否按下
{
// delay(5);
display(speed);
if(qiting==0)//判斷啟停鍵是否再次按下
{
qitingnum++;//啟停次數(shù)變量加加
// while(!qiting);//等待啟停鍵松開
while(!qiting)//等待啟停鍵松開
display(speed);
// lcd_init();//LCD1602液晶顯示器初始化函數(shù)
}
}
if(qitingnum==1)//判斷啟停次數(shù)變量是否為1
{
display(speed);//顯示速度函數(shù)
TR0=1;//打開定時器0
}
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
TR0=0;//關(guān)閉定時器0
}
}
/**定時器0、外部中斷0初始化子程序**/
void Time0_Int0_init()
{
TMOD=0X01;//模式選定時器0工作方式1
TH0=(65536-50000)/256;//定時器0高8位定時50毫秒
TL0=(65536-50000)%256;//定時器0低8位定時50毫秒
EA=1;//打開總中斷
IT0=1;//外部中斷0為下降沿中斷
EX0=1;//打開外部中斷0
ET0=1;//打開定時器0的中斷
TR0=0;//關(guān)閉定時器0
}
/**主函數(shù)**/
void main()
{
Time0_Int0_init();//定時器0、計數(shù)器1初始化子程序
while(1)
{
keyscan();//按鍵掃描函數(shù)
if(flag_1s==1)//判斷1s標志位變量是否為1
{
flag_1s=0;//1s標志位變量清零
display(speed);//轉(zhuǎn)速顯示函數(shù)
}
}
}
/**外部中斷0中斷服務(wù)子程序**/
void Int0() interrupt 0
{
pulse++;//脈沖個數(shù)變量
if(pulse==2) //兩次外部中斷脈沖,電機轉(zhuǎn)一圈。
{
quan++;//圈數(shù)變量加加
pulse=0;//脈沖個數(shù)變量置0
}
}
/**定時器0中斷服務(wù)子程序**/
void Timer0() interrupt 1
{
TH0=(65536-50000)/256;//重裝定時器0高8位定時50毫秒
TL0=(65536-50000)%256;//重裝定時器0低8位定時50毫秒
count++;//定時器0定時中斷次數(shù)變量加加
if(count==20)//判斷定時器0定時中斷次數(shù)變量是否等于20,即1秒鐘。
{
EX0=0;//關(guān)閉外部中斷0,開始統(tǒng)計1秒鐘內(nèi),霍爾元件發(fā)送的脈沖個數(shù)。
count=0;//定時器0定時中斷次數(shù)變量清0
speed=quan;//外部中斷0計數(shù)霍爾元件發(fā)送的脈沖個數(shù)為2個算一圈,即轉(zhuǎn)速:轉(zhuǎn)/秒,如果quan乘以60表示轉(zhuǎn)/分。
quan=0;//初始化圈數(shù),為了下一次統(tǒng)計1秒鐘內(nèi),霍爾元件發(fā)送的脈沖個數(shù)。
flag_1s=1;//1s標志位變量置1
TH0=(65536-50000)/256;//重裝定時器0高8位定時50毫秒
TL0=(65536-50000)%256;//重裝定時器0低8位定時50毫秒
EX0=1;//打開外部中斷0,開始計算霍爾元件發(fā)送的脈沖個數(shù)。
}
}
復(fù)制代碼
圖片111.png
(80.35 KB, 下載次數(shù): 36)
下載附件
2020-4-24 20:55 上傳
作者:
QEQWE123
時間:
2020-4-26 10:03
沒法下載呢親
作者:
51黑電子會員
時間:
2020-5-6 19:59
QEQWE123 發(fā)表于 2020-4-26 10:03
沒法下載呢親
看程序就可以做出來啊
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1