PIC学习笔记.docx

上传人:b****5 文档编号:4498440 上传时间:2022-12-01 格式:DOCX 页数:20 大小:24.62KB
下载 相关 举报
PIC学习笔记.docx_第1页
第1页 / 共20页
PIC学习笔记.docx_第2页
第2页 / 共20页
PIC学习笔记.docx_第3页
第3页 / 共20页
PIC学习笔记.docx_第4页
第4页 / 共20页
PIC学习笔记.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

PIC学习笔记.docx

《PIC学习笔记.docx》由会员分享,可在线阅读,更多相关《PIC学习笔记.docx(20页珍藏版)》请在冰豆网上搜索。

PIC学习笔记.docx

PIC学习笔记

1. 串行异步通信

将TXSTA寄存器的 TXEN 位置 1 可使能 EUSART 的发送器电路。

清零 TXSTA寄存器的 SYNC 位可将 EUSART配置为异步操作。

将 RCSTA寄存器的 SPEN 位置 1 可使能 EUSART 并自动将 TX/CK I/O 引脚配置为输出。

如果需要中断,将PIE1寄存器的TXIE中断允许位置1。

如果 INTCON 寄存器的GIE 和PEIE位也置1,则立即产生中断

 

TXREG中有数据,而且串口还在传数据,这是TXIF才被清零,其他时间都为1

 

TSR 寄存器为空时,TRMT 位置1,当有字符从TXREG传送到TSR寄存器时,该位清零

 

TRISC = 0; //设置IO通道, 0->输出  1->输入

PORTC = 0; //IO口赋值操作

 

//串口初始化 函数

void InitUart(void)

{

//配置发送状态 7=内部时钟 6=8位数据 5=使能发送 4=异步 2=高速(重要)

TXSTA = 0b10100110;

//1=使能串口

RCSTA = 0b10000000;

//波特率设置  4=16位波特率(与TXSTA 第2位对应)

BAUDCON = 0b00001000;

SPBRG = 103; //4MHz  9600 Baud

//TXIE = 1; //允许串口中断

}

 

 

//串口发送数据

void SendUart(unsigned char dat)

{

TXREG = dat; 

while(!

TRMT);

 

}

 

串口接收:

 

自动波特率检测:

 

 

总结:

波特率必须准确,虽然只用发送功能,但是接受寄存器RCSTA也需设置,使能串口。

 

 

PWM:

标准PWM 模式会在 CCPx 引脚上产生高达 10位分辨率的脉宽调制(PWM)信号。

由下列寄存器控制周期、占空比和分辨率:

• PRx 寄存器

• TxCON 寄存器

• CCPRxL 寄存器

• CCPxCON 寄存器     对应位清零将放弃PWM控制权

引脚需设置为输出

配置CCPTMRSx 寄存器的 CxTSEL<1:

0>位可以选择要使用的 Timer2/4/6 定时器。

 

CCPxM:

 

CCPxCON:

 00(单输出)00(占空比低2位) 1101 (ECCPx模式选择位)  0x0c

 

CCPTMRSx:

 

定时器0:

可作为一个8位定时器或者8位计数器使用

如果不使用预分频器,则Timer0模块在每个指令周期递增1 。

通过将选项寄存器的 TMR0CS位清零可选择8位定时器模式。

 

 

定时器2:

8 位定时器和周期寄存器(分别称为TMRx 和:

PRx )

TMRx 与相应的PRx 分别匹配时中断

TxCON 寄存器 TxCKPS<1:

0>  选择预分频比

TMRx   在每个时钟边沿递增计数,从00h 开始。

 

该计数器可使 PIRx寄存器中的 TMRxIF 即 TMRx匹配中断标志位置 1。

 将TMRx 匹配中断允许位(PIEx寄存器的 TMRxIE)置 1 来允许中断

 

TxCON:

 Timer2 控制寄存器

0(无) 0000(后分频比1:

1)1(TMRxON,使能定时器) 00(TxCKPS预分频选择:

1)

 

CCPxCON:

 CCPx控制寄存器

 

INTCON:

 中断控制寄存器

 

T2CON:

 设置分频, 允许timer2

 

//定时器  初始化

void InitTimer2()

