欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
51單片機頻率計(數碼管顯示)
[打印本頁]
作者:
musi798
時間:
2018-11-19 22:12
標題:
51單片機頻率計(數碼管顯示)
誤差不大
單片機源程序如下:
#include "reg51.h"
#include "intrins.h"
#define CKSEL (*(unsigned char volatile xdata *)0xfe00)
#define CKDIV (*(unsigned char volatile xdata *)0xfe01)
#define IRC24MCR (*(unsigned char volatile xdata *)0xfe02)
#define XOSCCR (*(unsigned char volatile xdata *)0xfe03)
#define IRC32KCR (*(unsigned char volatile xdata *)0xfe04)
#define M 2000
sfr ADC_CONTR = 0xbc;
sfr ADC_RES = 0xbd;
sfr ADC_RESL = 0xbe;
sfr ADCCFG = 0xde;
sfr P_SW2 = 0xba;
sbit EADC = IE^5;
sfr AUXR = 0x8e;
sfr CMPCR1 = 0xe6;
sfr CMPCR2 = 0xe7;
sfr IE2 = 0xaf;
sfr AUXINTIF = 0xef;
sfr T4T3M = 0xd1;
sfr TL3 = 0xd5;
sfr TH3 = 0xd4;
sfr IPH = 0xb7;
sfr P1M0 = 0x92;
sfr P1M1 = 0x91;
sbit FreIn = P0^4;
sbit P26 = P2^6;
sbit P27 = P2^7;
sbit CLK = P2^3;
sbit DAT = P2^1;
void display164(unsigned char udata)
{
char i;
for(i=0;i<8;i++)
{
if(udata&0x80)
{
DAT=1;
CLK=0;
udata = udata<<1;
CLK=1;
}
else
{
DAT=0;
CLK=0;
udata = udata<<1;
CLK=1;
}
}
}
void DiviVol()
{
P26 = 1;
P27= 0;
}
void NotDiviVol()
{
P27 = 1;
P26 = 0;
}
void delay(int ms)
{
int a,b;
for(a=ms;a>0;a--)
for(b=120;b>0;b--);
}
unsigned int time = 0;
unsigned int count = 0;
unsigned long frequency = 0,temp=0,tempone = 0;
unsigned char code Table[]={0xee,0x28,0xcd,0x6d,0x2b,0x67,0xe7,0x2c,0xef,0x6f};
unsigned char code PotTable[]={0xfe,0x38,0xdd,0x7d,0x3b,0x77,0xf7,0x3c,0xff,0x7f};
unsigned int H=0,L=0;
unsigned char tempp[7]={0};
unsigned int Vol = 0,RawVol = 0;
bit flag = 0;
unsigned int qf = 0;
void SetOutXtal()
{
P_SW2 = 0x80;
XOSCCR = 0xc0; //啟動外部晶振
while (!(XOSCCR & 1)); //等待時鐘穩定
CKDIV = 0x00; //時鐘不分頻
CKSEL = 0x01; //選擇外部晶振
P_SW2 = 0x00;
}
void CMP_Ini()
{
CMPCR1 = 0x86;
CMPCR2 = 0x42;
// CMPCR2 = 0x43;
P_SW2 = 0x00;
}
void T1_Ini()
{
TMOD = 0x00;
TH1 = 0x3c;
TL1 = 0xb0;
AUXR = 0x00;
ET1 = 1;
}
void T3_Ini()
{
T4T3M = 0x04;
TH3 = 0x00;
TL3 = 0x00;
IE2=0x20; //允許T3中斷
}
void INT1_Ini()
{
IT1 = 1;
EX1 = 1;
IP = 0x04;
IPH = 0x04;
}
void SysClkTest()
{
display164(Table[0]); //七個數碼管都顯示0,則系統時鐘選擇正常
display164(Table[0]);
display164(Table[0]);
display164(Table[0]);
display164(Table[0]);
display164(Table[0]);
display164(Table[0]);
display164(Table[0]);
}
void ADC_Ini()
{
DiviVol(); //初始選擇分壓
P1M0 = 0x00; //設置P1.0為ADC口
P1M1 = 0x03; //P1.0和P1.1都設置為高阻輸入模式
ADCCFG = 0x00; //設置ADC時鐘為系統時鐘/2/16/16
ADC_CONTR = 0x80; //使能ADC模塊
}
void main()
{
int timev[M]={0};
int i,imax,imaxp;
imaxp=0;
SetOutXtal();
SysClkTest();
INT1_Ini();
CMP_Ini();
T1_Ini();
T3_Ini();
ADC_Ini();
EA = 1;
while(1)
{
if(flag==0)
{
for(i=0;i<M;i++)
{
ADC_CONTR |= 0x40; //啟動AD轉換
_nop_();
_nop_();
delay(1);
while (!(ADC_CONTR & 0x20)); //查詢ADC完成標志
ADC_CONTR &= ~0x20; //清完成標志
H=ADC_RES;
L=ADC_RESL;
RawVol=H*16+L/16;
ADC_CONTR &= 0xa0;
// Vol = RawVol*11;
timev[i]=RawVol*11;
delay(5);
}
imax=timev[0];
for(i=1;i<M;i++)
{
if(timev[i]>imax)
{
imax=timev[i];
//imaxp=i;
}
}
Vol=2*imax;
// if(RawVol<33)
// {
// NotDiviVol();
// delay(5);
// ADC_CONTR = 0x81; //使能ADC模塊
// delay(5);
// ADC_CONTR |= 0x40; //啟動AD轉換
// _nop_();
// _nop_();
// while (!(ADC_CONTR & 0x20)); //查詢ADC完成標志
// ADC_CONTR &= ~0x20; //清完成標志
// H=ADC_RES;
// L=ADC_RESL;
//
// RawVol=H*16+L/16;
//
// Vol = RawVol/11;
//
// }
display164(Table[Vol/10%10]);
display164(Table[Vol/100%10]);
display164(PotTable[Vol/1000%10]);
display164(Table[Vol/10000]);
display164(0x00);
display164(0x00);
display164(0x00);
display164(0x3e);
DiviVol();
delay(5);
//imax=0;
// ADC_CONTR = 0x80; //使能ADC模塊
// ADC_CONTR |= 0x40; //啟動AD轉換
time = 0;
delay(6000);
}
if(flag==1)
{
if(time==0)
{
// while(FreIn==1);
// while(FreIn==0);
TR1=1;//打開T1、T3,開始測頻
T4T3M |= 0x08;
}
}
if(time==20)
{
TR1 = 0;
T4T3M &= 0xf7;
temp = TH3*256+TL3+count*65536;
tempone = temp+1;
frequency = temp+(int)(tempone*0.0001);
tempp[0] = frequency%10;
tempp[1] = (frequency/10)%10;
tempp[2] = (frequency/100)%10;
tempp[3] = (frequency/1000)%10;
tempp[4] = (frequency/10000)%10;
tempp[5] = (frequency/100000)%10;
tempp[6] = (frequency/1000000)%10;
if((frequency/1000000)%10==0)
{
tempp[6] = 10;
if((frequency/100000)%10==0)
{
tempp[5] = 10;
if((frequency/10000)%10==0)
{
tempp[4] = 10;
if((frequency/1000)%10==0)
{
tempp[3] = 10;
if((frequency/100)%10==0)
{
tempp[2] = 10;
if((frequency/10)%10==0)
{
tempp[1] = 10;
if(frequency%10==0)
{
tempp[0] = 10;
}
}
}
}
}
}
}
display164(Table[tempp[0]]); //頻率送顯
display164(Table[tempp[1]]);
display164(Table[tempp[2]]);
display164(Table[tempp[3]]);
display164(Table[tempp[4]]);
display164(Table[tempp[5]]);
display164(Table[tempp[6]]);
display164(0x71);
time = 0;
count = 0;
TH3 = 0;
TL3 = 0;
TH1 = 0x3c;
TL1 = 0xb0;
}
}
}
void INT1_Ser() interrupt 2
{
flag=!flag;
}
void T1_Isr() interrupt 3
{
time++;
}
void T3_Isr() interrupt 19
{
count++;
AUXINTIF &= 0xfd; //清中斷標志
}
/*
#include "reg51.h"
#include "intrins.h"
#define CKSEL (*(unsigned char volatile xdata *)0xfe00)
#define CKDIV (*(unsigned char volatile xdata *)0xfe01)
#define IRC24MCR (*(unsigned char volatile xdata *)0xfe02)
#define XOSCCR (*(unsigned char volatile xdata *)0xfe03)
#define IRC32KCR (*(unsigned char volatile xdata *)0xfe04)
sfr ADC_CONTR = 0xbc;
sfr ADC_RES = 0xbd;
sfr ADC_RESL = 0xbe;
sfr ADCCFG = 0xde;
sfr P_SW2 = 0xba;
sbit EADC = IE^5;
sfr AUXR = 0x8e;
sfr CMPCR1 = 0xe6;
sfr CMPCR2 = 0xe7;
sfr IE2 = 0xaf;
sfr AUXINTIF = 0xef;
sfr T4T3M = 0xd1;
sfr TL3 = 0xd5;
sfr TH3 = 0xd4;
sfr IPH = 0xb7;
sfr P1M0 = 0x92;
sfr P1M1 = 0x91;
sbit FreIn = P0^4;
sbit P26 = P2^6;
sbit P27 = P2^7;
sbit CLK = P2^3;
sbit DAT = P2^1;
void display164(unsigned char udata)
{
char i;
for(i=0;i<8;i++)
{
if(udata&0x80)
{
DAT=1;
CLK=0;
udata = udata<<1;
CLK=1;
}
else
{
DAT=0;
CLK=0;
udata = udata<<1;
CLK=1;
}
}
}
void DiviVol()
{
P26 = 1;
P27= 0;
}
void NotDiviVol()
{
P27 = 1;
P26 = 0;
}
void delay(int ms)
{
int a,b;
for(a=ms;a>0;a--)
for(b=120;b>0;b--);
}
unsigned int time = 0;
unsigned int count = 0;
unsigned long frequency = 0,temp=0,tempone = 0;
unsigned char code Table[]={0xee,0x28,0xcd,0x6d,0x2b,0x67,0xe7,0x2c,0xef,0x6f};
unsigned char code PotTable[]={0xfe,0x38,0xdd,0x7d,0x3b,0x77,0xf7,0x3c,0xff,0x7f};
//unsigned char code Table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
//unsigned char code PotTable[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
unsigned int H=0,L=0;
unsigned char tempp[7]={0};
unsigned int Vol = 0,RawVol = 0;
bit flag = 0;
unsigned int qf = 0;
void SetOutXtal()
{
P_SW2 = 0x80;
XOSCCR = 0xc0; //啟動外部晶振
while (!(XOSCCR & 1)); //等待時鐘穩定
CKDIV = 0x00; //時鐘不分頻
CKSEL = 0x01; //選擇外部晶振
P_SW2 = 0x00;
}
void CMP_Ini()
{
CMPCR1 = 0x86;
CMPCR2 = 0x42;
// CMPCR2 = 0x43;
P_SW2 = 0x00;
}
void T1_Ini()
{
TMOD = 0x00;
TH1 = 0x3c;
TL1 = 0xb0;
AUXR = 0x00;
ET1 = 1;
}
void T3_Ini()
{
T4T3M = 0x04;
TH3 = 0x00;
TL3 = 0x00;
IE2=0x20; //允許T3中斷
}
void INT1_Ini()
{
IT1 = 1;
EX1 = 1;
IP = 0x04;
IPH = 0x04;
}
void SysClkTest()
{
display164(Table[0]); //七個數碼管都顯示0,則系統時鐘選擇正常
display164(Table[0]);
display164(Table[0]);
display164(Table[0]);
display164(Table[0]);
display164(Table[0]);
display164(Table[0]);
display164(Table[0]);
}
void ADC_Ini()
{
DiviVol(); //初始選擇分壓
P1M0 = 0x00; //設置P1.0為ADC口
P1M1 = 0x03; //P1.0和P1.1都設置為高阻輸入模式
ADCCFG = 0x00; //設置ADC時鐘為系統時鐘/2/16/16
ADC_CONTR = 0x80; //使能ADC模塊
}
void main()
{
SetOutXtal();
SysClkTest();
INT1_Ini();
CMP_Ini();
T1_Ini();
T3_Ini();
ADC_Ini();
EA = 1;
while(1)
{
if(flag==0)
{
ADC_CONTR |= 0x40; //啟動AD轉換
_nop_();
_nop_();
delay(1);
while (!(ADC_CONTR & 0x20)); //查詢ADC完成標志
ADC_CONTR &= ~0x20; //清完成標志
H=ADC_RES;
L=ADC_RESL;
RawVol=H*16+L/16;
ADC_CONTR &= 0xa0;
Vol = RawVol*11;
// if(RawVol<33)
// {
// NotDiviVol();
// delay(5);
// ADC_CONTR = 0x81; //使能ADC模塊
// delay(5);
// ADC_CONTR |= 0x40; //啟動AD轉換
// _nop_();
// _nop_();
// while (!(ADC_CONTR & 0x20)); //查詢ADC完成標志
// ADC_CONTR &= ~0x20; //清完成標志
// H=ADC_RES;
// L=ADC_RESL;
//
// RawVol=H*16+L/16;
//
// Vol = RawVol/11;
//
// }
display164(Table[Vol/10%10]);
display164(Table[Vol/100%10]);
display164(PotTable[Vol/1000%10]);
display164(Table[Vol/10000]);
display164(0x00);
display164(0x00);
display164(0x00);
display164(0x3e);
DiviVol();
delay(5);
ADC_CONTR = 0x80; //使能ADC模塊
ADC_CONTR |= 0x40; //啟動AD轉換
time = 0;
delay(3000);
}
if(flag==1)
{
if(time==0)
{
// while(FreIn==1);
// while(FreIn==0);
TR1=1;//打開T1、T3,開始測頻
T4T3M |= 0x08;
}
}
if(time==20)
{
TR1 = 0;
T4T3M &= 0xf7;
temp = TH3*256+TL3+count*65536;
tempone = temp+1;
frequency = temp+(int)(tempone*0.0001);
tempp[0] = frequency%10;
tempp[1] = (frequency/10)%10;
tempp[2] = (frequency/100)%10;
tempp[3] = (frequency/1000)%10;
tempp[4] = (frequency/10000)%10;
tempp[5] = (frequency/100000)%10;
tempp[6] = (frequency/1000000)%10;
if((frequency/1000000)%10==0)
{
tempp[6] = 10;
if((frequency/100000)%10==0)
{
tempp[5] = 10;
if((frequency/10000)%10==0)
{
tempp[4] = 10;
if((frequency/1000)%10==0)
{
tempp[3] = 10;
if((frequency/100)%10==0)
{
tempp[2] = 10;
if((frequency/10)%10==0)
{
tempp[1] = 10;
if(frequency%10==0)
{
tempp[0] = 10;
}
}
}
}
}
}
}
display164(Table[tempp[0]]); //頻率送顯
display164(Table[tempp[1]]);
display164(Table[tempp[2]]);
display164(Table[tempp[3]]);
display164(Table[tempp[4]]);
display164(Table[tempp[5]]);
display164(Table[tempp[6]]);
display164(0x71);
time = 0;
count = 0;
TH3 = 0;
TL3 = 0;
TH1 = 0x3c;
TL1 = 0xb0;
}
}
}
void INT1_Ser() interrupt 2
{
flag=!flag;
}
void T1_Isr() interrupt 3
{
time++;
}
void T3_Isr() interrupt 19
{
count++;
AUXINTIF &= 0xfd; //清中斷標志
}
*/
復制代碼
所有資料51hei提供下載:
測頻率.rar
(37.85 KB, 下載次數: 25)
2018-11-19 22:11 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
admin
時間:
2018-11-20 04:15
補全原理圖或者詳細說明一下電路連接即可獲得100+黑幣
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1