PIC单片机C语言程序设计(15)
一个完整的PIC 单片机C 语言源程序应包括:包含头文件、变量定义、常量说明、函数定义、主函数main( )、若干个其他功能函数、各种功能C 语句,以及已定义的函数和函数体、注释等部分组成。
说明:对PIC 单片机中级或中级以下的产品,其头文件是#includepic.h> 和#includepic1687x.h>; 对高级产品,如PIC18F452 器件,其头文件是#includepic18.h> 和#include pic18fxx2.h>。
C 程序的运行,总是从主函数main( ) 开始(可以通过模拟仿真直接观察到),由主函数调用其他函数,其他函数也可互相调用, 如此运行工作。而C 语句,又可按其执行方式的不同而分为顺序结构、选择结构和循环结构等。这里的顺序结构, 是指程序按语句的顺序逐条执行;选择结构, 是指程序根据相关条件选择的执行顺序; 循环结构, 是指程序根据某条件的存在执行一段程序,直到条件消失为止,若该条件永远存在,就形成无限循环。
1. 延时函数的三种表达式
用汇编语言编辑一个较大的PIC 单片机程序时,一般分为多个程序模块,每个模块的子程序实现一个特定的功能。而用C 语言编辑该程序时,模块的功能是用函数实现的,即函数相当于汇编语言的子程序。下面我们以延时函数应用的实例,来说明PIC 单片机C 语言程序的基本组成格式。
延时函数是PIC 单片机源程序中出现频率较高的函数,而且具有相同功能的延时函数也有多种形式,我们选择常用的三种延时函数进行讨论。
所引用的三种延时函数都是由循环控制语句——while、do_while 和for 等实现的。
(1)带形式参数的由for 语句组成的延时函数。
void delay(unsigned int k)
{
unsigned int i, j;
fir(i=0;i=81;i++)
fir(j=0;j=k;j++)
cONtinue;
}
该延时函数由两个for 语句组成,第一个for语句中的81 是笔者设置的常数(可任意设定),用于使延时值增加; 第二个for 语句中的k 是在程序中主函数main( ) 调用delay(k) 时,由用户给定的值,k 值不同,延时时间就不等, 所以该延时函数可在一个C 程序中实现不同的多个延时量,显然比汇编语言延时子程序简单多了。在延时量要求较短时, 该延时函数种的两个for 语句的功能可用一个for 语句来实现。
(2)带形式参数的由while 循环语句组成的延时函数。
Void deley(unsigned long int k)
{
Unsigned long int d=k;
While(--d)
{;
}
{
此延时函数简单、容易记忆。使用时,在程序中主函数main( ) 调用delay(k) 时,由用户给定不同的k 值,亦可实现多种延时值。
(3)带形式参数的由do-while 语句组成的延时函数。
Void delay(unsigned long int k)
{
Unsigned int long j=o;
do {
j++;
}
While(j =k);
j=o;
}
该延时函数简单易记。使用时,在程序中主函数main( ) 调用delay(k) 时,由用户给定不同的k 值,即可实现多种延时值。
需要说明的是,上述由while 循环语句和由do-while 语句组成的延时函数中的形式参数,不一定用长整型(long ink)。
⒉ 电路功能相同形式不同的四种C 程序
下面介绍利用PIC16F84A 单片机的PORTB端口外接的8 只LED, 采用四种C 程序控制端口的LED 灯,来说明编辑C 语言程序时的基本格式及其灵活性。电路参见《电子制作》2009 年9期《单片机C 语言程序设计(1)》一文中的图1,程序流程如图64 所示,采用的是无限循环工作方式。
图64
(1)C 程序一,文件名为pic09.c, 清单如下:
#include pic.h> // 头文件
void delay(unsigned long int K)
// 延时函数开始
{
unsigned int long j=0;
// 说明语句
do
// 由do-while 组成的延时执行语句
{
j++;
}
while(j=K);
j=0;
}
main( ) // 主函数开始
{
TRISB=0x00;
// 设置PORTB 口全为输出
INTCON=0x00; // 关闭所有中断
PORTB=0x00; //RB 口先送低电平
while(1) // 永久循环开始
{
PORTB=0x55;
//RB 口外接LED 其1、3、5、7 点亮
delay(45000);
// 点亮的LED 延时1 秒后关闭
PORTB=0xAA;
//RB 口外接LED 其2、4、6、8 点亮
delay(98000);
// 点亮的LED 延时2 秒后关闭
PORTB=0xFF; //RB 口外接LED 全亮
delay(155000);
// 全亮的LED 延时3 秒后关闭
}
}
评论