📄 wfrequence.c
字号:
//参考程序A:WFREQUENCE.C 程序运行前将S3的第2和第4拨码开关拨到ON,用跳线将T0和P0.0短接,拨码开关S1打开任一方波信号通道(2000KHZ,1000KHZ,500KHZ,250KHZ);T0作为外部计数器,T1作为定时器,T1定时在1ms范围内察看计数器T0所计的数。计算出被测信号的频率并显示在LCD上.
#include <c8051f020.h> // SFR declarations
#include <intrins.h>
unsigned long x;
unsigned char *lcdpoint; /*指向 lcddata数组的指针*/
unsigned char lcd_data_count; /*要显示的数据个数 */
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); //系统时钟初始化
void PORT_Init (void); //端口初始化
void Time01_Init(void); //定时器0/1初始化
void LCD_Init(void);
unsigned int Frequence; //外部脉冲数变量
unsigned int FF1,FF2,FF3,FF4,FF;
/*延时子程序*/
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 (); /*初始化时钟*/
PORT_Init (); /*初始化交叉开关和IO口*/
Time01_Init(); /*初始化定时器0/1*/
while (1) {
P31=0;
sleep_ms(250);
EA=1; // 开总中断
TR1=1; // 开定时器1
TR0=1; // 开定时器0
P6 = 0x0d;
for(x=0;x<1000;x++); //延时
lcdpoint=&HMS;
for(lcd_data_count=9;lcd_data_count>0;lcd_data_count--)//显示"FREQUENCE:"
{
data1=*lcdpoint;
P7 = data1; /*送字符数据*/
P6 = 0x0c;
P6 = 0x0d;
lcdpoint++;
for(x=0;x<100;x++);
} //准备送数据
//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; /*转化成字符码*/
P7 = data1; /*送字符数据*/
P6 = 0x0c;
P6 = 0x0d;
lcdpoint++;
for(x=0;x<100;x++);
}
}
}
void SYSCLK_Init (void)
{
int i; /*延时计数器*/
OSCXCN = 0x67; /*启动外部11.0592MHz晶振*/
for (i=0; i < 255; i++) ; /*等待外部晶体起振*/
while ((OSCXCN & 0x80)==0x00) ; /*查询标志位*/
OSCICN = 0x08; /*选择外部晶体作为系统时钟并使能时钟丢失检测*/
}
void PORT_Init (void)
{
XBR0 = 0x00;
XBR1 = 0x02; /*交叉开关使能T0*/
XBR2 = 0x40; /*使能交叉开关和弱上拉*/
P74OUT = 0xf0; /*P6,P7为推挽输出*/
}
void Time01_Init(void)
{
EA=0; //关总中断
TR0=0; //关定时器0
TR1=0; //关定时器1
IE=0x0A; /*允许TF1/TF0标志位(TCON.7/TCON.5)的中断请求*/
/*定时器1/0发生溢出*/
TMOD=0x15; /*定时器1是16位定时器方式,定时器0是16为计数器(T0脚)方式*/
IP=0x08; /*定时器1是高优先级中断*/
CKCON=0x10; /*定时器1的时基是系统时钟*/
TH1=(-SYSCLK/1000)>>8; /*定时1ms,定时器1使用系统时钟*/
TL1=-SYSCLK/1000;
}
void TIMER1_ISR (void) interrupt 3 using 1
{ P31=1; /*关闭被测信号源*/
TF1=0; /*清中断标志*/
TR1=0; /*关定时器1*/
Frequence=TH0*0x100+TL0;/*外部脉冲数 单位 KHz*/
TR0=0;
FF4=Frequence/1000; /*将频率数据转化单字节并存入数组中*/
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; /*清定时器0到零*/
TL0=0;
TH1=(-SYSCLK/1000)>>8; TL1=-SYSCLK/1000;
TR1=1; /*开定时器1*/
TR0=1; /*开定时器0*/
P31=0; /*打开被测信号源*/
}
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; /*显示开,光标显示,光标不闪烁*/
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++);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -