大家好!是不是早就等的不耐烦了啊?让大家久等了,楼主最近参加竞赛,时间比较少,昨天通宵剪了个视频,今天睡了一会儿给大家继续出本讲!在这种艰辛的条件下,只为了能和大家早日研究通这块板子!
/**********************************************************/
有些问题楼主将不再重复阐述,论坛里面蛮多资料的,请大家仔细查阅!
有些过于深刻的理论楼主也不再阐述,目的是为大家更快的使用这块板子的实际功能,而且官方的数据手册上其实说的很清楚了。
文章结尾有楼主给大家如何从传统单片机过渡到STC15系列的经验。
如果还有疑问就请大家更贴提问吧!我们都会解答的!/**********************************************************/
废话不多说,咱们直奔主题:
首先经过前一贴,不知大家做好准备没有?
1. Keil编程软件。
2. 开发板USB转串口驱动。
3. STC下载器。
4. 新建一个工程。
如果以上几点都准备好了,那么咱们就开始下面的话题:
首先跟着楼主对自己的开发板做个手术
首先下载STC学习板的官方电路图:
下载STC IAP15F2K61S2的数据手册:
有需要STC IAP15头文件的也可以下载:
咱们现在把开发板拆下来,然后转到背面,按照下图添加两个电容。
楼主选择的是一颗16V220uF的极性电容(注意正负极,已在图中标注完毕)和一颗104的独石电容。为什么要这样做呢?因为楼主在编程中发现,板子一旦使用USB供电带上过大负载,如:LCD此类功耗巨大的外设,系统就偶尔会不稳定,尤其是下载的时候,这样做是加强了滤波,同时也要指出:虽然整板用了很多钽电容,可是都距离电源输入端较远,滤波作用有所下降。
该部分实质在原理图中是这样的:
楼主还给板子做了额外的一个手术:
楼主将板内的两个机械孔扩大了,这样做是因为楼主没有合适的螺丝钉,不方便LCD的安装,在看了不影响正反面PCB走线的情况下扩孔了。最后就是下面这个效果:
有了液晶后瞬间感觉板子萌萌哒了……
好了!手术到这里就结束了,现在咱们正式开始玩转这个开发板吧!
/**********************************************************/
我们第一次例程运用到开发板如下功能:
1. IAP15的1T定时器/计数器T0。
2. LED灯4个。
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的电源不能到单片机,实现冷启动下载。
/**********************************************************/
看了上面的现象,大家都迫不及待想在自己板子上实践了吧!
下面是我们的源码:
在这儿要给大家解析几处:
1.首先是代码风格!这个我觉得很重要!(该代码风格是楼主在外项目情况)多人联合开发的时候有一套良好的风格是很重要的,方便做大型项目的时候,开发到最后的联调顺利进行以及项目组成员的交流。多的不说了(楼主其实是话唠),我们在这儿采用的是模块化编程,整个代码框架大体如下:
(1)工程文件夹的建立:
文件夹分为:
Code用于存放.c\.h文件,也就是编写的代码;
Obj用于存放建立的工程文件;
OutPut用于存放输出的Hex文件。
(2)工程(自己建立的Keil工程)划分:
Source File:
Global:存放全局文件(所有头文件、全局变量等)。
Delay:绝大多数文件需要的延时函数。
以及单片机内部资源的驱动,譬如Timer、SPI、PWM等。
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循环)。
那么问题来了:
图片数据从哪来?
该代码是通过一个指针指向图片数据数组开头首地址,最终将数据逐一写入,那么这个数组的数据获得咱们需要通过一个软件来获得。请大家下载这个取模软件:
打开后看到这样的界面:
此时,因为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实质是这样的(也称中断向量表):
兼容传统8051与STC系列:
外部中断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) 定时器,传统单片机是12T,IAP15是1T大家,可以自行切换。
(3) 头文件使用STC15的减少出错,不必在单独文件中在此定义声明,直接使用STC15头文件。
UltraFire:分享使人进步,同时发现自身不足!
以上就是本次玩转STC15的全部内容,感谢大家的阅读观看!
感谢大家的支持!局限于作者知识,如若有错误大家可以提出!
共同进步,共同学习!
若有疑问可直接在下跟帖提问,UltraPlus会根据你的疑问为你解答!
提问格式:
问题标题:
问题描述:
问题现象:
最后,衷心感谢大家的支持!
UltraPlus
2014-10-24