PIC单片机学习资料 经典版
第7章-PIC系列单片机原理与应用
7.2.1 主要资源及引脚功能:主要资源
PIC16C5X系列单片机的内部结构框图
7.2.1 主要资源及引脚功能:引脚功能
PIC16C54单片机共有18个引脚,各个引脚的功能如下: (1)VDD:电源正极。额定电压为5V,可工作电压范围2.5~6.25V。 (2)VSS:电源负极,即地线。 (3)OSC1/CLKIN:振荡信号输入端。 (4)OSC2/CLKOUT:振荡信号输出端 (5)#MCLR:复位端,内带施密特电路。该引脚为低时单片机复位。 (6)TOCKI:TIMER0的外部计数输入端,内带施密特电路。当 TIMER0设置为定时器时,为避免干扰,应将其接VDD或VSS。 (7)RA0~RA3:端口A。它是4位的双向三态I/O口,可以位操作, 每一位可单独定义为输入或输出。 (8)RB0~RB7:端口B。它是8位的双向三态I/O口,可以位操作, 每一位可单独定义为输入或输出。
使用外部时钟源 (适用于HS、XT、LP型)
RC振荡型时钟电路
7.2.2 中央处理器:复位
PIC16C54单片机主要有以下3种复位方式: (1)上电复位(Power on Reset,简称POR)。单片机内部集成 有上电复位电路,即POR电路。上电复位时,引脚#MCLR可 以接VDD也可以悬空,但两种情况下复位的时序不同。 (2)手动复位。当引脚#MCLR为低电平时,单片机进入复位状态; 当引脚#MCLR恢复为高电平时,DRT开始计时,并继续保持 复位状态;DRT计时18ms后溢出,完成手动复位。 (3)看门狗(WDT)复位:单片机内部集成有看门狗电路,它使用 独立的内部RC振荡电路,当计时溢出时对单片机复位。看门 狗的基本溢出周期为18ms。
PIC18F2331,PIC18F2420,PIC18F2520,PIC18F2480,PIC18F2580
6-PIC单片机基础教程课件-第六章
1:允许CCP2中断; 0:屏蔽CCP2中断。
第六章中断系统
6.3中断控制
5 第二外围接口中断标志寄存器2(PIR2) 第二外围接口中断标志寄存器2(PIR2)的内容为 CCP2外部接口中断、SSP总线碰撞中断允许位和 EEPROM写操作中断的标志位。
U-0 R/W-0 U-0 R/W-0 R/W-0 U-0 U-0 R/W-0
第六章中断系统
6.1 中断概述
6.1 中断概述 6.1.1中断概念的引入 6.1.2有关中断的名词
当单片机的CPU 正在处理某事件时,若外部发生了某一事 件 ( 如定时器溢出、引脚上电平变化 ) ,请求 CPU 迅速去处理, 于是 CPU 就暂时中止当前的工作,转去处理所发生的事件。中 断处理完该事件后,再回到原来被中止的地方,继续执行原来 的工作,实现这种功能的部件称为中断系统。产生中断的请求 源称为中断源。中断源向 CPU 提出的处理请求,称为中断请求 或中断申请。 CPU 暂时中断自身的事务,转去处理事件的过程, 称为 CPU 的中断响应过程。对事件的整个处理过程,称为中断 服务(或中断处理)。处理完毕,再回到原来被中止的地方,称 为中断返回。
1:表示TMR1寄存器出现捕捉 功能, 0:表示TMR1寄存器未出现捕 捉功能,
1 :表示 SSP 中断条件已经发 生; 0:表示没有SSP中断出现。
第六章中断系统
6.3中断控制
4第二外围接口中断允许寄存器2(PIE2) 第二外围接口中断允许寄存器2(PIE2)的内容包括 CCP2外部接口中断允许位、SSP总线碰撞中断允许位、 EEPROM写操作中断允许位。
1 :表示 SSP 中断条件已经发 生; 0:表示没有SSP中断出现。
第六章中断系统
循序渐进学习PIC单片机
pic学习记录(自动保存的)
PIC 器件具有几个包含配置位或熔丝的存储单元。
这些位指定基本的器件操作,例如振荡器模式、看门狗定时器、编程模式和代码保护。
未正确设置这些位可能导致代码失败或器件无法运行。
对于 PIC18 器件,这些位可以使用配置 pragma 伪指令进行设置。
(在未来版本中,也会对于其他 8 位器件引入 pragma 伪指令。
)该 pragma 伪指令具有以下形式。
#pragma config setting = state|value#pragma config register = value其中, setting 是配置设置描述符(如 WDT), state 是所需状态的文本描述(如OFF)。
value 字段是一个可以优先用于描述符的数值。
* PIC16F1x端口控制实验* 芯片型号:PIC16F1936* 主要特性:增强性中档8位CPU,8K Flash,512字节RAM,最高速度8MIPS,11通道10位 AD,2个比较器,96段LCD控制器,16通道电容触摸模块,3个增强性PWM/捕获模块*/#include/* 配置芯片的工作方式,相当于其他单片机的熔丝位 */// CONFIG1#pragma config FOSC = INTOSC // 使用内部时钟#pragma config WDTE = OFF // 禁止看门狗#pragma config PWRTE = OFF // PWRT disabled#pragma config MCLRE = ON // MCLR/VPP pin function is MCLR#pragma config CP = OFF // 禁止程序代码保护(debug时要关闭代码保护)#pragma config CPD = OFF // 禁止EEPROM的保护#pragma config BOREN = ON // 使能欠压复位#pragma config CLKOUTEN = OFF // 禁止CLKOUT功能#pragma config IESO = ON // Internal/External Switchover mode is enabled#pragma config FCMEN = ON // Fail-Safe Clock Monitor is enabled)// CONFIG2#pragma config WRT = OFF // 禁止代码自编程保护#pragma config VCAPEN = OFF // All VCAP pin functionality is disabled#pragma config PLLEN = OFF // 禁止4x PLL#pragma config STVREN = ON // Stack Overflow or Underflow will cause a // Reset)#pragma config BORV = LO // 欠压复位电压为低档位(低档位为1.9V,高档位为2.5V)#pragma config LVP = OFF // 高压编程模式/* 定义系统时钟,在延时函数中需要这个定义 */#define _XTAL_FREQ 16000000UL#define Close_LED() TB4 = 0 // RB4输出低电平#define Open_LED() TB4 = 1 // RB4输出高电平int main(void){/* 禁止4X PLL,内部16MHz时钟源 */OSCCON = 0B11111000;/* 清除PORTB数据锁存寄存器 */LATB = 0;/* 设置RB4端口为输出口,注意PIC有点特殊,1为输入0为输出 */TRISBbits.TRISB4 = 0;/* RB4输出低电平 */TB4 = 0;/* 设置RB5端口为输入 */TRISBbits.TRISB5 = 1;/* RB5设置为数字端口 */ANSELBbits.ANSB5 = 0;/* 使能RB5内部上拉,作为数字输入端口在设计时要注意并不是所有端口都有内部上拉的 */WPUBbits.WPUB5 = 1;/* 等待按键按下 */while(PORTBbits.RB5 == 1);while (1){__delay_ms(1000);Open_LED();__delay_ms(1000);Close_LED();}}器件配置位可以在Window>Pic Memory Views>Configuration Bits中查询或者直接生成代码。
pic单片机总复习
01Fh 020h
09Fh 0A0h
11Fh 120h
19Fh 1A0h
• 四个存储体每个 128 字节 • 特殊功能寄存器
• 存储体选择通过 Status 中的 RP0,1 和 IRP
GPRs
07Fh RP<1:0> = 00
GPRs
0F0h 0FFh RP<1:0> = 01
GPRs
170h 17Fh RP<1:0> = 10
INCFSZ f,d DECFSZ f,d BTFSC BTFSS RETFIE RETLW RETURN NOP SLEEP f,b f,b K -
PICmicro指令集汇总
Byte-Oriented Operations
ADDWF ANDWF CLRF CLRW COMF DECF DECFSZ INCF INCFSZ IORWF MOVF MOVWF NOP RRF carry RLF SUBWF SWAPF XORWF f,d f,d f f,d f,d f,d f,d f,d f,d f,d f f,d f,d f,d f,d f,d Add W and f AND W and f Clear f Clear W Complement f Decrement f Decrement f, skip if zero Increment f Increment f, skip if zero Inclusive OR W and f Move f Move W to f No Operation Rotate right f through Rotate left f through carry Subtract W from f Swap nibbles of f Exclusive OR W and f BCF BSF BTFSC BTFSS
PIC单片机入门教程V1.1
PIC单片机入门教程V1.1PIC单片机入门教程一、简单介绍本文档主要介绍PIC单片机开发环境的建立、集成开发环境使用方法、简单示例程序说明、PIC单片机开发注意事项等。
ZC-ADK开发板作为Android外设开发套件(Accessory Developer Kit)时,提供两种与Android手机通信的方法,分别是USB和蓝牙通信,如果使用ZC-ADK做USB 外设开发时,只需支持USB Accessory的Android手机;如果使用ZC-ADK做蓝牙外设开发时,需要添加ZC-BLUE模块。
1.所需硬件:ZC-ADK开发板开发板数据线2.所需软件:集成开发环境:MPLAB_IDE_8_50,将代码编辑、编译、调试等功能集成于图形界面下的应用程序。
C编译器:MPLAB C30,用于将C源文件进行编译,生成汇编语言文件,并将编译器产生的文件与其他目标文件与库文件进行汇编和链接,产生最终的应用程序。
应用程序库:microchip-application-libraries,PIC单片机的应用程序库文件,包含图形、USB、Android外设等应用程序库。
程序下载:HIDBootloader,用于通过USB下载编译好的应用程序。
二、MPLAB IDE 8.50安装1.将MPLAB_IDE_8_50.zip解压缩,双击setup.exe开始安装,出现图2-1界面,点击NEXT继续。
图2-12.出现图2-2界面,选择I accept,点击Next图2-23.出现图2-3所示界面,选择Complete,点击Next。
图2-34.出现图2-4界面,选择安装目录,点击Next。
图2-45.出现图2-5界面,选择I accept,点击Next。
图2-56.出现图2-6界面,选择I accept,点击Next。
图2-67.出现图2-7界面,点击Next,开始安装。
图2-78.出现图2-8界面,询问现在是否安装HI-TECH C编译器,选择否。
PIC单片机基础教程
PIC单片机基础教程PIC 单片机基础教程第一章PIC 系列单片机结构原理目前在全世界,利用单片机设计的嵌入式系统带来的工业年产值已超过几万亿美元。
在美国,但是使用嵌入式电脑的全数字电视产品预计每年将产生超过1500亿美元的于世界市场,我国的占有率好不到1 % 。
这说明单片机应用早我国才刚刚起步,有着广阔的前景。
因此,培养单片机应用人才,特别是在大学和中等专业学校相关专业中普及单片机知识,有着重要现实意义。
1.1单片机概述微型计算机是一种以电子器件为基础,可以介入输入信息,并能够对各种输入的数字化信息进行算术和逻辑运算,最后产生输出的电子设备。
微型计算机机油快速运算能力,又有极强的逻辑判断能力和的容量存储功能,是20世纪人类最卓越的发明之一,而单片微型计算机就是将CPU 、RAM、ROM、定时器/计数器和多种接口都集成到一块集成电路芯片上的尖端武器和日常生活中最广泛使用的计算机。
近年来,单片机得到突飞猛进的发展,已经完全深入到了人们的生活和工作的各个方面。
单片机的发展过程和性能的日益完善,实际上是对传统控制技术的一场革命,开创了为控制技术的新天地,现代控制系统的核心内涵就是嵌入式计算机应用系统(MCU),而单片机就是最典型、最广泛和最普及的嵌入式计算机应用系统。
可以毫不夸张地说,在现代化的设备中,单片机无处不在,如电信、家用电器、工业控制、仪器仪表、汽车和玩具等;单片机也比比皆是,如自动调台收音机、VCD、遥控空调、微波炉、智能玩具、人体秤和心电监护仪等。
随着科技的发展,单片机必将在更多的方面发挥作用。
目前,全世界各大公司的单片机品种已经形成多个系列,同一系列的单片机在软件和硬件方面有很大的相同之处。
例如,PIC16F87X 系列单片机有着相同的内核、相同和兼容的指令系统。
各种单片机在其内部所处理的对象都是用二进制数表示的信息,因此在学习单片机原理之前,首先要了解二进制数和二进制编码。
1、1、1 二进制数和编码1 计算机中的二进制数字的表示,有二进制、十进制和十六进制等。
2-PIC单片机基础教程课件-第二章
说明:用于把指定文件读入源程序中作为源程序代码的一部分。 文件名必须用双引号或尖括号给出,如果被指定文件非当前工 作目录下,则需要指令完整的路径。
第二章 PIC单片机指令系统和汇编语言程序设计
2.4 汇编语言程序设计
2.4 汇编语言程序设计 2.4.2 PIC 汇编语言的伪指令 最常用的伪指令介绍 (2) EQU 功能: 对标号赋值 格式:<标号> EQU <表达式> 说明:使 EQU 两端的8位值相等,即给标号赋 予一个特定值或者说是给标号定义一个数值。
③循环程序流程图 循环程序的结构包含以下4个组成部分: 循环初始化部分:为循环程序作准备。如循环变量设置,
即指定或定义一个循环变量作循环次数计数器或地址指针,并 给它设置一个初始值。
第二章 PIC单片机指令系统和汇编语言程序设计
2.4 汇编语言程序设计
2.4 汇编语言程序设计 2.4.1 汇编语言程序设计知识 2.PIC 汇编语言的程序流程图
算术操作类指令
指令助记符
功能简述
周期
影响的状态位
DECF f,d
f减1
1
00 0011 dfff ffff
Z
DECFSZ f,d f减1,为0间跳
1(2)
00 1011 dffff ffff
—
INCF f,d
f加1
1
00 1010dfff ffff
Z
INCFSZ f,d SUBLW k
SUBWF f,d
功能简述
TO, PD
CLRWDT
清 除 WDT 定 时器
周期 1
14位指令字
PIC单片机资料
PIC单片机基础知识
第1课:单片机基础知识基于HJ-5G学习板1、前言尊敬的用户:您好!欢迎使用《慧净》系列开发板!恭喜您成为慧净电子产品的用户!我们非常高兴您选择了本款产品。
我们将为你提供最真诚最优质的服务,让您在以后的日子里尽情发挥你的创意!为了让您更好的使用本款产品,并将它的功能发挥到极限,我们特意为您提供此产品的学习笔记,使用产品前请您详细阅读,重头学起。
该操作说明。
希望您通过此学习笔记能够将您手中的产品性能发挥到最优。
谢谢!慧净电子 2、免责声明2.1、为了安全有效的使用该产品,请您使用前仔细阅读以下信息。
2.2、本产品可以通过USB供电,供电电流<500mA,自行外接电源时请注意电源极性和电压参数。
电源适配器必须使用原装产品。
2.3、请不要在带电时拔插芯片以及相关器件。
2.4、自行扩展搭接导致不良故障,慧净电子不负任何责任。
2.5、产品不定时升级,所有更改不另行通知客户,本单片机研究工人室有最终解释权。
2.5、网上购物给中评,差评的,客户自动放弃售后服务生效。
3、学习板使用的基本流程3.1、学会使用PIC基础下载工具3.2、学会使用PICC编程软件3.3、认识板上各种器件并了解其基本作用3.4、看懂HJ-5G电路图3.5、了解数字电路基础3.6、学习c语言3.7、了解单片机结构3.8、读程序并自己更改功能学习变通应用单片机基础知识4、收到学习板你需要做的事4.1、开机测试:4.1.2、在包装盒子取出单片机学习板。
接上USB电源线,一端接到电脑USB接口上,一端接到单片机USB接口上,打开电源开关,可以看到单片机里面的程序运行现象,比如,流水灯会走动,数码管有数字显示,LCD1602有时钟显示等,测试程序。
注意上面的不是同时有的,只能有其中的一个程序。
4.1.3、经过上面的开机测试,说明单片机学习板在运输过程中没有出现问题,学习板在出厂前全部是经多次测试合格后才出货的,各位朋友们请放心使用。
4.2安装学习板相关应用软件4.2.1、PIC单片机下载软件的安装,请看慧净电子PIC单片机下载编程烧录软件安装方法,第2课学习笔记上有详细使用说明。
PIC单片机原理及应用(第一章)
18
19
1.3 嵌入式微控制器系统
在计算机的发展历史上,特别是在第一台 小型控制器件形成以后,沿着两条完全不同的 用途(运算和控制)、不同的价格、和不同的 技术内涵的计算机,被充实到PU、存储器、输入 /输出和定时/计数器等部件的一台微型计算机。
14
2、内存储器
注:存储单元地址及存储单元内容。
15
3、微型计算机硬件系统的组成方式
• 总线结构
16
CPU
Address BUS
位数?
Data BUS*
位数?
Control BUS
Memory
I/O Interface
Peripherals
注意:总线的概念将贯穿于全书,一定要将它们的结构组
成、功能、连接方法弄通和掌握。
➢ 存储系统容量 :内存和外存,以字节(8位二进 制信息)为单位,(KB,MB,GB)。
➢ 具体换算关系: B,KB,MB,GB 12
1.2 微型计算机系统的组成
1.2.1 微型计算机硬件组成 计算机的硬件通常包括运算器、控制器、存储 器、输入设备及输出设备等五个部分。
13
1、CPU的结构及工作原理
5
1.1.1 微型计算机的发展历史
从计算机发展的历史看,微型计算机已属于第四 代计算机,而微型计算机的发展又已经历了四代。 微处理器(CPU)的发展表述微型计算机的发展。
代数 时间 处理器位数 第一代 1971 4位和低档8位 第二代 1973 8位 第三代 1978 16位 第四代 1981 32位
单片机入门知识-PIC为例
9 2019/11/19
PIC 单片机的特色
寻址方式简单
PIC系列单片机只有4种寻址方式 ——寄存器间接寻址、立即数寻址、直接寻址和位寻址 MCS-51 系列单片机则有7种寻址方式!
PIC 系列单片机代表着单片机发展的新动向
10 2019/11/19
PIC 单片机的特色
代码压缩率高
1K字节的存储器空间 ——PIC系列单片机能够存放1024条指令 ——MCS-51 系列单片机大约只能存放600条指令
PIC 系列单片机代表着单片机发展的新动向
8 2019/11/19
PIC 单片机的特色
精简指令集(RISC)技术
PIC系列单片机的指令系统只有35条指令,常用约20条 ——好学、易用;绝大多数为单周期指令,执行速度快! MCS-51系列单片机指令系统有111条指令!
PIC 系列单片机代表着单片机发展的新动向
一辆 RMW – 7 系列宝马轿车中嵌入了63片单片机。
MOTOROLA公司估计到2010年平均每人每天接触 到多达351片甚至更多的单片机。
单片机正名为:微控制器
——MCU ,MicroController Unit
3 2019/11/19
单片机概述
何为单片机:
将CPU、RAM、ROM、I/O等集成在一块集成电路 芯片上。
26 2019/11/19
PIC12F629/675系统结构与工作原理
PIC12F629/675简化结构框图
T1G T1CKI T0CKI
Flash程序 存储器 1K * 14
程序计数器PC 8级堆栈13位
RAM 寄存器 64*8
GP0/AN0/CIN+
指令寄存器 内部
PIC单片机第2章
PIC 16F87X microchip
FLASH型
端口A:RA(6线) 端口B:RB(8线) 端口C:RC(8线) 端口D:RD(8线) 端口E:RE(3线)
注:①只列出引脚的基本功能; ②28脚芯片只有RA、 RB 和RC端口。
返回本章目录
大连理工大学 电工电子实验中心 陈育斌
在了解PIC16F877的引脚时,要注意两点:
RB5
RB6 / PGC RB7 / PGD
38
39 40
大连理工大学 电工电子实验中心 陈育斌
引脚名称
PID 类型
复用功能说明
端口C:输入/输出可编程双向端口,此外还有第2、3 功能。 RC0/T1OSO/T1CK I RC1/T1OSI/CCP2 RC2/CCP1 RC3/SCK/SCL RC4/SDI/SDA 15 I/O TMR1的震荡输入 / 时钟输出
大连理工大学 电工电子实验中心 陈育斌
结构图
16.起振延时电路:当芯片上电延时后,该电路再提供一个1024个时钟周 期的延时,以保证振荡器有足够的时间来产生稳定的时钟信号; 17.看门狗定时器WDT:自带RC振荡器时钟源的定时器。用来监视程序 的运行状态。如果因某种原因使程序“脱离了”正常的“轨道” 而 “死机”时,能够强行将CPU复位,使系统从0000开始重新执行程 序。 18.欠压复位电路:当芯片的电源电压低于某个值时,CPU将不能正确的 执行指令,这样系统将会产生不可想象的后果。为了防止这种情况的 发生,PIC内部设立了电源监控电路,一旦电源电压低于某一个值时, 系统将自动产生复位,直到电源Vdd恢复正常后再延时72ms,CPU 才由复位状态转向运行状态。
引脚的“复用功能”;
1.
2.
PIC学习几个小知识点
1、芯片PIC16F877A:今天遇到了一个问题,不知道C语言不支持还是编译器不支持,具体是这样的,我在主函数中申明了一个数组,然后调用一个函数,将这个数组以形参的方式传入那个函数,传的是这个数组的地址,也就是形参是指针,在被调用的函数中,我这样处理这个指针行不行?
void main()
{
unsigned int Year,month_day,Week_Hour,Min_Sec;
RCFGCALbits.RTCPTR = 3;//指针指到年
Year = RTCVAL;//年
month_day = RTCVAL;//月日
Week_Hour = RTCVAL;//周时
*RAM_Addr++ = month_day & 0x00FF;
*RAM_Addr++ = (month_day & 0xFF00) >> 8;
*RAM_Addr++ = Year & 0x00FF;
}
不能省略Year,因为它每次都是自减的!
PIC学习小知识点
1、今天晚上搞了一个晚上,就PIC单片机,按键不知道为什么总是进S3,说明S3一直被按下,查了好半天才发现,S3接在了RB3上,RB3在用来仿真的时候是不能用的,它是一直被拉低的,所以一直S3是按下的!
2011.10.17学习:
在PIC的一些中、低端型号中,往往只有一个中断函数入口,而且没有中断优先级,这对于很多在学校学习89C51核出来的学生,往往给他们带来一定的学习障碍。
SinusoidalBLDC.c: In function '_T1Interrupt':
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
PIC单片机C语言编程简介用 C 语言来开发单片机系统软件最大的好处是编写代码效率高、软件调试直观、维护升级方便、代码的重复利用率高、便于跨平台的代码移植等等,因此 C 语言编程在单片机系统设计中已得到越来越广泛的运用。
针对PIC 单片机的软件开发,同样可以用 C 语言实现。
但在单片机上用 C 语言写程序和在PC 机上写程序绝对不能简单等同。
现在的PC 机资源十分丰富,运算能力强大,因此程序员在写PC 机的应用程序时几乎不用关心编译后的可执行代码在运行过程中需要占用多少系统资源,也基本不用担心运行效率有多高。
写单片机的 C 程序最关键的一点是单片机内的资源非常有限,控制的实时性要求又很高,因此,如果没有对单片机体系结构和硬件资源作详尽的了解,以笔者的愚见认为是无法写出高质量实用的 C 语言程序。
这就是为什么前面所有章节中的的示范代码全部用基础的汇编指令实现的原因,希望籍此能使读者对PIC 单片机的指令体系和硬件资源有深入了解,在这基础之上再来讨论 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 语言编程。
在此列出几个主要的针对PIC 单片机的 C 编译器相关连接网址,供读者参考:Hitech-PICC:IAR:CCS:/picc.shtmlByteCraft:/mpccaps.html本章将介绍Hitech-PICC 编译器的一些基本概念,由于篇幅所限将不涉及 C 语言的标准语法和基础知识介绍,因为在这些方面都有大量的书籍可以参考。
重点突出针对PIC 单片机的特点而所需要特别注意的地方。
11.2Hitech-PICC编译器PICC 基本上符合ANSI 标准,除了一点:它不支持函数的递归调用。
其主要原因是因为PIC 单片机特殊的堆栈结构。
在前面介绍PIC 单片机架构时已经详细说明了PIC 单片机中的堆栈是硬件实现的,其深度已随芯片而固定,无法实现需要大量堆栈操作的递归算法;另外在PIC 单片机中实现软件堆栈的效率也不是很高,为此,PICC 编译器采用一种叫做“静态覆盖”的技术以实现对 C 语言函数中的局部变量分配固定的地址空间。
经这样处理后产生出的机器代码效率很高,按笔者实际使用的体会,当代码量超过4K 字后,C 语言编译出的代码长度和全部用汇编代码实现时的差别已经不是很大(<10%),当然前提是在整个 C 代码编写过程中须时时处处注意所编写语句的效率,而如果没有对PIC 单片机的内核结构、各功能模块及其汇编指令深入了解,要做到这点是很难的。
11.3MPLAB-IDE内挂接PICCPICC 编译器可以直接挂接在MPLAB-IDE 集成开发平台下,实现一体化的编译连接和原代码调试。
使用MPLAB-IDE 内的调试工具ICE2000、ICD2 和软件模拟器都可以实现原代码级的程序调试,非常方便。
首先必须在你的计算机中安装PICC编译器,无论是完全版还是学习版都可以和MPLAB-IDE挂接。
安装成功后可以进入IDE,选择菜单项Project Set Language Tool Locations…,打开语言工具挂接设置对话框,如图11-1 所示:图11-1 MPLAB-IDE 语言工具设置对话框在对话框中选择“HI-TECH PICC Toolsuite”栏,展开可执行文件组“Executable”后,列出了将被MPLAB-IDE 后台调用的编译器所用到的所有可执行文件,其中有汇编编译器“PICC Assembler”、C 原程序编译器“PICC Compiler”和连接定位程序“PICC Linker”。
同时在此列表中还显示了对应的可执行程序名,请注意在这里都是“PICC.EXE”。
用鼠标分别点击选中这三项可执行文件,观察对话框下面“Location”一栏中显示的文件路径,用“Browse…”按纽,从计算机中已经安装的PICC 编译器文件夹中选择PICC.EXE 文件。
实际上PICC.EXE 只是一个调度管理程序,它会按照所输入的文件扩展名自动调用对应的编译器和连接器,用户要注意的是 C 语言原程序扩展名用“.c”,汇编原程序用“.as”即可。
工具挂接完成后,在建立项目时可以选择语言工具为“HI-TECH PICC”,具体步骤可以参阅第三章 3.1.3 节,此处不再重复。
项目建立完成后可以加入 C 或汇编原程序,也可以加入已有的库文件或已经编译的目标文件。
最常见的是只加入 C 原程序。
用 C 语言编程的好处是可以实现模块化编程。
程序编写者应尽量把相互独立的控制任务用多个独立的 C 原程序文件实现,如果程序量较大,一般不要把所有的代码写在一个文件内。
图11-2 列出的是笔者建立的一个项目中所有 C 原程序模块,其中主控、数值计算、I2C 总线操作、命令按键处理和液晶显示驱动等不同的功能分别在不同的独立的原程序模块中实现。
图11-2 C 语言多模块编程11.4PIC单片机的C语言原程序基本框架基于PICC 编译环境编写PIC 单片机程序的基本方式和标准 C 程序类似,程序一般由以下几个主要部分组成:&O1540; 在程序的最前面用#include 预处理指令引用包含头文件,其中必须包含一个编译器提供的“pic.h”文件,实现单片机内特殊寄存器和其它特殊符号的声明;&O1540; 用“__CONFIG”预处理指令定义芯片的配置位;&O1540; 声明本模块内被调用的所有函数的类型,PICC 将对所调用的函数进行严格的类型匹配检查;&O1540; 定义全局变量或符号替换;&O1540; 实现函数(子程序),特别注意main 函数必须是一个没有返回的死循环。
下面的例11-1 为一个 C 原程序的范例,供大家参考。
#include //包含单片机内部资源预定义#include “pc68.h” //包含自定义头文件//定义芯片工作时的配置位__CONFIG (HS & PROTECT & PWRTEN & BOREN & WDTDIS);//声明本模块中所调用的函数类型void SetSFR(void);void Clock(void);void KeyScan(void);void Measure(void);void LCD_Test(void);void LCD_Disp(unsigned char);//定义变量unsigned char second, minute, hour; bit flag1,flag2;//函数和子程序void main(void){SetSFR();PORTC = 0x00;TMR1H += TMR1H_CONST;LED1 = LED_OFF;LCD_Test();//程序工作主循环while(1) {asm(“clrwdt”);Clock();KeyScan();Measure();SetSFR();}}//清看门狗//更新时钟//扫描键盘//数据测量//刷新特殊功能寄存器11.5PICC中的变量定义例11-1 C 语言原程序框架举例11.5.1 PICC 中的基本变量类型PICC 遵循Little-endian 标准,多字节变量的低字节放在存储空间的低地址,高字节放在高地址。
11.5.2 PICC 中的高级变量基于表11-1 的基本变量,除了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;};例11-2 C 语言高级变量举例11.5.3 PICC 对数据寄存器bank 的管理为了使编译器产生最高效的机器码,PICC 把单片机中数据寄存器的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;bank3 float val[8];//变量定位在bank2 中//变量定位在bank3 中中档系列PIC 单片机数据寄存器的一个bank 大小为128 字节,刨去前面若干字节的特殊功能寄存器区域,在 C 语言中某一bank 内定义的变量字节总数不能超过可用RAM 字节数。
如果超过bank 容量,在最后连接时会报错,大致信息如下:Error[000] : Can't find 0x12C words for psect rbss_1 in segment BANK1连接器告诉你总共有0x12C(300)个字节准备放到bank1 中但bank1 容量不够。
显然,只有把一部分原本定位在bank1 中的变量改放到其它bank 中才能解决此问题。
虽然变量所在的bank 定位必须由编程员自己决定,但在编写原程序时进行变量存取操作前无需再特意编写设定bank 的指令。