PIC单片机C语言指南
- 格式:pdf
- 大小:162.40 KB
- 文档页数:8
第一部分为了对PIC单片机有更好的支持,PICC在标准C的基础上作了一些扩充:• 定义I/O函数,以便在你的硬件系统中使用中定义的函数。
• 用C语言编写中断服务程序• 用C语言编写I/O操作程序• C语言与汇编语言间的接口1-1 与标准C的不同PICC只在一处与标准C不同:函数的重入。
因为PIC单片机的寄存器及堆栈有限,所以PICC不支持可重入函数。
1-2 支持的PIC芯片PICC 支持很多PIC单片机,支持PIC单片机的类型在LIB目录下的picinfo.ini 文件中有定义。
1-3 PICC 包含一些标准库1-4 PICC 编译器可以输出一些格式的目标文件,缺省设置为输出Bytecraft的'COD' 格式和 Intel的'HEX'格式。
你可以用表1-1中的命令来指定输出格式。
表1-1格式名称描述PICC 命令文件类型Motorola HEX S1/S9 type hex file -MOT .HEXIntel HEX Intel style hex records(缺省) -INTEL .HEX Binary Simple binary image -BIN .BIN UBROF Universal Binary Image Relocatable Format -UBROF .UBR Tektronix HEX Tektronix style hex records -TEK .HEX American Hex format with symbols for American -AAHEX .HEX Automation HEX Automation emulatorsBytecraft .COD Bytecraft code format(缺省) n/a(缺省) .COD Library HI-TECH library file n/a .LIB1-5 符号文件PICC -G 命令用于生成符号文件,有了符号文件,你就可以进行源程序调试.命令格式为:PICC -16F877 -G test.c在使用仿真器时必须使用-G命令。
PIC单片机的C语言使用PIC(Perpheral Interface Controllers)单片机是一种高性价比的嵌入式处理器,也是应用最广泛的单片机之一、它们常常用于各种电子设备,例如家电、汽车、电子仪器仪表和医疗设备等。
PIC单片机的优点是具有较低的成本、低功耗和高性能。
在C语言中使用PIC单片机可以实现许多功能,例如控制输入输出、实现逻辑运算、实现算法等。
```c#include <xc.h>#include <pic.h>void mainTRISB=0x00;//将PORTB定义为输出口PORTB=0x00;//将PORTB的值初始化为0while(1)PORTB=0xFF;//将PORTB的值设置为全高电平__delay_ms(1000); // 延时1秒PORTB=0x00;//将PORTB的值设置为全低电平__delay_ms(1000); // 延时1秒}```上述示例程序中,我们使用了XC8编译器,它是一个用于编译PIC单片机C语言程序的开源编译器。
在以上代码中,我们将PORTB定义为输出口,然后在一个无限循环中将PORTB设置为全高电平,并延时1秒,然后将PORTB设置为全低电平,并再次延时1秒。
```c#include <xc.h>#include <pic.h>void mainADCON1=0x0F;//将ADCON1寄存器设置为模拟输入模式TRISB=0x00;//将PORTB定义为输出口PORTB=0x00;//将PORTB的值初始化为0while(1)ADCON0bits.GO = 1; // 启动A/D转换while(ADCON0bits.GO); //等待转换完成//读取A/D转换结果并进行温度转换int adcValue = ADRES;int temperature = (5 * adcValue) / 1023;PORTB = temperature; // 将温度值显示在PORTB上}```在以上代码中,我们首先将ADCON1寄存器设置为模拟输入模式,然后将PORTB定义为输出口,并初始化为0。
PIC单片机的C语言使用(一)在MPLAB-IDE中使用HitechC编译器一、装入编译器:1、启动MPLAB-IDE,如下图所示选择Project-》InstallLanguageTool2、在弹出的安装语言工具对话框里“LanguageSuite”选项现在显示的是Microchip,点击后面的箭我使用的工具是HI-TECHPICCME,所以选择为“HI-TECHPICC”。
3、接下来在“ToolName”里选择编译器组件的调用路径,这里有“PICCCompiler”(C编译器)、“P (汇编器)和“PICCLinker”(链接器)3项都需要设置。
用“Browse”来选择调用路径,把上述3项组件的调用文件都设为。
点“OK”后完成设置。
二、选用编译器:1、新建一个项目,编辑项目对话框的“LanguageToolSuite”栏目默认是“Microchip”,将它改为“HI-TECHPICC”。
2、在项目文件框里点“flasha[.hex]”,这时“NodeProperties”(节点属性)按钮将会亮起来。
点击进入。
3、设置节点属性。
由于还有其他相关连的源程序需要加进来,所以在“LanguageTool”栏里应该选择“PICCLinker”(链接器)。
通常我们可以选择:1)Generatedebuginfo:显示debug信息;2)Createmapfile:选择该项后我们将看到ROM、RAM的使用情况;3)Errorfile:显示错误信息;4)CompileforMPLABICD:如果不使用ICD,就不必选择这个项目了。
4、设置完成之后点“Add Node”来添加节点。
这个项目有两个节点:和,选择节点后点击“NodeProperties”或直接双击节点来进入节点属性设置。
5、节点文件的工具这时应该选择为“PICCCompiler”(C编译器),蓝色圈子里的4项依次是:1)显示debug信息;2)局部优化;3)全局优化;4)ICD编译配件。
PIC单片机的C语言编程指南PIC单片机是一种常用的嵌入式系统开发平台,其具有低功耗、成本低廉、易于编程等优点,在工业自动化、电子设备控制等领域有着广泛应用。
本文将为读者提供一份PIC单片机的C语言编程指南,帮助初学者快速入门并掌握基本的编程技巧。
首先,我们需要了解一些PIC单片机的基本概念。
PIC单片机采用哈佛结构,具有多种型号和系列,每个系列有多个型号可供选择。
不同的型号和系列有不同的特性和功能,因此在编程时需要根据具体的芯片型号进行适配。
PIC单片机的编程语言常用的是C语言,其语法简洁,易于理解和学习,并且具有较高的可移植性。
在编写PIC单片机的C语言程序时,我们需要按照以下步骤进行:1. 引入头文件:使用#include指令引入所需的头文件,头文件包含了定义和声明所需的函数和变量。
3.初始化:在程序开始时对所需的资源进行初始化,包括引脚配置、中断设置、定时器初始化等。
4.主循环:编写主循环代码,其中包括需要重复执行的功能,例如读取传感器数据、处理输入输出等。
5.中断处理:根据需要,编写中断处理函数,处理外部中断、定时器中断等。
6.清理工作:在程序结束时,进行一些清理工作,例如释放资源、关闭设备等。
下面是一个PIC单片机的C语言编程示例:```c#include <xc.h> // 引入XC8编译器的头文件#define LED_PIN RC0 // 定义LED连接的引脚void iniTRISC0=0;//配置RC0引脚为输出模式void maiinit(; // 初始化while(1)LED_PIN=1;//点亮LED__delay_ms(500); // 延时500毫秒LED_PIN=0;//关闭LED__delay_ms(500); // 延时500毫秒}```上述代码实现了一个简单的功能,即使LED灯以500毫秒的间隔交替点亮和关闭。
在程序中,我们首先引入了`<xc.h>`头文件,然后定义了一个宏`LED_PIN`来表示连接LED的RC0引脚。
PIC单片机的C语言使用(一)在MPLAB-IDE 中使用HitechC 编译器一、装入编译器:1、启动MPLAB-IDE,如下图所示选择Project-》Install Language Toolscreen.width-300)this.width=screen.width-300” border=0>2、在弹出的安装语言工具对话框里“Language Suite”选项现在显示的是Microchip,点击后面的箭头来选择语言。
screen.width-300) this.width=screen.width-300” border=0>我使用的工具是HI-TECH PICCME,所以选择为“HI-TECH PICC”。
3、接下来在“Tool Name”里选择编译器组件的调用路径,这里有“PICC Compiler”(C 编译器)、“PICC Assembler”(汇编器)和“PICC Linker”(链接器)3 项都需要设置。
screen.width-300)this.width=screen.width-300” border=0>用“Browse”来选择调用路径,把上述3 项组件的调用文件都设为PICC.EXE。
点“OK”后完成设置。
screen.width-300)this.width=screen.width-300” border=0>二、选用编译器:1、新建一个项目,编辑项目对话框的“Language Tool Suite”栏目默认是“Microchip”,将它改为“HI-TECH PICC”。
screen.width-300)this.width=screen.width-300” border=0>2、在项目文件框里点“flasha[.hex]”,这时“Node Properties”(节点属性)按钮将会亮起来。
点击进入。
screen.width-300)this.width=screen.width-300”border=0>3、设置节点属性。
PIC单片机C语言入门1.2.1 认识PIC单片机C语言用C语言来开发单片机系统软件最大的好处是编写代码效率高。
软件调试直观、维护升级方便、代码的重复利用率高、便于跨平台的代码移植等等,因此C语编程在单片机系统设计中已得到越来越广泛的应用。
但在单片机上用C语言写程序和在PC机上写程序绝对不能简单等同。
珊在的PC机资源十分丰富,运算能力强大,因此,程序员在写PC机的应用程序时,几乎不用关心编译后的可执行代码在运行过程中需要占用多少系统资源,也基本不用担心运行效率有多高。
写单片机的C语言程序最关键的一点是单片机内的资源非常有限,控制的实时性要求又很高,因此,如果没有对单片机体系结构和硬件资源作详尽的了解,以笔者的愚见认为是无法写出高质量实用性很高的C语程序。
本书围绕PIC中档系统单机来展开讨论的,Microchip公司自己没有针对PIC中档系列单片机的C语言编译器,但很多专业的第三方公司有众多支持PIC单片机的C语言编译器提供,常见的有Hitech、CCS、IAR、Bytecraft等公司。
其中笔者最常用的是Hitech公司的PICC编译器,它稳定可靠,编译生成的代码效率高,在用PIC单片机进行系统设计和开发的工程师群体中得到广泛认可。
其正式完全版软件需要购置,但在其网站上有限时的试用版供用户评估。
另外,Hitech公司针对广大PIC的业余爱好者和初学者,还提供了完全免费的学习版PICC-Lite编译器套件。
它的使用方式与完全版相同,只是支持的PIC单片机型号限制在PIC16F84、PIC16F877和PIC16F628等几款。
这几款Flash型的单片机因其所具备的丰富的片上资源而最适用于单片机学习入门,因此,笔者建议感兴趣的读者可以从PICC-Lite入手掌握PIC单片机的C语言编程。
我们一起来认识训练项目2——跑马灯的仿真与演示的程序LEDS.C。
1 #include"pic.h"2 int a; //定义整型变量a3 void main( )4 { TRISB=0X00; //定义端口B为输出模式5 while(1) //while循环语句6 { PORTB=0XFE; //1111 11107 for(a=1000;a>0;a--); //for循环语句8 PORTB=0XFD; //1111 11019 for(a=1000;a>0;a--); //for循环语句10 PORTB=0XFB; //1111 101111 for(a=1000;a>0;a--); //for循环语句12 PORTB=0XF7; //1111 011113 for(a=1000;a>0;a--); //for循环语句14 PORTB=0XEF; //1110 111115 for(a=1000;a>0;a--); //for循环语句16 PORTB=0XDF; //1101 111117 for(a=1000;a>0;a--); //for循环语句18 PORTB=0XBF; //1011 111119 for(a=1000;a>0;a--); //for循环语句20 PORTB=0X7F; //0111 111121 for(a=1000;a>0;a--); //for循环语句22 }23 } 说明:第1行:#include"pic.h"是文件包含语句,表示把语句中指定文件的全部内容复制到此处,与当前的源程序文件链接成一个源文件。
PIC单片机C语言教程PIC单片机(Peripheral Interface Controller)是德州仪器(Texas Instruments)公司生产的一款微控制器芯片。
它具有高性能、低功耗、易编程等特点,因此被广泛应用于各种电子设备中。
PIC单片机的编程语言主要是C语言。
C语言是一种广泛使用的高级程序设计语言,它结构简洁、表达能力强、可移植性好。
通过使用C语言,我们可以轻松地编写控制PIC单片机的程序,并且可以充分发挥PIC单片机的特性和功能。
在PIC单片机的C语言教程中,首先需要了解C语言的基础知识,包括变量、数据类型、运算符、控制语句等。
接下来,我们需要学习如何使用C语言编写PIC单片机的程序。
1.引脚配置:在PIC单片机的程序中,我们需要配置引脚的状态,包括输入输出模式、电平状态等。
通过使用C语言,我们可以方便地配置引脚,实现与外部器件的连接和通信。
2.中断编程:中断是PIC单片机的重要特性之一,可以使控制器在特定条件下停止当前任务执行,转而执行中断服务程序。
通过使用C语言,我们可以编写中断服务程序,实现特定条件下的任务切换和响应。
3.定时器编程:定时器是PIC单片机的另一个重要功能,可以实现一定时间间隔内的定时操作。
通过使用C语言,我们可以编程设置定时器的参数,以实现特定的定时操作。
4.串口通信:PIC单片机具有串口通信功能,可以与其他设备进行数据交换。
通过使用C语言,我们可以编写串口通信的程序,实现与其他设备的数据传输和交互。
5.外设控制:PIC单片机可以连接各种外设,如LCD显示屏、键盘、驱动器等。
通过使用C语言,我们可以编写控制程序,实现与外设的连接和控制。
以上只是PIC单片机C语言教程的一部分内容。
除了上述内容,我们还可以学习其他更高级的主题,如编码技巧、优化技术等。
通过系统学习和实践,我们可以掌握PIC单片机的C语言编程技巧,实现各种功能和应用。
总的来说,PIC单片机的C语言教程是一个庞大而丰富的话题,需要通过实践和深入学习来掌握。
第一部分为了对PIC单片机有更好的支持,PICC在标准C的基础上作了一些扩充:z定义I/O函数,以便在你的硬件系统中使用<stdio.h>中定义的函数。
z用C语言编写中断服务程序z用C语言编写I/O操作程序z C语言与汇编语言间的接口1-1 与标准C的不同PICC只在一处与标准C不同:函数的重入。
因为PIC单片机的寄存器及堆栈有限,所以PICC不支持可重入函数。
1-2 支持的PIC芯片PICC 支持很多PIC单片机,支持PIC单片机的类型在LIB目录下的picinfo.ini文件中有定义。
1-3 PICC 包含一些标准库1-4 PICC 编译器可以输出一些格式的目标文件,缺省设置为输出Bytecraft的'COD' 格式和 Intel的'HEX'格式。
你可以用表1-1中的命令来指定输出格式。
表1-1格式名称描述PICC 命令文件类型Motorola HEX S1/S9 type hex file -MOT .HEX Intel HEX Intel style hex records(缺省) -INTEL .HEX Binary Simple binary image -BIN .BIN UBROF Universal Binary Image Relocatable Format -UBROF .UBR Tektronix HEX Tektronix style hex records -TEK .HEX American Hex format with symbols for American -AAHEX .HEX Automation HEX Automation emulatorsBytecraft .COD Bytecraft code format(缺省) n/a(缺省) .COD Library HI-TECH library file n/a .LIB1-5 符号文件PICC -G 命令用于生成符号文件,有了符号文件,你就可以进行源程序调试.命令格式为:PICC -16F877 -G test.c在使用仿真器时必须使用-G命令。
1-6 配置字PIC单片机的配置字可以用__CONFIG命令来定义:#include <pic.h>__CONFIG(x)其中x是配置字,头文件中定义了相应的配置说明符,如:__CONFIG(WDTDIS & XT & UNPROTECT);这将关闭看门狗,设置XT振方式,程序不加密。
注意:不同的配置符间用'&'相联,未定义的部分保留未编程状态。
详细的情况请参考头文件及PIC数据手册。
1-7 ID 位置有些PIC单片机在程序空间外还有ID空间,可用下面的方法来定义:#include <pic.h>__IDLOC(x)其中x是ID标示,如:__IDLOC(15F0);将ID的四个单元定义为:1, 5, 15, 0. ID的具体位置由所指定的PIC芯片自动设定。
1-8 EEPROM 数据有些PIC单片机支持用外部编程器对内部的EEPROM进行编程。
__EEPROM_DATA()可以将用于初始化的数据放入HEX文件中,如:__EEPROM_DATA(0, 1, 2, 3, 4, 5, 6, 7)可将0-7八个数放入HEX文件中,在用外部的编程器进行编程时将这八个数写入PIC单片机中。
__EEPROM_DATA不是用于运行时写入EEPROM数据的,在运行时请用EEPROM_READ(), EEPROM_WRITE()。
1-9 位指令只要有可能,PICC总是采用位指令。
如:int foo;foo |= 0x40;的编译结果为:bsf _foo, 6为了方便可以定义如下宏:#define bitset(var, bitno) ((var) |= (1 << (bitno)))#defien bitclr(var, bitno) ((var) &= (1 << (bitno))) 上一条语句可写为:bitset(foo, 6);1-10 支持的数据类型PICC 支持1,2,4字节的基本类型。
所有的多字节类型都采用低有效位在前的格式,表1-2列出了所有数据类型及它们所占空间大小。
表1-2类型大小(位) 数字类型值bit 1 逻辑类型0 或 1signed char 8 有符号字符-128..+127unsigned char 8 无符号字符0..255signed short 16 有符号整数-32768..+32767unsigned short 16 无符号整数0..65535signed int 16 有符号整数-32768..+32767unsigned int 16 无符号整数0..65535signed long 32 有符号整数-2147483648..+2147483647 unsigned long 32 无符号整数0..4294967295float 24 浮点double 24 or 32 浮点由-D24, -D32决定1-10-1 常量及进制表示PICC 支持标准C的进制表示方法。
l或L后缀表明常量为long类型,u或U后缀表示常量为unsinged类型。
浮点数为double类型,可以用f或F指定浮点数为float类型。
字符型由单引号括起,如'a'.字符串由双引号括起,如"Hello world".1-10-2 位数据类型PICC 支持一位的变量,用bit来定义。
如:static bit init_flag;变量必须是全局的或静态的,它不能是自动变量或一个函数的参数,但可以作为一个函数的返回类型。
位变量很象unsigned char,但它只有0或1两个值,位变量占用空间少,且运算速度快. 所有的位变量在startup是被清0,请在程序开始处初始化它们。
如果将一个整型数赋给位变量,只是将最低位赋给位变量,如果你是想要将一个整型变量是否为0赋值给一个位变量,请用: bitvar = other_var != 0;如要你使用了PICC的-STRICT命令,bit将被视为非法命令。
1-10-2-1 使用可位寻址的寄存器位变量的定义可以与绝对地址的定义结合起来使用。
如:为了访问STATUS中Power Down位,先定义STATUS的绝对地址为3,然后再定义一位变量绝对地址为27static unsigned char STATUS @ 0x03;static bit PD @ (unsigned)&STATUS*8+3;注意: 头文件中已定义所有的特殊功能寄存器及相应的位寄存器.1-10-3PICC浮点数使用IEEE754 32位格式和IEEE754(截断)24位格式.float类型使用24位格式,double使用24位或32位格式, 由PICC命令控制, -D24使用24位格式, -D32使用32位格式.1-11 绝对地址变量一个全局的或静态的变量可以定位绝对地址, 使用如下格式:unsigned char Portvar @ 0x06;这里定义了一个名为'Portvar'的变量, 地址为06h,注意,编译器并不保留任何单元,仅仅是将一个变量分配在06h单元. 它等价于汇编语言: _Portvar EQU 06h 编译器及连接器都不作任何检查, 完全由程序员保证分配不会发生冲突.1-12 结构与联合PICC 支持struct及union, 它们可以作为函数的参数及返回值, 也可以作为指针指向的目标.1-12-1 结构限定PICC 支持在结构上使用限定符, 如果在一个结构上使用限定符, 那么, 这个结构的所有成员都被限定.如:bank1 struct {int number;int *ptr;}在这个结构里,number, ptr 都被放在bank1寄存器内.1-12-2 结构中定义位成员PICC 支持在结构中定义位成员.位成员按最低有效位在前的方式存储,位成员总是按8位字节方式存放, 当当前字节放满后再放下一个字节,位成员不会跨字节存放. 如:struct {unsigned hi: 1;unsigned dummy: 6;unsigned lo: 1;} foo @ 0x10;结构foo占用10h单元, hi为10h单元的第0位, lo为10h单元的第7位, dummy为10h 单元的2-6位,(第6位为最高有效位)不使用的位可用未命名的位成员来定义, 如果我们不使用dummy, 就可定义为:struct {unsigned hi: 1;unsigned : 6;unsigned lo: 1;} foo @ 0x10;1-13 在ROM及RAM存放字符串.一个未说明的字符串总是存放在ROM中, 并且只能通过常量指针为访问.#define HELLO "Hello word"SendBuff(HELLO);一个非常量的数组被一个字符串初始化, 如:char fred[] = 'Hello world";将在RAM中保留一个数组, 在startup时, 用存放在ROM中的"Hello world"来初始化.如果要将一个常数字符串作为函数参数或将它赋给一个指针, 必须定义一个常数指针.如: void SendBuff(const char * ptr)1-14 const, volatile 类型限定符.PICC 支持标准C的const, volatile类型限定符const类型限定符通知编译器一个目标含有的常量并且不会改变. 一个常量被放在ROM中, 显然一个常量是不能被赋值的. 如:const int version = 3;volatile 类型限定符通知编译器, 一个目标不能保证在连续的访问中不被改变.这将禁止编译器对该目标的优化. 所有的I/O口及在中断中使用的变量必须有volatile 类型限定符. 如:volatile unsigned char P_A @ 0x05;对volatile目标的访问与对non-volatile的访问是不同的, 如对volatile目标置1是先将该目标清0后加1, 而对non-volatile目标置1是先将1放在W中后再将W赋值到目标中.1-14 特别的类型限定符.PICC 支持一些特别的类型限定符: persistent, bank1, bank2及bank3,这些限定符不可用于自动变量.1-14-1 persistent按C的标准, 所有的C变量在startup时被清为0. 但是在有些情况下, 我们希望在复位后仍保持一些变量的值. persistent类型限定符使被其限定的变量在startup时不被清0, 而保留原有的值.1-14-2 bank1, bank2及bank3类型限定符.bank1, bank2及bank3类型限定符用于指定变量所在的寄存器页. 如:static bank3 unsigned char fred;bank3 unsigned char *ptrfred;缺省页是bank01-15 C语言中的中断处理在PICC C语言中可以用"interrupt"限定符来编写中断服务程序.一个中断服务函数必须用 interrupt void 来定义, 不能有参数, 并且不能被C 语言直接调用. 如:long tick_count;void interrupt tc_int(void){++tick_count;}1-15-1 在中断中保存环境PIC单片机硬件只保存PC, PICC 编译器自动地保存其它可能用到的变量. 但是编译器无法确定inline中的汇编语言段使用变量的情况, 你必须自已保护它们.1-15-2 开启中断在PIC.H中定义了所有的中断位, di()关闭所有中断, ei()打开所有中断. 如:ADIE = 1; // A/D interrupt will be usedPEIE = 1; // all peripheral interrupts are enabledei(); // enable all interruptsdi(); // disable all interrupts1-16 在C中使用汇编语言 #asm, #endasm, asm()可以在C语言中直接使用汇编语言. #asm, #endasm用来加入一段汇编语言, 而asm()用来加入一条汇编语言. 如:#include <stdio.h>unsinged char var;void main(void){var = 1;#asmrlf _var, 1rlf _var, 1#endasmasm("rlf _var, 1");}1-17 函数调用变换由于PIC5X只有两级堆栈, PICC 编译器使用转移指令来调用函数, 这样被套调用层次增加, 但调用速度下降, 请在需要快速调用的函数前加fastcall来指定编译器直接使用调用指令调用函数.对于14位的PIC单片机, 将永远使用调用指令调用.1-18 MPLAB使用的调试控制项-FACKLOCAL 命令用于在MPLAB下观察函数内的局部变量-MPLAB_ICD命令用于使用ICD调试C语言.第二部分2-1安装PICC将CD-ROM装入光驱, 自动运行程序将自动启动, 如果你已禁止自动运行功能, 可以直接运行: cd_drive:\compiler\install.exe安装程序将指导你完成PICC的安装.2-2设置伟福集成环境在伟福集成环境中, 将编译器路径指向PICC 所在目录将C命令行设置为: -16F877 –G –O –Zg -c将连接命令行设置为: -16F877 –G –O -Zg其中: -16F877 为芯片型号–G –O -c为源程序调试设置项, 不可修改–Zg 为打开优化你可以在命令行中加入其它控制项2-3调试C语言在WA VE\SAMPLES目录下有一个PIC C语言的例子程序: PIC_C.PRJ.1. 打开PIC_C项目.2. 编译该项目(F9)3. 用F7,F8单步调试例子程序4. 打开观察窗口观察变量。