給你改了一下試試
NewC51FreqCounterProject001a.jpg (447.43 KB, 下載次數: 32)
下載附件
2023-4-24 21:04 上傳
- //#include <sfr.h>
- //#include <os.h>
- #include <reg52.h>
- #include <stdlib.h>
- #include <stdio.h>
- sbit P36_o_74f161_clr_n = P3^6; //外部計數器F161復位
- sbit P35_o_74f161_enp = P3^5; //外部計數器F161有效(Enable)
- sbit P30_io_74hc393_clr_hold = P3^0; //外部計數器HC393復位/HOLD輸入
- sbit P37_i_prescaler = P3^7; // 64分頻的預分頻器
- //
- //七段LED字形數據
- // hgfedcba
- #define DIG0 0xC0 // 11000000b ; 0 P2.0
- #define DIG1 0xF9 // 11111001b ; 1 +-----a-----+
- #define DIG2 0xA4 // 10100100b ; 2 | |
- #define DIG3 0xB0 // 10110000b ; 3 P2.5 f b P2.1
- #define DIG4 0x99 // 10011001b ; 4 | |
- #define DIG5 0x92 // 10010010b ; 5 | P2.6 |
- #define DIG6 0x82 // 10000010b ; 6 +-----g-----+
- #define DIG7 0xD8 // 11011000b ; 7 | |
- #define DIG8 0x80 // 10000000b ; 8 P2.4 e c P2.2
- #define DIG9 0x98 // 10011000b ; 9 | |
- // ; | P2.3 |
- #define DIGM 0xBF // 10111111b ; - +-----d-----+ * h P2.7
- #define DIGP 0x7F // 01111111b ; .
- #define DIGB 0xFF // 11111111b ; "Blank"(“空白”)
- //
- code char segment_pattern[] = { DIG0, DIG1, DIG2,\
- DIG3, DIG4, DIG5, DIG6, DIG7, DIG8, DIG9 };
- //
- code char segment_select[] = { 0xFE, 0xFD, 0xFB, \
- 0xF7, 0xEF, 0xDF, 0xBF, 0x7F };
- //
- unsigned long trailer;
- unsigned long task;
- unsigned int trimer;
- unsigned char fnd[8];
- unsigned char mfnd[8];
- unsigned int int_state;
- unsigned char fnd_state;
- unsigned char boat;
- bit hold;
- //
- //
- //void _interrupt IVN_TIMER1 time_base() {
- void time_base() interrupt 3
- {
- //////////////////////////////////////////////
- TL1 = 0x60; TH1 = 0xF0; // 4000 2 M Sec 500 Times
- //////////////////////////////////////////////
- P0 = 0xff;
- P2 = segment_select[fnd_state];
- P0 = fnd[fnd_state++];
- fnd_state &= 0x07;
- //////////////////////////////////////////////
- if(int_state == 0) { //
- P35_o_74f161_enp = 0; //外部計數器F161計數禁止
- P30_io_74hc393_clr_hold = 1; //外部計數器HC393復位
- P36_o_74f161_clr_n = 0; //外部計數器F161復位
- TL0 = 0x00; TH0 = 0x00; //內部計數器復位
- hold = P30_io_74hc393_clr_hold; // HOLD(保持)鍵狀態輸入
- P36_o_74f161_clr_n = 1; // 外部計數器F161有效(Enable)
- P30_io_74hc393_clr_hold = 0; // 外部計數器HC393有效(Enable)
- P35_o_74f161_enp = 1; // 外部計數器F161進行計數
- }
- //////////////////////////////////////////////
- if(int_state == 316) { // 10GHz狀態(64分頻的預分頻器)
- if (!P37_i_prescaler) { // 門控時間為0.64秒
- for (trimer = 0; trimer<202; trimer++) ; // 15個機器周期單位
- // 測試信號24MHz輸入
- boat++; // 15360000 用于顯示,需調整
- boat++; // 延遲1個機器周期(12個時鐘周期)
- boat++; // 15359988
- boat++; // 15360000
- // boat++; // 15360012
- P35_o_74f161_enp = 0; // 外部計數器停止
- trailer = TH0;
- trailer = (trailer << 20) & 0x0ff00000;
- task = TL0;
- task = (task << 12) & 0x000ff000;
- trailer |= task;
- task = P3;
- task = (task << 7) & 0x00000f00;
- trailer |= task;
- task = P1 & 0x000000ff;
- trailer |= task;
- P35_o_74f161_enp = 1; // 소비 전류가 일정하게 하기위하여
- // 電流消耗,
- // 外部計數器將重新開始。
- }
- }
- //////////////////////////////////////////////
- if(int_state == 494) { // 100 MHz Mode 1 Sec Gate Time
- if (P37_i_prescaler) { // 1 Sec Gate Time
- for (trimer = 0; trimer<248; trimer++) ; // 15個機器周期單位
- // 測試24MHz信號源輸入
- boat++; // 24000000 用于顯示,需調整
- boat++; //
- boat++; //
- boat++; //
- boat++; // 延遲1個機器周期(12個時鐘周期)
- boat++; // 23999988
- boat++; // 24000000
- // boat++; // 24000012
- P35_o_74f161_enp = 0; // 外部計數器停止
- trailer = TH0;
- trailer = (trailer << 20) & 0x0ff00000;
- task = TL0;
- task = (task << 12) & 0x000ff000;
- trailer |= task;
- task = P3;
- task = (task << 7) & 0x00000f00;
- trailer |= task;
- task = P1 & 0x000000ff;
- trailer |= task;
- P35_o_74f161_enp = 1; // 소비 전류가 일정하게 하기위하여
- // 電流消耗,以時間表
- // 外部計數器重新開始。
- }
- }
- //////////////////////////////////////////////
- if(int_state == 506) { // 1Hz數字顯示
- boat = trailer % 10;
- mfnd[7] = segment_pattern[boat & 0xf];
- trailer /= 10;
- }
- //////////////////////////////////////////////
- if(int_state == 507) {
- boat = trailer % 10;
- mfnd[6] = segment_pattern[boat & 0xf];
- trailer /= 10;
- }
- //////////////////////////////////////////////
- if(int_state == 508) {
- boat = trailer % 10;
- mfnd[5] = segment_pattern[boat & 0xf];
- trailer /= 10;
- }
- //////////////////////////////////////////////
- if(int_state == 509) {
- boat = trailer % 10;
- mfnd[4] = segment_pattern[boat & 0xf];
- trailer /= 10;
- }
- //////////////////////////////////////////////
- if(int_state == 510) {
- boat = trailer % 10;
- mfnd[3] = segment_pattern[boat & 0xf];
- trailer /= 10;
- }
- //////////////////////////////////////////////
- if(int_state == 511) {
- boat = trailer % 10;
- mfnd[2] = segment_pattern[boat & 0xf];
- trailer /= 10;
- }
- //////////////////////////////////////////////
- if(int_state == 512) {
- boat = trailer % 10;
- mfnd[1] = segment_pattern[boat & 0xf];
- trailer /= 10;
- }
- //////////////////////////////////////////////
- if(int_state == 513) {
- boat = trailer % 10;
- mfnd[0] = segment_pattern[boat & 0xf];
- trailer /= 10;
- }
- //////////////////////////////////////////////
- int_state++;
- //////////////////////////////////////////////
- if(int_state >= 514) {
- int_state = 0;
- if (hold) {
- fnd[0] = mfnd[0];
- fnd[1] = mfnd[1];
- fnd[2] = mfnd[2];
- fnd[3] = mfnd[3];
- fnd[4] = mfnd[4];
- fnd[5] = mfnd[5];
- fnd[6] = mfnd[6];
- fnd[7] = mfnd[7];
- if (P37_i_prescaler) {
- fnd[1] &= 0x7F; // MHz點
- } else {
- fnd[0] &= 0x7F; // GHz點
- }
- }
- }
- //////////////////////////////////////////////
- }
- void main()
- {
- TMOD = 0x15; // 0b00010101 Timer0 = Mode1, Counter, use TR0
- // Timer1 = Mode1, Timer, use TR1
- TL0 = 0X00; TH0 = 0X00;
- TL1 = 0X00; TH1 = 0X00;
- TR0 = 1; // Timer 0 計數開始
- TR1 = 1; // Timer 1 計數開始
- ET1 = 1; // 設置定時器1中斷狀態
- EA = 1; // 設置全局中斷狀態
- while(1) ;
- }
復制代碼
|