{

INTCON = 0x40; //允许外部中断

PIE1 = 0x02; //1 = 允许Timer2与PR2 匹配中断

TMR2 = 0; //在每个时钟边沿递增计数,从00h 开始

PR2 = 100; //定时值

T2CON = 0x04; //后分频1:

1  预分频 1:

1  允许Timer2

}

 

定时器2 中断函数

unsigned int cnt;

 

void interrupt Timer2()

{

unsigned int cnt; //把全局变量放在中断函数里定义 定时器时间显得非常长

if(TMR2IE && TMR2IF) //判断是否允许中断 且 定时器标志被置位

{

TMR2IF = 0;

cnt++;

if(5000 == cnt)

{

cnt = 0;

RA3 = ~RA3;

}

 

}

}

 

 

ADC:

1. 对应引脚配置为模拟引脚

ADCON1寄存器的ADCS

位进行选择。

有以下7 种时钟频率可供选择:

 

2. ADC中断标志位是PIR1寄存器中的ADIF位。

ADC中断允许位是PIE1寄存器中的ADIE 位。

必须用软件将ADIF位清零

 

2. 10位A/D 转换的结果可采用两种格式:

左对齐或右对齐。

ADCON1寄存器的ADFM 位控制输出格式。

 

3. 要使能ADC模块,必须将ADCON0寄存器的ADON位设置为1。

将ADCN0寄存器的GO/DONE 位设置为1 可启动模数转换

 

3. 转换完成后,清零GO/DONE位、ADIF标志位置1、更新ADRESH和ADRESL

 

4. 选择 F RC 时钟源,ADC可工作于休眠状态

 

5.

15.2.6 A/D 转换步骤

这是使用ADC执行模数转换的示例步骤:

1. 配置端口:

•  禁用引脚输出驱动器(见TRIS寄存器)

•  将引脚配置为模拟引脚(见ANSEL寄存器)

2. 配置ADC模块:

•  选择ADC转换时钟

•  配置参考电压

•  选择ADC输入通道

•  启动ADC模块

3. 配置ADC中断(可选):

•  清零ADC中断标志

•  允许ADC中断

•  允许外设中断

•  允许全局中断

(1)

4. 等待所需的采集时间

(2)

5. 通过将GO/DONE 位置1 来启动转换。

6. 通过以下任一方式等待ADC转换完成:

•  查询GO/DONE 位

•  等待ADC中断(中断被允许)

7. 读ADC结果。

8. 清零ADC中断标志(如果中断被允许的话,必

需进行此操作)。

 

ADCON0:

 0(无)01010(通道10,AN10)0(未进行转换)1(使能ADC)  00101001

ADCON1:

  1(右对齐,高6位被置0)000(时钟选择位)0(无)0(负参考电压,VSS相连)00(正参考电压,与VDD相连)    10000000

ADRESH:

 AD转换结果的高字节

ADRESL:

 AD转换结果的低字节

 

//ADC Init

void InitADC(void)

{

ADCON0 = 0b00101001; //RB1 为ADC输入

ADCON1 = 0b10000000;

 

//RB1 配置为输入

TRISB = 0b00000010;

}

 

//读ADC的值

unsigned char ReadVoltage(void)

{

GO_nDONE = 1;

while(GO_nDONE)

continue;

return ADRESL;

}

 

数模转换器(DAC)模块

DACCON0 寄存器的DACEN位置1 来使能DAC

 

 

DACCON1:

DAC有32种输出电压。

这32种电压可使用寄存器的DACR<4:

0>位进行设置

DACCON0:

寄存器的 DACLPS 位置 1 可以禁止负电压源

 

DACCON0:

 0(使能DAC)1(选择DAC正参考电压源)1(DAC电平从DACOUT输出)  0(无)00(正电压源选择位-VDD)0(无)0(负电压源选择位-Vss)

0b01100000

DACCON1 :

 000(无) 4-0(DAC电压输出选择位)

 

FVRCON:

  固定参考电压控制寄存器(bit3-2)

CDAFVR<1:

0> :

比较器和DAC固定参考电压选择位

00 = 比较器和DAC固定参考电压外设输出关闭

01 = 比较器和DAC固定参考电压外设输出为1x(1.024V)

10 = 比较器和DAC固定参考电压外设输出为2x(2.048V)

11 = 比较器和DAC固定参考电压外设输出为4x(4.096V)

 

输出电压:

 

 

 

 

 

 

 

 

 

 

 

 

 

