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

📄 fm_s.c

📁 DOS下的基于研华PCL836的采集卡的c测评程序
💻 C
字号:

#include <stdio.h>
#include <conio.h>
#include <dos.h>
#define ESC 27
/*Constants definition:*/
#define N 65536
#define F_CLK 5000000
#define BASE 0x240
/*Global virables:*/
unsigned char started=0;
unsigned int overflow_cnt=0;
float frq=0.0;
unsigned int cnt_old,cnt_new;
void init_cnter(){/*使用counter0作为计数器,用fout0作为clk*/

		 disable();/*关闭中断*/
		 outportb(BASE +03,0x36);  /*写8254chip 1的控制字,值为:0011 0110 binary. 
		 作用为:
		 选择fout0 , mod3 ,先读写LSB然后MSB.16进制计数 */
		 	/*设置fout0频率为5MHz*/
		 outportb(BASE +00,0x02);//write LSB 
		 outportb(BASE +00,0x00);//write MSB ,这两句向fout0中写入2,就是2分频,晶体振荡器频率是10m,所以输出为10/2=5mhz
		 outportb(BASE +24,0x01); /*open fout0*/
		 outportb(BASE +18,0x02); /*初始化counter0的时钟模式为以fout0作为clk*/
		 outportb(BASE +11,0x30);/*初始化counter0*/
		 /*写8254chip 3的控制字,值为:0011 0000 binary. 
		 作用为:
		 选择counter0, mod0 ,先读写LSB然后MSB.16进制计数 */
		 outportb(BASE +8,0xff);	/*counter0 =65535*/
		 outportb(BASE +8,0xff);
		 enable();/*开中断*/	
}


unsigned int read_counter(){
 /*向8254chip3的控制寄存器写入0000 **** binary code
	                   作用为:
		           选择counter0, latch 
	                    */
		unsigned int c1,c2;
		outportb(BASE +11,0x00);
		c1=inportb(BASE +8);
		c2=inportb(BASE +8);
		return c2*256+c1;
}

void reload_counter(){
		outportb(BASE +8,0xff);/*写LSB*/
		outportb(BASE +8,0xff);/*写MSB*/
/*使用的是mode0,计数从新的值65535开始*/
}
void init_frq_measure(){
		started=0;
		overflow_cnt=0;
		cnt_old=0xffff;
		init_cnter();/*把8254的方式定为mod0,装入ffffh。等待闸门信号进行counter0减计数。*/
}

/*
程序用来更新frq的值
如果frq的值被更新了,则返回值1,否则返回0;

*/
int update_frequency (void) {
		cnt_new=read_counter();
		if(cnt_old ==cnt_new){
			if(started){/*说明计数结束了
                   计算频率值;*/
				frq=F_CLK /(float)((overflow_cnt+1)*N-cnt_new);
				cnt_old=0xffff;
				started=0;
				overflow_cnt=0;
				reload_counter();/*counter的值重置为0xffff;*/
				return 1;
			}
		}else{/*不相等*/
			  started=1;
			  if(cnt_old <cnt_new){
					overflow_cnt++;/*溢出次数加上1*/
			    }
		}
		cnt_old=cnt_new;/*把cnt_old更新(下一次的old就是本次的new),为下一次查询做准备*/
		return 0;
}

void main(){

	clrscr();/*清除屏幕,tc库函数*/
	init_frq_measure();/*初始化测频*/
	do{
		if (update_frequency()){/*如果更新了频率,就输出新的值*/
			printf("frequency=%f\r",frq);
		}
		if(kbhit()) 
			if(getch()==ESC)
				break;/*这句表示按下ESC就退出,否则什么也不做*/
	}while(1);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -