?? fm.c
字號:
#include "reg51.h"
#include "stdio.h"
#include " absacc.h "
#include <intrins.h>
#include <math.h>
/********************************************************************/
void delay_nms(unsigned int n);//delay function
sbit F_in=P3^6; //測量頻率管腳
sbit F_out=P3^7; //發生頻率管腳
bit int_flag;
unsigned int frequency;
void Display(void);
void Mcu_init(void);
void Measure_F(void);
void Measure_T(void);
void Frequency_Measure(void);
/***********************************************************************/
/********************/
sbit RCLK = P2^5;
sbit SCLK = P2^6;
sbit SDAT = P2^7;
sbit A_SEL = P2^2;
sbit B_SEL = P2^3;
sbit C_SEL = P2^4;
#define SM0 A_SEL = 0; B_SEL = 0; C_SEL = 0
#define SM1 A_SEL = 1; B_SEL = 0; C_SEL = 0
#define SM2 A_SEL = 0; B_SEL = 1; C_SEL = 0
#define SM3 A_SEL = 1; B_SEL = 1; C_SEL = 0
#define SM4 A_SEL = 0; B_SEL = 0; C_SEL = 1
#define SM5 A_SEL = 1; B_SEL = 0; C_SEL = 1
#define SM6 A_SEL = 0; B_SEL = 1; C_SEL = 1
#define SM7 A_SEL = 1; B_SEL = 1; C_SEL = 1
unsigned char leddata[]={
0x3F, //"0"
0x06, //"1"
0x5B, //"2"
0x4F, //"3"
0x66, //"4"
0x6D, //"5"
0x7D, //"6"
0x07, //"7"
0x7F, //"8"
0x6F, //"9"
0x77, //"A"
0x7C, //"B"
0x39, //"C"
0x5E, //"D"
0x79, //"E"
0x71, //"F"
0x76, //"H"
0x38, //"L"
0x37, //"n"
0x3E, //"u"
0x73, //"P"
0x5C, //"o"
0x40, //"-"
0x00, //熄滅
0x00 //自定義
};
void send(unsigned char data_out)
{
unsigned char i;
RCLK = 0;
for(i=0;i<8;i++)
{
if( data_out & 0x80)
SDAT = 1;
else
SDAT = 0;
SCLK = 0;
SCLK = 1;
data_out = data_out<<1;
}
RCLK = 1;
}
#define delay 450
/***********************************************************************/
void dis_delay(void);
void display(unsigned int temp);
/***********************************************************************/
void display(unsigned int temp)
{
unsigned int i;
//send(0x00);
SM6;
send(0x40);
for(i = 0; i < delay; i++);
send(0x00);
SM7;
if(frequency<2000)
send(0x39);
else
send(0x71);
for(i = 0; i < delay; i++);
send(0x00);
SM0;
send(leddata[temp/1000%10]);
for(i = 0; i < delay; i++);
send(0x00);
SM1;
send(leddata[temp/100%10]);
for(i = 0; i < delay; i++);
send(0x00);
SM2;
send(leddata[temp/10%10]);
for(i = 0; i < delay; i++);
send(0x00);
SM3;
send(leddata[temp%10]);
for(i = 0; i < delay; i++);
send(0x00);
}
void main()
{
Mcu_init(); //初始化
while(1)
{
unsigned int i;
Frequency_Measure();
for(i=100;i>0;i--)
display(frequency);
}
}
void time0(void) interrupt 1
{
int_flag=1; //計數溢出標志
}
void time1(void) interrupt 3
{
TH1=0xfe; //重新附值
TL1=0x33;
F_out=!F_out; //取反 產生頻率
}
void Frequency_Measure(void)
{
if(frequency<2000) //小于 2k 測周
Measure_T();
else if(frequency>=2000) //大于2k 測頻
Measure_F();
}
//測頻原理:
//開一個標準的50ms計數閘門,對被測信號計數
void Measure_F(void) //測頻子函數
{
bit state_old=0,state_new=0; //定義狀態
unsigned int f_count=0; //計數臨時值
int_flag=0;
TH0=0x4c; //定時器初值 50ms
TL0=0x00;
TR0=1; //啟動計數器
while(1) //死循環 測頻
{
state_new=F_in; //取得現在的 頻率發生引腳狀態
if(state_old!=state_new) //與前一個時刻 舊值 比較,如果不同
f_count++; //則 計數加1
state_old=state_new; //將新值 付給 舊值
if(int_flag) //如果到了定時時間
{
TR0=0; //關閉定時器0
frequency=f_count*10; //計算頻率
//定時 50ms計數 每個周期 計2次 所以 1s內計數= f_count*10
return; //返回 跳出循環
}
}
}
//原理:以被測信號的一個周期為閘門
//對單片機及其周期進行計數 讀取定時器的值為計數值
void Measure_T(void) //測周子函數
{
bit state_old=0,state_new=0; //定義狀態
unsigned char temp_flag=0;
unsigned int t_count; //計數臨時值
TH0=0;
TL0=0;
while(1) //死循環 測周
{
state_new=F_in; //取得現在的 頻率發生引腳狀態
if(state_old&&!state_new) // 下降沿開始啟動閘門
{
temp_flag++;
TR0=1; //啟動定時器 計數
}
if(temp_flag==2)
{
TR0=0; //計數停止
t_count=TH0*256+TL0; //取得當前的計數值
frequency=1000000/t_count; //計算頻率
return; //返回
}
state_old=state_new;
}
}
void Mcu_init(void) //初始化函數
{
EA=1; //開總中斷
ET0=1; //定時器0 開
TR0=1; //啟動定時器 0
ET1=1; //定時器 1 開
TR1=1; //啟動定時器1
TMOD=0x11; //工作狀態
TH0=0x4c; //定時器初值
TL0=0x00;
TH1=0xfe;
TL1=0x33;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -