|
本帖最后由 51黑電子會員 于 2020-4-8 21:32 編輯
單片機源程序如下:
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit qiting=P3^0;//定義啟停按鍵
- uchar qitingnum;//定義啟停次數變量
- uint count;//定時器0定時中斷次數變量
- unsigned long speed;//轉速變量
- uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f} ; //共陰數碼管段碼數字0~9字碼表,高電平點亮數碼管段碼數字0~9。
- /**ms級延時子程序**/
- 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;//轉速/10000得到萬位
- qian=speed%10000/1000;//轉速/10000的余數/1000得到千位
- bai=speed%1000/100;//取得百位
- shi=speed%100/10;//取得十位數字
- ge=speed%10;//取得個位數字
-
- P2=0xfd;//數碼管萬位顯示位
- P1=table[wan];//數碼管萬位數值顯示
- delay(2);//延時
- P2=0xfb;//數碼管千位顯示位
- P1=table[qian];//數碼管千位數值顯示
- delay(2);//延時
- P2=0xf7;//數碼管百位顯示位
- P1=table[bai];//數碼管百位數值顯示
- delay(2);//延時
- P2=0xef;//數碼管十位顯示位
- P1=table[shi];//數碼管十位數值顯示
- delay(2);//延時
-
- P2=0xdf;//數碼管個位顯示位
- P1=table[ge];//數碼管個位數值顯示
- delay(2);//延時
- }
- }
- /**按鍵掃描程序**/
- void keyscan()//按鍵掃描函數
- {
- if(qiting==0)//判斷啟停鍵是否按下
- {
- // delay(5);
- display(speed);
- if(qiting==0)//判斷啟停鍵是否再次按下
- {
- qitingnum++;//啟停次數變量加加
- // while(!qiting);//等待啟停鍵松開
- while(!qiting)//等待啟停鍵松開
- display(speed);
- // lcd_init();//LCD1602液晶顯示器初始化函數
- }
- }
- if(qitingnum==1)//判斷啟停次數變量是否為1
- {
- display(speed);//顯示速度函數
- }
- if(qitingnum==2)//判斷啟停次數變量是否為2
- {
- // write_1602com(0x08);//關LCD1602液晶顯示器顯示
- P2=0xff;//關數碼管顯示位
- P1=0x00;//關數碼管數值顯示
- qitingnum=0;//啟停次數變量置0
- }
- }
- /**定時器0、計數器1初始化子程序**/
- void Time0_Time1_init()
- {
- TMOD=0X51;//模式選定時器0、計數器1,工作方式選定時器0定時模式1、計數器1計數模式1。
- TH0=(65536-50000)/256;//定時器0高8位定時50毫秒
- TL0=(65536-50000)%256;//定時器0低8位定時50毫秒
- TH1=0;//計數器1高8位計數初值為0
- TL1=0;//計數器1低8位計數初值為0
- EA=1;//打開總中斷
- ET0=1;//打開定時器0的中斷
- TR0=1;//打開定時器0
- ET1=1;//打開計數器1的中斷
- TR1=1;//打開計數器1
- }
- /**主函數**/
- void main()
- {
- Time0_Time1_init();//定時器0、計數器1初始化子程序
- while(1)
- {
- keyscan();//按鍵掃描函數
- }
- }
- /**定時器0中斷服務子程序**/
- void Timer0() interrupt 1
- {
- TH0=(65536-50000)/256;//重裝定時器0高8位定時50毫秒
- TL0=(65536-50000)%256;//重裝定時器0低8位定時50毫秒
- count++;//定時器0定時中斷次數變量加加
- if(count==20)//判斷定時器0定時中斷次數變量是否等于20,即1秒鐘。
- {
- count=0;//定時器0定時中斷次數變量清0
- TR1=0;//關計數器1,開始統計1秒鐘內,霍爾元件發送的脈沖個數。
- speed=TH1*256+TL1;//表示計數器1計數霍爾元件發送的脈沖個數,即轉速:轉/秒。
- TH1=0;//計數器1高8位計數清0,為了下一次計數。
- TL1=0;//計數器1低8位計數0,為了下一次計數。
- TR1=1;//開計數器1,為了下一次統計1秒鐘內,霍爾元件發送的脈沖個數。
- }
- }
復制代碼
|
評分
-
查看全部評分
|