?? wfrequence.c
字號(hào):
//參考程序A:WFREQUENCE.C 程序運(yùn)行前將S3的第2和第4撥碼開關(guān)撥到ON,用跳線將T0和P0.0短接,撥碼開關(guān)S1打開任一方波信號(hào)通道(2000KHZ,1000KHZ,500KHZ,250KHZ);T0作為外部計(jì)數(shù)器,T1作為定時(shí)器,T1定時(shí)在1ms范圍內(nèi)察看計(jì)數(shù)器T0所計(jì)的數(shù)。計(jì)算出被測(cè)信號(hào)的頻率并顯示在LCD上.
#include <c8051f020.h> // SFR declarations
#include <intrins.h>
unsigned long x;
unsigned char *lcdpoint; /*指向 lcddata數(shù)組的指針*/
unsigned char lcd_data_count; /*要顯示的數(shù)據(jù)個(gè)數(shù) */
unsigned char temp,data1;
unsigned char HMS[9]={"FREQUECE:"},YMD[10]={0x0,0x00,0X0,0X0,"Khz"};
#define SYSCLK 11059200 /*外部晶振頻率*/
sbit P31 = P3^1;
void SYSCLK_Init (void); //系統(tǒng)時(shí)鐘初始化
void PORT_Init (void); //端口初始化
void Time01_Init(void); //定時(shí)器0/1初始化
void LCD_Init(void);
unsigned int Frequence; //外部脈沖數(shù)變量
unsigned int FF1,FF2,FF3,FF4,FF;
/*延時(shí)子程序*/
void sleep_ms(unsigned int count)
{
unsigned char ii,jj;
for(ii=0;ii<count;ii++)
{
for(jj=0;jj<250;jj++)
_nop_();
}
}
void main (void) {
WDTCN = 0xde; /*無效看門狗*/
WDTCN = 0xad;
LCD_Init();
SYSCLK_Init (); /*初始化時(shí)鐘*/
PORT_Init (); /*初始化交叉開關(guān)和IO口*/
Time01_Init(); /*初始化定時(shí)器0/1*/
while (1) {
P31=0;
sleep_ms(250);
EA=1; // 開總中斷
TR1=1; // 開定時(shí)器1
TR0=1; // 開定時(shí)器0
P6 = 0x0d;
for(x=0;x<1000;x++); //延時(shí)
lcdpoint=&HMS;
for(lcd_data_count=9;lcd_data_count>0;lcd_data_count--)//顯示"FREQUENCE:"
{
data1=*lcdpoint;
P7 = data1; /*送字符數(shù)據(jù)*/
P6 = 0x0c;
P6 = 0x0d;
lcdpoint++;
for(x=0;x<100;x++);
} //準(zhǔn)備送數(shù)據(jù)
//for(x=0;x<5000;x++);
lcdpoint=&YMD;
for(lcd_data_count=7;lcd_data_count>0;lcd_data_count--) //顯示"XXXXKhz"
{
data1=*lcdpoint;
if(data1<0x40)
data1 += 0x30; /*轉(zhuǎn)化成字符碼*/
P7 = data1; /*送字符數(shù)據(jù)*/
P6 = 0x0c;
P6 = 0x0d;
lcdpoint++;
for(x=0;x<100;x++);
}
}
}
void SYSCLK_Init (void)
{
int i; /*延時(shí)計(jì)數(shù)器*/
OSCXCN = 0x67; /*啟動(dòng)外部11.0592MHz晶振*/
for (i=0; i < 255; i++) ; /*等待外部晶體起振*/
while ((OSCXCN & 0x80)==0x00) ; /*查詢標(biāo)志位*/
OSCICN = 0x08; /*選擇外部晶體作為系統(tǒng)時(shí)鐘并使能時(shí)鐘丟失檢測(cè)*/
}
void PORT_Init (void)
{
XBR0 = 0x00;
XBR1 = 0x02; /*交叉開關(guān)使能T0*/
XBR2 = 0x40; /*使能交叉開關(guān)和弱上拉*/
P74OUT = 0xf0; /*P6,P7為推挽輸出*/
}
void Time01_Init(void)
{
EA=0; //關(guān)總中斷
TR0=0; //關(guān)定時(shí)器0
TR1=0; //關(guān)定時(shí)器1
IE=0x0A; /*允許TF1/TF0標(biāo)志位(TCON.7/TCON.5)的中斷請(qǐng)求*/
/*定時(shí)器1/0發(fā)生溢出*/
TMOD=0x15; /*定時(shí)器1是16位定時(shí)器方式,定時(shí)器0是16為計(jì)數(shù)器(T0腳)方式*/
IP=0x08; /*定時(shí)器1是高優(yōu)先級(jí)中斷*/
CKCON=0x10; /*定時(shí)器1的時(shí)基是系統(tǒng)時(shí)鐘*/
TH1=(-SYSCLK/1000)>>8; /*定時(shí)1ms,定時(shí)器1使用系統(tǒng)時(shí)鐘*/
TL1=-SYSCLK/1000;
}
void TIMER1_ISR (void) interrupt 3 using 1
{ P31=1; /*關(guān)閉被測(cè)信號(hào)源*/
TF1=0; /*清中斷標(biāo)志*/
TR1=0; /*關(guān)定時(shí)器1*/
Frequence=TH0*0x100+TL0;/*外部脈沖數(shù) 單位 KHz*/
TR0=0;
FF4=Frequence/1000; /*將頻率數(shù)據(jù)轉(zhuǎn)化單字節(jié)并存入數(shù)組中*/
YMD[0]=FF4;
FF=(Frequence-FF4*1000);
FF3=FF/100;
YMD[1]=FF3;
FF=(FF-FF3*100);
FF2=FF/10;
YMD[2]=FF2;
FF=(FF-FF2*10);
FF1=FF;
YMD[3]=FF1;
TH0=0; /*清定時(shí)器0到零*/
TL0=0;
TH1=(-SYSCLK/1000)>>8; TL1=-SYSCLK/1000;
TR1=1; /*開定時(shí)器1*/
TR0=1; /*開定時(shí)器0*/
P31=0; /*打開被測(cè)信號(hào)源*/
}
void LCD_Init(void)
{
P6 = 0x09;
for(x=0;x<50000;x++);
P7 = 0x30; /*一行顯示*/
// P7 = 0x38; /*兩行顯示*/
P6 = 0x08;
P6 = 0x09;
for(x=0;x<1000;x++);
P7 = 0x0e; /*顯示開,光標(biāo)顯示,光標(biāo)不閃爍*/
P6 = 0x08;
P6 = 0x09;
for(x=0;x<1000;x++);
P7= 0x06; /*顯示增加,不平移*/
P6 = 0x08;
P6 = 0x09;
for(x=0;x<5000;x++);
P7 = 0x01; /*清屏*/
P6 = 0x08;
P6 = 0x09;
for(x=0;x<5000;x++);
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -