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

共21条 1/3 1 2 3 跳转至

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

助工
2014-10-31 16:06:58     打赏

 

跟我一起学:STC15F2K61S2 开发板预告

 

大家好!是不是早就等的不耐烦了啊?让大家久等了,楼主最近参加竞赛,时间比较少,昨天通宵剪了个视频,今天睡了一会儿给大家继续出本讲!在这种艰辛的条件下,只为了能和大家早日研究通这块板子!

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

有些问题楼主将不再重复阐述,论坛里面蛮多资料的,请大家仔细查阅!

有些过于深刻的理论楼主也不再阐述,目的是为大家更快的使用这块板子的实际功能,而且官方的数据手册上其实说的很清楚了。

文章结尾有楼主给大家如何从传统单片机过渡到STC15系列的经验。

如果还有疑问就请大家更贴提问吧!我们都会解答的!/**********************************************************/

废话不多说,咱们直奔主题:

首先经过前一贴,不知大家做好准备没有?

1.    Keil编程软件。

2.    开发板USB转串口驱动。

3.    STC下载器。

4.    新建一个工程。

如果以上几点都准备好了,那么咱们就开始下面的话题:

首先跟着楼主对自己的开发板做个手术

首先下载STC学习板的官方电路图:

开发板4-带32K SRAM-2014-3-22.pdf

下载STC IAP15F2K61S2的数据手册:

STC15F2K60S2.pdf

有需要STC IAP15头文件的也可以下载:

STC15F2K60S2.zip

咱们现在把开发板拆下来,然后转到背面,按照下图添加两个电容。


楼主选择的是一颗16V220uF的极性电容(注意正负极,已在图中标注完毕)和一颗104的独石电容。为什么要这样做呢?因为楼主在编程中发现,板子一旦使用USB供电带上过大负载,如:LCD此类功耗巨大的外设,系统就偶尔会不稳定,尤其是下载的时候,这样做是加强了滤波,同时也要指出:虽然整板用了很多钽电容,可是都距离电源输入端较远,滤波作用有所下降。

该部分实质在原理图中是这样的:

楼主还给板子做了额外的一个手术:

楼主将板内的两个机械孔扩大了,这样做是因为楼主没有合适的螺丝钉,不方便LCD的安装,在看了不影响正反面PCB走线的情况下扩孔了。最后就是下面这个效果:

 

有了液晶后瞬间感觉板子萌萌哒了……

好了!手术到这里就结束了,现在咱们正式开始玩转这个开发板吧!

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

我们第一次例程运用到开发板如下功能:

1.    IAP151T定时器/计数器T0

2.    LED4个。

3.    数码管以及74HC595芯片。

4.    下载电路。

5.    I/O口若干。

6.    外接了一块LCD12864.

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

我们的操作流程是这样的:

1.    接上USB线,插到电脑上。

2.    打开下载器,确认设备是否连接,串口是否正常。

3.选择内部时钟,并设定IRC频率为22.1184MHz

4.其余设置默认,注意两个地方需要打上勾:

1)复位脚用作I/O口。(不勾选,会造成I/O冲突)

2)每次下载前都重新装载目标文件。(不勾选,每次下载hex文件都是调用之前的)

5.板子S1开关拨向上方,S2开关默认拨向左方。

下面这个是还未确定的因素:

请大家暂时不要旋动板子上的W1电位器,否则将会影响下载,不知道是单我这个板子的问题,还是哪个细节问题。加上前面的电容就好,楼主会继续观察,该处原理图如下图:

最后调入我们的HEX文件下载。

将楼主编写的代码下载到开发板中,你将会看到下面的情况:

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



视频地址:http://player.youku.com/player.php/sid/XODE1MTQwMjI4/v.swf

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

纠正下视频中所说:“下面我们按下复位键”,那个经后面考证后其实并不是复位键,而是使用了三极管的开关作用,当按下按键SW19后基极会被USB的电压置为高电平,也就是Q2截止,而单片机的电源是来自VCC这个网络节点的,当Q2截止后,也就意味USB的电源不能到单片机,实现冷启动下载

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

看了上面的现象,大家都迫不及待想在自己板子上实践了吧!

下面是我们的源码:

本讲例程.zip

在这儿要给大家解析几处:

1.首先是代码风格!这个我觉得很重要!(该代码风格是楼主在外项目情况)多人联合开发的时候有一套良好的风格是很重要的,方便做大型项目的时候,开发到最后的联调顺利进行以及项目组成员的交流。多的不说了(楼主其实是话唠),我们在这儿采用的是模块化编程,整个代码框架大体如下:

1)工程文件夹的建立:

文件夹分为:

Code用于存放.c\.h文件,也就是编写的代码;

Obj用于存放建立的工程文件;

OutPut用于存放输出的Hex文件。

2)工程(自己建立的Keil工程)划分:

