標(biāo)題:
單片機(jī)測(cè)頻率程序誤差較大,但是方波沒問題
[打印本頁(yè)]
作者:
123456ll33
時(shí)間:
2019-7-27 09:40
標(biāo)題:
單片機(jī)測(cè)頻率程序誤差較大,但是方波沒問題
麻煩大家看看 我寫的這個(gè)程序 測(cè)量方波頻率沒什么問題可是測(cè)量其他波形頻率的時(shí)候 誤差很大
順便想問問測(cè)量脈寬的思路是什么?
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit DU = P2^6;//數(shù)碼管段選
sbit WE = P2^7;//數(shù)碼管段選
sbit LED1 = P1^0;//LED1
//共陰數(shù)碼管段選表0-9
uchar code tabel[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,};
long uint mSec;//毫秒和秒儲(chǔ)存變量
long uint freq;
/*====================================
函數(shù) : delay(uint z)
參數(shù) :z 延時(shí)毫秒設(shè)定,取值范圍0-65535
返回值 :無(wú)
描述 :12T/Fosc11.0592M毫秒級(jí)延時(shí)
====================================*/
void delay(uint z)
{
uint x,y;
for(x = z; x > 0; x--)
for(y = 114; y > 0 ; y--);
}
/*====================================
函數(shù) :display(uchar i)
參數(shù) :i 顯示數(shù)值,取值范圍0-255
返回值 :無(wú)
描述 :三位共陰數(shù)碼管動(dòng)態(tài)顯示
====================================*/
void display(uchar i)
{
uchar A,B,C,D,E,F,G,H;
A = i % 100000000 / 1000000;
B = i % 10000000 / 1000000;
C = i % 1000000 / 100000;
D = i % 100000 / 10000;
E = i % 10000 / 1000;
F = i % 1000 / 100; //236 / 100 = 2
G = i % 100 / 10; //236 % 100 / 10 = 3
H = i % 10;//236 % 10 =6
//第一位數(shù)碼管
P0 = 0XFF;//清除斷碼
WE = 1;//打開位選鎖存器
P0 = 0XFE; //1111 1110
WE = 0;//鎖存位選數(shù)據(jù)
DU = 1;//打開段選鎖存器
P0 = tabel[A];//
DU = 0;//鎖存段選數(shù)據(jù)
delay(1);
//第二位數(shù)碼管
P0 = 0XFF;//清除斷碼
WE = 1;//打開位選鎖存器
P0 = 0XFD; //1111 1101
WE = 0;//鎖存位選數(shù)據(jù)
DU = 1;//打開段選鎖存器
P0 = tabel[B];//
DU = 0;//鎖存段選數(shù)據(jù)
delay(1);
//第三位數(shù)碼管
P0 = 0XFF;//清除斷碼
WE = 1;//打開位選鎖存器
P0 = 0XFB; //1111 1011
WE = 0;//鎖存位選數(shù)據(jù)
DU = 1;//打開段選鎖存器
P0 = tabel[C];//
DU = 0;//鎖存段選數(shù)據(jù)
delay(1);
//第四位數(shù)碼管
P0 = 0XFF;//清除斷碼
WE = 1;//打開位選鎖存器
P0 = 0XF7; //1111 1101
WE = 0;//鎖存位選數(shù)據(jù)
DU = 1;//打開段選鎖存器
P0 = tabel[D];//
DU = 0;//鎖存段選數(shù)據(jù)
delay(1);
//第五位數(shù)碼管
P0 = 0XFF;//清除斷碼
WE = 1;//打開位選鎖存器
P0 = 0XEF; //1111 1101
WE = 0;//鎖存位選數(shù)據(jù)
DU = 1;//打開段選鎖存器
P0 = tabel[E];//
DU = 0;//鎖存段選數(shù)據(jù)
delay(1);
//第六位數(shù)碼管
P0 = 0XFF;//清除斷碼
WE = 1;//打開位選鎖存器
P0 = 0XDF; //1111 1101
WE = 0;//鎖存位選數(shù)據(jù)
DU = 1;//打開段選鎖存器
P0 = tabel[F];//
DU = 0;//鎖存段選數(shù)據(jù)
delay(1);
//第七位數(shù)碼管
P0 = 0XFF;//清除斷碼
WE = 1;//打開位選鎖存器
P0 = 0XBF; //1111 1101
WE = 0;//鎖存位選數(shù)據(jù)
DU = 1;
P0 = tabel[G];
DU = 0;//鎖存段選數(shù)據(jù)
delay(1);
//第八位數(shù)碼管
P0 = 0XFF;//清除斷碼
WE = 1;//打開位選鎖存器
P0 = 0X7F; //1111 1101
WE = 0;//鎖存位選數(shù)據(jù)
DU = 1;
P0 = tabel[H];//打開段選鎖存器
DU = 0;//鎖存段選數(shù)據(jù)
delay(1);
}
void Timer_Config()
{
//--定時(shí)器T1做計(jì)數(shù)器,工作方式1(16位定時(shí)器),只由TRx打開計(jì)數(shù)器--//
//--定時(shí)器T0做定時(shí)器,工作方式1(16位定時(shí)器),只由TRx打開定時(shí)器--//
TMOD=0x51;
//--設(shè)置定時(shí)器晶振為12MHZ時(shí)定時(shí)50ms--//
TH0=0x4b;//高八位 定時(shí)器
TL0=0xfd;//低八位
// TH1=0XFF;//計(jì)數(shù)器
//TL1=0XFF;//計(jì)數(shù)器
//--打開中斷-//
ET0=1;
ET1=1;
EA=1;
//--打開定時(shí)器*/
TR0=1;
TR1=1;
}
void main()//main函數(shù)自身會(huì)循環(huán)
{
unsigned long z;//設(shè)置一個(gè)局部變量z
Timer_Config();//進(jìn)入中斷
while(1)
{
if(TR1 == 0) //當(dāng)計(jì)數(shù)器停下的時(shí)候,表明計(jì)數(shù)完畢 判斷是否到達(dá)一秒到達(dá)后讀取TL TH的值
{
freq = freq + TL1; //讀取TL的值
freq = freq + (TH1 * 256); //讀取TH的值 高八位
z=freq;
//--顯示完,重新計(jì)算下一次頻率。--//
freq = 0;//將計(jì)算的頻率清零
TH1 = 0; //將計(jì)數(shù)器的值清零
TL1 = 0;
TR0 = 1; //開啟定時(shí)器 TR運(yùn)行寄存器
TR1 = 1; //開啟計(jì)數(shù)器
}
display(z); //數(shù)碼管顯示函數(shù)
}
}
/*******************************************
*函數(shù)名 :Timer0
*功 能 :定時(shí)器0的中斷函數(shù)
*輸 入 :無(wú)
*輸 出 :無(wú)
*******************************************/
void Timer0() interrupt 1
{
//--12MHZ設(shè)置定時(shí)50ms的初值--//
TH0=0x4b;
TL0=0xfd;
LED1=~LED1;
mSec++;
if(mSec == 20) //定時(shí)1秒到 20個(gè)50ms等于1秒 1000ms=1s
{
TR0=0; //關(guān)閉定時(shí)器
TR1=0; //關(guān)閉計(jì)數(shù)器
mSec = 0; //秒數(shù)清零
}
}
/*******************************************
*函數(shù)名 :Timer1
*功 能 :定時(shí)器1的中斷函數(shù)
*輸 入 :無(wú)
*輸 出 :無(wú)
*******************************************/
void Timer1() interrupt 3
{
//--進(jìn)入一次中斷,表明計(jì)數(shù)到了65536--//
freq=freq+65536;
// TH1=0XFF;
// TL0=0XFF;
}
復(fù)制代碼
作者:
小黑屋525
時(shí)間:
2019-7-27 15:23
上升沿和下降沿觸發(fā)你弄明白了沒有?
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1