比较器模块:

两个模拟电压的大小并输出一个数字量以指示输入量的相对大小

CMxCON0 寄存器(见寄存器 17-1 )包含具有以下功能

的控制和状态位:

•  使能

•  输出选择

•  输出极性

•  速度/ 功耗选择

•  滞回电压使能

•  输出同步

CMxCON1 寄存器(见寄存器 17-2 )包含具有以下功能

的控制位:

•  中断允许

•  中断边沿极性

•  正输入通道选择

•  负输入通道选择

 

使能比较器:

 CMxCON0 的CxON位置1

 

 

中断:

每个 PORTB 引脚都带有一个上升沿检测器和一个下降沿检测器。

要使某个引脚检测上升沿,必须将IOCBP 寄存器中相应的 IOCBPx 位置 1。

要使某个引脚检测下降沿,必须将 IOCBN 寄存器中相应的 IOCBNx 位置 1。

通过分别将IOCBP寄存器中相应的IOCBPx 位和IOCBN寄存器中相应的IOCBNx 位置1,可将某个引脚配置为同时检测上升沿和下降沿。

 

PIE1:

外设中断允许寄存器1

 

INTCON 、PIR1、PIR2和PIR3寄存器

外部中断触发方式设置:

 OPTION (0x00)寄存器的INTEDG 位确定中断发生在哪个边沿。

当INTEDG 位置1 时,上升沿将触发中断。

当 INTEDG 位清零时,下降沿将触发中断。

外部中断标志:

 INTF

 

INTCON(0x78):

  0(禁止所有中断)1(允许外部中断)1(允许timer0中断)1(允许外部中断)1(允许电平变化中断)0(timer0中断标志未溢出)0(外部中断标志未发生)0(电平变化标志位-未发生)

 

 

串口中断:

只要EUSART接收器使能且接收FIFO 中存在未读字符,PIR1寄存器的RCIF中断标志位就会置1。

RCIF中断标志位是只读位,不能用软件置1 或清零。

将以下位置1 可允许RCIF中断:

• PIE1 寄存器的RCIE中断允许位

• INTCON 寄存器的PEIE外设中断允许位

• INTCON 寄存器的GIE 全局中断允许位

当FIFO 中存在未读字符时,不管中断允许位的状态如何,RCIF中断标志位都会置1。

 

定时器:

定时器0:

 8位定时器/计数器  用到寄存器:

OPTION_REG (设置分频)、TMR0(定时值)、INTCON(设置中断,标志位)

//定时器0  初始化

void InitTimer0()

{

 

OPTION_REG = 0b110000000; //Timer0选择位内部时钟源

 

TMR0CS = 0; //TMR0工作于定时器方式  采用内部时钟 Fose/4

TMR0IE = 1; //允许Timer0中断

TMR0 = 0;

TMR0IF = 0; //清除TMR0的中断标志 

PSA = 1;  //TMR0不用分频

 

}

 

通过将选项寄存器的 TMR0CS位清零可选择8位定时器模式

 

 

 

定时器1:

 16位定时器/计数器 

分别配置T1CON 寄存器中的TMR1ON位和T1GCON寄存器中的TMR1GE位可使能Timer1

 

 

TMR1ON   TMR1GETimer1   工作状态

   0             0            关闭

   0             1            关闭

   1             0            始终开启

   1             1            使能计数

 

时钟源选择:

 

引脚说明:

MCLR/Vpp:

 复位 低电平有效

RA3/AN3/Vref:

 AD参考电压输入

RB0/INT/:

 外部中断

 

预分频:

T1CON 寄存器的 T1CKPS 位控制该预分频计数器。

 

中断:

• T1CON 寄存器的TMR1ON位

• PIE1 寄存器的TMR1IE 位

• INTCON 寄存器的PEIE位

• INTCON 寄存器的GIE 位

在中断服务程序中将TMR1IF 清零可以清除中断。

 

 

捕捉/ 比较/PWM 模块

捕捉模式:

该外设能对事件的持续时间计时

比较模式:

允许用户在达到预先设定的定时时间后触发一个外部事件

PWM 模式:

可产生频率和占空比都可变化的脉宽调制信号

由下列寄存器控制周期、占空比和分辨率:

• PRx 寄存器

• TxCON 寄存器