Source File
Global
:存放全局文件(所有头文件、全局变量等)。

Delay:绝大多数文件需要的延时函数。

以及单片机内部资源的驱动,譬如TimerSPIPWM等。

Main

Process:进程文件,也就是主要程序。

Main:主函数。

HardWare

该目录下存放需要的外设驱动,以及该外设所对应的操作函数。

以上是代码文件结构。

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

2.下面是三个主要文件说明:

(1) Main.c

这一文件的编写原则是尽可能的简洁,大家可以看到,该文件下仅包含了初始化函数和进程执行函数。我们这样做,是想让程序尽可能的有层次感:

如上图,我们在这儿仅需对函数右键(需要先编译通过),选择“Go To Definition Of
XXXXXX ”就可跳转到相应函数主体存在位置。这样整个程序就能有层次化,清晰明了!

(2) Process.c

大家可以看到,直到到了Process这一层依然还是比较简洁的,我们对函数的命名也尽量使用部分英文组合,方便大家识别,Process这一层装载的就是主要的执行函数,大家同样能Go To……进去看函数主体。

(3) Global.h

大家从文件后缀可以知道,这是一个头文件。通过名字我们可以知道,该文件主要包含一些全局的东西,譬如:它包含了主晶振频率的定义、各文件的头文件、全局变量等,这样做的目的是减少头文件的重复定义,以及可以让协同编程人员查找你的全局变量。

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

3.大家还会发现,我们在每个文件上都标注了该文件的信息,在函数上都对该函数进行了说明。

以上就是我们程序的风格,希望大家能够喜欢!

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

对于实验中的几个问题要作解说:(选择内部晶振频率:22.1184MHz

1.    首先是数码管利用74HC595驱动,其中管脚P5.4 HC595-RCLK是和复位脚P5.4 RST冲突的,如若下载时将复位脚启用。电平只有复位时产生高电平,其余时刻都为低(依据正常复位电路情况)。

2.    由于LCD12864功耗较大,所以在USB供电时可能不稳定,所以我们最好做第一个手术,目前该LCD驱动采用的是并行,之后可能会调整为串行,并且不再使用数码管了,在这个时代中,很多东西都是可视化的了,数码管虽然成本上有优势,但是显示信息已经不足了,用的愈来愈少了。(楼主的LCD有一些年头了,显示效果不是那么好)

3.    我们余出一个LED(P4.6 LED10),在定时器中加入这个灯,以确保程序是在正常运行的,因为这个比电源指示灯实在多了,能确保看到单片机是在工作的。还可以加入一个灯,测定程序是否卡死。

4.    程序都作了注解,大家可以仔细学习下,理论方面大家需要去论坛中回顾下基础知识了,这里只是教大家怎么使用IAP的这片开发板,以及揪出问题。不过重要的部分还是会讲解的。

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

程序中,我们有两个地方要说:

1.    LCD12864显示图片。

首先我们下载LCD12864资料。

打开资料看到“五.显示坐标关系”,我们会看到下图

再结合程序来看:

程序首先关闭图形显示等待数据写入完成再显示,对照GDRAM地址以及汉字显示坐标写入对应数据(利用for循环)

那么问题来了:

图片数据从哪来?

该代码是通过一个指针指向图片数据数组开头首地址,最终将数据逐一写入,那么这个数组的数据获得咱们需要通过一个软件来获得。请大家下载这个取模软件:

取模软件.zip

打开后看到这样的界面:

此时,因为LCD12864显示范围,我们需要导入一幅128 X 64像素点大小的图片。楼主特意找jackwang要了份论坛的LOGO,是这样的:

.JPEG

我们需要做的首先是:

1.    裁剪为128 X 64像素点大小,并以.BMP格式输出,并需要转为灰图(黑白的)。于是就是下面这个样子

.BMP

转换后发现实际大小只能是 128 X 39像素点,这也不是问题….导入取模软件中。结果……..无法识别一团的。无奈尝试了各种办法:

反色:

 反色+灰度:

无奈还是都不行…..最终这个成了:

.BMP

原图裁剪后转为BMP…..但它识别后是这样的:

这完全看不出大概啊……最终楼主碉堡了….直接用鼠标修改:

最终忘记截图了….但大概是以下样子再作其它修改。

然后取模送显示….发现显示的时候LCD12864下班部分全是不均匀的白点点,这是为什么呢?

那是因为之前图片裁剪的时候图片大小只有128 X 39,这时候我们还是得手工…..我们这样做:

因为取模数组只取到了39行,我们需要补齐64行才得,因为下半部分我们不显示,所以对齐上面的行,再补25行的0x00……复制即可,大家不要手工输入….最后一行的最后一个逗号不要,大家注意,因为你的数组数据输入完毕了,以“}”结尾。

这样我们就能正常显示LOGO….当然这只是个例,也要给大家了解下。

以上就是图像的取模及显示。

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

2.    IAP15定时器。

教大家一个快速上手定时器的办法!

传统的8051有单片机小精灵

STC15系列有官方神器!STC的官方下载器!

打开官方下载器:

1.    找到定时器计算器。

2.    选择系统时钟频率。

3.    定时长度的设置,由于是1T定时器,最大设置2ms即好。

4.    选择定时器T0/T1还是XXXX

5.    选择16位自动重载。

6.    定时器时钟选择1T

7.    接着生成C代码,贴入你的工程中。

注意:

遵从传统8051.我们要加入两句话在上面的代码中:

1.    ET0 = 1这句代码的意思是打开计数器0开始计数

2.    EA = 1这句代码的意思是打开总中断。

因为要使用定时器中断及其服务函数,所以需要以上两项。

刚才的代码只是定时器的初始化,我们还需要一个中断服务函数:

后缀为interrupt X,然后在中断服务函数中写上定时器初值,之后就可以加入自己的代码了。

初学者可以对定时器/计数器中断作这样的简单理解:

目前定时器中断为2ms/次,意味着,每经过2ms,单片机都要打断你的所有程序,来执行你在中断服务函数中,自己添加的代码。

关于interrupt实质是这样的(也称中断向量表):

兼容传统8051STC系列:

外部中断INT0        0

外部中断INT1        2

定时器T0中断       1

定时器T1中断       3

串口1中断          4

STC15系列:

外部中断INT2        10

外部中断INT3        11

外部中断INT4        16

定时器T2中断       12

串口2中断           8

大家同样可以使用传统定时器(12T)。

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

以下比较关键,也是大家所关心的:

如何从传统8051过度到STC  IAP15?楼主给出大家以下几点经验:

1.    大家首先需要下载对应的芯片手册,里面对于IAP15操作说的很详尽了,有基础的看手册都能操作OK。文章开头已经附件。

2.    熟悉STC-ISP下载器的使用,这可是神器!下载器中带有以下功能:

(1) 串口助手。调试代码神器,后面讲说会给大家演示。

(2) 添加型号和头文件加入KEIL

(3) 范例程序!

(4) STC单片机的选型。

(5) 波特率计算器。(代码自动生成)

(6) 定时器计算器。(代码自动生成)

(7) 延时计算器。(代码自动生成)

(8) 头文件。

(9) 官方网站资源链接。

(10)            汇编指令表。

(11)            招聘启示………(仅限女性)

3.    了解IAP15与传统8051区别。

4.    注意IAP硬件设计,主要是突出IAP15的内部高精度晶振、内部高可靠复位电路。

5.    我认为从传统8051过渡到IAP15初学者最不注意的地方在于:

(1) 晶振频率,也就是系统时钟,这是影响定时器、延时、串口等等的关键点。晶振频率改变,定时器频率也会改变、延时时间也会改变,这两者的改变,对于传统程序的影响是造成其时序混乱,程序工作不正常。

(2) 定时器,传统单片机是12TIAP151T大家,可以自行切换。

(3) 头文件使用STC15的减少出错,不必在单独文件中在此定义声明,直接使用STC15头文件。

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

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

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

共同进步,共同学习!

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

提问格式:

问题标题:

问题描述:

问题现象:

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

                                                                                         UltraPlus

                                    2014-10-24




关键词: 带你玩转STC15          UltraPlus     代码    

院士
2014-10-31 16:26:59     打赏
2楼
真心详细,真心好!

专家
2014-10-31 16:38:33     打赏
3楼
惊呆了,楼主精神可嘉

专家
2014-10-31 16:38:33     打赏
4楼
楼主真上心了

院士
2014-10-31 23:14:26     打赏
5楼
楼主的帖子好全,学习了,谢谢。

菜鸟
2014-11-01 16:57:03     打赏
6楼
0.0.0.0.0

院士
2014-11-02 09:19:10     打赏
7楼

这个帖子肯定要精华的。


关于USB供电的问题,楼主的电容有些过大220uF,这样会加重供电端的启动电流。

另,所谓的供电不稳的原因基本在USB端,一方面是你的本本USB供电不足;另一方面,是开发板的耗电量过大,应该独立供电。


助工
2014-11-02 12:52:18     打赏
8楼
一开始是这样考虑的,后面干脆我在面包板那搭一个DC头的 感谢jobs.嘿嘿 后面我测一下电流看看,看下板子耗电量,记得当年测12864还是好几百mA电流。所以后面都用5110了,就是显示太少

院士
2014-11-02 14:44:20     打赏
9楼
学习板大量发送还没有开始?

高工
2014-11-02 18:01:39     打赏
10楼
楼主帅呆了,给你点32个赞

共21条 1/3 1 2 3 跳转至

回复

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