希望高手指點一下!
完整代碼下載:
頻率計.zip
(50.7 KB, 下載次數(shù): 43)
2017-2-19 11:34 上傳
點擊文件名下載附件
主程序預覽:
- #include "reg52.h"
- #include "lsh.h"
- #include "intrins.h"
- sbit SER = P3^4;
- sbit RCLK1 = P3^5;
- sbit SRCLK = P3^6;
- uchar code smgduan[17]=
- {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//顯示0~F的值
- uchar code smgwei[] = //--- 數(shù)碼管顯示的位選通段代碼表 ---
- {
- 0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,
- };
- uchar DispData[8];
- //--定義全局變量--//
- ulong Freq; //用來存放要顯示的頻率值
- ulong TimeCount; //用于計算1S鐘的
- void SerialSend(uchar DAT) //--- 串并轉(zhuǎn)換函數(shù)(595控制數(shù)碼管顯示) ---
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- DAT <<= 1;
- SER = CY;
- SRCLK = 0;
- _nop_();
- _nop_();
- SRCLK = 1;
- }
- }
- /*******************************************************************************
- * 函 數(shù) 名 : DigDisplay
- * 函數(shù)功能 : 數(shù)碼管動態(tài)掃描函數(shù),循環(huán)掃描8個數(shù)碼管顯示
- *******************************************************************************/
- void Scan_Disp()
- {
- uchar i;
- for(i=0; i<6; i++)
- {
- RCLK1 = 0;
- SerialSend(DispData[i]); //--- 送顯示代碼到串口引腳 ---
- SerialSend(smgwei[i]); //--- 送選通代碼到串口引腳 ---
- RCLK1 = 0;
- _nop_();
- _nop_();
- RCLK1 = 1; //--- 掃描計數(shù)變量加1 ---
- Delay(100);
- }
- }
- /*******************************************
- *函數(shù)名 :TIMER_Configuration
- *功 能 :配置定時/計數(shù)器T0和T1
- *輸 入 :無
- *輸 出 :無
- *******************************************/
- void Timer_Init()
- {
- //--定時器T1做計數(shù)器,工作方式1(16位定時器),只由TRx打開計數(shù)器--//
- //--定時器T0做定時器,工作方式1(16位定時器),只由TRx打開定時器--//
- TMOD=0x51;
- T2MOD = 0x02;//選擇為定時器2模式,工作方式1,僅用TR1打開啟動。
- RCAP2H = 0xFD;
- RCAP2L = 0xC8;
- //--設置定時器晶振為12MHZ時定時50ms--//
- TH0=0xD8;
- TL0=0xF0;
- TH2 = 0xFD;
- TL2 = 0xC8; //1us
- //--打開中斷-//
- ET0=1;
- ET1=1;
- ET2=1;//打開定時器1中斷允許
- EA=1;
- //--打開定時器*/
- TR0=1;
- TR1=1;
- TR2=1;//打開定時器
- }
- /*******************************************
- *函數(shù)名 :Disp_Fre
- *功 能 :顯示所計算的頻率值
- *輸 入 :無
- *輸 出 :無
- *******************************************/
- void Disp_Fre()
- {
- if(TR1 == 0) //當計數(shù)器停下的時候,表明計數(shù)完畢
- {
- Freq = Freq + TL1; //讀取TL的值
- Freq = Freq + (TH1 * 256); //讀取TH的值
- //--求頻率的個十百千萬十萬位--//
- DispData[0] = smgduan[Freq%1000000/100000];
- DispData[1] = smgduan[Freq%100000/10000];
- DispData[2] = smgduan[Freq%10000/1000];
- DispData[3] = smgduan[Freq%1000/100];
- DispData[4] = smgduan[Freq%100/10];
- DispData[5] = smgduan[Freq%10];
-
- //--顯示完,重新計算下一次頻率。--//
- Freq = 0;//將計算的頻率清零
- TH1 = 0; //將計數(shù)器的值清零
- TL1 = 0;
- TR0 = 1; //開啟定時器
- TR1 = 1; //開啟計數(shù)器
- }
- //--顯示求得的數(shù)值--//
- Scan_Disp();
- }
- /*******************************************
- *函數(shù)名 :Timer0
- *功 能 :定時器0的中斷函數(shù)
- *輸 入 :無
- *輸 出 :無
- *******************************************/
- void Timer0() interrupt 1
- {
- Scan_Disp();
- //--12MHZ設置定時50ms的初值--//
- TH0=0xD8;
- TL0=0xF0;
-
- TimeCount++;
- if(TimeCount==100)//計時到1S
- {
- TR0=0;
- TR1=0;
- TimeCount=0;
- }
- }
- /*******************************************
- *函數(shù)名 :Timer1
- *功 能 :計數(shù)器1的中斷函數(shù)
- *輸 入 :無
- *輸 出 :無
- *******************************************/
- void Timer1() interrupt 3
- {
- //--進入一次中斷,表明計數(shù)到了65536--//
- Freq=Freq+65536;
- }
- void Timer2(void) interrupt 5 //3 為定時器1的中斷號 1 定時器0的中斷號 0 外部中斷1 2 外部中斷2 4 串口中斷
- {
- TF2 = 0;
-
- }
- /*******************************************************************************
- * 函 數(shù) 名 : main
- * 函數(shù)功能 : 主函數(shù)
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- void main()
- {
- Timer_Init();
- while(1)
- {
- Disp_Fre();
- }
- }
復制代碼
|