在本节中,我们将利用ICDDEMO教学实验板做一个简单的开发实验。 在本次实验中,我们将从最简单的单片机功能模块做起,逐步深入。通过本次的开发实验,使用者将能够轻松的掌握各个功能模块的使用方法,并对开发的过程有一个大致的了解。
3.1 开发前准备工作 开发前先看看你是否已经准备好了: 1、 开发工具:
- MPLAB-ICD硬件仿真器及配合硬件使用的MPLAB-IDE软件
- 高奇公司为用户编写的实验程序(icdlab*.asm)
2 、 实验板:
3、 必要的资料:
- PIC16F877芯片资料:可从Microchip公司的网站上下载,该公司的中文网址是:www.microchip.com.cn 。
- PIC单片机的使用指导书:《PIC系列单片机原理和程序设计》(北京航空航天大学出版社)、《PIC系列单片机开发应用技术》(电子工业出版社)或者其它的一些使用指导书
- 汇编语言程序应用资料:假如你对于汇编语言还不是很熟悉的话,一本这方面的资料将会对你有很大的帮助。
3.2 实验开始 现在可以开始我们的开发实验了。 首先,我们来大致设想一下将要开发的产品的功能,估计一下将要使用的资源。 以本次实验为例:我们要设计一款电子钟,除了能作为普通的钟,还有测温、提醒的功能;使用LCD显示,在光亮度不够的时候会自动开启背光。 有了大致的构想后就可以对所要使用的单片机资源进行估计。然后,我们可以列出一个比较详细的表格出来(如表3-1所示)。这样,要做的事情就一清二楚啦。
|
功能 |
功能描述 |
实现电路 |
占用资源 |
备注 |
| 事件提醒 |
在设定时间或设定事件到来时启动 |
LED显示电路 |
D口 |
不同的事件闪烁方式可不同 |
LCD显示 |
显示时间或温度等 |
LCD电路 |
6个I/O口 |
液晶模块采用4bit输入方式 |
| 时钟 |
普通时钟 |
|
Timer1、RC0、RC1 |
外部晶振作时钟源 |
| 测温 |
测量温度 |
测温电路 |
1个A/D通道 |
NTC热敏电阻 |
| 背光控制 |
在环境光亮度不足时点亮背光 |
背光控制电路 |
1个A/D通道 |
用光敏电阻实现 |
| 功能调整设定 |
时间调整、功能选择 |
小按键 |
RB0、RA4 |
组合使用按键实现功能调整 |
表3-1:功能及使用资源列表
3.3 实验一:LED闪烁 实验内容:按提示补充程序,让连接在D口上的LED灯按一定的方式循环闪烁。 实验目的:
- 了解如何控制I/O口上的电平输出
- 熟悉延时子程序的编写
 图3-1 LED灯
电路说明:LED采用的是共阴极接法,因此,只要使与其相连的I/O口输出高电平即可点亮该灯。 程序实现:
- 在PORTD寄存器中写入数据,要点亮某一个LED只要在相应位置写入1(输出高电平),然后将TRISD清零(将D口全部设置为输出)。
例如:要将D1,D3点亮,只要写入B'0000 0101',然后清TRISD即可。
- 将写入PORTD寄存器中的数据循环移位即可实现闪烁。
- 用户也可考虑将PORTD寄存器置为全1(写入B'1111 1111'),然后将TRISD相应的位置清0,通过切换D口的输入/输出状态来实现闪烁。
例如:要将D1,D3点亮,如果PORTD中数据为B'1111 1111',则只要在TRISD写入B'1111 1010'即可。 感兴趣的用户可以尝试并比较一下两种方法的区别
提示:
注意事项:
- 使用到的通用寄存器要定义标号
- 通用寄存器的标号要容易让人明了其作用
3.4 实验二:LED闪烁方式选择 实验内容:在实验一的基础上,让LED灯的闪烁方式按一定顺序在几种不同的方式之间切换。 实验目的:
- 掌握INT中断的使用方法
- 熟悉中断服务程序的编写
- 熟悉子程序的调用
程序实现:
- 在指定的数据寄存器中写入数据,这些数据将被载入PORTD寄存器
- 通过INT中断切换载入PORTD寄存器的数据,从而改变闪烁的方式
提示:
注意事项:
- 程序结构要合理
- 子程序标号要清楚的概括其作用、内容
3.5 实验三:LCD显示 实验内容:写一个程序,在LCD屏上显示设定的数据或字符 实验目的:
- 了解LCD程序模块的各子程序的作用
- 掌握LCD模块的使用方法
电路说明:
- 如图3-2所示:实验板选用的LCD模块采用的是三星电子公司的KS0066U驱动芯片
 图3-2 LCD显示模块