• CCPRxL 寄存器

• CCPxCON 寄存器

 

配置标准PWM

1. TRISx设置对应PWM引脚为输出

2. PRx装PWM周期值

3. CCPxCON配置CCP模块工作于PWM模式

4. CCPRxL与CCPxCON寄存器的DCxBx位,存放PWM占空比值

5. CCPTMRSx中CxTSEL<1,0>,选择生成PWMTimer2/4/6资源

 

 

可编程死区延时模式:

避免直通电流损坏桥式功率开关

 

PWM脉冲转向模式:

可在多个引脚上同时输出同一PWM 信号

 

脉冲转向同步:

 

 

 

 

 

定义大数组的方法:

在定义数组时,最好将数组定义在一个BANK内。

如果数组的值是常数,可以将其声

明到程序存储区,如:

const rom char ch[]={“Hello”};MPLAB-C18支持大于256字节的数组,但需要修改连接文档(Linker Script) C:

\mcc18\lkr\18f452.lkr,数组的扩展必须是相邻的bank,Microchip PICmicro单片机C语言程序设计 此区域必须加以保护以避免被其他的变量所使用,使用“PROTECTED”属性参数。

 

 

 

程序模块:

1. IO口操作

TRISA = 0; //设置IO通道, 0->输出  1->输入

PORTA = 0; //IO口赋值操作

 

2. 定时器:

OPTION=0x07;

INTCON=0xa0;

TMR0=61;

 

void interrupt time0()

{

T0IF=0; //清楚中断标志位

TMR0=61;

intnum++;

}

 

指令周期:

PIC单片机的时钟经过内部分频,实际的工作频率为晶振频率的四分之一,同时指令的执行采用流水线方式,大部分的指令的执行时间是一个周期,所以在用4MHz的晶振时,指令执行的最大速度为1MIPS,即指令周期为1微秒。

 

 

只有设置为异步计数器模式时,Timer1才能在休眠期间工作

 

 

PORTA:

  是5位宽的双向端口

TRISA:

 数据方向寄存器, TRISA = 1  PORTA为输入  反之为输出

上电复位时引脚默认为模拟输入,读为0

 

PORTB:

 8位双向端口

TRISB:

 数据方向寄存器, TRISB = 1  PORTB为输入  反之为输出

PORTB引脚有内部弱上拉,端口被配置为输出时,弱上拉会自动关闭

 

TMR0:

 Timer0模块寄存器

只要有中断发生,相应中断标志位就会被置1

 

ADC:

 

ADCON1:

低3位有效,

配置和使用ADC时必须考虑以下功能:

• 端口配置

• 通道选择

•ADC参考电压选择

•ADC转换时钟源

• 中断控制

 

 

 

ADC模块可在模数转换完成时产生中断。

ADC中断标

志位是PIR1寄存器中的ADIF位。

ADC中断允许位是

PIE1寄存器中的ADIE位。

ADIF位必须用软件清零。

 

器件运行或休眠时都可产生该中断。

 

要使能ADC模块,ADCON0寄存器的ADON 位必须设置为1

 

将ADCON0寄存器的GO/DONE 位设置为1将启动模数转换。

 

转换完成

转换完成时,ADC模块将:

• 清零GO/DONE 位 

• 将ADIF标志位置1

• 用新的转换结果更新ADRES 寄存器

 

如果必须在转换完成前终止转换,可用软件将 GO/DONE 位清零

 

 

 

A/D 转换步骤

以下是用 ADC执行模数转换的示例步骤:

1. 配置端口:

• 禁止引脚输出驱动器(见TRIS寄存器)

• 将引脚配置为模拟

2. 配置ADC模块:

• 选择ADC转换时钟

• 配置参考电压

• 选择ADC输入通道

• 选择结果格式

• 开启ADC模块

3. 配置ADC中断(可选):

• 清零ADC中断标志

• 允许ADC中断

• 允许外设中断

• 允许全局中断

4. 等待所需采集时间

5. 通过将GO/DONE 位置1 启动转换。

6. 通过以下方式之一等待ADC转换完成:

• 查询GO/DONE 位

• 等待ADC中断(已允许中断)

7. 读取ADC结果

8. 清零ADC中断标志(如果已允许中断则需要)

 

 

中断:

中断控制寄存器(INTCON )用标志位记录各种中断请求。

