基于STC8A8K48D4的动画小人设计
一、设计任务与哀求
1、用单片机设计一个小动画

设计基本哀求:
(1)用12864显示器做为显示器。
(2)初始时在显示器中央先显示自己的学号并勾留3秒旁边,接下来清屏并在显示器的左上角画一个小人型的图画。
(3)用按键来掌握小人型的移动,分别用按键表示上,下,左,右。每按一次,小人型移动一步。
(4)小人型不能跑出显示器。
二、方案设计与论证
首先,我选择这个项目的时候,我认为这个项目须要的硬件根本比较大略,它仅仅只须要几个按键,一块单片机,一个显示屏罢了。这个项目紧张的问题是在程序的算法层面,要在显示屏上面显示小人,并利用按键来操控它。
由于这次实训指定了STC8A8K48D4的LQFP44封装,以是我先上STC官网下载了一个它的库文件下来,并且看了它的芯片手册。同时老师给我们供应了利用I2C通讯的0.96寸4PIN的OLED屏,我按照辅导手册接在了单片机相应的IO口上面。
三、硬件电路设计
完成一个课程设计,我们的第一步该当是理解主控芯片,完成最小系统板的设计,在芯片手册中见告我们的最小系统板是在VCC口上连接一个22uf和0.1uf的电容,此芯片内部集成震荡电路可以不用外部晶振,但是末了我还是给它加了12MHZ晶振,这样的话延时会更准一些。此外,我在P1.0到P1.3上接了10k的上拉电阻,并通过轻触开关接地,当按下轻触开关的时候,P1.0到P1.3就会低电平。单片机与显示屏的通讯,则是采取SCL和SDA两条线,SDA我接在了P1.4,SCL我接在了P1.5。电源供电利用DC接口,并且合营自锁开关。此外,这个板子上还有电源指示灯,检测电源是否接通。
图1.1 流程图
图1.2 事理图
实在这次的设计有很多IO口没有用上,我想在未来的PCB设计中这些没用到的IO口可以用排针引出来,避免产生资源摧残浪费蹂躏。
四、软件设计
OLED屏网上有可以调用的库函数,只须要修正一下引脚,便可以移植到我的设计上面。同时这个单片机上电后每个IO口都是高阻态,须要我们做出一些引脚配置,把PxM0和PxM1设置为0x00,方可利用。这个设计所须要的算法便是在OLED屏显示一个BMP图像,并且给它设置好位置坐标,当我按下开关时候,决定它某个方向的坐标就会发生变革,为了避免产生残影之类的,按下该当先清一次屏,再显示图片。此外,我还创造自己在软件算法方面的知识比较薄弱,在编写程序时,常常碰着语法缺点和逻辑缺点,须要仔细探求和修正才能办理问题,须要多加学习和实践。详细主函数文件的算法流程如下:
//
#include "stc8a8k64d4.h"
#include "oled.h"
#include "stdio.h"//显示浮点数的sprintf函数
sbit sw2=P1^0;
sbit sw3=P1^1;
sbit sw4=P1^2;
sbit sw5=P1^3;
int a=0;
int b=0;
int c=64;
int d=4;
extern unsigned char code BMP[];
unsigned char disbuf[9];//显示浮点数须要
void delay_tms(unsigned int ms)
{
unsigned int i,j;
for(i=ms;i>0;i--)
for(j=0;j<1100;j++);
}
void Delay20ms(void) //@11.0592MHz
{
unsigned char data i, j;
i = 216;
j = 37;
do
{
while (--j);
} while (--i);
}
int main(void)
{
P1M0=0x00;
P1M1=0X00;
OLED_Init(); //初始化OLED
OLED_Clear() ;
OLED_ShowString(0,4,"20210460523",16);
delay_tms(3000);
OLED_Init(); //初始化OLED
OLED_Clear();
while(1)
{
//测试字符串显示,测试结果:
//第一个参数,以8为间隔;
//第二个参数,是行,如果第四个参数是12,那么以1间隔0-1-2-3-4-5-6,如果第四个参数是16,那么以2间隔,0-2-4-6
//第三个参数,字符串,双引号括起来
//第四个参数,是字体尺寸12或者16,16字体大一写
//图片显示,显示BMP图片128×64起始点坐标(x,y),x的范围0~127,y为页的范围0~7
if(sw2==0)
{
Delay20ms();
if(sw2==0)
{
if(c<127)
{
a=a+8;
c=c+8;
OLED_Clear();
}
}
}
if(sw3==0)
{
Delay20ms();
if(sw3==0)
{
if(d<7)
{
b=b+1;
d=d+1;
OLED_Clear();
}
}
}
if(sw4==0)
{
Delay20ms();
if(sw4==0)
{
if(b>0)
{
b=b-1;
d=d-1;
OLED_Clear();
}
}
}
if(sw5==0)
{
Delay20ms();
if(sw5==0)
{
if(a>0)
{
a=a-8;
c=c-8;
OLED_Clear();
}
}
}
OLED_DrawBMP(a,b,c,d,BMP);
}
}
仿真过程与仿真结果由于proteus8.6上面没有现成的stc8a8k48d4的芯片,无法完成仿真。于是我采取最小系统板合营面包板来接线做一个仿照过程。仿照过程非常顺利,OLED屏幕可以显示学号和动画小人。面包板作为一种方便利用的产品,在电子信息专业的学习也是发挥着重要浸染。
图1.3 面包板显示学号
图1.4 面包板显示小人
安装与调试在器件得手之后,我动手进行焊接。焊接过程也不是很随意马虎,由于之前从未进行贴片器件的焊接,导致有些引脚由于过热被热掉了,幸亏热化的脚是没有用的,不然就完成不了这次课题了。我这个PCB一次成功的缘故原由便是在于利用的IO口比较少,很多人由于IO口利用较多,然后又没有焊接履历让芯片断了脚或是贴片的焊盘化了,导致板子不能用。以是说后期该当要多学习点贴片焊接手法,再把那些剩余IO口用排针引出来这个板子就会好很多。
图1.5 设计的PCB
结论与心得本次设计让我也是明白了一些道理,世上无难事,只要肯登攀。原来的我对单片机实在不是很理解,也担心自己没办法做出来。于是,在百度上一贯搜索资料,找到了好多干系资料,并仔细剖析了那些代码,并融入自己的思想。我也是在剖析代码后创造别人做的显示图片是定好点位,显示在屏幕上。只要通过按键把点位移动就能实现动画小人。在这次的单片机实训中,我深刻体会到了理论与实践相结合的主要性,通过老师的讲解和自己的实践操作,我逐渐节制了单片机的基本知识和运用技巧。在未来的学习和事情中,我将连续努力提高自己的实践能力,不断学习新知识、新技能。同时,我也将看重团队协作能力的培养,与他人共同互助、共同进步。
八、参考文献
[1]、实例6 单片机显示数据 https://blog.csdn.net/lmf666/article/details/110117294
[2]、布丁橘长 OLED笔墨、图片左移右移效果事理先容
[3]、单片机事理及运用:基于STC15系列单片机+C51编程 赖义汉