大家好!今天给大家带来《带你玩转STC15第二讲》。
本讲主要内容涉及以下资源:
晶振频率 @ 22.1184MHz 串口波特率 @ 9600bps
1. IAP15F2K61S2单片机8路10位ADC。
2. IAP15F2K61S2控制矩阵键盘。(ADC与行列扫描法)
3. IAP15F2K61S2串口1。
4. IAP15F2K61S2定时器0(运行指示灯)、定时器1(串口波特率发生器)。
/**********************************************************/
本讲源码下载:
/**********************************************************/
大家看过前面两贴的应该知道这是要干嘛了吧?看到上面这个图片,说明我们又要对官方的板子改进一番。之前提到过:“官方板子由于使用USB供电,并且没有专门的供电电路,导致加上过大的负载后系统可能会不稳定。” 譬如楼主之前加了一个LCD12864,电脑USB插了2.4G模块、小WIFI这些,再加上板子本身,系统运行就有些不稳定了,下载的时候也不稳定。
针对这一情况,之前我们的处理方法是增加滤波电容,但是在这儿我们首先要感谢Jobs!他给我们的建议是外接电源。我们也实测了整板正常运行时候所需要的电流,如下图:
实测整板运行电流
从图中我们看到,整板运行电流为216mA,如果全部数码管点亮可能会达到240mA甚至更大,我们应该为板子留够余冗功率,所以使用了一个5V/2A的电源适配器来给整板供电,如下图:
5V/2A DC适配器
针对上一改装目的:首先我们还是得用到台钻,或者其它具有切割、钻孔能力的设备,我们要把官方板上自带的面包板进行使用,我们要做的是加入一个DC头(下图有两种规格的,我们选左边这种),左边的DC头本来有三个脚的,为了方便安装,我们掰了一个脚。
两种DC适配头与1.2mm钻针
将DC头装入
DC头安装完成
依照上图我们装入了DC头以及滤波电容。
/**********************************************************/
这次调试我们遇到了诸多问题!
我们的起始调试环境是这样的:STC官方学习板,插入LCD12864。
我们的目的是利用IAP15自带的10位ADC对矩阵键盘进行键值获取,然后通过LCD12864显示所按下按键,而后使用串口1将采集到的键值以及对应的ADC值,通过USB转串口芯片传至PC,利用PC上的STC官方下载器的串口助手查看。
我们编写ADC按键扫描程序的思路是这样的:
始终开启ADC不断扫描键值,如果按下按键,那么将按下的键值通过串口1发送至PC的串口助手。
在这里我们遇到一个问题,I/O口在加入下拉电阻R18的时候,并不能讲电压拉低趋近至0V,这样导致的直接问题是电压会时钟维持在约1.6V左右,这样默认得出来的键值会是按键3或者4,同时我们也不否认我们程序思路也造成这一问题。于是我们这样做:
去掉下拉电阻,直接读取ADC值,然后转换键值。但是这样会带来一个问题,ADC接口电压会变为约5V,最后个键值“F”按照原理来说也为满值附近,最终等效于不按下任何键,检测出来的也是“F”,故最终我们去掉了“F”这个键。
为什么我们这么做?(去掉“F”)
这是因为这里只想通过这个例子,让大家知道STC特别的ADC按键扫描模式。虽然使用ADC扫描按键固然节约I/O,但是这对电源是有要求的,ADC通常需要一个基准电压源,在出厂以及编程的时候,如果不作任何其它配置,ADC使用的基准电压源是单片机的VCC电压,这样的话,一旦电压波动,采集的数值也会改变,或者电源使用不同,有个0.1V的误差也会改变最终采集的键值。譬如,当前我们对于键值数就相对于芯片手册做了小改变,大家可以对照程序看。
今后在做ADC采样时,我们如果需要精度比较高的话还是外加一个基准参考电压源,以下是典型应用电路:
同时我们提供以下一个思路供大家参考实现:
当按键按下时,再采集ADC值,然后取平均值,最终得出按键值,然后关闭ADC等待下次按下。
或者先让I/O口为低电平再采集(未验证,官方提供):
官方I/O复位低电平做法
使用ADC的时候还需要注意,是用到8位(0-255)ADC还是10位(0-1023)ADC,程序中需要注意:
TENBIT宏
这里我们使用宏定义(TENBIT)来选择如果定义了TENBIT那么就是10位ADC否则就是8位。选择了10位ADC还要注意获得的低两位数据,以及组合方式。最后清除转换完成标志位,然后结合高低位数据(详见程序)就可以得到10位ADC数据,而8位相对来说就比较简单,但是精度不高的场合才能使用。
最诡异的问题:
这个问题相当的诡异!!!!
LED10的亮灭,会影响在ADC采集时的“2”这个按键的键值!在原理图中,二者是互不相联的,打开或者关闭LED10,都会导致键值改变,所以在最后程序处理方面我们关闭了LED10,并调整了按键2的键值。
以上就是ADC扫描得到键值,下面我们介绍普通的行列扫描。
/**********************************************************/
行列扫描:
首先,我们要否定上面的是用LCD12864的做法,为什么呢?因为I/O口(P0口)是冲突的,数据无法传输,要么显示,要么扫描按键……于是我们果断放弃了LCD12864的做法,决定带大家接触下IAP15的串口,这里我们使用串口1,。我们是怎么做的呢?
1. 首先进行行列按键扫描,得到键值。
2. 将得到的键值通过提示语句显示到串口助手当中。
说到这儿,我们顺便也将ADC扫描按键的结果通过串口给到PC串口助手显示了,就不用LCD12864了,得到下面的实验现象:
串口助手现象
这里,凡所带Volt的都是ADC扫描按键得到的键值,而不带Volt的就是普通行列扫描得到的键值。
程序解析在程序中已经注释的非常清楚了。
如果不想用那么多的I/O还可以用74HC595这个芯片作I/O口扩展,然后进行行列扫描。
小谈:
其实现在的行业中,数码管、按键一步一步在减少了,触屏成本一度下跌,成为了大家的选择,数码管显示信息少、按键太多,触屏加界面是当下最合适的人机交互办法。大家努力学吧!
/**********************************************************/
刚才提到了IAP15F2K61S2的串口应用,这里要和大家说明几点:
1. 串口1使用的是定时器1作波特率发生器,波特率可变(宏定义修改MAIN_Fosc)
定时器1作串口1波特率发生器
2.串口1我们使用的是中断方式接收。
3.我们在串口发送字符串(ASCII码)的基础上加入了数值的发送,实质就是将数值转换为字符形式发送出去。这样就方便了大家把采集到的数据值发送到PC上观察,对于入门使用串口作数据发送很方便!
4.大家还要注意,我们可以加入一些提示语句来指示当前状态,这样更直观!(提示语句:”The Key Num is:”等)
/**********************************************************/
最后我们看一下本讲的实验现象:
视频地址:http://player.youku.com/player.php/sid/XODI0Mjg2MDIw/v.swf
/**********************************************************/
总结:
本次实验使用的是IAP15F2K61S2内部10位ADC来采集ADC矩阵按键的键值,并通过串口发送键值及电压至PC的串口助手,同时使用了P0口作为行列扫描按键的I/O完成了普通矩阵按键的扫描,也把键值通过串口1发送至PC的串口助手。
使用了定时器1来作为串口1的波特率发生器,定时器0中加入了指示灯来表明单片机运行正常,上一讲也说过,普通电源指示灯只能看出:电压是否正常、是否有短路等情况,然而单片机工作还是没工作,还是得靠单片机内部资源来表示,这里我们就采用了定时器+LED灯的方式。
/**********************************************************/
UltraFire:分享使人进步,同时发现自身不足!
以上就是本次玩转STC15第二讲的全部内容,感谢大家的阅读观看!
感谢大家的支持!局限于作者知识,如若有错误、不足大家可以提出!
共同进步,共同学习!
若有疑问可直接在下跟帖提问,UltraPlus会根据你的疑问为你解答!
提问格式:
问题标题:
问题描述:
问题现象:
最后,衷心感谢大家的支持!
UltraPlus
2014-11-10