65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 PIC C Lite 用 C 语言编程 PIC 微控制器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.91/5 (16投票s)

2008年9月21日

GPL3

5分钟阅读

viewsIcon

371209

downloadIcon

3588

在本文中,我将向您展示如何使用 C 语言对 PIC16F84 进行编程。

引言

使用汇编语言对微控制器进行编程非常令人沮丧且繁琐,更不用说陈旧了。随着时间的推移,开发人员开始为针对微控制器的高级语言构建编译器。我个人使用 PIC,它们有很多资源。甚至存在 MBasic 这样优秀的基础编译器,但我讨厌 BASIC,所以我就不谈论它了!我曾尝试使用 CC5X、SDCC(这是开源的)以及 HiTech 软件的 PIC C 等各种编译器来为非常流行的微控制器 PIC16F84 构建应用程序。我还没有使用 Microchip 的 mikroC,因为我不使用更高级的 PIC。这些编译器各有优缺点,但到目前为止,我最推荐的编译器是 PIC C。HiTech 软件提供了一个免费的 Lite 版本,正如预期的那样,我不会期望一家致力于开发 PIC 微控制器 C 编译器而非其他任何东西的公司有任何低于此水平的产品。

背景

像往常一样,对于任何类型的编码初学者来说,都必须有第一个“hello world”应用程序!在微控制器编程中,这绝对是让 LED 闪烁。我们现在就开始做。

我正在使用带有 PIC C Pro(45 天试用版)的 HI-TIDE 集成开发环境。您也可以使用 PIC C Lite(它会产生更大的 hex 文件,因为它没有全知代码生成)。还有什么?PIC C Lite 可以轻松集成到 Microchip 的 MPLAB 中……所以,您就拥有了两个**免费**产品。

SDCC 有一个名为 DevMic 的 IDE(我认为它是用 Delphi 编写的,就像 DevC++ 一样;它们非常相似),并且两者都是开源的。但是,让我们把 SDCC 留到以后再说……我不会说它对初学者更好。

那么,让我们开始“滋滋滋”吧,正如 CodeProject 的老话所说!!

<htc.h><pic.h> 包含标准定义,并且在您处理的任何源文件中都不能省略。由于我们希望 LED 延迟一点,我们将使用函数 DelayMs(int);此函数仅接受高达 255 的值。此数字表示您希望 LED 亮起或熄灭的毫秒数。此外,您必须声明哪个端口,或者更具体地说,哪些引脚是输出,哪些是输入。PortB 有 8 个端口,从 RB0-RB7,是双向的(任何引脚都可以是输入或输出)。PortA 有从 RA0-RA5 的引脚,也是双向的。但是,只有 RB4 到 RB7 可以配置为中断。稍后我们将看到什么是中断。您的代码在编辑器中应该如下所示

#include <htc.h>
#include <pic.h>
#include <delay.c>

main()
{
    TRISB=0; // declare portb as outpot
    
    for(;;)  // do forever
    {
        RB0=1;    // LED ON
        DelayMs(250);  // delay for 0.25 seconds
        RB0=0;      // LED OFF
        DelayMs(250);
    }
}

获取形成的 HEX 文件并将其加载到微控制器中(我假设您知道如何操作)。请记住,我们使用的是 PIC16F84。如果您使用的是其他类型,则在创建项目时必须指定此详细信息。HI TIDE 甚至可以让您在处理项目时随时将源代码适配到任何类型的 PIC。

PIC 的最大源电流为 25mA(我有时测量过高达 26.3mA 的电流),这足以直接驱动 LED。因此,如果将 LED 连接到 RB0 引脚和地,您应该会看到它以四分之一秒的间隔闪烁。请记住,LED 是一个 p-n 结,所以您必须正确连接(简而言之,如果一个方向不起作用,第二个方向应该有效!)。

干扰正常操作

在微处理器和微控制器中,我们总是希望设备控制多项事物,并根据不同情况做出不同反应。换句话说,正常操作中有一个 sequence1;当发生某某事情时,激活 sequence2。通常,这被称为“中断序列”,但为了避免更高级程序员的批评(中断序列必须驻留在程序内的自身代码空间中,并直接改变主例程的执行),让我们称之为“干扰正常操作”!

在 C 语言中有两种方法可以做到这一点。一种是使用 if 语句,另一种是使用 while 语句。我讨厌 while 循环,所以我们将坚持使用“if”。

我们将稍微修改我们的代码,甚至添加一个额外的函数,以便我们可以用小数秒来指定我们的“延迟”,而不是被限制在毫秒(而且是 255!)内。

那么,让我们在 HITIDE 或 MPLAB 中创建另一个项目,并插入此代码。在我上传的源代码中,它被称为 Interrupt.c

#include <htc.h>
#include <pic.h>
#include <delay.c>

int j;// general global variables I will use

void Wait_These_Seconds(float s)// only to 3 decimals
{
    int milli_Equiv;  // milli second equivalent integer
    milli_Equiv=1000*s;
    for(j=1;j<=milli_Equiv;j++)
    {
        DelayMs(1);
    }
} 
   
main()
{
    TRISB=0xF0; // RB4:RB7 are input ; 11110000 in binary
    for(;;)
    {
 
        if(RB7==1)
        {
            RB0=1;    // LED ON
            Wait_These_Seconds(1.8);  // delay for 1.8 seconds
            RB0=0;      // LED OFF
            Wait_These_Seconds(0.9);
         }
     
        if(RB7==0)  // interrupt is connecting RB7 to ground
        {
            RB0=1;    // LED ON
            Wait_These_Seconds(0.7);  // delay for 0.7 seconds
            RB0=0;      // LED OFF
            Wait_These_Seconds(0.1);
        }
    }
}

我建议您学习如何进行十六进制到二进制以及二进制到十六进制的转换。如果您打算用 C 语言处理 PIC,您需要它。我们现在所做的就是

  • 我们将引脚 RB4 到 RB7 配置为接受输入,从而接受中断,因为它们是唯一可以这样做的引脚,并且
  • 我们将 RB7 作为我们的中断引脚。在正常操作中,RB7=1。我们的中断操作是将 RB7 接地并将其强制为零(硬件始终胜过软件!)。

因此,构建项目并对 PIC 进行编程。它应该会持续大约 2 秒(精确地说 1.8 秒)亮起,然后熄灭约一秒。现在,将一根导线连接到 RB7 并将其固定到地。序列将改变,LED 将闪烁得更快,亮起 0.7 秒,然后熄灭仅零点一秒。我们已成功编程了中断!

还有什么?

想点亮一个大灯泡或驱动一个直流电机?如果您告诉我,我会告诉您如何做!我们只需要放大电流并使用晶体管!

欢迎提问和故障排除。

我将撰写更多关于如何构建复杂算法的文章,例如装饰灯、不同时间间隔的同步 LED 闪烁等等!

© . All rights reserved.