PIC学习笔记.docx
- 文档编号:4498440
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:20
- 大小:24.62KB
PIC学习笔记.docx
《PIC学习笔记.docx》由会员分享,可在线阅读,更多相关《PIC学习笔记.docx(20页珍藏版)》请在冰豆网上搜索。
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、分频比为多少,这要根据你的需要来决定。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PIC 学习 笔记