收藏 分销(赏)

第四章PIC16F877A功能及其编程.pptx

上传人:xrp****65 文档编号:12533716 上传时间:2025-10-26 格式:PPTX 页数:110 大小:651.42KB 下载积分:10 金币
下载 相关 举报
第四章PIC16F877A功能及其编程.pptx_第1页
第1页 / 共110页
第四章PIC16F877A功能及其编程.pptx_第2页
第2页 / 共110页


点击查看更多>>
资源描述
,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,福州大学电气工程与自动化学院,#,单击此处编辑母版标题样式,第四章,PIC16F877A,功能及其编程,制作:王骞,2015.9,4.1,输入输出端口,4.2,中断,4.3,定时,/,计数器,TMR0,4.4,定时,/,计数器,TMR1,4.5,定时,/,计数器,TMR2,4.6,A/D,转换器,4.7 CCP,模块,(Capture/Compare/PWM),4.8,异步串行通信(,USART,),4.9 EEPROM,的读写,4.10 SLEEP,工作方式,结束,4.1,输入输出端口,877A,有,33,根,IO,引脚。有,A,、,B,、,C,、,D,、,E,共,5,个端口,其中,A,端口的有,6,个引脚,,B,、,C,、,D,口各,8,个引脚,,E,口,3,个引脚。,各自端口的方向控制寄存器,TRISA,、,TRISB,、,TRISC,、,TRISD,、,TRISE,,控制其相应的端口是作为输出还是输入。,0,:输出;,1,:输入,所有的,I/O,端口,上电复位默认值均为,1,,即为输入口。,每个,IO,引脚的最大输出电流(拉电流)为,20mA,,最大输入电流(灌电流)为,25mA,。,端口,A,、,B,、,E,的最大输入电流总和与输出电流总和均为,200mA,;,端口,C,、,D,的最大输入电流总和与输出电流总和也为,200mA,。,对,I/O,端口的写操作是一个,读修改写,的过程。,一条写,IO,引脚的指令如,RB3=1,,实际上是在指令的开头读入整个,B,端口,并在指令周期的末尾时刻把,1,写入,RB,端口,3,的输出锁存器。,如果立即对同一端口操作,如,x=PORTB,,在指令周期的开始处,由于前一指令产生在,IO,口的电平尚未稳定,读入的可能是引脚的前一个状态而不是新状态值。,因此连续对同一端口的操作时,最好用一个,NOP,指令或者其他不访问该,I/O,端口的指令隔开。,RA3,1;,NOP();,RA4=0;,4.1.1,端口,A,因此,,在使用,RA,口时,除了要设置,TRISA,外,有时相关寄存器也要设置。,注意,:在,上电复位时,,,与,AN,有关的,端口的默认设置是作为,模拟端口,,即,ADCON1,(见,4.6,)中默认值为,0b00 xx0000,,这个值的设置结果是除,RA4,外的所有的,RA,引脚都,作为,模拟输入,。,1,、端口,B,有,8,个引脚,:,RB0/INT,:,IO,引脚、,INT,中断;,RB1,、,RB2,、,RB4,、,RB5,:,IO,引脚;,RB3/PGM,:,IO,引脚、低电压编程电压引脚;,RB6/PGC,:,IO,引脚、编程时钟线;,RB7/PGD,:,IO,引脚、编程数据线。,2,、如果使用,PIC KIT3,作为调试工具,,RB6,、,RB7,引脚将被调试系统占用,因此在调试时此二个引脚暂不能使用。,4.1.2,端口,B,3,、,8,个引脚具有内部弱上拉使能,控制,由,OPTION_REG,寄存器,的第,7,位,RBPU,控制,如果弱上拉使能,作为,输入,的,RB,口在端口悬空时将被上拉到高,电平。以,RB0,为例,如下图所示:,4,、,RB0/INT,具有外部中断功能。,5,、,RB,的的高,4,位还具有电平变化中断功能,当,RB4RB7,引脚做为输入时,只要有一个引脚的逻辑电平发生变化,就会使,RB,电平中断标志位置,1,。这些功能的设置,与,OPTION,、,INTCON,有关,参见相关各章节。,4.1.3,端口,C,RC0/T1OSO/,T1CKI,:,IO,引脚、,TMR1,振荡输出、,TMR1,外部脉冲输入;,RC1/T1OSI/,CCP2,:,IO,引脚、,TMR1,振荡输入、,CCP2,;,RC2/,CCP1,:,IO,引脚、,CCP1,;,RC3/SCK/SCL,:,IO,引脚、,SPI,的时钟线、,I2C,的时钟线,;,RC4/SDI/SDA,:,IO,引脚、,SPI,的数据输入、,I2C,的数据线;,RC5/SDO,:,IO,引脚、,SPI,的数据输出;,RC6/TX/CK,:,IO,引脚、异步串行通信的发送、同步串行通信的时钟线;,RC7/RX/DT,:,IO,引脚、异步串行通信的接收、同步串行通信的数据线。,4.1.4,端口,D,端口,D,有,8,个引脚,它除了作为普通,IO,口外,还能作为并行从动口使用。,4.1.5,端口,E,端口,E,只有,3,个引脚,它们都可以作为,AD,转换的模拟电压输入口,功能如下:,RE0/RD/AN5,:,IO,引脚、并行从动口的读控制、模拟电压输入通道,AN5,;,RE1/WR/AN6,:,IO,引脚、并行从动口的写控制、模拟电压输入通道,AN6,;,RE2/CS/AN7,:,IO,引脚、并行从动口的片选控制、模拟电压输入通道,AN7,。,返回目录,4.2,中断,中断的概念:正常程序运行时发生了事先设定的事件,需要暂停原来运行的程序而转到处理目前需要马上处理的事件。,中断的特点:可返回性。中断处理结束后必须能回到原先的程序,并且能继续运行原先的程序,这就需要在中断时能进行现场保护与恢复,。,中断的执行过程,中断发生:,程序执行到某行,突然事件(能够产生中断的事件)发生,产生中断。,断点保护:,CPU,自动将中断时刻即将要执行的下一条指令的地址压入堆栈。,中断响应:,CPU,自动将,PC,强制设为,0X0004,,且,GIE,0,。执行中断服务程序,(,自动完成现场保护与恢复,,手动清中断标志位,),。,中断返回:,程序执行到”,RETFIE”,时,按照后入先出的原则,自动从堆栈中弹出地址给,PC,,,GIE,1,,程序返回到中断前要执行的程序,程序恢复中断前程序的运行状态,。,PIC16F877A,有,15,个中断源,每个中断源都有自己的,使能控制位,(,IE,)和,中断标志位,(,IF,)。,中断逻辑示意图,只有在,SLEEP,状态下能运行的模块产生中断才能唤醒,SLEEP,。,中断,CPU,当前的程序,唤醒,CPU,(,如果当前处于睡眠模式,),PEIE,控制了,12,个中断源,与门:只有所有的输入为,1,,输出才为,1,或门:只要有一个输入为,1,,输出就为,1,EEIF,EEIE,PSPIF,PSPIE,ADIF,ADIE,RCIF,RCIE,TXIF,TXIE,SSPIF,SSPIE,CCP1IF,CCP1IE,CCP2IF,CCP2IE,TMR1IF,TMR1IE,TMR2IF,TMR2IE,BCLIF,BCLIE,T0IF,T0IE,INTF,INTE,RBIF,RBIE,PEIE,GIE,+,+,PSPIF,PSPIE,GIE,控制所有的中断源,bit7,bit6,bit5,bit4,bit3,bit2,bit1,bit0,GIE,PEIE,T0IE,INTE,RBIE,T0IF,INTF,RBIF,全局中断使能,外围中断使能,TMR0,溢出中断使能,外部触发中断使能,RB,口的高,4,位电平变化中断使能,TMR0,溢出中断标志,外部触发中断标志,RB,口的高,4,位电平变化中断标志,中断,控制,寄存器:,INTCON,相应,使能位为,1,,,允许中断;为,0,,禁止中断。,相应,标志位为,1,,表示有,中断发生,必须用软件清,0,。,bit7,bit6,bit5,bit4,bit3,bit2,bit1,bit0,PSPIE,ADIE,RCIE,TXTE,SSPIE,CCP1IE,TMR2IE,TMR1IE,RD,并行口中断,使能,AD,转换中断,使能,串行通信接收中断,使能,串行通信发送中断,使能,同步串行通信中断,使能,CCP1,模块,中断,使能,TMR2,溢出,中断,使能,TMR1,溢出,中断,使能,第一,外围中断控制寄存器,PIE1,:,bit7,bit6,bit5,bit4,bit3,bit2,bit1,bit0,PSPIF,ADIF,RCIF,TXTF,SSPIF,CCP1IF,TMR2IF,TMR1IF,RD,并行口中断,标志,AD,转换中断,标志,串行通信接收中断,标志,串行通信发送中断,标志,同步串行通信中断,标志,CCP1,模块,中断,标志,TMR2,溢出,中断,标志,TMR1,溢出,中断,标志,第一,外围中断标志寄存器,PIR1,:,bit7,bit6,bit5,bit4,bit3,bit2,bit1,bit0,CMIE,EEIE,BLCIE,CCP2IE,比较器中断,使能,EEPROM,写完成中断,使能,I,2,C,总线冲突中断使能,CCP2,模块,中断,使能,第二外围,中断控制寄存器,PIE2,:,bit7,bit6,bit5,bit4,bit3,bit2,bit1,bit0,CMIF,EEIF,BLCIF,CCP2IF,比较器中断标志位,EEPROM,写完成中断,标志,I,2,C,总线冲突中断标志,CCP2,模块,中断,标志,第二外围,中断标志寄存器,PIR2,:,Bit 7,Bit 6,Bit 5,Bit 4,Bit 3,Bit 2,Bit 1,Bit0,RBPU,INTEDG,T0CS,T0SE,PSA,PS2,PS1,PS0,选项寄存器,OPTION_REG,:,与中断直接相关的位为,INTEDG,,它涉及到外部中断(,RB0/INT,)的中断边沿选择,,0,为下降沿。,OPTION_REG=0b10111111;,/,等效,INTEDG=0,进入中断后硬件自动屏蔽全局中断,即中断后,GIE=0,,中断返回后自动恢复全局中断允许,,GIE=1,。,因此,,PIC16,单片机不允许中断嵌套!也就是说,在中断服务程序未退出时,即使有新的中断发生,也不能进入中断。等当前的中断处理完成退出中断后才能重新进入中断。,注意:,每按一次按键,,LED,翻转亮,/,例用,RB0/INT,按键,每按一下,,LED,翻转亮,#include,_CONFIG(0 x3F39);,#define LEDRB7,charA=0;/,全局变量,保存,LED,状态,void DELAY(unsigned int);,void interrupt ISR(void);,void main(void),OPTION_REG=0b00000000;/RB0,为下降沿触发中断,TRISB =0b00000001;/,设定,RB0,为输入,,RB7,为输出,INTCON=0b10010000;/,允许,RB0/INT,中断,LED=0;/,初始状态,LED,灭,while(1);/,原地等待,/=,中断服务程序,void interrupt ISR(void),if(INTF=1),DELAY(30);/,延时,30ms,躲过抖动时间,INTF=0;/,清中断标志位,须在延时之后!,LED=!LED;,/=,延时,(n)ms,,,4MHz,晶振下,void DELAY(unsigned int n),unsigned int j;,char k;,for(j=0;j0;k-),NOP();,以后此程序略,可参见附录:公用子程序。,返回目录,4.3,定时,/,计数器,TMR0,TMR0,是个,8,位,计数,/,定时器,自带可编程预分频器,可对,外部脉冲,计数或对,内部指令脉冲,计数(,1,:,11,:,256,),工作原理:,递加计数,。即由计数初值开始,每来若干个计数脉冲(和预分频比有关),计数值,+1,,直到,255,。若再加,1,,溢出,同时使计数当前值等于,0,TMR0,有溢出中断功能,,,T0IF,将自动置,1,若要对外部脉冲计数,必须,编程,OPTION_REG,,,(),置,1,编程,TRISA,,,RA4/T0CKI,引脚设置为输入,硬件电路:符合一定要求的外部脉冲送,RA4/T0CKI,与,TMR0,有关的寄存器,寄存器,名称,地址,各位定义,bit7,bit6,bit5,bit4,bit3,bit2,bit1,bit0,TMR0,01H,101H,8,位累加计数器,OPTION_,REG,81H,181H,T0CS,源选择,T0SE,沿选择,PSA,PS2,PS1,PS0,INTCON,0BH,GIE,T0IE,T0IF,TRISA,85H,TRISA4,TMR0,、,OPTION_REG,、,INTCON,、,TRISA,初值 控制字 中断 端口,OPTION_REG,分频器倍率选择位,PS2-PS0,TMR0,倍率,WDT,倍率,0 0 0,1:02,1:01,0 0 1,1:04,1:02,0 1 0,1:08,1:04,0 1 1,1:16,1:08,1 0 0,1:32,1:16,1 0 1,1:64,1:32,1 1 0,1:128,1:64,1 1 1,1:256,1:128,TMR0,的预分频系数范围为,2-256,如何获得,1,:,1,的倍率?,采用,4MHz,晶振,用,TMR0,最大延时多少?,例:假设晶振振荡频率,fosc=4MHz,,求,TMR0,最大延时时间是多少?,解:则指令周期,Tcy=1us,TMR0,的最大延时时间为:,256256Tcy=65536Tcy=65536us,。,TMR0,延时常数计算示例,例:假设现要延时,12ms,,即,12000us.,首先要先计算预分频系数,K,:,256KTcy=12000,,得,K=48.9,,,取比其大的预分频系数,64,。,再计算延时常数,X,:,(,256,X)KTcy=12000,,得,X=68.5,,四舍五入取整,X=69,。,即:,TMR0=69,在允许的情况下,分频比倍率越小越好,分辨率越高!,编程举例!,注意:在初始化编程中,TMRO,须赋初值!在程序适当的地方(如中断服务子程序中)还必须重装初值!,福州大学电气工程与自动化学院,4.4,定时,/,计数器,TMR1,TMR1,是由,2,个,8,位寄存器,TMR1H(0FH),、,TMR1L(0EH),组成的,16,位,计数,/,定时器,自带可编程预分频器,可对外部脉冲计数或对内部指令脉冲计数,(,分频比,1,、,2,、,4,、,8,),工作原理:递加计数。,其计数值由,0000H,到,0FFFFH,循环增加,当它从,0FFFFH,加,1,时变为,0000H,TMR1,有溢出中断功能,,PIR1.TMR1IF,将自动置,1,相关的寄存器有:,TRISC,、,TMR1H,、,TMR1L,、,T1CON,、,INTCON,若要对外部脉冲计数,必须,编程,T1CON,,,(),置,1,编程,TRISC,,,RC0/T1CKI,引脚设置为输入,硬件电路:符合一定要求的外部脉冲送,RC0/T1CKI,与,TMR0,不同的还有,它有一个,控制定时器走,/,停,的控制位,T1CON.TMR1ON,TMR1,还是,CCP,模块中的比较和捕捉工作的时基,(,参见,4.7,),bit7,bit6,bit5,bit4,bit3,bit2,bit1,bit0,T1CKPS1,T1CKPS0,T1OSCEN,T1SYNC,TMR1CS,TMR1ON,预分频系数,00,1:1,01,1:2,10,1:4,11,1:8,自带振荡器工作使能,同步控制设置,P184,时钟源选择,0,为内部时钟,停止或工作,1:,开始,0:,计时,TMR1,控制寄存器,T1CON,TMR1,延时常数的计算,例:假设单片机使用的晶振为,4M,,要求延时,100ms,。,解:,先求预分频系数,K,:,65536KTcy=1001000us,得,K=1.52,取,K=2,。,再求延时常数,X,:,(,65536-X)2Tcy=1001000,得,X=15536=3CB0H,即,TMR1H,3CH,,,TMR1L,0B0H,。,计算出初值后,要转换为十六进制,TMR1H=155368;TMR1L=15536;,读取,TMR1,当前值时要特别注意的问题:,在读取,TMR1H,、,TMR1L,的值时,要注意是否在读期间发生了从低字节向高字节进位。,假设当前,TRM1H,、,TMR1L,0 x01FF,,则在读取,TMR1,时就可能发生错误:,如先读低字节,得到,0 xFF,,假设此时发生进位,则再读高字节时得到,0 x02,,总的结果是,0 x2FF,,显然是错误的。,如先读高字节,得到,0 x01,,假设此时发生进位,则再读低字节得到,0 x00,,总的结果是,0 x100,,也是错误的。,如果允许的话,在读之前让,TMR1,停止计数;,如果不允许停止计数,则先读高字节,再读低字节,再读一次高字节,如果前后,2,次读的高字节不同,说明在读期间发生了进位,A=TMR1H;/,先读高字节,B=TMR1L;/,再读低字节,C=TMR1H;/,再读高字节,if(A=C)/,判断读期间是否发生从低字节向高字进位,X=(A8)+B;/,没有进位,就用第一次读高字节的结果,else,X=(C=1.6us,PIC16,系列单片机的,AD,采集时间,AD,转换过程:先打开,AD,通道,被转换电压对,AD,模块的保持电容充电,待电容充满电,才能进行,AD,转换,AD,采样时间,Tsamp=(,采集时间,Tacq)+(AD,转换时间,),采集时间,Tacq,:即充电时间,是由于内部的保持电容充电所要求的,,Tacq,要求在,20us,(AD,转换时间,)=(N+2)Tad=12Tad,,,N,为,AD,位数,N=10,除了以,RC,作为采样时钟外,,Tad,最小为,1.6us,。即在选择,AD,时钟时,要根据单片机的工作频率选取。常用,4M,晶振,选,8T,OSC,=2us1.6us,,满足要求!,Tad,与,PIC,单片机的最大工作频率,(,标准,F,型,),AD,时钟,Tad,最大工作频率,状态,ADCS2-ADCS0,2Tosc,000,1.25MHz,4Tosc,100,2.5MHz,8Tosc,001,5MHz,16Tosc,101,10MHz,32Tosc,010,20MHz,64Tosc,110,20MHz,内部,RC,(,1,、,2,、,3,),X11,注,1,注,1,:,RC,方式,AD,具有典型的,4us,,但其值在,2,6us,之间变化。,注,2,:当器件的频率超过,1MHz,时,,RC,只推荐在,sleep,下进行,AD,转换。,注,3,:对于低压器件(,LF,),应查阅相关资料。,bit7,bit6,bit5,bit4,bit3,bit2,bit1,bit0,ADFM,ADCS2,PCFG3,PCFG2,PCFG1,PCFG0,D,结果格式,0:,左对齐,1:,右对齐,D,时钟选择位,AD,转换器引脚功能及参考电压选择,见下页。,控制寄存器,ADCON1,AD,结果对齐示例,PCFG,AN7/RE2,AN6/RE1,AN5/RE0,AN4/RA5,AN3/RA3,AN2/RA2,AN1/RA1,AN0/RA0,Vref+,Vref-,通道数,/,参考数,0000,A,A,A,A,A,A,A,A,Vdd,Vss,8/0,0001,A,A,A,A,Vref+,A,A,A,RA3,Vss,7/1,0010,D,D,D,A,A,A,A,A,A,A,5/0,0011,D,D,D,A,Vref+,A,A,A,RA3,Vss,4/1,0100,D,D,D,D,A,D,A,A,Vdd,Vss,3/0,0101,D,D,D,D,Vref+,D,A,A,RA3,Vss,2/1,011X,D,D,D,D,D,D,D,D,-,-,0/0,1000,A,A,A,A,Vref+,Vref-,A,A,RA3,RA2,6/2,1001,D,D,A,A,A,A,A,A,Vdd,Vss,6/0,1010,D,D,A,A,Vref+,A,A,A,RA3,Vss,5/1,1011,D,D,A,A,Vref+,Vref-,A,A,RA3,RA2,4/2,1100,D,D,D,A,Vref+,Vref-,A,A,RA3,RA2,3/2,1101,D,D,D,D,Vref+,Vref-,A,A,RA3,RA2,2/2,1110,D,D,D,D,D,D,D,A,Vdd,Vss,1/0,1111,D,D,D,D,Vref+,Vref-,D,A,RA3,RA2,1/2,显然,上表的设计不是很合理,它不能由用户任意选定哪些引脚做,AD,转换,哪些引脚做普通,IO,口,在,PIC16F887,中已经对此进行了改进。,对,AD,参考电压与输入电压的要求,单位,V,名称,说明,最小值,最大值,Vref,Vref=(Vref+),(Vref-),2.0,Vdd+0.3,Vref+,参考电压正端,Vdd,2.5,Avdd+0.3,Vref-,参考电压负端,Vss,0.3,(Vref+),2.0,V,AIN,模拟输入电压,Vss,0.3,Vref+0.3,A/D,转换步骤,(,采用查询的方法,),1,禁止,A/D,中断,(PIE1.ADIE=0),;,2,设置有关的,I/O,口,:,TRISA,或,TRISE,设置为输入;,3,设置,ADCON1:,对模拟引脚,/,基准电压,/,数字,I/O,进行设置,选择,A/D,结果格式,;,4,设置,ADCON0:,选择,A/D,通道、时钟,A/D,模块使能;,5,延时约,20us:,使得输入电压对保持电容充电达到稳定;,6,启动,A/D,转换:,(,GO=1,);,7,等待,A/D,转换结束:,查询,(PIR1.ADIF=0,或,GO=1),PIR1.ADIF,软件清零,,GO,自动清零;,8,读,A/D,转换结果:,(,ADRESH,、,ADRESL,),AD,转换值输入模拟电压,Vin1023,(,V,ref+,V,ref-,),例:某一输入的模拟电压为,2V,,如果参考电压是,Vdd,GND,,,解:若,Vdd=5V,,,AD,值,21023,5,409,Vdd=2.5V,,,AD,值,21023,2.5,818,结论,:同样的输入电压,若参考电压不同,计算得到的数值(理论值)也不同。所以,要求参考电压要稳定!,返回目录,编程举例,4.7 CCP,模块,(Capture/Compare/PWM),共有两个,CCP,模块:,CCP1,、,CCP2,CCP,模块对应的引脚为,CCP1,RC2,,,CCP2,RC1,CCP,模块各有一个,16,位的可读写的寄存器,CCPRxH,、,CCPRxL,且各有相应的控制寄存器为,CCPxCON,与,CCP,有关的寄存器有:,TRISC,、,PORTC,、,CCP1CON,、,CCP2CON,、,CCPR1H,、,CCPR1L,、,CCPR2H,、,CCPR2L,、,中断相关的寄存器、以及,TMR1,TMR2,相关的寄存器,CCP1,和,CCP2,,除了,触发特殊事件,不同外,两者在功能上没有其他不同。因此,以下内容常以,CCP1,为例说明!,CCP,模块的时钟源,CCP,模式,时钟源,捕捉,(Capture),TMR1,比较,(Compare),TMR1,脉宽调制,(PWM),TMR2,bit7,bit6,bit5,bit4,bit3,bit2,bit1,bit0,CCP1X,CCP1Y,CCP1M3,CCP1M2,CCP1M1,CCP1M0,PWM,中的比较参数中的最低,2,位,其它模式未用。,CCP,模块的工作方式选择,见下页,控制寄存器,CCP1CON/CCP2CON,CCP,模块工作方式设置,CCP1M3-CCP1M0,工作方式,设定条件,响应状态,0000,关闭,CCP1,复位,0100,捕捉,每个脉冲下降沿,0101,捕捉,每个脉冲上升沿,0110,捕捉,每,4,个脉冲上升沿,0111,捕捉,每,16,个脉冲上升沿,1000,比较,输出匹配,CCP1,置高,1001,比较,输出匹配,CCP1,置低,1010,比较,输出匹配,软件中断,1011,比较,特殊事件触发,TMR1,清零,11XX,脉冲调制,条件匹配,4.7.1,捕捉模式,工作原理:有事先设定的事件在,RC2/CCP1,上发生时,,CCPR1H,、,CCPR1L,就捕捉,16,位寄存器,TMR1,的值,可以捕捉的事件为以下之一:,每个下降沿,每个上升沿,每,4,个上升沿,每,16,个上升沿,所谓捕捉,就是把当设定的事件发生时的,TMR1H,、,TMR1L,的值,自动,送给,CCPR1H,、,CCPR1L,。在此过程中,定时器,1,一直保持工作。,捕捉方式结构图,CCP1,引脚输入,捕捉开始,,TMR1,开始,计时,硬件自动把此时,TMR1,的值复制到,CCPR1,中,且,CCP1IF,1,例:每,4,个上升沿捕捉一次的工作情况,当产生一次捕捉时,相应的中断标志位被置,1,,必须由软件清,0,。,如果在一个捕捉未读取时又产生一个捕捉,则前一个捕捉值被取消。,在捕捉模式中,必须把,RC2/CCP1,(,PC1/CCP2,)定义成,输入,。,而,TMR1,必须定义为定时器或同步计数器,如果定义为异步计数器,则捕捉无法工作。,所谓同步计数器,指的是在一个指令周期中的,4,个 节拍中,,TMR1,可以在任何节拍时与外部脉冲同步加,1,,而异步计数时,,TMR1,都要等到指令周期结束时才加,1,。,说明:,如果,CCPx,从捕捉模式改变为其它模式时,会产生一个错误的捕捉中断,因此用户要先屏蔽其中断,即对,CCPxIE,清,0,。且在捕捉模式改变后对,CCPxIF,清,0,。,如果用户程序改变捕捉预分频率,也会产生一个错误的中断请求,且预分频器不会清,0,。以下的程序可以清预分频器并且不会引起错误的中断请求:,CCP1CON=0;/,关闭,CCP1,模块(,CCP1,复位),CCP1CON=NEW_CAPT_PS;/,选择新的预分频系数,编程举例,4.7.2,比较模式,工作原理:,CCPRxH,、,CCPRxL,不停地与,TMR1H,、,TMR1L,进行比较,当二者相等时,将在,CCPx(RC2/CCP1,RC1/CCP2),产生以下的事件:,1000:,CCPx,引脚输出高电平,,CCPxIF,置,1,1001:,CCPx,引脚输出低电平,,CCPxIF,置,1,1010:,CCPx,引脚状态不变,,CCPxIF,置,1,1011:,触发特殊事件,CCP1:,复位,TMR1,,,CCP1IF,置,1,CCP2:,复位,TMR1,,,自动启动,A/D,转换,(注:复位,TMR1,,即将,TMR1H,TMR1L,清零),4.7.2,比较模式,CCP2,触发特殊事件应用:要求在此之前先使能,A/D,模块,(ADON,位置,1),。触发时,,GO/DONE,位被自动置,1,,启动,A/D,转换。自动复位,TMR1,可实现,A/D,采集周期的自动重复。,在比较模式中,必须把,RC2/CCP1,(,PC1/CCP2,)定义成,输出,。,在本模式下,对,TMR1,的要求同捕捉模式,即要做为定时器或同步计数器。,4.7.2,比较模式,工作原理:,CCPRxH,、,CCPRxL,不停地与,TMR1H,、,TMR1L,进行比较,当二者相等时,将在,CCPx(RC2/CCP1,RC1/CCP2),产生以下的事件:,变为高电平,变为低电平,保持不变,触发特殊事件,在比较模式中,必须把,RC2/CCP1,(,PC1/CCP2,)定义成,输出,。,比较匹配时,,TMR1,清零,同时,PIRx.CCPxIF,被置,1,。,在本模式下,对,TMR1,的要求同捕捉模式,即要做为定时器或同步计数器。,比较方式结构图,TMR1,在工作,即,TMR1,值在增加。当,TMR1,值与,CCPRx,相等时便产生了匹配。,事先设定的,CCPRx,之值,触发特殊事件:不影响,CCPx,引脚状态,都会对,TMR1,清,0,,都不会对,TMR1IF,置,1,;,CCP1,和,CCP2,唯一的不同,:,CCP1,:置,CCP1IF,为,1;,CCP2,:置,CCP2IF,为,1,,启动,A/D,转换。,要求在此之前先使能,A/D,模块,(ADON,位置,1),。触发时,,GO/DONE,位被自动置,1,,启动,A/D,转换。复位,TMR1,可实现,A/D,采集周期的自动重复。,比较模式下触发特殊事件,编程举例,4.7.3,PWM,模式,在,PWM,模式下,,TMR2,为其时基。根据不同的设置值,从,CCPx,脚输出周期和脉宽一定的矩形波。,周期,Tp=(PR2)+1*4Tosc*(TMR2,预分频值,),脉宽,Td=DC1*Tosc*(TMR2,预分频值,),其中,DC1,=(CCPR1L:CCP1CON),10,位的数,PWM,模式参数计算,周期,Tp=(PR2)+1*4Tosc*(TMR2,预分频值,),脉宽,Td=DC1*Tosc*(TMR2,预分频值,),其中,DC1=(CCPR1L:CCP1CON),已知:周期,Tp,和脉宽,Td,解:,第一步计算周期:先假定,PR2=255,,,TMR2,预分频值查表选择略大于计算值的可选项再计算,PR2=?,第二步计算脉宽:利用上步计算得到的预分频值代入脉宽公式计算,DC1,(,10,位的数),PWM,编程步骤:,1.,将,PWM,的周期值写入,PR2,。,2.,将,PWM,的脉宽值写入,(CCPRxL,和,CCPxCON,),3.,设置,TRISC,使得,CCPx,为输出。,4.,设置,TMR2,预分频值,置,T2CON.TMR2ON=1,TMR2,开始计时。,5.,设置,CCPxCON,定义,CCPx,为,PWM,模式。,PWM,输出示意(,CCP1X=CCP1Y=0,),TMR2,1,PR2,,,CCP1,引脚置高电平,,TMR2,0,TMR2,CCPR1H,,,CCP1,引脚置低电平,。,TMR2,1,PR2,,,CCP1,引脚置高电平,,TMR2,0,返回目录,8,位工作循环周期值写入,CCPRxL,,当循环开始时,CCPx,输出,1,,,8,位数据,CCPRxL,就传送到,CCPRxH,中,,CCPRxH,与,TMR2,进行比较,相等时,CCPx,脚输出,0,,然后,TMR2,再与,PR2,比较,当,TMR2+1=PR2,时,CCPx,脚输出,1,,,TMR2,自动清,0,,不产生,CCPxIF,中断标志位,下一周期开始。,编程举例,4.8,异步串行通信(,USART,),可在单片机与单片机之间,单片机与计算机之间进行通信,异步串行通信是最常用的通信方法。,“异步”指的是在通信的每个字节之间的间隔时间可以不一样,但每一位的时间宽度是严格按照通信波特率要求的。,而同步通信要有一个同步脉冲信号,,每个字节中的每一位是要严格按通信时钟的上下沿的有关规定进行的。,“串行”指的是进行通信的每个字节是由一位一位发出或接收的。,它只需要,RX,,,TX,,,GND,三根线就可以进行通信。,RC7/RX,RC6/TX,是,877A,的异步串行通信脚。,与异步串行通信有关的寄存器有:,TRISC,、,PORTC,RCSTA,、,TXSTA,、,SPBRG,、,RCREG,、,TXREG,及中断相关的寄存器,INTCON,、,PIE1(RCIE,TXIE),、,PIR1(RCIF,TXIF),。,上图为发送一个,0 xEA(0b11101010),,采用偶校验的情况。,偶校验:,即发送的为,1,的位数必须为偶数,通过改变校验位使得整个帧中为,1,的位数为偶数。,奇校验:,就是调整校验位,使得发送的,1,帧数中为,1,的位数为奇数。,也可以采用校验位恒,1,恒,0,等方式。,例,4.14,奇偶校验程序,例:要求奇校验,有一个字符型变量,A,,判断其二进制数中,1,的个数,N,,如,N,为奇数,令,TX9D=0,,反之为,1,。,N=PARITY_CHECK(A);,If(N=1),TX9D=0;,else,TX9D=1;,/,奇偶校验,实际是计算字符型变量中,1,的个数,Char PARITY_CHECK(char X),char i,j=0;,for(i=0;i1;/,计算,1,位后整个数右移,1,位,下次仍判断,0,位,if(j&0 x01)=0,return(0);/j,是偶数,返回,0,else,return(1);/j,是奇数,返回,1,波特率设置,异步模式下,在,低速,时,即,TXSTA.BRGH=0,时,波特率计算公式为:,波特率,=Fosc/(64(X+1),高速,即,TXSTA.BRGH=1,时,波特率计算公式为:,波特率,=Fosc/(16(X+1),这里,X,为波特率因子,即,SPBRG,之值,,Fosc,为晶振的振荡频率。,应用:已知波特率,通过计算波特率因子,选择采用高速或低速方式(导致精度不同),波特率计算示例,例:已知晶振的振荡频率为,4MHz,拟采用,9600,波特率,解:,低速方式:,9600=4000000/(64(X+1),得,X=5.51,取,6,验证:,4000000/(64*(6+1)=8928.6,高速方式:,9600=4000000/(16(X+1),得,X=25.04,,取,25,验证:,4000000/(16*(25+1)=9615.4,比较二者的误差:,低速:,(8928.6-9600)/9600=-6.99%,高速:,(9615.4-9600)/9600=0.16%,对这种情况,选,高速,。,bit7,bit6,bit5,bit4,bit3,bit2,bit1,bit0,CSRC,TX9,TXEN,SYNC,-,BRGH,TRMT,TX9D,时钟源,选择,异步未用,发送,9,位数据,0:8,位,1:9,位,发送使能,0:,禁止,1:,使能,同步异步选择,0:,异步,1:,同步,高速波特率选择,0:,低速,1:,高速,发送移位寄存器,状态位,0:,满,1:,空,发送的第,9,位数据,0:,数,0,1:,数,1,TXSTA,:发送状态和控制寄存器,bit7,bit6,bit5,bit4,bit3,bit2,bit1,bit0,SPEN,RX9,SREN,CREN,ADDEN,FERR,OERR,RX9D,串口使能,0:,禁止,1:,使能,接收,9,位数据,0:8,位,1:9,位,异步不用,连续接收使能,0:,禁止,1:,使能,地址检测使能位,只选用于,9,位数据,0:,禁止,1:,使能,数据帧错误标志,0:,无错误,1:,发生错误,溢出错误标志,0:,无错误,1:,发生错误,接收的第,9,位数据,0:,数,0,1:,数,1,RCSTA,:接收状态和控制寄存器,注意:即便一个程序中不是同时包含接收和发送程序(也就是说只有接收或者只有发送功能),但是在程序中仍然要对,RCSTA,和,TXSTA,都进行定义!,福州大学电气工程与自动化学院,发送接收步骤,(,发送:查询方式;接收:中断方式,),禁止发送中断,允许接收中断;,由所要求的波特率计算、选择高速、低速方式,(TXSTA.BRGH),及波特率因子,SPBRG;,将,0b0X100Y00,送给,TXSTA,设置结果是发送允许,其中,X,根据要发送的数据位数,(8,或,9,位,),决定,,Y,由波特率计算误差判断决定是高速还是低速,;,将,0b1X010000,送给,RCSTA,,设置结果是串口使能,允许接收,其中,X,根据要发送的数据位数,(8,或,9,位,),决定;,如为,9,位数据,先把第,9,位数送入,TXSTA.TX9D,再把要发送的数送入,TXREG,,开始发送;,查询发送是否结束(,PIR1.TXIF=0,或,TXSTA.TRMT=0,),如结束,清,PIR1.TXIF,;,查询是否有接收中断标志,(PIR1.RCIF),如有,则读入,RCREG,,如为,9,位数据,还要读入第,9,位,(,在,RCSTA.RX9D),清接收中断标志。,编程示例,返回目录,EEPROM,是单片机应用中一个重要的资源,它的主要特点是在掉电时,数据,仍能保持不变,通常作为保存仪器
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 百科休闲 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服