4 智能转速测量系统的软件设计 4 智能转速测量系统的软件设计
4.1单片机C51的介绍
4.1.1单片机C语言与汇编语言
在单片机的开发应用中,逐渐引入了高级语言,C语言就是其中的一种。对用惯了汇编语言的人来说,高级语言的可控行不好,不如汇编语言那样能够随心所欲。但是使用汇编语言会遇到很多问题,首先它的可读性和可维护性不强,特别是当呈现没有很好的标注时,其次就是代码的可重用性也比较低。使用C语言就可以很好的解决这些问题[18]。
C语言具有良好的模块化,容易阅读和维护等优点。由于模块化,用C语言编写的程序有很好的可移植性,功能化代码能够很方便地从一个工程移植到另一个工程,从而减少开发时间。
用C语言编写程序比用汇编编写程序更符合人们的思考习惯,开发者可以更专心地考虑算法而不是考虑一些细节问题,这样就减少了开发和调试时间。使用像C这样的语言,编写者不必十分熟悉处理器的运算过程。很多处理器支持C编译器,这意味着对新的处理器也能很快上手,而不必知道处理器的具体内部结构,这使得用C语言编写的程序比汇编程序有更好的可移植性。
C语言的特点就是可以使编写者尽量少地对硬件进行操作,它是功能性和结构性很强的语言。
对大多数51系列单片机,使用C语言这样的高级语言与使用汇编语言相比具有如下优点:
(1)不需要了解处理器的指令集,也不必了解存储器结构;
(2)寄存器分配和寻址方式由编译器进行管理,编程时不需要考虑存储器的 寻址和数据类型等细节;
(3)指定操作的变量选择组合提高了程序的可读性; (4)可使用与人的思维更相近的关键字和操作函数;
(5)与使用汇编语言编程相比,程序的开发和调试时间大大缩短; (6)C语言中的库文件提供许多标准的方程,例如:格式化输出、数据转换和浮点运算等;
(7)通过C语言可实现模块编程技术,从而可将已编制好的程序加入到新程序中;
(8)C语言可移植性好且非常普及,C语言编译器几乎适用于所有的目标系统,已完成的软件项目可以很容易地转换到其它的处理器或环境中。
所以在本毕业设计数据采集系统的软件设计中我选用单片机C语言来进行程序代码的编写。
11
西安工业大学毕业设计(论文) 4.1.2 C51对标准C语言的扩展
1.在51系列单片机中使用的C语言与标准C语言还有一些不同,或者说C51对标准C语言有一些扩展。
C51语言的特色主要体现在以下几个方面:
(1)C51虽然继承了标准C语言的绝大部分的特性,而且基本语法相同,但是本身又在特定的硬件结构上有所扩展,如关键字sbit、data、idata、pdata、xdata、code等。
(2)应用C51更要注重对系统资源的理解,因为单片机的系统资源相对PC机来说很贫乏,对于RAM、ROM中的每一字节都要充分利用。可以通过看编译生成的.m51文件来了解自己程序中资源的利用情况。
(3)程序上应用的各种算法要精简,不要对系统构成过重的负担。尽量少用浮点运算,可以用unsigned无符号型数据的就不要用有符号型数据,尽量避免多字节的乘除运算,多使用移位运算等。
2.C51相对于标准C语言的扩展直接针对51系列CPU硬件,大致有以下几个方面:
(1)数据类型
C51具有标准C语言所具有的标准数据类型,除此之外,为了更加有效地利用8051的结构,还加入了以下特殊的数据类型。 (2)存储区
C51编译器支持8051及其扩展系列,并提供对8051所有存储区的访问。存储区可分为内部数据存储区、外部数据存储区以及程序存储区。8051CPU内部的数据存储区是可读写的,8051派生系列最多可有256字节的内部数据存储区,其中低128字节可直接寻址,高128字节(从0x80到0xFF)只能间接寻址,从20H开始的16字节可位寻址。内部数据区又可分为3个不同的存储类型:data、idata、bdata。外部数据区也是可读写的。但是访问起来比较慢,因为外部数据区是通过数据指针加载地址来间接访问的。 (3)特殊功能寄存器(SFR)
51单片机提供128字节的SFR寻址区,地址为80H~FFH。51单片机中除了程序计数器PC和4组通用寄存器组之外,其它所有的寄存器均为SFR,并位于片内特殊寄存器区。
4.2程序设计
根据硬件电路设计,进行程序设计,在程序设计之前,首先要确定定时器的工作方式,方式控制字,确定串行口的工作模式等,下面分别讨论。 4.2.1工作方式及控制字设置
1.定时/计数器T0
本系统设计中,T0被用于计数,我们当然希望计数量越大越好,这样,可
12
西安工业大学毕业设计(论文) 以获得较大的测量范围,因此,T0选定为工作方式1(16位的计数方式),设计中,没有使用外部控制端,仅用指令置位/清零TR0来进行计数的启动/停止,这样,电路较为简单,但精度会受到一定的影响,但在本设计中,认为采用这种方式,精度可达到要求,因此,T0采用自由计数的方式,不用预置初值。 2.定时/计数器T1
定时器T1每10ms中断一次,用以进行数码管显示和每一秒读取一次计数器T0中的数值。这里选用T1的工作状态为1。要使T1设定正确的定时时间,首先要计算其初值,定时时间为:
t=(216-T1的初值)×晶振周期×12 (4.1)
定时时间10ms:
10ms=(216-T1的初值)×1/12*10-6×12 则: T1的初值=216-104 因此,TH1=D8, TH1=F0;
确定了定时/计数器T1的定时时间以后,就要计算定时初值,本系统用了12M的晶振,恰好是一个机器周期为1μs,因此,1ms定时时间意味着只要计数1000次即可,由于定时/计数器T1是向上计数,因此,要化为16进制,并分别送入T1的高8位和低8位。这里,采用的keil汇编软件有较强的预处理功能,能够处理较复杂的运算,因此,计数程序中可写为:PlusCounter = TH0*256 + TL0。
这里用PlusCounter作为转化为10进制数值的数值存储器,TH0和TL0分别是二进制计数值的高8位和低8位。
由于AT89C51单片机在中断时,会附加延时3-8个周期,在满足一定条件的情形下,验证这个数值是否正确,可以在进入仿真调试时通过观察Keil提供的有关变量看到,如果不正确,可以根据实际情况略作调整,保证定时时间尽量准确。
3.定时/计数器的方式控制字
定时/计数器的方式控制字TMOD,其地址为89H,复位值00H,不可位寻址。其8位控制。如图4.1工作模式寄存器TMOD的位定义所示。 GATE
C/T M1 M0 GATE C/T M1 M0 T1 T0
图4.1 工作模式寄存器TMOD的位定义图
说明:
GATE:门控位。由GATE、软件控制位TR0/1和INT0/1共同决定定时/计数器0/1的打开或关闭。当GATE=0,只要用指令置TR0/1=1即可启动定时/计数器0/1工作。GATE=1,只有INT0/1引脚为高电平且用指令置TR0/1=1时,才能启动定时/计数器0/1的工作。
C/T:定时器/计数器选择位。C/T=1,工作于计数器方式;C/T=0工作于定时器方式。
13
西安工业大学毕业设计(论文) M1M0:定时/计数工作模式选择位。M1M0=00,13位计数;M1M0=01,16位计数;M1M0=10,自动再装入8位计数;M1M0=11,工作于模式3状态。
根据前面的描述,可以确定TMOD的控制字应为00010101B。 程序如下:
void init_timer0() // T0、T1分别定义 {
TMOD= 0xF1; }
void init_timer1() {
TMOD = 0x50;
}
将控制字分别送入TMOD。 4.定时/计数控制寄存器TCON
TCON地址88H,可进行位寻址,复位值00H。如图4.2控制寄存器TCON的位定义图所示。 TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 图4.2 控制寄存器TCON的位定义图
TF0、TF1分别为定时器T0和计数器T1的溢出标志位,TR0和TR1在正常情况下,都没有溢出标志,只有当计数值或定时值超过65536时,才能有溢出中断请求,这两位是由硬件置位和硬件清零,不需另行设置。可在T0和T1的溢出中断服务程序中,以供使用。
TR1、TR0分别用于开启T1和T0的开关位,其中TR1由系统开启时,直接置位,打开T1,开始定时,经运行判断后,打开TR0。 4.2.2变量分配及程序的初始化
在程序开始之前,首先进行变量的分配,程序的初始化,根据硬件电路的要求,将各硬件电路置于其规定的状态;根据需要,对定时器、计数器、串行口等设置工作状态,预置初值等。以下是程序定义变量及进行初始化的程序行。 uint Tcounter = 0; //时间计数器
bit Flag_Fresh = 0; //刷新标志 bit Flag_clac = 0; //计算转速标志 bit Flag_Err = 0; //超量程标志
Disbuf[0] = 0; //开机时,初始化为0000 Disbuf[1] = 0; Disbuf[2] = 0; Disbuf[3] = 0;
init_timer0(); //T0、T1分别初始化
14
西安工业大学毕业设计(论文) init_timer1(); 4.2.3显示功能的实现
定时计数器T1每10ms中断一次,用以进行数码管显示和每1秒读取一次计数器T0中的数值。 1.秒信号的产生 中断产生后:
#define TIME_CYLC 100 Tcounter++;
if(Tcounter>TIME_CYLC) { Flag_clac = 1; }
判断Tcounetr是否到达100了,如果到达100,则说明1秒时间已到,程序将关闭T0计数器,然后对T0中已计得的数据进行处理,然后再去进行显示,否则直接转去显示。这部份的程序流程图如图4.3秒信号子程序流程图所示。
开始
秒计数器加1
到100了吗
停止T0工作 读T0计数值 清T0值 置位计算请求标志
进入显示部分 清秒计数器 图4.3 秒信号子程序流程图
2.数码管的显示
数码管显示采用动态方式,即通过延迟程序使数码管分时点亮,依次循环。由于数码管共有4位,延迟5ms,因此,每20ms即可轮流点亮每个数码管一次,
15