数字频率计中C语言编程的研究
时间:07-04
来源:互联网
点击:
1 引言
为了实现智能化的电子计数测频,实现一个宽领域、高精度的频率计,一种有效的方法是运用单片机测量频率。采用单片机、接口芯片以及分频电路实现频率的自动分频。根据计数值、分频系数,求出周期T,得到待测频率。
2 C51语言使用中几个关键问题
在数字频率计中,没有采用常用的汇编语言,全部软件用C语言编程。8051单片机的C语言编译器简称C51。C51程序有且仅有一个名为main的主程序。
(l)用#include在C语言源程序中包含库文件。例如:#include〈reg51.h〉
(2)为了能直接访问特殊功能寄存器SFR,C51提供了一种自主形式的定义方法,这是标准C语言中所没有的,仅适于单片机编程。例如:sfr TMOD=OX89;
(3)对于片外的I/O扩展,用“#define',语句进行定义。如:#define PORT A XBYTE[0xffc0];
(4)实时中断程序的编程方法。中断函数的声明方法如下:
void函数名>(void)interrupt【中断向量代号][using[内部寄存器组代号]
3 数字频率计主程序设计
在主程序中声明库文件,定义8155的口地址和所有全局变量。显示函数说明以及定时器和8155的初始化。点亮启动标志灯。设置外部中断为边沿触发。设置分频系数初值并测周期。进行分频系数的判断,读周期值并将其转换成频率。调用显示程序,完成显示频率的功能。
#include
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define COM8155XBYTE[0x2000]
#define PA8155XBYTE[0x2001]
#define PB8155XBYTE【0x2002]
#define PC8155XBYTE[0x2003]
float fre; float mid,total,v,c,g
uint j=0,par=0x01,fen2=0x80,fenl=0x00.p;
bit rflag1,rflag2;
在使用C51语言中,absacc.h和reg51.h是不可缺少的。这两个文件定义了单片机的所有寄存器和端口。上述程序中还定义8155的各个口地址,便于C51编译器按8155的实际硬件结构,建立I/O变量名与其实际地址的对应关系。下面程序是函数说明和初始化:
void main(void)
(uint k=0; /*给循环变量赋初值*/
void show(void); /*显示函数说明*/
TMOD=0x10; /*定时器1方式1,
GATE=0*/
COM8155=0xof; /*8155的工作方式控制字*/
PB8155=fen1; /*分频初值赋予8155的PB口*/
PC8155=0x06p /*点亮启动标志灯*/
PA8155=0x80;
EA=1;IT1=1;ET1=1;PX1=1;/*开中断,
4 数字频率计显示程序设计
在显示程序中,要设定字型数码数组,判断频率值的单位,并将其分为Hz,KHz,MHz。判断频率值的整数部分和小数部分的位数,显示频率值和单位数量级标志灯。小数点处理显示程序如下:
PC8155=0x07; PA8155=table[s[6]];
c=0;while(c〈10000)(++c;);PA8155=0x00;
PC8155=0x065
if(n==O)(PA8155=0x005;PA8155=0x01;);
c=0;while(c1000)(++c;);
if(n==1)(PA8155=0x00;PA8155=0x02;);
c=0;while(c1000)(++c;);
if(n==2)(PA8155=0x00;PA8155=0x04;);
c=0;while(c1000)(++c;);
i++;
小数点处理程序中由高位到低位,逐位显示频率值。每显示一位数,要有一个C循环语句进行适当的延时,并将8155的PA口清零,保证下一次的显示。显示的方法是数组s[8]的每个值作为字形码数组table[]的下标,在table[]数组中找到自己对应的字形码,送至8155的PA口。最后根据n的值,确定所显示的频率值的单位数量级。
5 结论
本文的工作基础是应用单片机设计的数字频率计。利用C语言进行单片机应用系统数字频率计的设计,不仅编程简单,精度高,而且避免了汇编语言在进行乘除法运算时要考虑采用浮点运算的要求。与汇编语言相比编程语句大大减少。数字频率计的全部软件均经过了调试。并进行了误差分析。频率的测量范围从1Hz到1MHz,具有一定的实用价值。
为了实现智能化的电子计数测频,实现一个宽领域、高精度的频率计,一种有效的方法是运用单片机测量频率。采用单片机、接口芯片以及分频电路实现频率的自动分频。根据计数值、分频系数,求出周期T,得到待测频率。
2 C51语言使用中几个关键问题
在数字频率计中,没有采用常用的汇编语言,全部软件用C语言编程。8051单片机的C语言编译器简称C51。C51程序有且仅有一个名为main的主程序。
(l)用#include在C语言源程序中包含库文件。例如:#include〈reg51.h〉
(2)为了能直接访问特殊功能寄存器SFR,C51提供了一种自主形式的定义方法,这是标准C语言中所没有的,仅适于单片机编程。例如:sfr TMOD=OX89;
(3)对于片外的I/O扩展,用“#define',语句进行定义。如:#define PORT A XBYTE[0xffc0];
(4)实时中断程序的编程方法。中断函数的声明方法如下:
void函数名>(void)interrupt【中断向量代号][using[内部寄存器组代号]
3 数字频率计主程序设计
在主程序中声明库文件,定义8155的口地址和所有全局变量。显示函数说明以及定时器和8155的初始化。点亮启动标志灯。设置外部中断为边沿触发。设置分频系数初值并测周期。进行分频系数的判断,读周期值并将其转换成频率。调用显示程序,完成显示频率的功能。
#include
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define COM8155XBYTE[0x2000]
#define PA8155XBYTE[0x2001]
#define PB8155XBYTE【0x2002]
#define PC8155XBYTE[0x2003]
float fre; float mid,total,v,c,g
uint j=0,par=0x01,fen2=0x80,fenl=0x00.p;
bit rflag1,rflag2;
在使用C51语言中,absacc.h和reg51.h是不可缺少的。这两个文件定义了单片机的所有寄存器和端口。上述程序中还定义8155的各个口地址,便于C51编译器按8155的实际硬件结构,建立I/O变量名与其实际地址的对应关系。下面程序是函数说明和初始化:
void main(void)
(uint k=0; /*给循环变量赋初值*/
void show(void); /*显示函数说明*/
TMOD=0x10; /*定时器1方式1,
GATE=0*/
COM8155=0xof; /*8155的工作方式控制字*/
PB8155=fen1; /*分频初值赋予8155的PB口*/
PC8155=0x06p /*点亮启动标志灯*/
PA8155=0x80;
EA=1;IT1=1;ET1=1;PX1=1;/*开中断,
4 数字频率计显示程序设计
在显示程序中,要设定字型数码数组,判断频率值的单位,并将其分为Hz,KHz,MHz。判断频率值的整数部分和小数部分的位数,显示频率值和单位数量级标志灯。小数点处理显示程序如下:
PC8155=0x07; PA8155=table[s[6]];
c=0;while(c〈10000)(++c;);PA8155=0x00;
PC8155=0x065
if(n==O)(PA8155=0x005;PA8155=0x01;);
c=0;while(c1000)(++c;);
if(n==1)(PA8155=0x00;PA8155=0x02;);
c=0;while(c1000)(++c;);
if(n==2)(PA8155=0x00;PA8155=0x04;);
c=0;while(c1000)(++c;);
i++;
小数点处理程序中由高位到低位,逐位显示频率值。每显示一位数,要有一个C循环语句进行适当的延时,并将8155的PA口清零,保证下一次的显示。显示的方法是数组s[8]的每个值作为字形码数组table[]的下标,在table[]数组中找到自己对应的字形码,送至8155的PA口。最后根据n的值,确定所显示的频率值的单位数量级。
5 结论
本文的工作基础是应用单片机设计的数字频率计。利用C语言进行单片机应用系统数字频率计的设计,不仅编程简单,精度高,而且避免了汇编语言在进行乘除法运算时要考虑采用浮点运算的要求。与汇编语言相比编程语句大大减少。数字频率计的全部软件均经过了调试。并进行了误差分析。频率的测量范围从1Hz到1MHz,具有一定的实用价值。
- 基于DSP的高精度数字频率计的设计(02-03)
- 基于TMS320F2812的数字频率计的设计(05-11)
- 基于FPGA自适应数字频率计的设计(08-14)
- 51单片机数字频率计-带仿真文件(11-29)
- 基于单片机的数字频率计该如何设计(10-29)
- 基于单片机系统和CPLD的数字频率计的设计(12-23)