精华内容
下载资源
问答
  • PICC 入门笔记 PIC 单片机 C 语言编程入门笔记 一 C语言基础复习 -------- 没 C语言基础看起来可能有点困难 程序的语句 语句名称 一般形式 说明 表达式语句 表达式 表达式语句由表达式加上分号 组成 函数调用语 函数...
  • 关于PIC单片机编程的文档,很不错的资料。
  • 这是一个pic单片机入门的经典教程。简单通俗易懂
  • PIC单片机编程助手

    热门讨论 2011-10-30 19:31:36
    工具——PIC单片机编程助手Net 绿色小工具 用于PIC单片机开发 包括代码生成等实用功能 同时1分提供其他PIC相关资源 包括: 《PIC单片机入门与实战》 pdf 张明峰 北京航空航天大学出版社 本书从PIC中档系列单片机...
  • PIC单片机C语言入门 1.2.1认识PIC单片机C语言 用C语言来开发单片机系统软件最大的好处是编写代码效率高软件调试直观维护 升级方便代码的重复利用率高便于跨平台的代码移植等等因此 C语编程在单片机系 统设计中已得到...
  • PIC单片机入门_C语言编程技术

    万次阅读 2016-11-05 18:27:24
    1.为什么也是C语言? 用C 语言来开发单片机系统软件最大的好处是编写代码效率...Microchip 公司没有自行开发PIC单片机的C 语言编译器,但其他公司有开发众多支持PIC 单片机的C 语言编译器,常见的有Hitech、CCS、

    1.为什么也是C语言?

    用C 语言来开发单片机系统软件最大的好处是编写代码效率高、软件调试直观、维护升级方便、代码的重复利用率高等,因此C 语言编程在单片机系统设计中越来越广泛的运用。PIC 单片机的软件开发,同样可以用C 语言实现。
    Microchip 公司没有自行开发PIC单片机的C 语言编译器,但其他公司有开发众多支持PIC 单片机的C 语言编译器,常见的有Hitech、CCS、IAR、Bytecraft 等公司。其中最常用的是Hitech 公司的PICC 编译器,它稳定可靠,编译生成的代码效率高,在用PIC 单片机开发者中得到广泛认可。
    Hitech-PICC 编译器基本上符合ANSI C标准,但是不支持函数的递归调用。其主要原因是因为PIC 单片机特殊的堆栈结构。PIC 单片机的堆栈是硬件实现的,其深度已随芯片固定,无法实现需要大量堆栈操作的递归算法。  成的代码效率高,在用PIC 单片机开发者中得到广泛认可。

    2.MpLab中配置PIC C编译环境,并进行项目开发

    为便于PICC编译器的编译环境设置,应先在MPLAB IDE集成开发环境下创建一个PICC  C编译器的项目。
    1.启动MPLAB IDE7.00集成开发环境窗口。选择集成开发环境中的Project->New菜单项,打开如下所示的新项目对话框,在此对话框中设置项目名和项目路径。

    在项目名文本框中输入项目名led,在项目路径文本框中输入项目路径D:\led,也可以通过单击Browse按钮选择项目名的保存路径。
    2.器件选择,其操作过程如下所示。首先在MPLAB集成开发环境中打开Configure菜单,然后单击Select Device菜单项,弹出如下所示的器件选择对话框。此处可以选择PICl6F877A作为开发芯片。

    3.设置项目
    在创建项目和选定器件后,接下来就可以设置工程的编译环境。首先进行语言组件的设置。
    在Active Toolsuite下拉列表框中选择HI-TECH PICC Toolsuite作为开发工具组件,然后在Toolsuite Contents列表框中选择PICCCompiler项,如下图所示。  

    3.PICC基本编程

    3.1 PICC 中的基本变量类型

    PICC 支持的基本变量类型见下表:

    3.2 PICC 中的高级变量

    基于上表的基本变量,除了bit 型位变量外,PICC 完全支持数组、结构和联合等复合型高级变量,这和标准的C 语言所支持的高级变量类型没有什么区别。例如:
    数组:
    unsigned int data[10];
    
    结构体:
    struct commInData {
    unsigned char inBuff[8];
    unsigned char getPtr, putPtr;
    };
    
    联合体:
    union int_Byte {
    unsigned char c[2];
    unsigned int i;
    };
    

    3.3 PICC 对数据寄存器bank 的管理

    在PIC单片机编程时,单片机数据寄存器的bank是由编程员管理的,因此在定义变量时必须决定这些变量具体放在哪一个bank 中缺省时,所定义的变量将被定位在bank0中,例如下面所定义的这些变量:
    unsigned char buffer[32];
    bit flag1,flag2;
    float val[8];
    
    以上变量都是分布在bank0 中。定义在其它bank 内的变量前面必须加上相应的bank 序号,例如:
    bank1 unsigned char buffer[32];  //变量定位在bank1 中
    bank2 bit flag1,flag2;  //变量定位在bank2 中
    bank3 float val[8];  //变量定位在bank3 中
    

    3.4 volatile 修饰词 

    PICC 中还有一个特殊的变量修饰词“volatile”,用来说明一个变量的值是会随机变化的,即使程序没有刻意对它进行任何赋值操作。
    在单片机中,作为输入的IO 端口其内容将是随意变化的;很多特殊功能寄存器的值也将随着指令的运行而动态改变。所有这种类型的变量必须将它们明确定义成“volatile”类型,例如:
    volatile unsigned char STATUS @ 0x03;
    volatile bit commFlag;
    

    3.5 标准库函数

    PICC 提供了较完整的C 标准库函数支持,其中包括数学运算函数和字符串操作函数。在程序中使用这些现成的库函数时需要注意的是入口参数必须在bank0 中。
    如果需要用到数学函数,则用 “#include <math.h>” 包含头文件;如果要使用字符串操作函数,就需要包含“#include <string.h>”头文件。在这些头文件中提供了函数类型的声明。直接查看这些头文件就可以知道PICC 提供了哪些标准库函数。
    C 语言中的格式化输出函数“printf/sprintf”用在单片机的程序中时要特别谨慎。printf/sprintf 是一个非常大的函数,一旦使用,你的程序代码长度就会增加很多。 

    4.C和汇编混合编程

    用C 语言进行单片机应用程序开发时经常要使用汇编语句。比如,单片机的一些特殊指令操作在标准的C 语言语法中没有直接对应的描述,例如PIC 单片机的清看门狗指令“clrwdt”和休眠指令“sleep”。这样,一个项目中就会出现C 和汇编混合编程的情形,我们在此讨论一些混合编程的基本方法和技巧。
    在C 原程序中直接嵌入汇编指令是最直接最容易的方法。如果只需要嵌入少量几条的汇编指令,PICC 提供了一个类似于函数的语句:
    asm(“clrwdt”)  ;
    双引号中可以编写任何一条PIC 的标准汇编指令。例如:
    for (;;) {
    asm("clrwdt"); //清看门狗
    asm("sleep"); //休眠
    asm(“nop”); //空操作延时 
     }
    如果需要编写一段连续的汇编指令,PICC 支持另一种语法描述:用“#asm”开始指令段,用“#endasm”结束。
    例如下面的一段嵌入汇编指令实现了将0x20~0x7F 间的RAM 全部清零:
    #asm
          movlw 0x20
          movwf  _FSR
          clrf  _INDF
          incf _FSR, f
          btfss _FSR,7
          goto  $-3
    #endasm
    展开全文
  • PAGE PAGE # PIC单片机C语言入门 1.2.1认识PIC单片机C语言 用C语言来开发单片机系统软件最大的好处是编写代码效率高 软件调试直观维护升级方便 代码的重复利用率高便于跨平台的代码移植等等因此 C语编程在单片机系统...
  • 8位单片机C语言编程-PIC单片机入门与实战-李明峰版,值得学习
  • PIC单片机入门与实战]

    2018-08-18 13:43:26
    书中介绍的代码实例将以汇编指令为主,最后专门介绍pic单片机的c语言编程。读者对象主要是对pic单片机感兴趣的初学者或准备用pic单片机进行产品开发的工程师,对已经熟悉pic单片机开发的工程师也可以作为设计时的...
  • 为了给前一段时间学习PIC16F616型单片机的一个总结和方便大家的交流,笔者写了这篇关于PIC单片机的学习心得,都是在看了手册和编程调试后用自己的语言组织的,其中有不足或者有疑问的地方希望大家能及时的给予纠正和...
  • PIC单片机C语言编程入门书籍,PICC编译系统
  • 对于首次使用8位PIC单片机的用户,Microchip推出了基于云的IDE MPLAB Xpress,从而使入门变得更加容易,它摒弃了下载、安装、配置和定期更新工具的繁琐工作。MPLAB Xpress包含MPLAB代码配置器,使用户能够使用图形...
  • 为了给前一段时间学习PIC16F616型单片机的一个总结和方便大家的交流,我写了这篇关于PIC单片机的学习心得,都是在看了手册和编程调试后用自己的语言组织的,其中有不足或者有疑问的地方希望大家能及时的给予纠正和批评,...
  • 我写了这篇关于PIC单片机的学习心得,都是在看了手册和编程调试后用自己的语言组织的,其中有不足或者有疑问的地方希望大家能及时的给予纠正和批评,提出宝贵的意见.
  • 美国微芯科技公司(Microchip Technology)日前宣布推出PICkit 2入门工具包,帮助工程师、学生及任何对PIC单片机有兴趣的人士以极低的初始投资成本,便能轻松地开始使用PIC单片机进行设计和开发。PICkit 2入门工具...
  • 对于初学者来说,这个文档很有帮助,讲解了pic的各个单元,c语言编程的方法等
  • PIC单片机入门_PICC的指向RAM的指针

    千次阅读 2016-11-05 20:58:06
    问题: ...利用指向RAM的指针进行编程如下: #include static volatile unsigned char add1 @0x30; static volatile unsigned char add2 @0x31; static volatile unsigned char add3 @0x32; s

    问题:

    将30h,31h,32h单元中最大的数放入40h。

    利用指向RAM的指针进行编程如下:


    <span style="font-size:18px;">#include <pic.h>
    static volatile unsigned char add1 @0x30;
    static volatile unsigned char add2 @0x31;
    static volatile unsigned char add3 @0x32;
    static volatile unsigned char add  @0x40;
    main()       //绝对地址定位
    {  add1=0x51;
        add2=0x5;
        add3=0x60;
        if(add1>add2) add=add1;
        else add=add2;
        if(add3>add) add=add3;
        while(1){  ;   }
    }</span>

    注意:

    本例中add1、add2、add3和add本质上都是地址,因此它们都是指向RAM的指针。在PICC中用指针进行寻址是通过FSR间接寻址的,因此add1=0x51以及add=add1都是以间接寻址方式进行赋值的。

    以上程序中的指针add1、add2、add3和add都是指向bank0,假如要定义指向其他bank的指针也是可以的。

    例如:

    <span style="font-size:18px;">#include<pic.h>
    //将绝对地址定位在不同的体
    static volatile unsigned char add1 @0x30 ;       //实际地址=30h
    bank1 static volatile unsigned char add2 @0x31;  //实际地址=(80h+31h)=0B1h
    bank2 static volatile unsigned char add3 @0x32 ; //实际地址=80h*2+32h=132h
    bank3 static volatile unsigned char add @0x40  ; //实际地址=80h*3+40h=1c0h
    int x,y,z;
    void comparison()
    {  if (x>y)
             z=x;
       else
            z=y;   }
    main()
    { add1=0x31;    add2=0x34;     add3=0x28;
      x=add1;     y=add2; 
      comparison();
      x=z;     y=add3; 
      comparison();
      add=z;
      while(1){  ;    }
    }</span>
    

    换一种思路:

    也可以直接对三个常数进行比较大小,然后将最大的数存放在于bank3的某单元中。

    <span style="font-size:18px;">#include<pic.h>
    //符号定义
    #define x_data 0xe0;
    #define y_data 0x60;
    #define z_data 0x90;
    bank3 static volatile unsigned char add @0x40  ; //实际地址=80h*3+40h=1c0h
    int x,y,z;
    void comparison()
    {  if (x>y)
          z=x;
       else
         z=y;
    }
    main()
    { x = x_data ;  
      y = y_data; 
      comparison();
      x = z;
      y = z_data; 
      comparison();
      add = z;
     while(1){  ;  }
    }</span>
    展开全文
  • PIC单片机入门_定时器TMR2详解与实例

    千次阅读 2016-11-10 14:51:01
    TMR2为8位宽,附带二个4位宽的分频器:一个“预分频器”和一个“后分频器”,一个可编程的8位周期寄存器PR2。其主要用途: 1. 可以用作时间定时器,但是不能作为计数器; 2. 可以为同步串行端口

    1.前言

    这里将介绍另一款定时器TMR2模块,TMR2与前面介绍的TMR0和TMR1相比,最大的差别是只能工作于定时模式,因此称它为“定时器TMR2”。 

    2.TMR2的特性

    TMR2为8位宽,附带二个4位宽的分频器:一个“预分频器”和一个“后分频器”,一个可编程的8位周期寄存器PR2。其主要用途:
    1. 可以用作时间定时器,但是不能作为计数器;
    2. 可以为同步串行端口MSSP模块提供波特率时钟;
    3. 可以与CCP模块配合使用,实现脉宽调制PWM功能。
    TMR2的核心是一个可以由软件读/写的8位宽的计数器,它也是按递增计数,从某一初值(缺省为0)开始递增,直到与周期寄存器PR2中内容匹配之后,在下一次递增时则返回到00H,并且会产生匹配信号,该匹配信号将作为“后分频器”的计数脉冲。
    只有在后分频器产生溢出时,才会将溢出中断标志位TMR2IF(PIR1的bit1)置1。如果此时相关的中断使能位都置位,则会引起CPU的中断响应。通过对中断使能位TMR2IE的置位或复位,即可允许或禁止CPU响应TMR2产生的中断请求。
    需要注意的是:
    1. TMR2和RAM空间统一编址,地址为11H; 
    2. 可用软件方式直接读/写TMR2的内容;
    3. 有一个4位的预分频器和一个4位的后分频器;
    4. 有一个8位周期寄存器;
    5. 累加计数的触发信号只能选择内部系统时钟

    3. TMR2相关的寄存器

    与TMR2有关的寄存器共有6个,如下表所示。这6个寄存器中的前3个寄存器的功能可以查看“中断系统”。在此介绍TMR2控制寄存器T2CON。 


    TMR2控制寄存器T2CON是一个只用到低7位的可读/写寄存器,最高位未用,其余各位的含义如下:
    1. TOUT-PS3~TOUT-PS0:TMR2后分频器分频比选择位,如下表所列:
    2. TMR2-ON:TMR2使能控制位。1=启用TMR2;0=关闭TMR2,可以降低功耗。 
    3. T2CK-PS1~T2CK-PS0:预分频器分频比选择位,如下表所列:

    4. TMR2的电路结构

    TMR2的内部结构,如下图所示,包含5个组成部分。下面分析各个部分的功能和组成关系。
    核心部分就是一个8位宽的累加计数器TMR2。其复位值是00H,也可以是在00H~FFH范围内由用户设定的一个起始值。 
    4位宽的预分频器,对于进入TMR2的时钟信号进行预先分频,允许选择3种不同的分频比(1:1、1:4或1:16)。
    注意:在对TMR2或控制寄存器进行写操作时,都可以使预分频器清0;在用任何方式复位时,都会对预分频器清0。
    周期寄存器PR2也是一个8位可读/写寄存器。用来预置一个作为TMR2一次计数过程结束的周期值。芯片复位后PR2寄存器被自动设置为全1(FFH)。
    比较器是一个8位宽的按位比较逻辑电路,只有当参加比较的两组数据完全相同之后,下一次递增时,“匹配”输出端才会送出高电平,其他情况下该输出端均保持低电平。
    4位宽的后分频器,对于比较器的输出信号进行后续分频,允许连续选择16种分频比,其输出信号频率是输入信号频率的1/N (N=1~16) 。
    TMR2的工作是可控的,所以还包含一个控制门G1。只有当TMR2使能位TMR2ON置1,系统时钟才能通过G1,TMR2也才能进入活动状态。 

    5.TMR2的工作原理

    TMR2只有一种工作方式:定时器方式,其触发钟信号也只能从内部系统时钟4分频后得到。

    5.1 禁止TMR2工作

    TMR2也比TMR0多了一种选择,即可以被用户程序关闭而节电,此点类似于TMR1。具体方法是将TMR2使能控制位TMR2ON清0。此时与门G1的一只引脚被低电平封锁,其输出端均保持低电平;因此使得累加计数器TMR2不能活动。

    5.2 定时工作方式

    TMR2只有定时工作模式,该模式可以被用来实现一般的延时或定时。但是,TMR2的主要目的并不是把它用作普通的定时器,而是为CCP模块或MSSP模块提供周期可调的时基信号
    用作周期可调的时基发生器
    当TMR2被用作周期可调的时基发生器时,可以为CCP模块或MSSP模块提供周期可调的时基信号。
     这时,应该将中断使能位TMR2IE清0,即屏蔽TMR2的中断功能,相当于把后分频器的作用也屏蔽了;通过对周期寄存器PR2设置不同的值,以及给预分频器设定不同的分频比,来灵活调整TMR2输出端的信号周期TTMR2 。该周期的计算式为:
                                                     TTMR2=(4/fosc)*N1*(PR2+1)
    其中:fosc为系统时钟频率;N1为预分频器的分频比(取1、4或16);PR2为周期寄存器预赋值;PR2+1是因为在TMR2与PR2匹配后的下一次增量时TMR2才回00H。

    用作延迟时间可调周期性定时器
    把TMR2作为延迟时间可调的周期性定时器,会比TMR0的定时方式更加节省软件开销。
    TMR2不必像TMR0那样,每次溢出后,都要给寄存器TMR2赋初值。只要一次性设定溢出周期(通过设定预分频器、后分频器以及PR2来实现),TMR2就将会周期性地按预先设定的溢出周期产生超时中断。该超时溢出周期的计算式为 :
                                               TTMR2IF=(4/fosc)*N1*(PR2+1)*N2
    其中,N2为后分频器的分频比(连续可取1~16)。这时的简化电路如下图所示:
     
    用作普通定时器
    TMR2也可以像TMR0那样用作普通的定时器,这样使用时,可以将后分频器的分频比设定为1:1,PR2的值设定为最大值FFH,就相当于把后分频器、周期寄存器以及比较器的功能禁止掉了,使得它们不发挥作用。
    从而使TMR2简化为类似于TMR0一样,带有一个分频比可设定为1:1、1:4或1:16的4位预分频器。这时超时溢出周期的计算式为:
                                                         TTMR2IF=(4/fosc)*N1*(256-M)
    其中,M为TMR2的初始值。简化电路如下图所示:

    采用这种用法时,需要在TMR2每次超时溢出时,都要给TMR2赋一次初始值。累加计数寄存器TMR2,就会以该初始值为起点开始增量,直到递增到FFH,之后再出现一个计数脉冲,就会将TMR2复位清0,并且发出中断请求(TMR2IF被置1)。如果想把预分频器的功能禁止掉,可以把它的分频比也设置为1:1,这样就相当于把预分频器给短路掉了。 
    展开全文
  • PIC单片机选型表

    2011-10-30 19:32:45
    PIC单片机选型表 包括大部分常用型号 xls ...工具——PIC单片机编程助手Net 绿色小工具 用于PIC单片机开发 包括代码生成等实用功能 PIC单片机选型表 xls 常用PIC系列8位单片机芯片引脚符号的功能 doc
  • PIC单片机C语言应用例程,带你入门PIC单片机系列C编程
  • 16位单片机C语言编程:基于PIC24 比较好的一本入门书 结合汇编和C语言 很难找到的这一系列的入门
  • Microchip PIC系列8位单片机入门教程(五)定时器 第一节 知识点 我们通过定时器0的讲解来实现多个定时器的定时功能。 (1)Timer0 模块具有以下特征: • 可通过软件选择,作为8 位或16 位定时器/ 计数器 • 可读写...

    Microchip PIC系列8位单片机入门教程(五)定时器

    第一节 知识点

    我们通过定时器0的讲解来实现多个定时器的定时功能。
    (1)Timer0 模块具有以下特征:
    • 可通过软件选择,作为8 位或16 位定时器/ 计数器
    • 可读写的寄存器
    • 专用的8 位软件可编程预分频器
    • 可选的时钟源(内部或外部)
    • 外部时钟的边沿选择
    • 溢出中断

    (2)TImer0工作原理

    Timer0 既可用作定时器亦可用作计数器;具体的模式由TOCS 位(T0CON<5>)选择。在定时器模式下(T0CS = 0),除非选择了不同的预分频值,否则,默认情况下在每个时钟周期该模块的计时都会递增(见第11.3 节“预分频器”)。如果写入TMR0 寄存器,那
    么在随后的两个指令周期内,计时将不再递增。用户可通过将校正后的值写入TMR0 寄存器来解决上述问题。通过将T0CS 位置1 选择计数器模式。在计数器模式下, Timer0 可在RA4/T0CKI 引脚信号的每个上升沿或下降沿递增。触发递增的边沿由Timer0 时钟源边沿选择位T0SE (T0CON<4>)决定。清零此位选择上升沿递增。下面讨论外部时钟输入的限制条件。可以使用外部时钟源来驱动Timer0。但是必须确保外部时钟与内部时(TOSC)相位同步。在同步之后,定时器/ 计数器仍需要一定的延时才会引发递增操作。

    (3) 中断

    当TMR0 寄存器发生溢出时(8 位模式下,从FFh 到00h ;或16 位模式下,从FFFFh 到0000h),将产生TMR0 中断。这种溢出会将标志位TMR0IF 置1。可以通过清零TMR0IE 位(INTCON<5>)来屏蔽此中断。在重新允许该中断前,必须在中断服务程序中用软件清
    零TMR0IF 位。由于Timer0 在休眠模式下是关闭的,所以TMR0 中断无法将处理器从休眠状态唤醒。

    (4) 定时器的时钟选择内部FOSC/4;

    定时器的初值为0的话,8位模式, 一次中断的时间为(1/(FOSC/4)*256; 如果定时1s 中断的计数值为n=1/((1/(FOSC/4)*256);

    eg: FOSC=40MHz 1s定时n=39063
    在这里插入图片描述
    在这里插入图片描述

    第二节 软件设计

    我们新建一个关于定时器的头文件和一个源文件
    (1) timer_config.h

    /* 
     * File:   timer_config.h
     * Author:  Greg
     * Comments: 定时器的配置和初始化程序
     * Revision history: version 1.1
     */
    
    // This is a guard condition so that contents of this file are not included
    // more than once.  
    #ifndef _TIMER_CONFIG_H_
    #define	_TIMER_CONFIG_H_
    
    #include <xc.h> // include processor files - each processor file is guarded.  
    extern unsigned int timer0num=0;
    extern unsigned int timer1num=0;
    extern unsigned int timer2num=0;
    void timer0_config_init(void);
    void tiner1_config_init(void);
    void timer2_config_init(void);
    void timer3_config_init(void);
    #endif	/* _TIMER_CONFIG_H_ */
    

    (2)timer_config.c

    #include <xc.h>
    #include "timer_config.h"
    
    void timer0_config_init(void)
    {   //没有预分频,可以预分频
        TMR0ON=1; // enable timer0
        T08BIT=1; // 8bit model
        T0CS=0; //clock is selected by internal clko
        PSA=1; // 未经分频器
        // 中断timer0 使能
        TMR0IE=0; // timer0 允许中断
        TMR0IF=0; // 中断标志位清零
        TMR0L=0;  // 初值为0
    }
    void tiner1_config_init(void)
    {   //没有预分频,可以预分频
        T1CONbits.RD16=1;// 16位操作
        T1RUN=0;// 时钟由时钟源产生
        T1OSCEN=0;
        TMR1CS=0;// 内部时钟 Fosc/4
        TMR1ON=1;// timer1 使能
        TMR1IE=0;// timer1 允许中断
        TMR1IF=0;
        TMR1=0;  //timer1 初值 
        
    }
    void timer2_config_init(void)
    {
        T2CONbits.TMR2ON=1;// timer2使能
        T2CONbits.T2CKPS=0b00; //预分频值为1
        T2CONbits.T2OUTPS=0b0000; //timer2输出后分频为1
        TMR2=0; //timer2 初值W为0;
        PR2=0xFF;// tiner2 周期寄存器的值设置为256;TMR2的值和PR2的值相等时是TMR2IF为1;
        TMR2IE=0;// timer2允许中断
        TMR2IF=0;
    }
    
    void timer3_config_init(void)
    {
        T3CONbits.RD16=1;// 16位操作
        T3CONbits.T3CKPS=0b00;// 预分频
        T3CONbits.T3SYNC=1;// 不与外部时钟同步
        T3CONbits.TMR3CS=0;// 内部时钟
        T3CONbits.TMR3ON=1;//  timer3使能
        TMR3=0;  //timer3 初值   
        TMR3IE=1;// timer3允许中断
        TMR3IF=0;
    }
    
    

    在新建两个关于中断的头文件和源文件
    (3)inrt_config.h

    // This is a guard condition so that contents of this file are not included
    // more than once.  
    #ifndef _INRT_CONFIG_H_
    #define	_INRT_CONFIG_H_
    
    #include <xc.h> // include processor files - each processor file is guarded. 
    #include "usart_dr.h"
    void interrupt_config_init(void);
    // 高级优先级中断服务子程序 声明
    void interrupt high_priority inrt_isr_high(void);
    //低级中断服务子程序 声明
    void interrupt low_priority inrt_isr_low(void);
    
    #endif	/* _INRT_CONFIG_H_ */
    

    (4)inrt_config.c

    #include<xc.h>
    #include"timer_config.h"
    #include "inrt_config.h"
    void interrupt_config_init(void)
    {
        INTCONbits.GIE=1;//允许全局中断
        INTCONbits.PEIE=1;// 允许外设中断
        RCONbits.IPEN=1;  // 中断优先级使能位
        RCIE=1;  //USART中断使能
        RCIP=1; // USART中断优先级高
        RCIF=0;
        TMR0IP=1;// timer0 设置为高级优先中断
        TMR1IP=1; //timer1 设置为高级优先级中断
        TMR2IP=1; //timer2 设置为高级优先级中断
        TMR3IP=1; //timer3 设置为高级优先级中断
    }
    // 高级优先级中断服务子程序 
    void interrupt high_priority inrt_isr_high(void)
    {    //usart 服务
        if(RCIF&&RCIE)
        {   
            RCIF=0; // 必须先清楚RC中断标志位
            usart_send_byte(RCREG);
        }
        //timer 0 服务
        if(TMR0IE&&TMR0IF)
        {
            TMR0IF=0;
            timer0num++;
                if(timer0num==39063)
                {
                    usart_send_string("timer0 is count for 1s!\r\t\n");
                    timer0num=0;
                }
        }
        //timer 1 服务
        if(TMR1IE&&TMR1IF)
        {   // 在这里定时器的初值在初始化设置为0,因此不需要再赋初值 
            TMR1IF=0;
            timer1num++;
            if(timer1num==305) //16bits
            {
                usart_send_string("timer1 is count for 2s!\r\t\n");
                timer1num=0;
            }
        }
        if(TMR2IE&&TMR2IF)
        {   // 在这里定时器的初值在初始化设置为0,因此不需要再赋初值 
            TMR2IF=0;
            timer2num++;
            if(timer2num==39063)
            {
                usart_send_string("timer2 is count for 1s!\r\t\n");
                timer2num=0;
            }
        }
        //timer3 服务
        if(TMR3IE&&TMR3IF)
        {   // 在这里定时器的初值在初始化设置为0,因此不需要再赋初值 
            TMR3IF=0;
            timer1num++;
            if(timer1num==458)//3s 16bits 
            {
                usart_send_string("timer3 is count for 3s!\r\t\n");
                timer1num=0;
            }
        }
    }
    // 低级中断服务程序由此处书写
    void interrupt low_priority inrt_isr_low(void)
    {
       ;
    }
    
    

    现在具体的定时器和中断的配置已经完成了,我们在主函数中使用:

    注意:我们配置字没有修改,默认前期教程的。

    #include <xc.h>
    #include "usart_dr.h"
    #include "inrt_config.h"
    #include "timer_config.h"
    //#include"plib/adc.h"
    //#include "delays.h"
    int main(void)
    {   
        usart_port_dir_init();
        usart_Config_init();
        interrupt_config_init();
        timer0_config_init();
        tiner1_config_init(); 
        timer2_config_init();
        timer3_config_init();
        usart_send_string("I love you!");
      
        while(1)
        {
            
        }
         return 0;
       
    }
    
    

    下载到开发板中测试吧,我已经测试过没有问题。

    展开全文
  • 全书共16章,首先简要介绍了PIC系列产品、硬件结构、C语言编程基础,以及常用开发工具,引导读者技术入门;然后精心选择了13个典型工程实例,以“设计思路分析+硬件电路设计+软件设计与程序注释”的主要形式,完整...
  • 详细介绍基于MPLAB的汇编工程创建,以及汇编程序的编写,可以使初学者更容易入门PIC单片机编程
  • 《PIC单片机实用教程——提高篇》 pdg 李学海 北京航天航空...工具——PIC单片机编程助手Net 绿色小工具 用于PIC单片机开发 包括代码生成等实用功能 PIC单片机选型表 xls 常用PIC系列8位单片机芯片引脚符号的功能 doc
  • PIC入门书籍

    2017-10-31 14:39:34
    里面有两本pic入门书籍。方便新手零基础轻松入门PIC单片机编程
  • pic24单片机例程

    热门讨论 2012-11-19 09:29:55
    pic24系列单片机编程快速入门. 代码的书写模式可以借鉴。模块划分可以借鉴。

空空如也

空空如也

1 2 3
收藏数 60
精华内容 24
关键字:

pic单片机编程入门