本帖最后由 yangjiaxu 于 2021-9-9 21:12 编辑
#申请原创# @21小跑堂 学电开发板-初识
前言:大家好,我是豆包。前两天从我兄弟那里得到了一款穿了“衣服”的51开发板,说真的,能把开发板做成这样,真的是很用心,很细心。之前,我还自己建立个公众号,做的是关于51单片机开发的经验分享,可能是因为当时能力有限,可能也没有耐性,最后,公众号也没怎么维护,也没有继续发表**了;论坛是个好地方,前段时间有个做社区的朋友给我打电话,做了一下用户回访,我们聊了很多,说现在直播和公众号真的很强,给社区论坛这种平台冲击不小,我跟她说,论坛长久看来是最好的,它可以承载很多,很多工程师的经验和快乐都在这里。当需要查找资料,遇到技术难题了,都可以在论坛里找到答案。 今天,借此契机,把之前想做而没做完的事情做好吧,在论坛和公众号一起为大家分享关于51单片机的开发经验与心得,虽然没有大佬们做的那么细致,但是我也有一些自己在开发中遇到的问题,BUG或者研发中的启发,都可以与大家分享,因为,研发就是互相学习,互相进步的一个过程,在这个圈子里,不仅有制作出来产品的成就,还有和大佬们畅谈和学习的快乐,好了,言归正传吧,开启我们的基于学电开发板的51单片机开发之旅。 51单片机,其实很多工程师的入门工具都是它,51因为其是八位单片机,寄存器较少,采用C语言开发,程序通俗易懂,而且开发起来较为简单,所以,备受高校实验室和企业工程师的喜爱。 之前的51单片机,在工程师眼里,就是封装“笨重”,运行速度慢,不带仿真,而且调试基本只能靠printf,蜂鸣器+LED来看程序运行到哪里了。虽然胜在便宜,但是企业上用的还是不太多。 现在的51单片机可不一样了,就拿学电开发板中运用的MCU来说,STC8G2K64S4:64k Flash, 2k+256 RAM, 35MHz主频, 内置EEPROM,硬件SPI/I2C,所有IO可做PWM,而且本身芯片就是个仿真芯片,可以通过STC-ISP来配置成仿真芯片,如图1所示,配置完成之后,就可以通过keil进行硬件仿真了。 图1 配置仿真模式 软件方面配置如图2所示,首先选择仿真工具,直接选择STC Monitor-51 Driver这个就好,然后点击setting,会弹出串口号设置和波特率,串口号通过电脑设备管理器查找,确定是与开发板相连的端口号才可以,波特率是115200,然后就是跟正常仿真操作一致了,可以打断点,单步运行等等操作。 图2软件方面配置仿真的流程 接下来介绍一下学电开发板,学电开发板拿到手之后,真的眼前一亮,虽然瞅着小巧,但是功能和性能都一点不差劲。先看看开发板的样式,如图3,图4所示。 图3 学电51开发板正面
图4 学电51开发板背面
开发板外设资源如下: l 红黄绿 3 个发光二极管; l 1 个电源指示发光二极管(红); l 2.0 寸 IPS 液晶屏(320*240像素); l 4 个按键(3 个用户自定义按键、1 个硬复位重启按键); l 背面扩展IO引出; 接下来介绍一下硬件的内部结构,主要内部电路分为几个部分,首先是供电电路(包含锂电池充电电路和电压检测电路)、串口通讯和下载电路、外设电路(包含存储、按键、LED、传感器、蜂鸣器和TFT液晶屏等)。具体结构框图如图5所示。 图5 学电51开发板硬件结构框图 这里值得学习的是只要使用 USB连接电脑,CH340 就开始工作了,不受电源开关控制。但是这部分电路建议可以做成自动下载电路(免冷启动电路),这样的话会方便很多,也不用频繁重启硬件。 到此,硬件基本就介绍的差不多了,小结一下:学电开发板电路设计的比较人性化,电路考虑的比较全面,尤其是对LDO1电源通过一个按键控制实现了MCU重启功能,其次是USB转串口下载程序的那部分是不受LDO1控制,这样不会因为电源重启导致串口突然断开从而导致烧录失败的问题发生。最后是选择的TFT液晶屏是8080总线接口的,因为STC的MCU一般都会有一组8位的IO作为并口使用,这样会提升屏幕的刷新速度。 接下来讲一下环境搭建和如何开发吧。 首先下载个KEIL C51,然后需要有STC-ISP软件(这个是专门给STC下载程序用的,而且在这个软件上还能下载很多关于STC MCU开发的资源)接下来就是通过STC-ISP软件把 STC 单片机的头文件也添加进去,保证编译器可以支持STC的MCU。 接下来就是再KEIL C51中创建工程,最后就是和正常开发一样啦,具体可以参考学电的快速入门手册,非常全面。
02-快速入门手册.pdf
(1.36 MB)
最后,分享一下用学电开发板的点灯视频吧,使用学电开发板驱动WS2812共24位,代码如下: void main()
{
unsigned char i, j, t = 1;
PIN_MODE_CONFIG(P1, PIN_5, PIN_MODE_STANDARD);
WS2812_IO = 0;
while (1)
{
switch(t)
{
case 1:
for (i = 1; i <= 24; i++)
{
for (j = 0; j < i; j++)
{
Send_WS2812((unsigned long)0xFF0000);
}
for (; j < 24; j++)
{
Send_WS2812((unsigned long)0x000000);
}
Delay100ms();
}
t = 2;
break;
case 2:
for (i = 1; i <= 24; i++)
{
for (j = 0; j < i; j++)
{
Send_WS2812((unsigned long)0xD2691E);
}
for (; j < 24; j++)
{
Send_WS2812((unsigned long)0x000000);
}
Delay100ms();
}
t = 3;
break;
case 3:
for (i = 1; i <= 24; i++)
{
for (j = 0; j < i; j++)
{
Send_WS2812((unsigned long)0xFFFF00);
}
for (; j < 24; j++)
{
Send_WS2812((unsigned long)0x000000);
}
Delay100ms();
}
t = 4;
break;
case 4:
for (i = 1; i <= 24; i++)
{
for (j = 0; j < i; j++)
{
Send_WS2812((unsigned long)0x008000);
}
for (; j < 24; j++)
{
Send_WS2812((unsigned long)0x000000);
}
Delay100ms();
}
t = 5;
break;
case 5:
for (i = 1; i <= 24; i++)
{
for (j = 0; j < i; j++)
{
Send_WS2812((unsigned long)0x00FFFF);
}
for (; j < 24; j++)
{
Send_WS2812((unsigned long)0x000000);
}
Delay100ms();
}
t = 6;
break;
case 6:
for (i = 1; i <= 24; i++)
{
for (j = 0; j < i; j++)
{
Send_WS2812((unsigned long)0x0000FF);
}
for (; j < 24; j++)
{
Send_WS2812((unsigned long)0x000000);
}
Delay100ms();
}
t = 7;
break;
case 7:
for (i = 1; i <= 24; i++)
{
for (j = 0; j < i; j++)
{
Send_WS2812((unsigned long)0x800080);
}
for (; j < 24; j++)
{
Send_WS2812((unsigned long)0x000000);
}
Delay100ms();
}
t = 1;
break;
}
}
}
学电-WS2812.rar
(57.88 KB)
|