PIC单片机培训资料

PIC单片机培训资料
PIC单片机培训资料

首届机器人大赛培训资料

——之PIC单片机

一、单片机概述

针对比赛项目的具体功能,对所用单片机模块进行介绍。前期知识准备

1引脚图说明(见附表单片机引脚图)

单片机工作在稳定的5V下,引脚输出的驱动能力强,拉出(流出)和灌入(注入)电流均达到了25mA,一般引脚都有第一、第二功能。如:17脚默认为I/O口功能RC2。还有闲置的输入I/O口不要悬空,要么接地要么接电源。

2、单片机对输入引脚高低电平的门限判别(TTL)

单片机采用二值逻辑(以二元集合{O,1}为变化元的逻辑系

统,即只有逻辑0和1,也就是我们平时说的高低电平)。对于

TTL电平,我们通俗地说,在4.5-5V之间为逻辑1,高电平:

在0V左右为逻辑0,低电平。(TTL标准有兴趣可上网查找了

解)

3、信号(用大小和逻辑来标识,信号类型为这次我们接触到的)

a、模拟信号可用连续的、不间断的、平滑曲线表示。

如右图:

b、数字信号中的开关信号如开关门一样,是两种泾渭

分明的状态:开、关,在这里只有逻辑0、1两种状态的信号。

数字信号中的脉冲信号,有一定频率的矩形波信号。如下图:

4、数据表示方式

程序中数据的表示有二进制0bxxxxxxxx,如:0b10100010;十进制如125,数字前没有前缀;八进制以0开头,如012;十六进制以0x开头或以H结尾,如0x0a2或67H。

5、单片机模块和寄存器的关系

单片机的模块都有不同的功能,要实现各自的功能,就需要进行一些相应的设置,在这里就设置相应的寄存器,如要实现RD口的输出高电平功能,设置TRISD=0X00;PORTD=0X0FF;

可见,从程序的角度看,单片机的引脚端口或功能模块就是一堆寄存器组成。

6、系统初始化,为何要进行系统初始化?

有两方面原因:从能耗上讲,不用的功能模块就不要使能,关掉节省能量。从要实现的功能上讲,需进行一些设置,系统才会工作。如下是单片机PIC16F877A的初始化程序段:

Void sys_init(void){

INTCON=0X00;//关掉总中断,根据情况是否使用中断进行

//相应设置,这次比赛我们都可以不采用中断,大家在遇见中断时,都对其复位处理.

/*下面就是各个模块的初始化*/

......}

7、程序是怎样运行的?

8、程序是怎样烧写的,关于在线编程是什么?

二、A/D 模块

1、灰度传感器输出信号类型分析

传感器粗略电路 简单串联电路如上图: 理想情况下,光从弱变强得到传感器输出的模拟信号(实际中有很多毛刺),如左图

2、怎样转换成单片机引脚可以识别的数字信号

这个过程就是由单片机内部的

A/D(analog-digital)模块实现的

a 、A/D 模块内容

Pic877a 单片机有8个用于A/D 转换通道的输入引脚,使用时须在I/O 端口的引脚的方向寄存器设为输入。引脚上的模拟信号经转换过后,可以得到与信号大小成正比的数值,范围在0-1023之间,这样会用到两个8位的寄存器来储存转换结果。A/D 模块 包含了ADCON0、ADCON1、ADRESH 、ADRESL 三个寄存器。

ADRESH :ADRESL 是用于存放AD 转换10位结果,在确定通道位后,读取它俩就会得到结果,ADRESH 中只有两位(bit0、bit1或bit6、bit7)有效。

ADCON0的ADCS1、ADCS0是AD 转换时钟选择位,控制转换器的时钟速度,它与信号输入引脚上采样保持时间、单片机工作时钟有关。(采样保持电路是由二极管、电阻、电容构成的RC 回路,输入信号进入引脚时快速充电,当电荷充饱保持电容后,电压就是模拟输入电压,电压器上电压就是AD 转换器的输入电

压值,这一个过程需要时间,也就是采样保持时间Tacq (芯片手册上Tacq 是19.72s μ),这之后就是AD 转换时间,10位转换要12AD T 时间,AD T 为AD 转换一位的时间,对PIC877A A D T 至少要1.6s μ。)。CHS2、CHS1、CHS0位的组合是选择转换通道哪一路为输入,同一时间只能处理一个AD 通道的输入,如有多路模拟信号输入时,就必须依次完成AD 转换后,重新设定新的AD 转换通道。GO/DONE 位是AD 转换状态显示位、AD 转换开始标志位。GO/DONE =1时启动AD 转换,就会按照寄存器设定进行完AD 转换,然后GO/DONE 清0,可以通过检测这个来判断AD 转换是否完成。注意:在设置通道和GO/DONE 之间必须让采样电容足够

充电。ADON 位是AD 转换的允许位,ADON=1表示打开转换器电源,该模块 可以工作,ADON=0,关闭整个转换器,此时它会消耗工作电流。ADCON0寄存器具体设置如下图:

