STC15單片機制作的秒脈沖計數(shù)頻率檢測程序,JLX12864和串口雙顯示,做了一天寫的東西,僅供參考。不懂可留言
單片機源程序如下:
- #include "config.h"
- #include "12864.h"
- #include <stdio.h> // 為使用KEIL自帶的庫函數(shù)printf而加入
- /***********************************************************************************IO初始化*/
- void port_mode() // 端口初始化 //P2推挽
- {
- P0M1=0x00; P0M0=0x00;P1M1=0x00; P1M0=0x00;P2M1=0x00; P2M0=0xFF;P3M1=0x00; P3M0=0x00;
- P4M1=0x00; P4M0=0x00;P5M1=0x00; P5M0=0x00;P6M1=0x00; P6M0=0x00;P7M1=0x00; P7M0=0x00;
- }
-
- bit flag; // 需要通過串口向電腦發(fā)送數(shù)據(jù)的標志
- sbit LED_1s=P0^0; // 調試指示燈
- sbit LED_T0_Over=P0^1; // 調試指示燈
- sbit LED_T1_Over=P0^2; // 調試指示燈
- unsigned char Read_TH0,Read_TL0; // 讀取的定時器T0的高低位計數(shù)值
- unsigned char Read_TH1,Read_TL1; // 讀取的定時器T1的高低位計數(shù)值
- unsigned char HT0,HT1; // 超過16位的計數(shù)值,最大256*65536=16.777 216 MHz
- unsigned char Read_HT0,Read_HT1; // 讀取的超過16位的計數(shù)值,
- unsigned char Count=200; // 中斷計數(shù)變量(1S計時用),200*5mS = 1S
- void Uart_Init(void) // 9600bps@22.1184MHz
- {
- SCON = 0x50; // 8位數(shù)據(jù),可變波特率
- AUXR |= 0x04; // 定時器2時鐘為Fosc,即1T
- T2L = 0xC0; // 設定定時初值
- T2H = 0xFD; // 設定定時初值
- AUXR |= 0x01; // 串口1選擇定時器2為波特率發(fā)生器
- AUXR |= 0x10; // 啟動定時器2
- TI=1;
- }
- void JiShuQ_Init() // 計數(shù)器初始化,T0和T1共2路計數(shù)脈沖輸入
- {
- TMOD=0x55; // 設置T1、T0工作于計數(shù)方式,16位計數(shù)
- HT0=0;TH0=0;TL0=0;HT1=0;TH1=0;TL1=0; // 清空計數(shù)器
- TR0=1;TR1=1; //開啟計數(shù)器0 /計數(shù)器1
- ET0=1;ET1=1; // 開啟計數(shù)器0與1的中斷
- }
- void DingSQ_Iint_5mS() // PCA定時器初始化為5mS中斷
- {
- CMOD=0x80; // #10000000B 空閑模式下停止PCA計數(shù)器工作
- // 選擇PCA時鐘源為fOSC/12,禁止PCA計數(shù)器溢出時中斷
- CCON=0; // 清0 PCA計數(shù)器溢出中斷請求標志位CF
- // CR = 0, 不允許 PCA 計數(shù)器計數(shù);清0 PCA 各模塊中斷請求標志位CCFn
- CL=0; // 清0 PCA 計數(shù)器
- CH=0;
- CCAP0L=0; // 給PCA模塊0的CCAP0L置初值
- CCAP0H=0x24; // 給PCA模塊0的CCAP0H 置初值
- CCAPM0=0x49; // 設置PCA模塊0為16位軟件定時器
- // ECCF0=1允許PCA模塊0中斷
- // 當[CH,CL]=[CCAP0H,CCAP0L]時,CCF0=1,產生中斷請求
- EA=1; // 開整個單片機所有中斷共享的總中斷控制位
- CR=1; // 啟動PCA計數(shù)器(CH,CL)計數(shù)
- }
- void PCA(void) interrupt 7 // PCA中斷服務程序,每5ms中斷一次
- {
- union
- { // 定義一個聯(lián)合,以進行16位加法
- unsigned int num;
- struct
- { // 在聯(lián)合中定義一個結構
- unsigned char Hi,Lo;
- }Result;
- }temp;
-
- temp.num=(unsigned int)(CCAP0H<<8)+CCAP0L+0x2400; //0X1200=0.500112S, 0X11FF=0.500003S,
- CCAP0L=temp.Result.Lo; // 取計算結果的低8位
- CCAP0H=temp.Result.Hi; // 取計算結果的高8位
- CCF0=0; // 清 PCA 模塊0 中斷標志
- Count--; // 修改中斷計數(shù)
- P15=!P15;
- P16=!P16;
- if(Count==0)
- {
- Count=200; // 恢復中斷計數(shù)初值 200*5mS = 1S
- LED_1s =!LED_1s; // 在P0.0輸出脈沖寬度為1秒鐘的方波(周期2S)
- TR0=0;TR1=0; // 關閉計數(shù)器0與1 ,防止讀數(shù)錯誤
- CR=0; // 關閉16位PCA計數(shù)器(CH,CL)
-
- Read_HT0=HT0;Read_TH0=TH0;Read_TL0=TL0; // 讀取計數(shù)值
- Read_HT1=HT1;Read_TH1=TH1;Read_TL1=TL1; // 讀取計數(shù)值
- HT0=0;TH0=0;TL0=0; // 清空計數(shù)器
- HT1=0;TH1=0;TL1=0;
- TR0=1;TR1=1; // 開啟計數(shù)器0與1 ,防止讀數(shù)錯誤
- CR=1; // 開啟16位PCA計數(shù)器(CH,CL)
- flag=1; // 需要主程序處理數(shù)據(jù)
- }
- }
- void Timer0(void) interrupt 1 // 定時器T0 中斷函數(shù)
- {
- HT0++; // 超過16位計數(shù)值變量一次變量加1
- LED_T0_Over=!LED_T0_Over;
- }
- void Timer1(void) interrupt 3 // 定時器T1 中斷函數(shù)
- {
- HT1++; // 超過16位計數(shù)值變量一次變量加1
- LED_T1_Over=!LED_T1_Over;
- }
- void SendBuf()
- {
- unsigned long tmp,tmp1,tmp2;
- tmp= (Read_HT0*65536+Read_TH0*256+Read_TL0)*1.002;
- printf("F1: %ldHz ",tmp);
-
- tmp1=tmp/1000,tmp2=tmp%1000;
- display_Write_number_5_0(3,1,tmp1);display_Write_number_3_0(3,1,tmp2);
-
- tmp= Read_HT1*65536+Read_TH1*256+Read_TL1;
- printf("F2: %ldHz\n",tmp);
-
- tmp1=tmp/1000,tmp2=tmp%1000;
- display_Write_number_5_0(5,1,tmp2);display_Write_number_3_0(5,1,tmp2);
- }
- #if 0
- void SendBuf()
- {
- u8 tmp;
- tmp= Read_HT0*65536+Read_TH0*256+Read_TL0;
- printf("F1: %ldHz ",tmp);
-
- // if(tmp<10000)
- // {display_Write_number_5_0(3,0,tmp);display_english_str_6x8(4,49," Hz"); } //顯示正負的7位的整數(shù);
- // else {display_Write_number_5_0(3,0,tmp/1000);display_english_str_6x8(4,49,"kHz");} //顯示正負的7位的整數(shù);
- tmp= Read_HT1*65536+Read_TH1*256+Read_TL1;
- printf("F2: %ldHz\n",tmp);
- // if(tmp<10000)
- // {display_Write_number_5_0(5,0,tmp); display_english_str_6x8(6,49," Hz");}//顯示正負的7位的整數(shù);
- // else {display_Write_number_5_0(5,0,tmp/1000);display_english_str_6x8(6,49,"kHz");} //顯示正負的7位的整數(shù);
- }
- #endif
- #if 1
- void CLOCK_Init()
- {
- //***************** 設置主時鐘輸出,不分頻 *****************
- CLK_DIV = 0xc0; // 主時鐘輸出頻率= Fosc /4,R/C時鐘頻率要求不大于12MHz。
- }
- #endif
- /*************************主函數(shù)***********************/
- void main(void)
- {
- port_mode();
- CLOCK_Init(); // 時鐘4分頻 P54輸出
- lcd_start();
-
- Uart_Init(); // 串口初始化
- JiShuQ_Init(); // 計數(shù)器初始化
- DingSQ_Iint_5mS(); // PCA定時器5mS初始化
- printf("初始化完成");
- /***********************頻率*********************************/
- display_diy_80x16(1,1,pinlv);
- display_english_str_6x8(4,61,"Hz"); display_english_str_6x8(6,61,"Hz");
-
- while(1)
- {
- if (flag==1) // 需要通過串口向電腦發(fā)送數(shù)據(jù)的標志
- {
- SendBuf();
- flag=0;
- }
- }
-
- }
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
stc15頻率檢測.zip
(91.37 KB, 下載次數(shù): 193)
2017-8-1 18:47 上傳
點擊文件名下載附件
|