- DB4~DB7依次与单片机的RB2~RB5连接,为数据线,DB0~DB3未使用;
- RS为显示、指令选择线,当RS为高电平时单片机向LCD模块进行读写操作;
- E为数据接收、发送标志,每当E线向LCD模块发送一个脉冲,LCD模块与单片机之间将进行一次数据交换;
- A、K分别是LCD模块背光的正负电源,如图3-2所示,我们将用AN5控制背光,改变R28的值将改变背光亮度
- R/W为读写选择线,在ICDDEMO教学实验板中,R/W线接地,只做对LCD模块的写操作
程序实现:
- 调用初始化LCD子程序初始化显示模块
- 调用显示定位子程序选择显示字符的行位置(第1或第2行)
- 将要显示的数据或字符代码写入指定的通用寄存器中
- 调用发送显示数据子程序将指定的数据寄存器内的数据送到LCD显示
- ICDDEMO教学实验板上的LCD模块采用的是4bit显示模式(即所谓的半字节模式)
提示:
- 打开ICDLAB3.ASM后按提示写程序(可参看lcddemo.asm)
- 液晶模块上电后应在第1行显示16个5x7点阵块
- 若LCD模块在实验板上电后无上述现象,请检查V0电压(VDD-V0≥4.7V),改变RL10的值将改变LCD显示的亮度
3.6 实验四:LCD背光控制 实验内容:分析光敏电阻对环境光强的采样结果。当环境光强下降至某一值时开启背光;否则关闭背光。 实验目的:
- 熟悉A/D模块的使用方法
- 了解并掌握数据比较的方法
- 学习如何用模拟量来实现单片机控制
电路说明:
- 实验所用的光敏电阻在正常的室内光强下大约是100K?
- 环境光亮度越低则RA2采样到的电压值越小
程序实现:
- 开启A/D转换模块并等待转换结束
- 将采样值与设定的临界值进行比较
- 根据比较的结果来控制AN5脚电平(见图3-2)
提示:
- 打开ICDLAB4.ASM后按提示写程序
- 光敏电阻的阻值随光强的减小而增大,无光亮时相当于断路
- 合理调整R13的值将有利于调试
- 选择合理的临界值
 图3-3:用光敏电阻采样环境光强
注意事项:
- 光敏电阻的阻值是一个非线性量,因此临界值要根据实际的情况来确定
3.7 实验五:用Timer1做一个时钟 实验内容:用Timer1定时/计数器做一个时钟(Timer1采用外部32KHz晶振),并在LCD上显示时间(显示为 时:分:秒 格式)。 实验目的:
- 了解并掌握定时/计数器的使用方法
- 了解如何将16进制数转换为BCD码
程序实现:
- 设置Timer1为计数器方式
- 设置Timer1使用外部晶振
- 利用Timer1计数器的溢出中断来处理时、分、秒寄存器内的数据
- 调用数据格式转换子程序对时、分、秒寄存器内的数据进行BCD转换
- 调用LCD显示子程序将转换完的数据以时:分:秒的格式显示在液晶屏上
 图3-4 Timer1采用外部晶振
提示:
- 打开ICDLAB5.ASM后按提示写程序
- 本实验中应将JP1置于2、3位置,JP2置于1、2位置(见图3-4)
- 调整R28的值可以调整背光的亮度
注意事项:
3. 8 实验六:为时钟加上调整的功能 实验内容:在实验五基础上加入程序,来调整时间 实验目的:
程序实现:
- 在中断处理时判断中断的来源
- 根据来源进行相应的数据处理
- 用RTCC来选择要调整的项目;用INT来调整选定的项目
- 按键实现方式由用户自定
 图3-5:RTCC按键
提示:
注意事项:
- 在中断服务程序中要处理尽量少的内容以免影响程序的实时性
3.9 实验七:温度测量 实验内容:利用热敏电阻来测量环境温度,并将测量结果显示在LCD屏上。 实验目的:
- 练习使用查表方式
- 练习对非线性的采样结果的校正
- 进一步理解和掌握A/D模块的使用
 图3-6 用热敏电阻采样温度
电路说明:
- R33为NTC(负温度系数)热敏电阻,室温20摄氏度时阻值约为10K?
- R33的阻值随温度的升高而降低
程序实现:
- 选择A/D通道,开启A/D转换模块并等待转换结束
- 将转换的结果调入校准表进行校准,转换为实际温度值
- 调用LCD显示程序显示温度
- 根据实际温度合理调整校准表,使测量结果更准确
提示:
- 打开ICDLAB7.ASM后按提示写程序
- 热敏电阻的阻值是非线性量,但可以在局部范围内按线性量处理,校准表正是根据这个原理来实现校准的
- 合理选取校准点可以让你在精确程度和程序工作量之间取得平衡
注意事项:
3.10 实验八:程序的链接和调试 实验内容:将前几个调试通过的各个单独的功能模块子程序链接起来,使其成为一个完整的多功能电子钟的运行程序。 实验目的:
- 学习如何合理调配资源
- 进一步熟悉如何利用各种调试手段调试程序
- 体会如何更好的整合调试有多个功能子程序复杂的程序
实现功能:
- 可调整时间的时钟
- 可设定一个或多个时间,在时钟运行到该时刻时发出提示信号(用不同的闪烁方式表示不同的提示)
- 可设定事件发生时的提示信息
- 显示环境温度
- 在光线较暗时开启背光
提示:
注意事项:
- 在链接子程序时请仔细查对所用到的通用寄存器标号和对应的通用寄存器,以避免因寄存器使用不当引起的错误
- 注意各个子程序的标号不要有重复
- 注意程序的可读性:注释要简单明了;子程序标号和通用寄存器标号最好要一目了然
|