自己动手学习PIC单片机.docx
《自己动手学习PIC单片机.docx》由会员分享,可在线阅读,更多相关《自己动手学习PIC单片机.docx(49页珍藏版)》请在冰豆网上搜索。
自己动手学习PIC单片机
自己动手学习PIC单片机
一、前言
随着单片机在各个领域应用的广泛深入,越来越多的电子爱好者和大中专院校的学生渴望了解单片机、学习单片机以及使用单片机。
但目前国内市场上单片机图书绝大部分都是从深奥的器件结构及工作时序入手,给他们以当头一棒,使得好多电子爱好者以英语差、汇编语言为理由而放弃了单片机的学习。
本文独辟蹊径,从零起步,只要是略有数字电路基础知识的读者,都可以阅读。
本问忽略了单片机器件结构和工作时序的介绍,读者可以参看本栏目的其他内容。
读者可以通过文中的各个小实验来逐步了解PICMCU的结构、指令系统和应用。
本文主要结合低档型的PIC16C5X系列单片机,通过图式分解模式以及完整的实验题材,循序渐进,详细介绍PIC单片机的基本原理与实际应用,希望读者能迅速地进入到PIC单片机的精彩世界中。
内容浅显易懂、简洁明了,这也是这本文的一大特点,初学者可以很轻松地掌握所叙述的内容;而详细的实验准备工作(材料准备、电路图、实照、实验步骤、程序流程图以及完整的程序代码与注解等),更是帮助初学者在掌握理论知识的同时自己动手,以经济的配备去投入到PIC单片机的实践中。
本文是学习单片机入门的极佳教程。
通过本书的学习不仅能为今后的学习PIC系列单片机打好基础。
本文主要针对电子爱好者以及大中专院校非电子类专业的学生,可以作为他们学习PIC单片机的入门引导书籍。
二、实验器材与工具
○PIC单片机烧写器(含烧写操作程序)
○EPROM型PIC单片机(PIC16CE54、PIC16CE56或PIC16CE57)
○紫外线擦除器
○万用接线板(俗称:
面包板)
○单芯电线
○剥线钳
○电源(5V3A,最好有+12V、-12V输出)
○万用表
○逻辑笔
○文本编辑器
○程序编译器
○其他的设备诸如示波器、数字式示波器、数字记忆示波器、逻辑分析仪、仿真器等最好也要有。
三、输出端口的实验
这次的实验,可以看到八个小红灯,每次只会亮一个小红灯,然后八个会轮流着亮,亮到最边之后,又从另外一端跑回来亮,一直这样下去。
1.目的
□电路上:
学会如何将发光二极管与PIC单片机的I/O口连接。
□程序上:
学会使用PIC单片机的基本指令,以及编写简易的延时程序。
2.材料
实验所需材料在表5-1中详细列出来。
表5-1材料
项
品名
规格
数量
1.
2.
3.
4.
5.
6.
万用接线板(面包板)
PIC16C57
石英振荡器
电容
发光二极管(LED)
排阻
17×17cm
EPROM型(注)
8MHz
20pF
红色
330Ω,9Pins
1
1
1
2
8
1
∴注:
57到54大同小异,请参考附录A。
54与57间在编写程序上的注意:
54复位后所执行的第一个程序地址在1FFH,而57则是在7FFH。
另外57比54多出一个端口C可以使用,因端口C的特性与端口B雷同,所以以往对F6的指令操作(如MOVF6.0、TRIS6等……),都可以改成MOVF7.0、TRIS7,所得到的执行效果是一样的。
3.电路
图5-1原理图
4.实照
图5-2实照
5.步骤
1.将PIC16C57单片机插到万用接线板(以后简称面包板)上。
(注1)
2.石英振荡器有两个引脚(两个一样长),把其中的一个引脚跟PIC16C57(以后简称PIC)的OSC1脚连接,然后剩另一个引脚,把它跟PIC的OSC2脚连接。
(注2)
3.PIC的OSC1、OSC2已经分别接上石英振荡器的两个脚了,这时候把两个电容再分别跟OSC1、OSC2引脚接上,两个电容的另一个脚,就一起接到PIC的VSS脚上。
(注3)
4.将PIC的VDD、MCLR引脚接上电源的+5V端,而VSS则接电源的+0V端。
(注4)
5.发光二极管(以后简称LED)有长短两个引脚,其中有一个较短的,和PIC的RB0引脚连接,接着第二个LED与PIC的RB1引脚连接,往下的第三个、第四个也一样,最后一个直接到RB7,刚好用完八个LED。
(注5)
6.排阻外观上有个白点(印上去的,左右两边找找看),白点下方的那个引脚,把它跟PIC的VSS接在一块,其他的引脚分别一对一的跟LED的较长引脚连接。
(注6)
7.把PIC从面包板上拨出,用烧写器将写好的程序烧入芯片内,完成后再插回板子上的原位。
8.打开电源,大功告成!
∴注1:
尽量将芯片安插在板上的中间位置,以后扩充电路才方便。
∴注2:
其实石英振荡器引脚没有极性,颠倒接也一样可以操作。
∴注3:
有些电容有极性之分(引脚较长的接电位较高的一端,或包装上有标"+"符号),例如电解电容就是。
∴注4:
PIC单片机内置POWERONRESET的电路,只要直接连VDD即可。
∴注5:
事实上LED也可以反过来接,只是亮灭状态相反而已。
∴注6:
排阻引脚数目,按规格需求有不同数目及不同阻值的产品,但依旧会有白点(共地点)存在。
6.流程图
7.程序
□标号说明
·RESET:
起始程序的进入点
·REDO:
循环执行的进入点
·DLY:
延时子程序的进入点
·DLY1:
延时重复递减判断的进入点
(1)
·DLY2:
延时重复递减判断的进入点
(2)
□寄存器使用配置情况
·F6:
输出LED亮灭用
·F8:
延时程序的外部循环计数器
·F9:
延时程序的内部循环计数器
8.说明
(1)使芯片复位后可以跳至主程序开始处。
(2)将主程序安排在100H处开始。
(3)使端口B成为输出状态。
(4)输出7FH的值呈现在端口B上(使一个LED点亮,其他皆灭)。
(5)将C标志位设为"1",因接下来的旋转操作(列10的RRF)只允许一个LED亮,若不将其设为"1",则会造成同时有两个灯亮,虽然不是说不行,但这种操作不是我们要的。
(6)调用延时子程序。
(7)将RB寄存器的值(含C标志位)作向右旋转的操作。
(8)跳至原先调用延时子程序的地址,再次进入延进程序。
(9)延时程序,利用两个寄存器递减的原理作为循环,直到两个寄存器都递减为零时才跳出循环。
(10)通知编译器,编译操作到此结束。
9.除错
如果没有见到预期的操作,或根本没运行的话,请试着思考下列问题:
1、程序是否有写错的地方?
(包含输入错误、编译错误、烧写错误)
□输入错误:
程序输入时打错,例如把MOVLW打成MOVWF。
□编译错误:
编译时有错误信息,但一时忽略而未作修正。
□烧写错误:
烧写时忘了擦除以前烧入的内容,或下载成ACSII码,而不是政党的二进制码。
2、LED的长短引脚是否弄错?
(必须八个长脚全在一边,若有一个不是,就会造成若干不亮的现象。
3、电容忘了接地、排阻的白点忘了接地,诸如此类……。
四、输入端口的实验
输入端口的实验,可以继续沿用实验5-0的输出端口电路,然后由这个电路再加上一些器件来完成。
这次的实验是用一个按键,来控制八个LED的亮灭情形,当按键按下,八个LED一起亮,放开之后,又一同暗下去。
提醒您:
事实上将5-0电路上的LED拆下几个也没关系,只要留下一个就可以显示出按键的操作是否有效即可。
1.目的
□电路上:
学会如何将按键与PIC连接,并可向PIC输出HI、LO信号。
□程序上:
学会用PIC指令,来检查I/O端口引脚的HI、LO信号,并利用检测到的信号,来改变程序执行的路径。
2.材料
表5-2材料
3.电路
图5-4原理图
4.实照
图5-5实照
5.步骤
1.准备实验5-0的电路。
(注1)
2.将2kΩ的电阻,一端接+5V,另一端接PIC的RA0引脚。
(注2)
3.将RA0引脚接按键开关的一端,而按键开关的另一端接+0V.(注3)
4.打开电源,按下按键,看到LED跟着按键的按下与放开而一明一灭的话,便是成功了!
∴注1:
如果实验5-0的电路已经拆除,请参考以前的步骤,重新完成一份实验5-0的电路。
∴注2:
电阻的主要作用,是限制电源的电流,不要超过PIC芯片的端口引脚所能承受的程度,保证PIC芯片不受电流损坏。
∴注3:
如果不清楚按键开关的哪些引脚是开路、是短路?
可以用万用表的欧姆档来测量。
6.流程图
图5-6流程图
7.程序
□标号说明:
·RESET:
起始程序的进入点,PIC复位后即会跳到此处
·TEST:
测试按键电位的进入点,除程序执行外,每当执行完LED亮或灭操作后即会跳入此处
·LIGHT:
LED亮操作执行的进入点
·DARK:
LED灭操作执行的进入点
□寄存器使用配置情况
·F5:
测试按键电位操作用
·F6:
输出LED亮灭操作用
8.说明
(1)PIC16C57在复位后(RESET)后,第一个执行的地址是7FFH,此地址我们放了一个GOTO指令,使程序改到另一个地方继续执行(因为地址7FFH之后就没有地方可以放程序了)。
(2)主程序的开始处放在100H的理由,主要是把每一页的前256字节空间都留给子程序使用。
(3)由于TRIS指令只允许用W寄存器来指定,所以必须将要写入端口的值,先写入W寄存器中,再用TRIS来设置各端口的状态。
本次是将端口B的8个引脚全部设为输出,而端口A的第一个引脚为输入,其他的为输出。
(4)BTFSS指令是个作判断,然后改变执行路径的指令,这里的程序使用这个指令,是用作检查开关的HI、LO,来改变LED的亮灭情形。
(5)将FFH写入F6,使LED全亮。
(6)将00H写入F6,使LED全熄。
(7)"END"为虚指令,告诉编译器编译到此行即可结束。
名词解释:
虚指令?
在前面的程序列表中,有ORG、END等指令,你在PIC的33个指令中找不到的,这种ORG、END的指令,是不会被编译器译成任何机器码的,也没有可以对应的机器码可以转译。
它们的主要作用只是提醒编译器,在编译过程时必须注意的事项,例如后面的程序码要安排在存储器中的什么地址?
编译到何处停止等,还有许多虚指令,也提供各种不同的功能等,都只是为了辅助编译或者是方便编写程序而已,善用虚指令会为你带来许多的方便。
9.除错
假如按键无法控制LED亮灭的话,可能是下列的原因:
1.把按键的引脚搞错,例如本来就短路的引脚,误以为是经过按键按下才短路。
2.按键"抖动"的情形太过厉害,这样可改用下列的电路取代,如图5-7所示。
图5-7消除抖动的电路
五、RTCC的使用
本次的实验将RTCC当作计数器使用,并利用LED读出RTCC的计数值。
1.目的
□电路上:
学习如何以7400IC来制作消除抖动的电路。
□程序上:
学习如何编写控制RTCC的程序。
7400功能方框图
图5-87400功能方块图
说明:
7400内部有四个二输入的NAND逻辑门,读者可以任意挑选其中两个,使用在本次的实习电路中。
.
2.材料
表5-3材料
3.电路
4.实照
图5-10实照
5.步骤
1.PIC基本电路
□将VDD与MCLR引脚接上+5V,Vss引脚接上+0V。
□将石英振荡器的两个引脚,分别接上PIC的OSC1、OSC2引脚。
□将两个电容的其中一个电容,一脚接OSC1、另一脚接+0V,而另外一个电容,则是一脚接OSC2,另一脚与前一个电容的作法一样,接+0V。
2.LED显示电路
□将八个LED的长引脚各自接到PIC的RC0到RC7引脚。
□另一边的短引脚都接上排阻的引脚,但是封装上方有白点的引脚必须保留不接。
□将排组的共地端接上PIC的Vss。
3.消除抖动电路
□将7400的VDD接+5V,GND接+0V.
□将微动开关的C脚接+0V,NC脚接7400的10脚,NO脚接7400的12脚。
□将两个2K的电阻一端接+5V,另一端分别接7400的12脚、10脚。
□将7400的11脚与9脚短路,将7400的8脚与13脚短路。
□将7400的8脚与PIC的RTCC引脚连接。
6.流程图
7.程序
□标号说明:
·RESET:
起始程序进入点
·REDO:
重复读取RTCC操作的进入点
□寄存器使用配置情况:
·F1:
RTCC当计数器用
·F7:
输出RTCC的现存值用
8.说明
(1)初始设置
初始设置首先是执行OPTION指令,本次的设置是将RTCC当计数器,下降沿递增,预分频器分配给WDT使用,由于WDT在烧写时会被我们禁止,所以预分频器与WDT都没有作用,所以预分频倍数值就不重要了,在此PS0PS2都设为"1"。
然后还有些初始操作,例如清除RTCC与RB的寄存器值,将RB设为输出等。
(2)读出RTCC值
在此处我们读取RTCC的值,放在W寄存器内,等待转入F6中,以作显示。
(3)放入RB显示
将W寄存器的值转入F6,由于RB已设为输出,所以F6的值就通过LED显现出来了,显示之后,重回读取RTCC值的操作,然后重复读取与显示。
9.除错
□电路方面的错误
1.无法显示:
可能是忘了将排阻共地端脚接地,或是搞错引脚了。
2.无法显示:
若是使用PIC16C55/57的话,很容易将VDD与Vss接偏。
3.消除抖动电路没有HI/LO信号:
可能将7400的输出输入引脚搞错。
□程序方面的错误
1.执行OPTION指令前没把W寄存器的值设好。
2.执行TRIS指令前没把W寄存器的值设好。
3.读出RTCC的值,其第二操作数必须为"0",否则RB将无法从W寄存器得到RTCC的值。
六、SLEEP与WATCHDOG
第一部分:
SLEEP模式的实验
1.目的
验证SLEEP模式的功能与特性
2.材料
表5-3材料
3.电路
图5-12原理图
4.实照
图5-13实照
5.步骤
1.PIC基本电路
□将PIC的MCLR引脚接上+5V,Vss引脚接上+0V,而VDD与VSS引脚之间接个直流电流表或者是万用表的直流电流档。
□将石英振荡器的两个引脚,分别接上PIC的OSC1、OSC2引脚。
□将两个电容的其中一个电容,一脚接OSC1、另一脚接+0V,而另外一个电容,则是一脚接OSC2,另一脚与前一个电容的作法一样,接+0V。
2.SLEEP验证电路
□将RA0引脚接上一个220Ω的电阻,然后再串接上一个LED,最后把LED的负极脚接+0V
□将一个2KΩ的电阻一边与+5V接,另一边则接到PIC的引脚。
□将DIPSW一端接PIC的RA1引脚,另一端直接连+0V。
6.流程图
图5-14流程图
7.程序
□标号说明
·RESET:
起始程序的进入点
·RE-TEST:
重复检查指拨开关电位的进入点
□寄存器使用配置情形
·F5:
读取指拨开关电位用
8.说明
起先当我们尚未给PIC接入电源时,先将指拨开关拨到OFF的位置,接着送电,执行了点亮LED的程序生,很快PIC执行到"BTFSC5,1"的指令,由于从外部所检测到的电位一直是"HI",所以程序的执行路径开成了一个无穷循环,不断在执行检测外部电位的工作。
这个时候,我们从直流电表上可得知PIC在无穷循环的执行下,其PIC单片机的电流损耗情形。
在此处我们以无穷循环执行的电力损耗,来代表一般正常运行的电力损耗。
然后我们将指拨到ON的位置,此时PIC检测到"LO"原电位,改变为不同的执行路径,而跳离了无穷循环。
一旦跳离了无穷循环的执行,紧接着执行的是SLEEP指令,执行了SLEEP指令后,PIC单片机便因为SLEEP指令的执行,而进入了POWERDOWN的模式(即是一种省电状态),这时再来看直流表的电流读数,便会小于原先执行无穷循环时的电流量了,因此达到省电的性能。
在PIC进入POWERDOWN模式后,PIC的I/O状态会保持在原先尚未执行SLEEP指令前的状态,即是输入还是输入,输出还输出,而输出的电位也不会被改变,因为即使进入省电状态后,LED依然亮着就是证明。
9.除错
电路方面可能的错误:
□LED不亮:
可能是将正负极引脚方向弄反
□LED不亮:
可能是把2KΩ与日俱增200Ω的电阻插错位置。
□指拨开关控制结果相反:
将开关两端接线对调即可。
程序方面可能的错误:
□BTSFC与BTFSS两个指令容易混淆,必须注意。
□MOVLW与MOVWF两个指令容易混淆,必须注意。
□以二进制(Binary)表示数值时,要注意位数的位置。
第二部分:
WATCHDOGTIMER的实验
1.目的
用DIPSW来模拟执行故障情况,并由LED的操作状况来验证WATCHDOG的功能与特性。
2.材料
除了不用万用表或直流电流表之外,所有器件与前一部分的实验相同。
3.电路
与第一部分电路相同,请参考第一部分。
4.实照
与和一部分实照相同,请参考第一部分。
5.步骤
1.PIC基本电路
□将PIC的MCLR引脚接上+5V,Vss引脚接上去+0V,而VDD与VSS引脚之间接个直流电流表或者是万用表的直流电流档。
□将石英振荡器的两个引脚,分别接上PIC的OSC1、OSC2引脚。
□将两个电容的其中一个是电容,一脚接OSC1、另一个接+0V,而另外一个电容,则是一脚接OSC2,另一脚与前一个电容的作法一样,接+0V。
2.WATCHDOGTIMER验证电路
□与SLEEP的验证电路完全相同。
6.流程图
7.程序
□标号说明
·RESET:
起始的进入点
·SSS:
主程序进入点
·LAM:
慢亮操作的进入点
·XX:
检测指拨开关电位的进入点
·BAM:
快亮操作的进入点
·DELAY:
延时子程序的进入点
·DD1:
递减延时操作进入点
(1)
·DD2:
递减延时操作进入点
(2)
□寄存器使用配置情形
·F5:
读取拨动开关电位用
·F30:
延时子程序递减延时用
(1)
·F29:
延时子程序递减延时用
(2)
·F31:
递减重复闪灭执行次数用
8.说明
首先在程序中,我们使用OPTION指令将WDT设置为约定2.5秒才会计时额满,当然这也使用分频来延长定时时间。
在这次的实习中,我们用一个指拨开关来模拟PIC执行上的问题(Trouble),使PIC无法正常运行,在面包板送电之初,我们将此指拨开关打在OFF这一端,使PIC能运行正常。
送电之后,PIC开始运行,正常的运行情形是使LED慢节奏的亮八下,然后再快节奏的亮八下,这样周而复始的运行,即是正常的状况。
由于程序中有一段检查开关电位的指令"BTFSC5,1",原先在指拨开关打在OFF端的情况下,这个指令检测到"HI"电位,使程序能顺畅地循环执行而不间断,并在执行途中不时地执行CLRWDT的指令,以防止WDT产生复位,影响PIC正常工作,当然这必须将CLRWDT指令适时适处地放在程序中。
当我们把指拨开关打到ON端,会发现LED慢节奏的亮完八下后,轮到执行检测外部电位时,由于所侦得为"LO"电位,所以进入重复检查电位的循环,只要电位无法恢复成"HI",程序的执行就无法跳出此循环。
如果这种情况一直持续,约2.5秒后会发现,LED重新慢节奏的亮八下,这种现象表示WDT定时值已满,对PIC产生了复位,使芯片从头运行,因为在持续的检查循环中,并没有执行CLRWDT的指令,以致于WDT持续递增定时值,在2.5秒后WDT计满,使PIC复位。
当然,如果指拨开关拨回OFF端,仍旧会在2.5秒后重新运行,直到成ON端后,才有机会正常运行,以及执行到快节奏的闪烁操作。
如果在检测电位循环中,也有CLRWDT指令的执行,那么PIC的运行仍会持续不正常,详细与深入的探讨可以参考旗标出版的另一本PIC书籍"PIC单片机应用系列
(一)烧写器"。
所以安排CLRWDT指令也是有决窍,至于WDT的计满时间,读者也可以自行调整,本次实习只是以让肉眼能证实际上考虑,所以才将WDT计时调慢,真正的应用情况大多比较快速。
9.除错
电路方面可能的错误:
如第一部分
程序方面可能的错误:
□插入CLRWDT指令必须适时适处,如果汉有把握可以多插入几处。
□调用延时子程序的次数要正确,否则LED的亮灭操作会不正确。
□BSF与BCF两个指令必须明确,否则LED的亮灭操作会不正确。
七、LED数码管的实验
本次的实验,将在复位(RESET)PIC芯片后,可以见到数码管显示出"0"的字样,之后自动换成"1",依次一直往更高的数字显示,直到显示完"9"之后,又重新回到显示"0"的地方,然后再重复显示,这样周而复始,不停地按规律显示。
1.目的
□电路上:
了解数码管对应LED的关系。
□程序上:
学习在PIC汇编语言中,如何调用程序指令与返回指令,来达到索引查表的目的。
2.材料
表5-5材料
3.电路
图5-16原理图
4.实照
图5-17实照
5.步骤
1.将PIC单片机插到面包板。
2.将石英振荡器的两个引脚,名接到PIC的OSC1、OSC2两引脚上(石英振荡器的两个引脚没有极性之分,倒过来接也没关系)。
3.拿一个20pF的电容,将其中的一个脚与PIC单片机的OSC1连接,而另一个脚接地。
同样的再拿一个电容如法炮制,拿另一个电容,一个脚接地,另一个脚改接PIC的OSC2。
4.将PIC的MCLR、VCC接电源的+5V端,而VSS接+0V。
5.将PIC的RB1到RB7等七个脚,各接一个300Ω的电阻,而电阻的另一端则分别连接数码管,请依图5-18所示的配置来接线:
图5-18接线图
1.本次以共阳的数码管为例,数码管共有十个引脚,标COM的代表共阴或共阳端,若为共阴型的数码管就是、要接电源负端,若为共阳型的数码管则要接电源正端。
两个COM引脚是相同的,因其中一个就要以了,若两个都接也可以。
如图5-19所示。
图5-19共阳数码管结构示意图
2.的八人引脚在图中分编号对应到PIC的端口B,以及数码管的显示面。
3.此次的实验,并不用数码管的Dot,以及PIC端口B的第一个引脚(RBO)。
6.流程图
图5-20流程图
7.程序
□标号说明
·RESET:
起始程序的进入点,PIC复位后即会跳到此处
·RE_DO:
递增显示程序的进入点
·CLR_F8:
修正显示值的程序进入点
·FIND_TAB:
查表前置操作的进入点,若显示值递增后无需修正的话,可直接跳往此处
·TRANS:
查表子程序的进入点
·DELAY:
延时子程序的进入点
·DELAY1:
延时重复递减判断的进入点
(1)
·DELAY2:
延时重复递减判断的进入点
(2)
□寄存器使用配置情况
·F2:
将在查表子程序中,用做查表的起始值
·F3:
执行中参考用的标志位
·F6:
输出显示信号到数码管用的输出端口
·F8:
显示值的保存处
·F9:
延时程序的外部循环计数器
·F10:
延时程序的中部循环计数器
·F11:
延时程序的内部循环计数器
8.说明
(1)跳跃至100H的地方,而00H到FFH的地方留给子程序用。
(2)设置端口B为输出,清除寄存器F8,显示起始数字到数码管上等操作,此处显示出"0",并且使F8寄存器也为"00",而让显示出来的数字跟F8所存的值相同。
(3)调用延时子程序,因为刚显示完新的,必须停留一阵子,再将这新数字替换掉。
(4)将F8