PIC单片机C语言程序的组成 一个完整的PIC 单片机C 语言源程序应包括:包含头文件、变量定义、常量说明、函数定义、主函数main( )、若干个其他功能函数、各种功能C 语句,以及已定义的函数和函数体、注释等部分组成。 说明:对PIC 单片机中级或中级以下的产品,其头文件是#include和#include; 对高级产品,如PIC18F452 器件,其头文件是#include和#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 // 头文件 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 秒后关闭 } } |