⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wfrequence.c

📁 C8051F系列单片机外围电路功能模块程序
💻 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 + -