電路原理圖如下:
51hei圖片_20210918115138.png (144.82 KB, 下載次數: 79)
下載附件
2021-9-18 11:57 上傳
單片機源程序如下:
- #include "stc8.h"
- #include "LED.h"
- //#include<reg52.h> //包含頭文件
- #define uchar unsigned char
- #define uint unsigned int //宏定義
- sbit COUNT_IN=P3^3; //定義信號輸入
- uchar count,m,n; //定義計算速度變量
- unsigned long RPM=0; //定義速度變量
- unsigned long TT=0; //定義時間變量
- unsigned long sum=0; //計算平均值的總數
- unsigned char T_num=0; //平均值取值的次數
- unsigned long num=0; //單次轉速
- unsigned long TT1=0; //定義定時器中斷次數變量
- bit flag; //定義位變量,值只能是0或者1
- uchar p,sec;
-
-
-
- void delay(uint x) //延時函數,大約延時1ms,不精確
- {
- uint i,j; //定義延時函數變量
- for(i=0;i<x;i++) //for循環延時
- for(j=0;j<110;j++);
- }
- //void delayms(unsigned int m)
- // {
- // int a, b;
- // for(a=0;a<5000;a++)
- // for(b=0;b<m;b++);
- //
- // }
-
-
- unsigned char code Led_display[]={ //標準字庫 共陰數碼管字符
- //// // 0 1 2 3 4 5 6 7 8 9 A B C D E F
- 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
-
- // unsigned char LedBuff[] = { 0xFF, 0xFF, 0xFF, 0xFF}; //數碼管顯示緩存區
-
- // static
- unsigned long Temp;
-
-
- void LED_Init(void)
- {
- P1=0x3F;
- P34=0;
- P35=0;
-
- P36=0;
- P37=0;
-
- }
- //
- void init() //定時器中斷初始化
- {
- // IT0=1; //INT0負跳變觸發 =1下降沿
- IT1=1; //INT0負跳變觸發 =1下降沿
-
- TMOD=0x01;//定時器工作于方式1 16位不自動重載模式 當[TH1,TL1]中的16位計數值溢出時,定時器1將從0開始計數
- TH0=0;
- TL0=0;
- EA=1; //CPU開中斷總允許 中斷允許寄存器
- ET0=1; ////使能定時器中斷
- // EX0=1;//開外部INTO中斷 //使能 INT0 中斷,**********
- EX1=1;//開外部INTO中斷 //使能 INT0 中斷,**********
- TR0=0;//啟動定時 啟動定時器
- TH1=0x3c; //定時器 1 高 8 為寄存器
- TL1=0xb0; ////定時器 1 低 8 為寄存器
- ET1=1; //////使能定時器中斷
- TR1=1; ////開外部INT O 中斷 //使能 INT 0 中斷,**********
- }
- void LedScan(void) //數碼管掃描顯示
- {
- if (RPM<1)
- {
- P1 = 0x00; //顯示指示燈
- P34=1;
- P35=1;
- P36=1;
- P37=1;
-
- delay(10);
- }
- else{
-
- if (RPM>9999)
- {
-
- P1 = 0x6F; //顯示報警9999
- P34=0;
- P35=0;
- P36=0;
- P37=0;
-
- }
- else
- {
- static unsigned char i = 0; //動態掃描索引
- unsigned char buf[4]=0;
- Temp=RPM;
- buf[0] = Temp%10;
- buf[1] = (Temp/10)%10;
- buf[2] = (Temp/100)%10;
- buf[3] = (Temp/1000)%10;
- P1 = 0x00; //顯示消隱
- switch (i)
- {
- case 0: P34=1;P35=1;P36=1;P37=0; P1=Led_display[buf[i]]; i++;break;
- case 1:P34=1; P35=1;P36=0;P37=1; P1=Led_display[buf[i]]; i++;break;
- case 2: P34=1;P35=0;P36=1;P37=1; P1=Led_display[buf[i]]; i++;break;
- case 3: P34=0;P35=1;P36=1;P37=1; P1=Led_display[buf[i]];i=0; break;
- default: break;
-
- }
-
- }
-
- // }
-
- }
- }
-
-
-
- main()
- {
- init(); //調用初始化函數
- P1M1=0;P1M0=0xFF;
- // P3M1=0x00;P3M0=0x00;
- P3M1=0x08;P3M0=0x08;
-
-
- while(1)
- {
- LedScan();
- }
- }
-
-
- //中斷服務函數
- void EXINT0() interrupt 2 //外部中斷函數,霍爾元件有信號,會進入此中斷
- {
-
- if(TR0==0) //霍爾有信號輸入時,定時器沒有打開就打開定時器,準備計時
- {
- TH0=0;
- TL0=0; //定時器清零
- TT=0; //計時變量清零
- TT1=0; //定時器中斷次數清零
- TR0=1; //打開定時器,開始計時
- p=0;sec=0;
- }
- else //第二次檢測到信號時
- {
- p=0;sec=0;
- TR0=0; //關閉定時器
- TT=TT1*65536+TH0*256+TL0; //計算兩次信號的時間差。中斷次數*65536+TH0*256+TL0,得到時間差
- TH0=0;
- TL0=0; //計算完成后,將定時器清零
- num=120000000/TT; //根據時間計算1min中的速度。一分鐘是60秒,一秒是1000毫秒,1毫秒是1000us,所以是60*1000*1000/時間,TT的單位是單片機的最快速度1微秒
- TT1=0; //計算完速度后,TT1清零
- if(num>1000) //轉速超過1000時,取50次的平均值
- {
- sum=num+sum; //將數據加一起
- T_num++; //次數加
- if(T_num>=20) //加到50次
- {
- T_num=0; //次數清零
- RPM=sum/20; //總數除以50得到平均值
- sum=0; //計算完后總數清零
- }
- }
- else //轉速小于1000時
- {
- sum=0; //總數清零
- RPM=num; //數據直接賦值給轉速
- num=0; //數據清零
- T_num=0; //次數清零
- }
- }
- }
- void timeT0() interrupt 1 //兩次信號中間,定時器有中斷
- {
- TT1++; //說明達到一次65536,將TT1加1,計算時,將TT1乘以65536就是這個的時間了
- TH0=0;
- TL0=0; //定時器清零
- }
- void timeT1() interrupt 3 //兩次信號中間,定時器有中斷
- {
- TH1=0x3c;
- TL1=0xb0; //定時器清零
- // LedScan();//***
- p++;
- if(p>=20)
- {
- p=0;
- sec++;
- if(sec>=5)
- {
- sec=0;
- RPM=0;
- TR0=0;
- }
- }
- }
復制代碼 Keil代碼下載:
轉速表程序.rar
(73.11 KB, 下載次數: 33)
2021-9-18 14:19 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|