图5-9 运行Keil C编译成功后生成的所有文件
5.3 软件功能模块设计
系统软件设计主要包括9大模块,分别为测量初始化模块、显示模块、信号频率测量模块、量程自动转换模块、信号周期测量模块、定时器中断服务模块、浮点数格式化模块、浮点数算术运算模块、浮点数到BCD码转换模块。其系统软件框图如图5-10。
浮点数到ASCII码转换模块 浮点运算模块 显示模块 周期测量模块 初始化模块 频率测量模块 量程自动转化模块 定时器中断服务模块 浮点数格式转化模块 图5-10 频率计系统软件框图
- 27 -
5.3.1 LCD初始化设置模块
LCD初始化主要进行显示器显示模式设置和显示开关及光标设置,在本次设计中定义其显示模式为:8位数据端口,5*7矩阵,16*2显示,并且开启显示无光标。具体实现代码为:
void LCD_Initial() { LcdEn=0;
LCD_Write(LCD_COMMAND,0x38); //8位数据端口,2行显示,5*7点阵 LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //开启显示, 无光标 LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏
LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC递增, 画面不动 }
5.3.2 浮点数到ASCII码转换模块
在LCD1602的显示中,数据是以ASCII码的形式在屏幕上显示出来的,而通过系统测量出的频率值为浮点数形式,因此必须将浮点数形式的数据转化为ASCII码的形式才能显示出来。将浮点数转换为ASCII码的代码为:
void IntToStr(unsigned int t, unsigned char *str, unsigned char n) {
unsigned char a[5]; char i, j; a[0]=(t/10000); //取得整数值到数组 a[1]=(t/1000); a[2]=(t/100); a[3]=(t/10); a[4]=(t/1); a[i]=a[i]+'0'; for(i=0; a[i]=='0' && i<=3; i++); for(j=5-n; j
- 28 -
for(i=0; i<5; i++) //转成ASCII码
*str='\\0'; }
5.3.3 定时/计数器初始化模块
在系统测频之前,首先要进行定时/计数器0和1的初始化,这一部分主要是进行定时/计数器0和1的工作方式和中断优先级的设置,在实验中通过设置定时/计数器 0和1的工作方式控制寄存器TMOD的操作模式和工作方式,我们设置定时器1为16位定时器方