1、PIC学习笔记1.串行异步通信将TXSTA寄存器的TXEN位置1可使能EUSART的发送器电路。清零TXSTA寄存器的SYNC位可将EUSART配置为异步操作。将RCSTA寄存器的SPEN位置1可使能EUSART并自动将TX/CKI/O引脚配置为输出。如果需要中断,将PIE1寄存器的TXIE中断允许位置1。如果INTCON寄存器的GIE和PEIE位也置1,则立即产生中断TXREG中有数据,而且串口还在传数据,这是TXIF才被清零,其他时间都为1TSR寄存器为空时,TRMT位置1,当有字符从TXREG传送到TSR寄存器时,该位清零TRISC=0;/设置IO通道,0-输出1-输入PORTC=0;/
2、IO口赋值操作/串口初始化函数voidInitUart(void)/配置发送状态7=内部时钟6=8位数据5=使能发送4=异步2=高速(重要)TXSTA=0b10100110;/1=使能串口RCSTA=0b10000000;/波特率设置4=16位波特率(与TXSTA第2位对应)BAUDCON=0b00001000;SPBRG=103;/4MHz9600Baud/TXIE=1;/允许串口中断/串口发送数据voidSendUart(unsignedchardat)TXREG=dat;while(!TRMT);串口接收:自动波特率检测:总结:波特率必须准确,虽然只用发送功能,但是接受寄存器RCSTA也
3、需设置,使能串口。PWM:标准PWM模式会在CCPx引脚上产生高达10位分辨率的脉宽调制(PWM)信号。由下列寄存器控制周期、占空比和分辨率:PRx寄存器TxCON寄存器CCPRxL寄存器CCPxCON寄存器对应位清零将放弃PWM控制权引脚需设置为输出配置CCPTMRSx寄存器的CxTSEL位可以选择要使用的Timer2/4/6定时器。CCPxM:CCPxCON:00(单输出)00(占空比低2位)1101(ECCPx模式选择位)0x0cCCPTMRSx:定时器0:可作为一个8位定时器或者8位计数器使用如果不使用预分频器,则Timer0模块在每个指令周期递增1。通过将选项寄存器的TMR0CS位清
4、零可选择8位定时器模式。定时器2:8位定时器和周期寄存器(分别称为TMRx和:PRx)TMRx与相应的PRx分别匹配时中断TxCON寄存器TxCKPS选择预分频比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/定时器初始化vo
5、idInitTimer2()INTCON=0x40;/允许外部中断PIE1=0x02;/1=允许Timer2与PR2匹配中断TMR2=0;/在每个时钟边沿递增计数,从00h开始PR2=100;/定时值T2CON=0x04;/后分频1:1预分频1:1允许Timer2定时器2中断函数unsignedintcnt;voidinterruptTimer2()unsignedintcnt;/把全局变量放在中断函数里定义定时器时间显得非常长if(TMR2IE&TMR2IF)/判断是否允许中断且定时器标志被置位TMR2IF=0;cnt+;if(5000=cnt)cnt=0;RA3=RA3;ADC:1.对应引
6、脚配置为模拟引脚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和ADRESL4.选择FRC时钟源,ADC可工作于休眠状态5.15.2.6A/D转换步骤
7、这是使用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
8、(未进行转换)1(使能ADC)00101001ADCON1:1(右对齐,高6位被置0)000(时钟选择位)0(无)0(负参考电压,VSS相连)00(正参考电压,与VDD相连)10000000ADRESH:AD转换结果的高字节ADRESL:AD转换结果的低字节/ADCInitvoidInitADC(void)ADCON0=0b00101001;/RB1为ADC输入ADCON1=0b10000000;/RB1配置为输入TRISB=0b00000010;/读ADC的值unsignedcharReadVoltage(void)GO_nDONE=1;while(GO_nDONE)continue;ret
9、urnADRESL;数模转换器(DAC)模块DACCON0寄存器的DACEN位置1来使能DACDACCON1:DAC有32种输出电压。这32种电压可使用寄存器的DACR位进行设置DACCON0:寄存器的DACLPS位置1可以禁止负电压源DACCON0:0(使能DAC)1(选择DAC正参考电压源)1(DAC电平从DACOUT输出)0(无)00(正电压源选择位-VDD)0(无)0(负电压源选择位-Vss)0b01100000DACCON1:000(无)4-0(DAC电压输出选择位)FVRCON:固定参考电压控制寄存器(bit3-2)CDAFVR:比较器和DAC固定参考电压选择位00=比较器和DAC
10、固定参考电压外设输出关闭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引脚都带有
11、一个上升沿检测器和一个下降沿检测器。要使某个引脚检测上升沿,必须将IOCBP寄存器中相应的IOCBPx位置1。要使某个引脚检测下降沿,必须将IOCBN寄存器中相应的IOCBNx位置1。通过分别将IOCBP寄存器中相应的IOCBPx位和IOCBN寄存器中相应的IOCBNx位置1,可将某个引脚配置为同时检测上升沿和下降沿。PIE1:外设中断允许寄存器1INTCON、PIR1、PIR2和PIR3寄存器外部中断触发方式设置:OPTION(0x00)寄存器的INTEDG位确定中断发生在哪个边沿。当INTEDG位置1时,上升沿将触发中断。当INTEDG位清零时,下降沿将触发中断。外部中断标志:INTFIN
12、TCON(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。定
13、时器:定时器0:8位定时器/计数器用到寄存器:OPTION_REG(设置分频)、TMR0(定时值)、INTCON(设置中断,标志位)/定时器0初始化voidInitTimer0()OPTION_REG=0b110000000;/Timer0选择位内部时钟源TMR0CS=0;/TMR0工作于定时器方式采用内部时钟Fose/4TMR0IE=1;/允许Timer0中断TMR0=0;TMR0IF=0;/清除TMR0的中断标志PSA=1;/TMR0不用分频通过将选项寄存器的TMR0CS位清零可选择8位定时器模式定时器1:16位定时器/计数器分别配置T1CON寄存器中的TMR1ON位和T1GCON寄存器中
14、的TMR1GE位可使能Timer1TMR1ONTMR1GETimer1工作状态00关闭01关闭10始终开启11使能计数时钟源选择:引脚说明:MCLR/Vpp:复位低电平有效RA3/AN3/Vref:AD参考电压输入RB0/INT/:外部中断预分频:T1CON寄存器的T1CKPS位控制该预分频计数器。中断:T1CON寄存器的TMR1ON位PIE1寄存器的TMR1IE位INTCON寄存器的PEIE位INTCON寄存器的GIE位在中断服务程序中将TMR1IF清零可以清除中断。捕捉/比较/PWM模块捕捉模式:该外设能对事件的持续时间计时比较模式:允许用户在达到预先设定的定时时间后触发一个外部事件PWM
15、模式:可产生频率和占空比都可变化的脉宽调制信号由下列寄存器控制周期、占空比和分辨率:PRx寄存器TxCON寄存器CCPRxL寄存器CCPxCON寄存器配置标准PWM1.TRISx设置对应PWM引脚为输出2.PRx装PWM周期值3.CCPxCON配置CCP模块工作于PWM模式4.CCPRxL与CCPxCON寄存器的DCxBx位,存放PWM占空比值5.CCPTMRSx中CxTSEL,选择生成PWMTimer2/4/6资源可编程死区延时模式:避免直通电流损坏桥式功率开关PWM脉冲转向模式:可在多个引脚上同时输出同一PWM信号脉冲转向同步:定义大数组的方法:在定义数组时,最好将数组定义在一个BANK内
16、。如果数组的值是常数,可以将其声明到程序存储区,如:constromcharch=“Hello”;MPLAB-C18支持大于256字节的数组,但需要修改连接文档(LinkerScript)C:mcc18lkr18f452.lkr,数组的扩展必须是相邻的bank,MicrochipPICmicro单片机C语言程序设计此区域必须加以保护以避免被其他的变量所使用,使用“PROTECTED”属性参数。程序模块:.口操作TRISA=0;/设置IO通道,0-输出1-输入PORTA=0;/IO口赋值操作.定时器:OPTION=0x07;INTCON=0xa0;TMR0=61;voidinterrupttim
17、e0()T0IF=0;/清楚中断标志位TMR0=61;intnum+;指令周期:PIC单片机的时钟经过内部分频,实际的工作频率为晶振频率的四分之一,同时指令的执行采用流水线方式,大部分的指令的执行时间是一个周期,所以在用4MHz的晶振时,指令执行的最大速度为1MIPS,即指令周期为1微秒。只有设置为异步计数器模式时,Timer1才能在休眠期间工作PORTA:是5位宽的双向端口TRISA:数据方向寄存器,TRISA=1PORTA为输入反之为输出上电复位时引脚默认为模拟输入,读为0PORTB:8位双向端口TRISB:数据方向寄存器,TRISB=1PORTB为输入反之为输出PORTB引脚有内部弱上拉
18、,端口被配置为输出时,弱上拉会自动关闭TMR0:Timer0模块寄存器只要有中断发生,相应中断标志位就会被置1ADC:低位有效,配置和使用ADC时必须考虑以下功能:端口配置通道选择ADC参考电压选择ADC转换时钟源中断控制ADC模块可在模数转换完成时产生中断。ADC中断标志位是PIR1寄存器中的ADIF位。ADC中断允许位是PIE1寄存器中的ADIE位。ADIF位必须用软件清零。器件运行或休眠时都可产生该中断。要使能ADC模块,ADCON0寄存器的ADON位必须设置为1将ADCON0寄存器的GO/DONE位设置为1将启动模数转换。转换完成转换完成时,ADC模块将:清零GO/DONE位将ADIF
19、标志位置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中断标志(如果已允
20、许中断则需要)中断:中断控制寄存器(INTCON)用标志位记录各种中断请求。同时还包括各个中断允许位和全局中断允许位PICC可以实现C语言的中断服务程序。中断服务程序有一个特殊的定义方法:voidinterruptISR(void);其中的函数名“ISR”可以改成任意合法的字母或数字组合,但其入口参数和返回参数类型必须是“void”型,亦即没有入口参数和返回参数,且中间必须有一个关键词“interrupt”。中断服务程序:voidinterruptISR(void)/中断服务程序if(T0IE&T0IF)/判TMR0中断T0IF=0;/清除TMR0中断标志/在此加入TMR0中断服务if(TMR
21、1IE&TMR1IF)/判TMR1中断TMR1IF=0;/清除TMR1中断标志/在此加入TMR1中断服务/中断结束并返回用“_CONFIG”预处理指令定义芯片的配置位;除了bank0内的变量声明时不需特殊处理外,定义在其它bank内的变量前面必须加上相应的bank序号,例如:bank1unsignedcharbuffer32;/变量定位在bank1中bank2bitflag1,flag2;/变量定位在bank2中bank3floatval8;/变量定位在bank3中PIC单片机的位操作指令是非常高效unionstructunsignedb0:1;unsignedb1:1;unsignedb2:
22、1;unsignedb3:1;unsignedb4:1;unsignedb5:1;unsigned:2;/最高两位保留oneBit;unsignedcharallBits;myFlag;定义位变量于同一字节需要存取其中某一位时可以myFlag.oneBit.b3=1;/b3位置1一次性将全部位清零时可以myFlag.allBits=0;/全部位变量清0当程序中把非位变量进行强制类型转换成位变量时,要注意编译器只对普通变量的最低位做判别:如果最低位是0,则转换成位变量0;如果最低位是1,则转换成位变量1变量的绝对位置定位:unsignedchartmpData0x20;/tmpData定位在地址
23、0x20中档系列PIC单片机的硬件堆栈深度为8级嵌入汇编代码:一行代码:asm(“clrwdt”);多行代码:#asmmovlw0x20movwf_FSRclrf_INDFincf_FSR,fbtfss_FSR,7goto$-3#endasm寄存器:INTCON:它包含TMR0寄存器溢出、RB端口电平变化和外部RB0/INT引脚中断等各种允许位和标志位PIR1:T1CON:ADCON0:OPTION:TRISA:TRISB:ADRES:AD转换后的值放于此C语言的位域:用于指定结构体或者联合体中成员在内存存储时所占用的位数。位域的使用主要出现在如下两种情况:(1)当机器可用内存空间较少而使用位
24、域可以大量节省内存时。如,当把结构作为大数组的元素时。(2)当需要把一结构或联合映射成某预定的组织结构时。例如,当需要访问字节内的特定位时。带位域的结构在内存中各个位域的存储方式取决于具体的编译程序;它们既可以从左到右,也可以从右到左存储。位域从低位开始书写数字滤波:在软件中对采集到的数据进行消除干扰处理,对数据进行平滑加工。采用算术平均值与统计学数据融合防脉冲干扰平均值滤波,去掉最高点和最低点预分频:拿计数器的预分频器来说吧,假如你不使用分频器,那么可能1us计数器加1(有使用的晶振大小决定),但是使用预分频器后就变成2us加1了(假设分频比预先设置为1:2的话),说到底就是为了增大计数的时间间隔。分频器的使用很简单,只须注意两点:1、决定用与不用,有的可以分配给其他的功能模块使用,而有的只能是把分频比设置为1:1。2、分频比为多少,这要根据你的需要来决定。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1