---------------------------------------------------------------------------------------------------------------------------------------------------------- 小知识区:小程序,供大家了解程序编写过程:点亮流水灯 #include Void sys_init (){ INTCON=0X00;//关总中断 PIE1=0X00; TRISD=0X00;//方向寄存器设为输出

PORTD=0X00;//端口寄存器设为输出低电平 TRISC=0X00;} Void main(){ Sys_init();

PORTC=0X00;//拉低C 口 While(1){

PORTD=0X01; PORTD=PORTD<<1;//最低位右移一位 Delay();//500ms,请自定义于头文件 }

VR1

B40K130

VCC GND

S

}

ADCON1中ADFM用来设定转换结果在

ADRESH:ADRESL如何存放。ADFM=1结果右对齐,

ADFM=0结果左对齐。如右图所示:

比赛中AD转换结果只需要8位,可设ADFM=1,只

读取ADRESL的8位结果。PCFG3:PCFG0AD转

换引脚功能选择位,用来设置AD转换引脚的工作

模式(模拟功能、数字IO功能)和转换的基准电压

来源。

ADCON1寄存器具体设置如下

-----------------------------------------------------------------笔记区

----------------------------------------------------------------------------------------

b、AD模块使用流程如下:

3、和A/D有关的寄存器及初始

化如左图:

思考:A/D怎样初始化?

三、电机控制模块

1、怎样调速控制电机?

A、引导

单片机调速控制电机就如同流水带动水车,水流大,水车转速快,如果

我们让水流断断续续流动,那么水车也会流断断续续转动,这是我们宏观上看见

的现象,微观地看,应用在电机上,只是电机转动有惯性,我们看不出它断断续

续的转动。

可以看出我们也能用断断续续的有一定频率的电压脉冲信号去控制电机

的转动。其频率f=1/T,T为周期,Tr为运行周期,也就是驱动电机的高电平

持续时间。占空比=Tr/T. 如右图:

B、怎样产生周期时间T

Timer2定时器就可以产生这个周期时基T。我们使用它工作在定时器模式下,包含的寄存器有T2CON、PR2、TMR2三个。

TMR2寄存器是可读可写的,任何单片机复位都将对其清0,它是用于存放计数值的,定时器工作在定时器模式下,只能使用内部时钟来触发增量,在一定的(指令周期)时钟频率下从00H递增的(就比如现实中钟表的秒针一样,不停一走)。

PR2是周期寄存器,我们可以给它赋一个合适的值,TMR2寄存器的值同PR2寄存器的值相等时,(如果中断使能,就会响应中断)TMR2的值就会清0,又从00H开始下一个循环。(这里就好比我们给钟表定闹钟一样)。PR2也是可读写的,对它赋新值,要到下一次TMR2匹配PR2后才会生效。但是,PR2被复位后会被填入初值FFH。

T2CON寄存器是Timer2的控制寄存器,它包括预分频和后分频的设置,还有就是Timer2的使能位TMR2ON。关于预分频(有三种选择1:1,1:4,1:16),前几节说过程序执行有个指令周期,这个预分频就是将指令周期的频率分成几分之几,来触发TMR2的增量,分频的效果是频率小了周期大了,那样上图一个脉冲信号持续时间变长了。对于后分频,我们不使用中断,可以对它不进行设置,保持默认0状态。T2CON寄存器如下:

----------------------------------------------------------------------------------------------------------------------------------------------------------

创新区知识:无线技术、红外线技术、

这样设置好PR2的值,周期T就设定了。和Timer2有关的寄存器如图:

思考:Timer2怎样初始化?

C、怎样输出运行周期间的高电平

这由单片机的CCP模块的PWM(Pulse width Modulation)模式实现,CCP工作在PWM模式,需要设定CCP1CON=0X0C和CCP2CON=0X0C,并且CCP的两引脚也要设置为输出,即TRISC<1:2>位的设定。PWM 模式有CCPRxL、CCPRxH寄存器.

CCPRxL寄存器是用于存放运行周期Tr的值。在Timer2从0开始增量的过程中,TMR2的值会不停地和CCPRxL的值进行比较(比较器中),刚开始时时C1、C2输出高电平,直到TMR2的值等于CCPRxL 的值时,C1、C2输出低电平,TMR2会再增下去,到等于PR2的值时,TMR2值清0,开始下一个循环重新计数。当CCPRxL的值超过PR2的值时,就会一直输出高电平。

CCPRxH是个只读寄存器(就是我们不能操作的寄存器),其实当我们给CCPRxL赋值后,CCPRxL 会把这个值加载到CCPRxH,供PWM的比较器使用,所以它是CCPRxL的内部缓冲寄存器。

和PWM、Timer2有关的寄存器也有几个即:

思考:那么PWM怎样初始化?:

四、Proteus仿真软件和maplab编译环境介绍

1、怎样安装Proteus和mplab、怎样使用Proteus软件进行仿真操作、怎样编制程序?

五、实例分析

1、D口、C口驱动电机仿真分析

2、A/D模块仿真分析

3、Pwm模式仿真分析

附表:

相关主题
相关文档
最新文档