打印
[学习资料]

c语言比用delay更好的延时

[复制链接]
522|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
febgxu|  楼主 | 2023-3-27 07:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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 秒后关闭

}

}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

38

主题

4695

帖子

2

粉丝