临近期末考试周,我们专业的选修课《微机原理与接口技术》的实验部分也验收完毕。这门课程总共设置了四个专题实验,对于初学单片机的学生来说,这四个专题实验还算是简单。只要掌握了基本的原理,题目再出什么花样都离不开最基本的框架。
这四个专题实验分别为:
- I/O 口控制实验
- 定时器实验
- 键盘接口实验
- 1-Wire 与 I2C 总线实验
我们使用的是普中科技的单片机实验箱,实验箱基本包含了各种基础模块,比较适合初学者学习使用。在开始实验之前,我的室友就在网上搜集到了普中科技实验箱的教学指导资料。里面包含了单片机各模块的使用程序,可以作为不错的参考资料。
下面总结一下我是怎么做这四个实验的。
I/O 口控制实验
基础型
实验一:实现 8 位逻辑电平显示模块的奇偶位亮灭闪烁显示,闪烁间隔为 1s。
|
|
实验二:实现 8 位逻辑电平显示模块的 LED 轮流点亮,间隔为 1s。
|
|
在以上两题中,将 P2 口接入发光管,发光管的亮灭与 P2 口的输出有关。因此我们可以设定 P2 口输出的初值(这个初值是一个八位二进制数),再利用 _crol_
(循环左移)或 _cror_
(循环右移)位移函数将数值进行位移,即可控制灯亮灭的转换。
比如,设定奇偶位亮灭,上述程序设定的初始值为 0xaa,即二进制 10101010,执行 _crol_
,则在延时后变为 01010101,实现了奇偶位亮灭的变化。
同理,实现灯的轮流点亮,则可设定其中一个初始值为 1,剩余灯为 0,如上述程序,设定的初始值为 0x80,即二进制 10000000,执行 _crol_
,则灯依次点亮。
在上述程序中用到的延时函数 delayms(1000)
,近似可实现循环一次延时 1s。
设计型
采用按键控制 8 个 LED 全亮、全灭、循环点亮或奇偶位亮灭闪烁显示。
|
|
探究型
十字路口交通灯模拟实验
实验一:设计程序,使南北方向和东西方向交通灯同时显示红色、绿色、黄色各 1s 后,再分别显示不同的颜色并实现显示色的滚动。
|
|
实验二:模拟十字路口交通灯。交通信号灯控制逻辑如下:开始东西路口的绿灯亮,南北路口的红灯亮,东西路口方向通车,对应人行道绿灯亮。延时一段时间后(20 秒),东西路口的绿灯,闪烁若干次后(3 秒),东西路口的绿灯熄灭,同时东西路口的黄灯亮,延时一段时间后(2 秒),东西路口的红灯亮,南北路口的绿灯亮,南北路口方向通车,对应人行道绿灯亮。延时一段时间后(20 秒),南北路口的绿灯闪烁若干次后(3 秒),南北路口的绿灯熄灭,同时南北路口的黄灯亮,延时一段时间后(2 秒),再切换到东西路口的绿灯亮,之后重复以上过程。
|
|
课程所使用的单片机实验箱,在接交通灯模块的时候,若直接赋给端口十六进制数,则会与理论端口号输出相反。如:P0.0 对应 D8 口,P0.1 对应 D7 口,以此类推。
定时器实验
基础型
利用定时器 16 位定时方式实现 1s 定时的程序。
|
|
晶振频率为 12MHz,则:
最长时间间隔(μs) | 实现方法 |
---|---|
≈10 | 软件编写 |
256 | 定时器工作方式 2(8 位定时方式) |
65536 | 定时器工作方式 1(16 位定时方式) |
无限长 | 16 位定时器及软件计数 |
此定时程序可以作为一个模板,下面的几个程序都是以此程序为基础进行拓展的。
设计型
结合数码管显示模块,设计程序实现利用定时器设计一分钟倒计时器。
动态数码管电路图如下所示。
|
|
探究型
实验一:利用 8051 微控制器的定时器,由某一 I/O 口线输出一周期为 20ms 的 PWM 波,占空比按 10% 的步进从 0%~90% 线性调节。
|
|
实验二:在上题的基础上,加入按键控制,改变 PWM 波占空比,并通过 ULN2003 模块电路,实现 LED 亮度调节。
ULN2003 模块电路图以及所用到的大功率 LED 如下图所示。
|
|
键盘接口实验
矩阵键盘的结构如下图所示。
基础型
实验一:数码管静态显示电路,依次显示第 1 个数码管的各段(依次循环显示次序为 a、b、c、d、e、f),每段显示时间为 100ms。
|
|
实验二:采用矩阵式键盘,指定 IO 与键盘的连接,设计程序实现对键盘的扫描、按键去抖动等处理。当 Key0-KeyF 键按下时分别对寄存器 B 赋值 0-F,并通过数码管显示。
|
|
设计型
基于动态显示模块,设计程序实现数码管从右到左滚动显示自己的学号的所有位数(这里由于学号属于个人隐私,选择用其他数字替代)。
|
|
探究型
实验一:结合动态数码管显示模块,设计程序实现 24 小时实时时钟功能。
|
|
在这个程序中我添加了通过矩阵键盘调节时间的功能,但目前仍存在 BUG,键盘判定过程有一些问题待解决。由于添加这个功能只是为了应付一下老师的要求,没有太多闲暇时间 DEBUG,将矩阵键盘程序忽略即可。
实验二:基于动态扫描显示电路,设计程序实现滚动显示 8 位数码管的边缘各段(1# 和 8# 应显示向外的 4 段,其余 6 个将显示上方的 a 段和下方的 d 段),显示出滚动运行的大方框。
|
|
此程序本人采用了较为无脑的穷举方法,将灯亮的所有情况穷举出来实现循环。
1-Wire 与 I2C 总线实验
回顾《微机原理与接口技术》课程的四个实验,最坑的实验就是这个实验。在课堂中,这一部分知识是以「翻转课堂」的形式进行教学的,说白了就是同学上台讲课。结果一堂课下来,基本没有听明白台上的同学在说些什么。无奈只好自学。
这一部分的程序基础型与探究型实验是我写的,设计型实验是我借鉴室友的。本来我自己写出了一个程序,但执行结果是错的。但是从理论分析并没有什么错误,就这样,我被这个设计型实验困扰了很长时间……
基础型
通过 1-Wire 总线读取 DS18B20 的温度,并通过串口上传至 PC 机。
DS18B20 原理图:
|
|
设计型
通过 I2C 总线读取 PCF8591 的 ADC 采集值,实现环境亮度值(光敏电阻)的检测,并将亮度值上传至 PC 机。
PCF8591 原理图:
这个程序足足坑了我半天的时间,无奈之下用室友在网上花 2 元钱购买的资料蒙混过关。
此程序主要包含三个文件:i2c.h
,i2c.c
,main.c
。
i2c.h
:
|
|
i2c.c
:
|
|
main.c
:
|
|
探究型
通过 I2C 总线设置 PCF8591 的 DA,实现 LED 亮度的控制,设定值通过串口向 MCU 发送。
这个程序我采用的是中断的方式,将 LED 的亮度等级设定为十级。
|
|