📄 fm_s.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 + -