这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 合作大赛 » UltraPlus带你玩转STC15单片机-第二讲

共13条 1/2 1 2 跳转至

UltraPlus带你玩转STC15单片机-第二讲

助工
2014-11-11 13:04:26     打赏

大家好!今天给大家带来《带你玩转STC15第二讲》。

本讲主要内容涉及以下资源:

晶振频率 @ 22.1184MHz     串口波特率 @ 9600bps

1.    IAP15F2K61S2单片机810ADC

2.    IAP15F2K61S2控制矩阵键盘。(ADC与行列扫描法)

3.    IAP15F2K61S2串口1

4.    IAP15F2K61S2定时器0(运行指示灯)、定时器1(串口波特率发生器)。

/**********************************************************/

本讲源码下载:

本讲例程.zip

/**********************************************************/




    大家看过前面两贴的应该知道这是要干嘛了吧?看到上面这个图片,说明我们又要对官方的板子改进一番。之前提到过:“官方板子由于使用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自带的10ADC对矩阵键盘进行键值获取,然后通过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-255ADC还是10位(0-1023ADC,程序中需要注意:




TENBIT

    这里我们使用宏定义(TENBIT)来选择如果定义了TENBIT那么就是10ADC否则就是8位。选择了10ADC还要注意获得的低两位数据,以及组合方式。最后清除转换完成标志位,然后结合高低位数据(详见程序)就可以得到10ADC数据,而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内部10ADC来采集ADC矩阵按键的键值,并通过串口发送键值及电压至PC的串口助手,同时使用了P0口作为行列扫描按键的I/O完成了普通矩阵按键的扫描,也把键值通过串口1发送至PC的串口助手。

使用了定时器1来作为串口1的波特率发生器,定时器0中加入了指示灯来表明单片机运行正常,上一讲也说过,普通电源指示灯只能看出:电压是否正常、是否有短路等情况,然而单片机工作还是没工作,还是得靠单片机内部资源来表示,这里我们就采用了定时器+LED灯的方式。

/**********************************************************/

UltraFire:分享使人进步,同时发现自身不足!

    以上就是本次玩转STC15第二讲的全部内容,感谢大家的阅读观看!

感谢大家的支持!局限于作者知识,如若有错误、不足大家可以提出!

共同进步,共同学习!

若有疑问可直接在下跟帖提问,UltraPlus会根据你的疑问为你解答!

提问格式:

问题标题:

问题描述:

问题现象:

最后,衷心感谢大家的支持!

                                                                                                 UltraPlus

                                   2014-11-10




关键词: STC    

助工
2014-11-11 13:09:01     打赏
2楼

楼主先占个沙发.....这个排版楼主实在搞不定,预览与实物不符啊!修改几次了都没救.....

希望大家凑合着看吧!毕竟内容才是精华


院士
2014-11-11 19:30:28     打赏
3楼

不错!

实验现象是空白,是要嵌入视频吗?若是,请参考http://forum.eepw.com.cn/thread/249042/4#39


助工
2014-11-11 19:42:28     打赏
4楼

咦?昨天嵌入完成了啊!!!我还看了~

等我修改下~


院士
2014-11-11 19:52:55     打赏
5楼
OK了,呵呵

院士
2014-11-11 23:26:41     打赏
6楼

这个挺有意思的。

写得真详细,多年以后再看,一定会乐的不行的


工程师
2014-11-11 23:31:51     打赏
7楼
挺不错的,

助工
2014-11-12 15:55:03     打赏
8楼
我的项目也是这个用法,我是16个按键,10ms采一次AD,用到普通按键和长按。我的原理图没有基准,除此之外和官方原理图一模一样。芯片是IAP15W4K61S4.发现一个问题,就是按下和松开的瞬间采到的AD可能有多种情况。应该是某个范围内的随机值。我用合泰单片机就是脚悬空时候采的AD值就是这个样子。消抖动要注意一些、、、

助工
2014-11-14 20:13:05     打赏
9楼
嗯嗯,挺不错的

高工
2014-11-15 17:44:25     打赏
10楼

顶起来

真不错


共13条 1/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]