Uploaded by emo

PIC单片机原理及应用-教案完整版

advertisement
《PIC 单片机原理及应用》教案
牛军浩 主编
桂林电子科技大学
《PIC 单片机原理及其应用》 牛军浩
第 1 章 PIC 单片机概述(1)
教学内容:PIC 单片机特点、资源
重点内容:哈佛(Harvard)总线结构、两级流水线、为什么驱动能力强?
难点内容:哈佛体系、哈佛总线
§1.1 PIC 单片机的 CPU 特点
1. 精简指令集技术 [代码利用率提高、执行速度提高、学习记忆快、节约开发时间]
2. 哈佛总线结构
哈佛体系结构:指程序存储器和数据存储器处于不同的物理空间,即两者不处于同一存储空间。
哈佛总线结构:指程序存储器和数据存储器独立编址,即两者位于不同的物理空间的结构。
图 1.1 冯*诺依曼结构(普林斯顿) 图 1.2 普通(哈佛体系)总线结构
图 1.3 哈佛总线结构
3. 单字节指令
单片机位数概念:单片机是多少位的取决于数据总线的位数,如常用的为 8 位,即数据宽度为 8
位,每次传送一个字节。例如:PIC16 系列主要为 8 位的,凌阳单片机 16 位,DSP、ARM 等基本
上为 32 位,计算机为 32 位,也有 64 位的。
作为冯*诺依曼结构和普通哈佛结构,程序存储器和数据总线公用,所以程序指令也是 8 位的;
但对 PIC 的哈佛总线结构而言,程序存储器使用独立指令总线,所以不受数据总线的限制,高中
低档单片机的指令长度分别为 16、14、12 位。
【位数越大,单次取指所含的信息就越多,执行效率越高,如 MCS51 为 8 位的指令长度,很多指
令必须要两次取指才能将一次执行所需的信息获取完毕】
4. 两级流水线指令结构
流水线是当前控制器中普遍采用的用于提高运算执行速度的方法,指的是处理器在处理一条指令
的同时可以对下一条要执行的指令进行预处理。这得益于哈佛总线结构的应用。
5. 寄存器结构【RAM 结构形式】
PIC 的所有寄存器、IO 口、定时器等资源,均采用 RAM 结构形式。只需一条指令周期即可完成
访问和操作。
§1.2 PIC 单片机的系列产品
1. 档次:按高中低,16 位、14 位、12 位
2. 管脚:最少 8 个引脚,14、18、20、28、40、80、84 等
3. 资源:ADC、PWM、比较器、LCD 显示、温度传感器、IIC、SPI、USART、CAN、USB、LAN
§1.3 PIC16F877 单片机的功能特点(外围模块)【以后讲解如不特别说明,均指 16F877 型号的单片机】
1. 功耗低:5V@4MHz 时电流小于 2mA,睡眠模式下电流小于 1uA。
2. 程序存储器容量:8K*14 位
3. RAM 存储器容量:368 字节
4. 驱动能力强:驱动输出电流可达 25mA,吸收电流达 20mA,而 51 IO 驱动电流为 uA 级的
5. 基本 IO 端口:33 个 IO 口,PA6 位,PB、PC、PD 为 8 位,PE 为 3 位
6. 定时、计数器:TMR0(8 位)、TMR1(16 位、CC)、TMR2(16 位、PWM)
第 4 页
《PIC 单片机原理及其应用》 牛军浩
7. 内部 EEPROM 数据存储器:256 字节
8. 片内看门狗:不需外部元件,节省成本和空间
9. 片上 ADC:8 个 10 位分辨率
10.
具有捕捉、比较和 PWM 模式:Capture 可捕捉外部输入脉冲的上升沿或下降沿,并产生中断。
用于测量外部信号周期、频率、脉宽。Compare 比较功能用于输出不同宽度的矩形脉冲和延时信
号;PWM 脉宽调制功能将产生占空比可调的周期性方波信号,可实现直流电机的调速、DA 及步
进电机的控制。
11.
同步串行口 SSP:SPI、IIC
12.
通用异步串行口 USART
13.
并行从动端口 PSP
作业:
PIC 单片机采用的哈佛总线结构和冯*诺依曼、普通的哈佛结构有什么区别,有何优点?
PIC16F877 单片机与普通 51 单片机相比有何优点,至少列出 5 条?
第 5 页
《PIC 单片机原理及其应用》 牛军浩
第 2 章 PIC 单片机的 CPU 和中断系统(1)
教学内容:PIC 单片机的基本环境设置、中断系统结构
重点内容:系统配置、中断系统结构
难点内容:系统配置、中断系统结构
§2.1 PIC 单片机的基本设置
1. 系统配置字
用于设定单片机的程序保护、在线调试、低压编程、掉电锁存复位使能位、上电定时、看门狗、
振荡器模式等基本的工作环境。由软件在烧写程序时设置,用户在程序中不能访问;
配置方式:使用软件上的选项进行选择、或者在程序中用“__CONFIG”预处理指令定义芯片的
配置位;
__CONFIG (HS & PROTECT & PWRTEN & BOREN & WDTDIS &DEBUGDIS);
设计时不用关心各个功能位的位置,只需执行软件选项,防止出错。
2. 振荡器配置
表 2.1 PIC 单片机的不同振荡方式
振荡方式
解释
频率范围
LP
低功耗
≤200KHZ
XT
标准晶体
200KHZ ≤
HS
高速晶体
4MHz≤
RC
阻容振荡
0≤
特点
≤4MHz
≤20MHz
≤4MHz
节约成本、频率不稳定
4.7K 22pF 时约为 4MHz
外部时钟
3. 复位
表 2.2 PIC 单片机的复位方式
复位方式
解释
上电复位
每次加电、检测 VDD 上升过程,上升到 1.6V~1.8V,有效复位,会自动延时
72mS+1024 个时钟周期
人工复位
通常使用按键
看门狗复位
为防止程序跑飞而有意安排的复位,必须周期性对看门狗 WDT 清零
欠压复位
工作电压跌落到 Vbor 以下的时间超过 200uS 时就会复位
VCC
DIODE1
1N4001
R1
10k
U1
R7
SW-PB1
reset
MCLR
C1
10uF
C2
VCC
22pf
C3
22pf
CR1
4M
PIC16F877A
100
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
VPP/MCLR
RA0
RA1
RA2
RA3
RA4
RA5
RE0/RD
RE1/WR
RE2/CS
VDD
VSS
OSC1/CLK1
OSC2/CLK0
RC0
RC1
RC2
RC3
RD0
RD1
RB7
PB6
RB5
RB4
RB3
RB2
RB1
RB0
VDD
VSS
RD7
RD6
RD5
RD4
RC7
RC6
RC5
RC4
RD3
RD2
40
39
38
37
36
35
34
33
32
31
30
29
28
27
26
25
24
23
22
21
RB7
RB6
RB5
RB4
RB3
RB2
RB1
RB0
VCC
*R1 电阻值应小于 40KHz,以保证
压降不大于 0.2V,MCLR 漏电流为
5uA
*R7 电阻取值为 100~1000 欧,用于
限流保护 MCLR 引脚
*D1 二极管能够使 C 能快速放电,
如果掉电又上电,C 的积累电荷会
造成复位电路失去作用
*MCLR 引脚不能悬空
图 2.1 复位电路和振荡电路
4. 看门狗
第 6 页
《PIC 单片机原理及其应用》 牛军浩
目的:增加系统的稳定性、可靠性和安全性,是一种亡羊补牢的措施,当单片机一旦发生程序失
控或者死机,设法把系统回复到正常工作状态。
造成程序失控的原因:电源电压的波动、电源电压叠加的噪声、电磁干扰、软件故障等
结构图:自带时钟源、定时周期 7~33ms,典型 18ms,可分频 1:128,达到 2.3s
正常情况:在主程序或者耗时较长的函数体内,周期性的“喂狗”CLRWDT
图 2.2 看门狗结构图
5. 睡眠模式
为了降低功耗的又一措施, sleep
§2.2 中断系统
1. 中断的概念:当 CPU 正在执行当前程序的过程中,由于某种突发事件的发生,CPU 暂停当前的操
作,转去执行对突发事件的处理程序,完成后,再返回原来被打断的地方继续执行。
2. 中断作用:对于主要的时间可以得到及时处理,可在实时性较高的程序中使用。
3. PIC16F877 的中断源
表 2.3 PIC 单片机的中断源
中断源种类
外部中断 INT
TMR0 溢出中断
TMR1 溢出中断
TMR2 溢出中断
RB 口电平变化中断
CCP1 中断
CCP2 中断
SCI 同步发送中断
SCI 同步接收中断
SSP
IIC 总线碰撞
AD
EEPROM 写操作
PSP 并行从口读写中断
标志位
INTF
T0IF
T1IF
T2IF
RBIF
CCPIIF
CCP2IF
TXIF
RCIF
中断使能位
INTE
T0IE
T1IE
T2IE
RBIE
CCP1IE
CCP2IE
TXIE
RCIE
4. PIC16F877 的中断逻辑
第 7 页
《PIC 单片机原理及其应用》 牛军浩
图 2.3 PIC16F877A 中断逻辑
5. 与中断相关的寄存器
名称
解释
内容
INTCON
中断控制寄存器
全局、外围、T0、RB、INT
PIE1
第一外设中断屏蔽寄存器
打开或者关闭中断用
PIR1
第一外设中断标志寄存器
存放中断标志用
PIE2
第二外设中断屏蔽寄存器
打开或者关闭中断用
PIR2
第二外设中断标志寄存器
存放中断标志用
OPTION
RBPU、INTEDG、T0CS
6. 常用中断介绍
(1) 外部中断(INT pin Interupt)
(2) TMR0 中断 0xFF->0x00
(3) RB 口电平变化中断
(4) TMR1 中断 0xFFFF->0x0000
(5) TMR2 中断 0xPR2->0x00
(6) CCP1 中断:捕捉模式、比较模式
(7) CCP2 中断
7.
#include <pic.h>
void main()
{
unsigned char key,sendkey;
OPTION = 0X00;
PIE1 = 0XFF;
TXIE = 1;
SSPIE =0;
INTCON = 0X80;
}
作业:
z 画出 PIC16F877A 单片机的中断逻辑图。并书写程序段,开放 PB 电平中断为上升沿,AD 使能和 SCI
中断。
z 列举 PIC16F877A 单片机的振荡方式,说明各振荡方式的工作频率范围。
z 画出单片机的基本复位电路、时钟电路,注明参数,并说明作用。
第 8 页
《PIC 单片机原理及其应用》 牛军浩
第 3 章 PIC 单片机的指令系统(2)
§3.1 PIC 汇编语言指令格式
每条汇编指令由 4 部分组成,格式如下:
标号
操作码助记符
操作数 1,操作数 2
;注释
1. 标号。代表指令的符号地址,为了便于查看、修改,以及指令转移地址的表示。切记不能与系统
的操作码助记符同名。可选项
2. 操作码助记符。必选项,可以是指令助记符、伪指令、宏指令。
3. 操作数。可选项,注意表示方式,0011001100B,0x0A,0AH,125O,213D
4. 注释。可选项,用来对程序进行注释,便于用户理解、修改和调试。用分号隔开
§3.2 PIC 汇编语言指令集
§3.3 伪操作指令
§3.4 寻址方式
第 9 页
《PIC 单片机原理及其应用》 牛军浩
第 5 章 IO 输入输出模块(2)
一、 IO 口分布
表 5.1
PIC16F877A 单片机 IO 口分布
端口名称
端口数量
复用功能
PA
6
模拟输入
PB
8
外部中断(RB0) 上拉
PC
8
定时器 1、CCP、SPI、USART
PD
8
并行从动端口
PE
3
并行从动端口、模拟输入
二、 IO 口使用注意事项
1. 使用时,必须设置输入输出方向
2. 作为 IO 使用时,必须关闭复用功能寄存器,默认上电为 IO 状态
3. 每个 IO 输入输出驱动能力为 20mA,可简化外围电路
4. 每个 IO 有嵌位保护电路(可防止外部输入超出电压范围)
三、 IO 口相关寄存器
1. TRISX 端口方向寄存器
2. PORTX 端口数据寄存器
3. OPTION 寄存器 BIT7-RBPU,RB 口上拉功能
四、 IO 口使用方法
1. 数据输入
Unsigned char Inputdata= 0;
BIT InputFlag = 0;
TRISB = 0xFF;
//设置端口输入输出方向,0 为输出,1 为输入
Inputdata = PORTB; //寄存器操作,读取外部端口 8 位状态数据
InputFlag = RB0;
//位操作,读取单个输入状态
2. 数据输出
Unsigned char Outputdata = 0x55;
TRISB = 0x00; //设置端口输入输出方向,0 为输出,1 为输入
PORTB = Outputdata; //设置外部端口状态数据
RB0 = 1;
五、 应用实例一、独立式按键输入
1. 独立式按键电路
VCC
VCC
DIODE1
1N4001
R10 R11 R12 R13
10k 10k 10k 10k
R1
10k
U1
R7
SW-PB1
reset
MCLR
C1
10uF
C2
VCC
22pf
C3
22pf
CR1
4M
PIC16F877A
100
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
VPP/MCLR
RA0
RA1
RA2
RA3
RA4
RA5
RE0/RD
RE1/WR
RE2/CS
VDD
VSS
OSC1/CLK1
OSC2/CLK0
RC0
RC1
RC2
RC3
RD0
RD1
图 5.1
RB7
PB6
RB5
RB4
RB3
RB2
RB1
RB0
VDD
VSS
RD7
RD6
RD5
RD4
RC7
RC6
RC5
RC4
RD3
RD2
40
39
38
37
36
35
34
33
32
31
30
29
28
27
26
25
24
23
22
21
RB7
RB6
RB5
RB4
RB3
RB2
RB1
RB0
SW-PB1
SW-PB1
SW-PB1
SW-PB1
KEY0
KEY1
KEY2
KEY3
VCC
独立式按键电路
第 10 页
《PIC 单片机原理及其应用》 牛军浩
电路原理:
在无按键的情况下:RB4~RB7 在上拉电阻(或者 RBPU)的作用下保持高电平。
当有键按下时,对应的单片机管脚输入为低电平;
当 RB4~RB7 中有低电平存在时,进行判断并执行相关程序。
2. 按键去抖
按键抖动过程:
通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,电压信号如下图。由于机械
触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。因而
在闭合及断开的瞬间均伴随有一连串的抖动,如下图。
图 5.2 按键抖动过程示意图
抖动时间:
抖动时间的长短由按键的机械特性决定,一般为 5ms~20ms,甚至 100ms。依据实际使用来定。
抖动危害:
按键稳定闭合时间的长短则是由操作人员的按键动作决定的,一般为零点几秒。键抖动会引起
一次按键被误读多次。
处理方法:
硬件去抖和软件去抖,硬件是在每个按键处添加 RS 触发器,成本高,设计麻烦。主要讲软
件方法通过延时去抖。
为确保 CPU 对键的一次闭合仅作一次处理,必须去除键抖动。在键闭合稳定时读取键的状态,
并且必须判别到键释放稳定后再作处理。
所以,所谓去抖并不是把按键的抖动消除了,而是通过延时避开抖动的时间。
实际去抖是否成功,需根据按键功能程序是否出现非正常重复处理来判定。
3. 程序编写流程
开始
设置RB口方向
读取RB口输入
设置RB口上拉
是否一致?
否
是
无
读取RB口输入
确定按键
有键按下?
执行按键执行程序
有
延时去抖
等待按键释放
图 5.2 按键扫描流程图
第 11 页
《PIC 单片机原理及其应用》 牛军浩
4. C 语言程序设计
#include <pic.h>
void DelayXms(int time);
unsigned char GetKeyNumber(unsigned char x);
void main()
{
unsigned char key,keytemp;
TRISB=0xf0;
//设置 RB 口的 0~3 方向
RBPU = 1;
//OPTION bit7 使能 RB 口弱上拉功能
while(1)
{
keytemp=PORTB&0xf0; //高四位的值即保留 RB4-RB7
if(keytemp!=0xf0)
{
DelayXms(125); //延时 125ms 消抖
if(keytemp == (PORTB&0xf0))
{
key = GetKeyNumber(keytemp);
//…………执行按键处理函数
while(PORTB&0xf0 != 0xF0);
}
}
}
}
void DelayXms(int time)
{
int x,y;
for(x=0;x<time;x++)
{
for(y=0;y<1000;y++);
}
}
unsigned char GetKeyNumber(unsigned char x)
{
unsigned char key;
switch(x)
{
case 0x70:
{key=1;break;}
case 0xB0:
{key=2;break;}
case 0xD0:
{key=3;break;}
case 0xE0:
{key=4;break;}
default:
{key=0xFF;break;}
}
return key;
}
备注
六、 应用实例二、采用中断方式处理按键输入
1. RB 口中断相关寄存器
INTCON:bit7GIE,bit3RBIE,bit0RBIF
2. 中断处理程序
void interrupt ISR(void) //中断服务程序 0x0004
{
if (RBIE && RBIF) //判 RB 口 中断
{
RBIF = 0; //清除 RB 口中断标志
//在此加入 TMR0 中断服务
}
if (T0IE && T0IF) //判 TMR0 中断
第 12 页
《PIC 单片机原理及其应用》 牛军浩
{
T0IF = 0; //清除 TMR0 中断标志
//在此加入 TMR0 中断服务
}
if (TMR1IE && TMR1IF) //判 TMR1 中断
{
TMR1IF = 0; //清除 TMR1 中断标志
//在此加入 TMR1 中断服务
}
} //中断结束并返回
3. 程序编写流程
中断处理
开始
是否RB中断?
否
是
设置RB口方向
读取RB口输入
延时去抖
设置RB口上拉
读取RB口输入
开放RB口中断
是否一致?
否
是
确定按键
总中断使能
执行按键执行程序
执行主程序
等待按键释放
中断返回
图 5.3 采用中断的按键处理程序
4. C 语言程序设计
#include <pic.h>
void DelayXms(int time);
unsigned char GetKeyNumber(unsigned char x);
unsigned char key,keytemp;
void main()
{
TRISB=0xf0;
RBPU = 1;
while(1)
{
}
备注
//设置 RB 口的 0~3 方向
//OPTION bit7 使能 RB 口弱上拉功能
}
void interrupt ISR(void) //中断服务程序
{
if (RBIE && RBIF) //判 RB 口 中断
{
RBIF = 0; //清除 RB 口中断标志
keytemp=PORTB&0xf0; //保留高四位的值即保留 RB4-RB7
if(keytemp!=0xf0)
{
DelayXms(125); //延时 125ms 消抖
if(keytemp == (PORTB&0xf0))
{
key = GetKeyNumber(keytemp);
//…………执行按键处理函数
第 13 页
《PIC 单片机原理及其应用》 牛军浩
while(PORTB&0xf0 != 0xF0);
}
}
}
}
第 14 页
《PIC 单片机原理及其应用》 牛军浩
七、 应用实例三:数码管控制设计
1、 数码管内部结构及工作原理
LED 数码管就是一组 LED 灯的排列。分共阳极和共阴极两种。
A
a
b
c
d
K
e
f
g
dp
a
b
c
DS?
10
9
8
5
4
2
3
7
d
e
f
g
dp
DS?
a
b
c
d
e
f
g
DP
1
6
A
A
10
9
8
5
4
2
3
7
Dpy Red-CA
a
b
c
d
e
f
g
DP
K
K
1
6
Dpy Red-CC
图 5.1 数码管结构图
2、 电路原理设计
VCC
DIODE1
5v
R1
10k
1k*8
MCLR
C8
10u
SW-PB1
reset
C1
VCC
22pf
C2
22pf
CR1
4M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
VPP/MCLR
RA0
RA1
RA2
RA3
RA4
RA5
RE0/RD
RE1/WR
RE2/CS
VDD
VSS
OSC1/CLK1
OSC2/CLK0
RC0
RC1
RC2
RC3
RD0
RD1
RB7
PB6
RB5
RB4
RB3
RB2
RB1
RB0
VDD
VSS
RD7
RD6
RD5
RD4
RC7
RC6
RC5
RC4
RD3
RD2
40
39
38
37
36
35
34
33
32
31
30
29
28
27
26
25
24
23
22
21
DS?
10
9
8
5
4
2
3
7
VCC
a
b
c
d
e
f
g
DP
A
A
VCC
1
6
Dpy Red-CA
PIC-16F877A
图 5.2 单个(共阳极)数码管控制电路图
注意:如果数码管为共阴极的,则公共端接地,如果是共阳极的,公共端接 VCC,注意限流电阻的位
置,不能放在公共端部分。
2、 程序流程设计
建立数码管位码表
设置端口方向
初始数据
取位码表
输出
延时
修改数据
图 5.3 程序设计流程图
第 15 页
《PIC 单片机原理及其应用》 牛军浩
3、 程序设计实现
#include <pic.h>
//table for Com-A SHMG
static volatile unsigned char table[11]=
{0xC0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,0x80,0x90,0xff};
// 0
1
2
3
4
5
6
7
8
9 全灭
void delayXms(unsigned int Xms) ;
void main()
{
unsigned char i;
TRISB = 0;
while(1)
{
for(i=0;i<10;i++)
{
PORTB = table[i];
//PORTB = ~table[i]; for Com-K SHMG
delayXms(1000);
}
}
}
void delayXms(unsigned int Xms)
{
unsigned int i,j;
for(i =0;i<Xms;i++)
for(j =0;j<90;j++);
}
注意:如果使用的是共阴极的数码管,在不需更改位码表内容,只需将 PORTB = table[i];改为 PORTB
= ~table[i];即可
应用实例三:多个数码管控制设计
1、电路设计
VCC
DIODE1
5v
R1
10k
1k*8
MCLR
C1
10u
SW-PB1
reset
C2
VCC
22pf
CR1
4M
C3
22pf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
VPP/MCLR
RA0
RA1
RA2
RA3
RA4
RA5
RE0/RD
RE1/WR
RE2/CS
VDD
VSS
OSC1/CLK1
OSC2/CLK0
RC0
RC1
RC2
RC3
RD0
RD1
RB7
PB6
RB5
RB4
RB3
RB2
RB1
RB0
VDD
VSS
RD7
RD6
RD5
RD4
RC7
RC6
RC5
RC4
RD3
RD2
40
39
38
37
36
35
34
33
32
31
30
29
28
27
26
25
24
23
22
21
DS1
10
9
8
5
4
2
3
7
VCC
DS2
a
b
c
d
e
f
g
DP
A
A
Dpy Red-CA
1
6
10
9
8
5
4
2
3
7
a
b
c
d
e
f
g
DP
Q1
9012
1
6
Dpy Red-CA
VCC
4.7K
DS3
A
A
10
9
8
5
4
2
3
7
A
A
1
6
Dpy Red-CA
VCC
4.7K
DS4
a
b
c
d
e
f
g
DP
Q2
9012
10
9
8
5
4
2
3
7
a
b
c
d
e
f
g
DP
1
6
Dpy Red-CA
VCC
4.7K
A
A
Q3
9012
VCC
4.7K
Q4
9012
PIC-1
图 5.4 多个(共阳极)数码管控制电路图
2、程序流程
第 16 页
《PIC 单片机原理及其应用》 牛军浩
图 5.5 多个(共阳极)数码管控制流程图
3、程序设计实现
//多个数码管显示实例
//PORTB[0..7] --------[a..dp]
//PORTD[0..3] -------CS[3..0]
#include <pic.h>
//table for Com-A SHMG
static volatile unsigned char table[11]=
{0xC0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,0x80,0x90,0xff};
// 0
1
2
3
4
5
6
7
8
9 全灭
void delayXms(unsigned int Xms) ;
void main()
{
int i;
int loopnum;
unsigned char cQian,cBai,cShi,cGe;
TRISB = 0;
TRISD = 0;
while(1)
{
for(i=0;i<10000;i++)
{
cQian = i/1000;
cBai
= (i%1000)/100;
cShi = (i%100)/10;
cGe
= (i%10);
for(loopnum=0;loopnum<60;loopnum++)
{
PORTB = table[cQian];
PORTD = 0x07;
delayXms(10);
PORTB = table[cBai];
PORTD = 0x0B;
delayXms(10);
PORTB = table[cShi];
PORTD = 0x0D;
delayXms(10);
PORTB = table[cGe];
PORTD = 0x0E;
delayXms(10);
}
第 17 页
《PIC 单片机原理及其应用》 牛军浩
}
}
}
void delayXms(unsigned int Xms) //@4MHz
{
unsigned int i,j;
for(i =0;i<Xms;i++)
for(j =0;j<90;j++);
}
应用实例四:继电器控制电路
通常采用 PNP 管进行驱动、NPN 管
第 18 页
《PIC 单片机原理及其应用》 牛军浩
第 7 章 定时器/计数器模块(4)
一、 定时器/计数器模块用途
1、按一定周期控制输出
如空调变频控制、VCD、光驱、照相机镜头、打印机、传真机、遥控玩具车等步进电机的控制。也可
以用软件延时的方法实现,但是耗费 CPU 的时间,而且在插入其他功能程序后,延时长度会被破坏,造
成时间不准确。
2、检测外部信号的脉宽、周期等
3、计数用,对外部事件产生的触发信号进行准确计数。
二、 16F877A 单片机的 TMR 构成
1、TMR0、TMR1、TMR2 三个定时器
2、TMR0:8 位宽、可选预分频器、通用目的
3、TMR1:16 位宽、可编程预分频器、可选低频时钟、适合 CCP 配合使用
4、TMR2:16 位宽、可编程预分频器、可编程后分频器、周期寄存器和比较器、适合 CCP 配合实现
PWM
三、 定时器 TMR0 工作原理
图 7.1 TMR0 的工作原理图
四、 定时器 TMR0 相关寄存器
1、OPTION 寄存器
表 7.1
OPTION 控制寄存器
Bit7
6
5
4
3
2
1
0
RBPU
INTEDG
T0CS
T0SE
PSA
PS2
PS1
PS0
RBPU:PORTB 内部弱上拉设置,低电平有效
INTEDG:外部中断边沿选择,0:RB0/INT 下降沿触发中断;1:上升沿中断
T0CS:TMR0 时钟源选择位,0:内部提供的指令周期;1:T0CK 引脚输入
T0SE:TMR0 时钟边沿选择位,(外部时钟时,即 T0CS=1 时有效),0:上升沿,1:下降沿
PSA:分频器分配位,0:分配给 TMR0;1:分配给 WDT
PS2~PS0:分频器分频比选择,
第 19 页
《PIC 单片机原理及其应用》 牛军浩
2、INTCON 中断控制寄存器
T0IF:TMR0 溢出标志位,1:表示溢出
T0IE:TMR0 溢出中断使能位,1:使能
GIE:全局中断使能位,1:使能
3、TRISA 端口 RA 方向控制寄存器
TRISA4:当 TMR0 工作在计数器模式时,要求该脚必须设定为输入方式。
三、 定时器定时时间计算方法
定时时间 =( 2 +(256 – TMR0)* PS )* (1/ FOS/4)
例如:外部 4Mhz 晶体时,FOS = 4Mhz,每个机器周期频率为 1MHz,机器周期为 1us
定时单位为:1us
要求定时 1ms 时:取 PS=4,TMR0 初始值为 6。理论误差为 2us。
四、 应用实例一:使用定时器控制输出方波信号(查询方式)
1、 电路原理设计
VCC
DIODE1
5v
R1
10k
VCC
MCLR
C8
10u
SW-PB1
reset
C1
VCC
22pf
C2
22pf
CR1
4M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
VPP/MCLR
RA0
RA1
RA2
RA3
RA4
RA5
RE0/RD
RE1/WR
RE2/CS
VDD
VSS
OSC1/CLK1
OSC2/CLK0
RC0
RC1
RC2
RC3
RD0
RD1
RB7
PB6
RB5
RB4
RB3
RB2
RB1
RB0
VDD
VSS
RD7
RD6
RD5
RD4
RC7
RC6
RC5
RC4
RD3
RD2
40
39
38
37
36
35
34
33
32
31
30
29
28
27
26
25
24
23
22
21
R1
10k
SW-PB1
VCC
reset
DS?
LED1
PIC-16F877A
图 7.2 TMR0 定时器应用原理图
第 20 页
《PIC 单片机原理及其应用》 牛军浩
2、 程序流程设计
图 7.3 TMR0 定时器延时应用流程图
3、 程序设计实现
//TMR0 作为定时延时用
//PORTC[7] --------LED
//PORTB[0] --------KEY
#include <pic.h>
//table for Com-A SHMG
static volatile unsigned char table[11]=
{0xC0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,0x80,0x90,0xff};
// 0
1
2
3
4
5
6
7
8
9 全灭
void delayXms(unsigned int Xms) ;
void delayTMR0() ;
void main()
{
TRISB = 0xFF;
TRISC = 0x7F;
OPTION = 0x7; //T0CS = 0;PSA = 0; PS2..PS0 = 111;
//tmr0 使用内部时钟,使用预分频器,分频比 1:256
T0IF = 0;
RC7 = 1;
while(1)
{
delayTMR0();
RC7 = !RC7;
}
}
void delayXms(unsigned int Xms)
{
unsigned int i,j;
for(i =0;i<Xms;i++)
for(j =0;j<90;j++);
}
//delay 64us @ 4MHz
void delayTMR0()
{
//@4MHz
第 21 页
《PIC 单片机原理及其应用》 牛军浩
TMR0 = 0x08;
while(T0IF==0)
{}
T0IF=0;
}
五、 应用实例二:使用定时器控制数码管数据(中断方式)
1、 电路原理设计
2、 程序流程设计
3、 程序设计实现
//使用 TMR0 中断,控制输出
//PORTC[7] --------LED
//PORTB[0] --------KEY#include <pic.h>
void main()
{
TRISB = 0xFF;
TRISC = 0x7F;
OPTION = 0x5; //T0CS = 0;PSA = 0; PS2..PS0 = 101;
//tmr0 使用内部时钟,使用预分频器,分频比 111:256; 101:64
T0IF = 0;
TMR0 = 0x08;
T0IE = 1;
GIE = 1;
while(1)
{
}
}
//delay 10ms with timer0 interrupt (256-100)*64
void interrupt ISR_Timer()
{
If(T0IE&&T0IF)
{TMR0 = 100;
T0IF=0;
RC7=!RC7; }
}
@ 4MHz
六、 应用实例三:使用定时器/计数器模式测试外部信号频率
1、 电路原理设计
使用两个定时器完成计数、测频功能。
使用 TMR0 进行精确定时,使用 TMR1 进行外部信号频率计数。
TMR0 定时时间到后,TMR1 的计数值/TMR0 的定时时间即得外部信号频率,方法为测频方式。
2、 程序流程设计
3、 程序设计实现
七、 Timer0、Timer1、Timer2 的不同及应用
第 22 页
《PIC 单片机原理及其应用》 牛军浩
第 8 章 A/D 模块(2)
一、 AD 转化原理及过程
1、 PIC 单片机 AD 类型:逐次比较型、10 位、8 个通道
2、 工作原理
图 8.1
PIC 单片机 AD 通道框图
3、 转换时间要求
T = (10+2)*Tad
每一位数据的转换时间定义为 Tad,Tad 不得小于 1.6us。
在转换完成后,下次采样重新开始之前,必须有 2Tad 的等待时间。
完成 10 位转换时间为 10*Tad。
二、 AD 相关寄存器
1、 ADCON0 控制寄存器 0
表 8.1
ADCON0 控制寄存器
Bit7
6
5
4
3
2
1
0
ADCS1
ADCS0
CHS2
CHS1
CHS0
GO/DONE
-
ADON
ADCS1..0:AD 转换时钟选择位。
00:fosc/2
01:fosc/8
10:fosc/32
11:自带阻容(RC)振荡器
CHS2..0:AD 转换通道选择位。
000:RA0/AN0
001:RA1/AN1
010:RA2/AN2
011:RA3/AN3
100:RA5/AN4
101:RE0/AN5
110:RE1/AN6
111:RE2/AN7
GO/DONE:AD 转换启动控制/状态位。1 启动,0 未启动或者转换完成
ADON:AD 转换开关位,1 使用,0 关闭 ADC
第 23 页
《PIC 单片机原理及其应用》 牛军浩
2、 ADCON0 控制寄存器 1
表 8.2
ADCON1 控制寄存器
Bit7
6
5
4
3
2
1
0
ADFM
-
-
-
PCFG3
PCFG2
PCFG1
PCFG0
ADFM:AD 转换结果格式选择位。
0:左对齐;1:右对齐
PCFG:AD 转换引脚功能选择位。
表 8.3
3、
4、
5、
6、
7、
AD 转换引脚功能选择
AD 转换结果寄存器 ADRESH..ADRESL
端口方向寄存器 TRISA TRISE
第 1 外设中断使能寄存器 PIE1 <6> ADIE
第 1 外设中断标志寄存器 PIR1<6>ADIF
中断控制寄存器 INTCON<7>GIE INTCON<6>PEIE
三、 AD 转化结果计算方法
Ain =
(Vref+ - Vref-)*ADRES + Vref1024
四、 应用实例一:使用 AD 通道测试外部电压(查询方法)
1、 电路原理设计
VCC
VCC
R3
10K
ADinput
C1
VCC
22pf
CR1
4M
C2
22pf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
VPP/MCLR
RA0
RA1
RA2
RA3
RA4
RA5
RE0/RD
RE1/WR
RE2/CS
VDD
VSS
OSC1/CLK1
OSC2/CLK0
RC0
RC1
RC2
RC3
RD0
RD1
RB7
PB6
RB5
RB4
RB3
RB2
RB1
RB0
VDD
VSS
RD7
RD6
RD5
RD4
RC7
RC6
RC5
RC4
RD3
RD2
40
39
38
37
36
35
34
33
32
31
30
29
28
27
26
25
24
23
22
21
R1
10k
SW-PB1
VCC
reset
DS?
LED1
PIC-16F877A
图 8.2
PIC 单片机 AD 转换通道
第 24 页
《PIC 单片机原理及其应用》 牛军浩
2、 程序流程设计
开始
设置端口A、E方向
设置ADCON1
设置ADCON0
启动AD
等待AD转换完成
读AD转换结果
数据处理
图 8.2
PIC 单片机 AD 转换流程图
3、 程序设计实现
void main()
{
int i;
int loopnum;
int ADData;
unsigned char cQian,cBai,cShi,cGe;
TRISA = 0xFF;
TRISE = 0xFF;
ADCON1 = 0X80;
ADCON0 = 0x81;
while(1)
{
ADGO = 1;
while(ADGO)
{
}
ADData = (int)ADRESH;
ADData = ((ADData<<8)&&0x0300)+ADRESL;
display(ADData);
}
}
五、 应用实例二:使用 AD 通道测试外部电压(中断方法)
1、 程序流程设计
2、 程序设计实现
第 25 页
《PIC 单片机原理及其应用》 牛军浩
第 15 章 网络通信与数据传输模块(3)
一、 USART 串行通信模块介绍
串行通信的两种基本方式:同步传输、异步传输
1、异步传输
只有数据线,没有时钟线
必须预先约定:双方通信速率,每个字符的长度、起始位同步技术
起始位:空闲为逻辑 1,1 个逻辑 0 表示起始
数据位串:5、6、7、8、9 位等,LSB 在前。
奇偶校验位:1 位
停止位:表示一个字符的结束,1 位、1.5 位、2 位
2、同步传输
外加时钟线,提高了传输效率,不需开始位、停止位等,如 SPI、IIC
3、串行通信的数据传输
单工传送、半双工传送、全双工传送
4、组网方式
点对点、多机通信
二、 相关寄存器
1、 INTCON 控制寄存器
GIE、PEIE
2、 PIE1 第一外设允许
RCIE、TXIE
3、 PIR1 第一外设标志
RCIF、TXIF
4、 C 口方向寄存器 TRISC7(RX)TRISC6(TX)
5、 TXSTA 发送状态兼控制寄存器
表 15.1 TXSTA 寄存器
Bit7
6
5
4
3
2
1
0
CSRC
TX9
TXEN
SYNC
---
BRGH
TRMT
TX9D
TX9D:发送数据第 9 位
TRMT:发送移位寄存器空标志
BRGH:高速波特率选择位,异步模式下:1 高速
SYNC:同步异步选择,1 同步
TXEN:1 使能发送功能
TX9:发送数据长度选择位,1:9 位,0:8 位
CSRC:时钟源:异步未用,同步下:1 主控,0 被控
6、 RCSTA 接收状态兼控制寄存器
表 15.2 RCSTA 寄存器
Bit7
6
5
4
3
2
1
0
SPEN
RX9
SREN
CREN
ADDEN
FERR
OERR
RX9D
RX9D :
OERR :超速出错
FERR :帧格式出错
ADDEN:地址匹配检测功能 BIT8=1 表示地址
CREN :连续接收使能位
SREN :单字节接收使能位(异步未用)
RX9 :接收数据长度选择位
SPEN:串行端口使能位
7、 TXREG、RCREG
第 26 页
《PIC 单片机原理及其应用》 牛军浩
8、 SPBRG 波特率寄存器
异步方式下:
BRGH= 0 波特率=Fosc/64(X+1) X= Fosc/(64*波特率)-1
BRGH= 1 波特率=Fosc/16(X+1) X= Fosc/(16*波特率)-1
同步方式下:波特率=Fosc/4(X+1) X= Fosc/(4*波特率)-1
例 1:Fosc = 16MHz,需要 9600,选定 BRGH=0,SYNC=0,异步,求波特率寄存器和误差
波特率=Fosc/64(X+1)
X= Fosc/(64*9600)-1=25.042 ==25=19H
实际波特率为:Fosc/64(X+1) = 9615,误差为 15/9600 = 0.16%
三、 硬件电路设计
VCC
R3
10K
ADinput
C1
VCC
22pf
CR1
4M
C2
22pf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
VPP/MCLR
RA0
RA1
RA2
RA3
RA4
RA5
RE0/RD
RE1/WR
RE2/CS
VDD
VSS
OSC1/CLK1
OSC2/CLK0
RC0
RC1
RC2
RC3
RD0
RD1
RB7
PB6
RB5
RB4
RB3
RB2
RB1
RB0
VDD
VSS
RD7
RD6
RD5
RD4
RC7
RC6
RC5
RC4
RD3
RD2
40
39
38
37
36
35
34
33
32
31
30
29
28
27
26
25
24
23
22
21
C? 0.1
U?
1
3
4
5
VCC
C?0.1
DRX
DTX
11
10
12
9
15
C1+
C1C2+
C2-
VCC
V+
R1OUT R1IN
R2OUT R2IN
DS232A
C?
J?
0.1
T1IN T1OUT
T2IN T2OUT
GND
16
2
V-
14
7
RSRX
RSTX
13
8
C?
6
0.1
1
6
2
7
3
8
4
9
5
11
10
D Connector 9
PIC-16F877A
四、 应用实例一:使用串口发送数据到计算机,接受计算机控制数据
1、 程序流程设计
硬件电路 demo 板上:需接通 R14、R15、R17、R19
初始化
设置端口方向
设置波特率寄存器
设置接受控制寄存器
设置发送控制寄存器
设置中断使能
发送数据
查询 TXIF,等待上次发送结束
将发送的数据放置到 TXREG
接受数据
查询 RCIF,是否有数据接收
有则返回数据,读取数据后,标志自动清零
2、 程序设计实现
//使用 USART 传输数据
//PORTC[7] DRX<--------MAX232<------RSTX<---DB9.PIN3
//PORTC[6] DTX-------->MAX232------>RSRX<---DB9.PIN2
#include <pic.h>
#define BAUD 19200UL
#define FOSC 4000000UL
#define DIVIDER ((int)(FOSC/(16UL * BAUD) -1))
第 27 页
《PIC 单片机原理及其应用》 牛军浩
#define HIGH_SPEED 1
void initComm();
void sendData(unsigned char data);
unsigned char recieveData();
void main()
{
unsigned char cData;
//test for usart @4MHz,19200,N,0,1
initComm();
while(1)
{
i++;
cData=recieveData();
sendData(cData);
}
}
void initComm()
{
TRISC7=1; //DRX FROM PC-3
TRISC6=0; //DTX TO PC-2
SPBRG = DIVIDER;
RCSTA = 0x90;
TXSTA = 0x20|0x04;
}
void sendData(unsigned char data)
{
while(!TXIF);
TXREG = data;
}
unsigned char recieveData()
{
while(!RCIF);
return RCREG;
}
四、 应用实例二:采用中断方式设计串口接受通信程序
在应用实例一的基础上,开放串口接收中断,并在中断中处理接收到的数据。
作业:
计算波特率寄存器值,书写串口初始化函数,要求 19200bps、8 位数据。
(@4MHz,要求有计算过程)
第 28 页
《PIC 单片机原理及其应用》 牛军浩
综合设计(2)
设计要求:设计一个数据采集系统,采集模拟信号,100 次/秒,采集数据通过 RS232 上传到计算机,使用
计算机串口调试助手显示,并同时通过板上数码管显示。
作业:设计综合设计的电路、流程、程序、并明附各步骤详细说
1、 采集模拟信号:初始化 AD 函数、启动并获得 AD 数据函数
2、 定时器使用:初始化定时器函数、定时器中断处理函数
3、 异步串行接收:中断方式
4、 异步串行发送:查询方式
5、 数码管显示:动态显示
第 29 页
Download