同时还包括各个中断允许位和全局中断允许位

 

PICC可以实现C 语言的中断服务程序。

中断服务程序有一个特殊的定义方法:

 

void interrupt ISR(void); 

其中的函数名“ISR ”可以改成任意合法的字母或数字组合,但其入口参数和返回参数类型必须是“void ”型,亦即没有入口参数和返回参数,且中间必须有一个关键词“interrupt ”。

 

中断服务程序:

void  interrupt  ISR(void)  //中断服务程序 

   if (T0IE && T0IF)     //判TMR0 中断 

   { 

T0IF = 0;    // 清除TMR0 中断标志 

      //在此加入TMR0 中断服务 

   } 

   if (TMR1IE && TMR1IF)  //判TMR1 中断 

   { 

   TMR1IF = 0;   //清除TMR1 中断标志 

      //在此加入TMR1 中断服务 

   } 

}      //中断结束并返回

 

用“__CONFIG ”预处理指令定义芯片的配置位;

 

除了bank0 内的变量声明时不需特殊处理外,定义在其它bank 内的变量前面必须加上

相应的bank 序号,例如:

 

bank1 unsigned char buffer[32];    //变量定位在bank1中 

bank2 bit flag1,flag2;    //变量定位在bank2中 

bank3 float val[8];    //变量定位在bank3中

 

PIC 单片机的位操作指令是非常高效

 

union { 

   struct { 

      unsigned b0:

 1; 

      unsigned b1:

 1;   

      unsigned b2:

 1; 

      unsigned b3:

 1; 

      unsigned b4:

 1; 

      unsigned b5:

 1; 

      unsigned   :

 2;  //最高两位保留 

   } oneBit; 

   unsigned char allBits; 

} myFlag; 

定义位变量于同一字节 需要存取其中某一位时可以    myFlag.oneBit.b3=1; //b3 位置1 

一次性将全部位清零时可以     myFlag.allBits=0;   //全部位变量清0 

 

当程序中把非位变量进行强制类型转换成位变量时,要注意编译器只对普通变量的最低

位做判别:

如果最低位是 0 ,则转换成位变量 0 ;如果最低位是 1 ,则转换成位变量 1 

 

变量的绝对位置定位:

  unsigned char tmpData @ 0x20;  //tmpData定位在地址0x20

 

中档系列PIC 单片机的硬件堆栈深度为8 级

 

嵌入汇编代码:

一行代码:

 asm(“clrwdt”);

多行代码:

#asm 

   movlw    0x20 

   movwf    _FSR 

   clrf     _INDF 

   incf     _FSR,f 

   btfss    _FSR,7 

   goto     $-3 

#endasm

 

 

寄存器:

INTCON:

它包含TMR0 寄存器溢出、RB端口电平变化和外部RB0/INT 引脚中断等各种允许位和标志位

PIR1:

T1CON:

ADCON0:

OPTION:

TRISA:

TRISB:

ADRES:

 AD转换后的值放于此

 

 

 

 

 

 

 

C语言的位域:

用于指定结构体或者联合体中成员在内存存储时所占用的位数。

位域的使用主要出现在如下两种情况:

 

(1)当机器可用内存空间较少而使用位域可以大量节省内存时。

如,当把结构作为大数组的元素时。

 

(2)当需要把一结构或联合映射成某预定的组织结构时。

例如,当需要访问字节内的特定位时。

 

带位域的结构在内存中各个位域的存储方式取决于具体的编译程序;它们既可以从左到右,也可以从右到左存储。

 

位域从低位开始书写

 

数字滤波:

在软件中对采集到的数据进行消除干扰处理,对数据进行平滑加工。

采用算术平均值与统计学数据融合

防脉冲干扰平均值滤波,去掉最高点和最低点

 

 

预分频:

拿计数器的预分频器来说吧,假如你不使用分频器,那么可能1us计数器加1(有使用的晶振大小决定),但是使用预分频器后就变成2us加1了(假设分频比预先设置为1:

2的话),说到底就是为了增大计数的时间间隔。

 

 

分频器的使用很简单,只须注意两点:

 

 

1、决定用与不用,有的可以分配给其他的功能模块使用,而有的只能是把分频比设置为1:

1。

 

 

2、分频比为多少,这要根据你的需要来决定。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 高中教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1