找回密码
 立即注册
查看: 317|回复: 5

用擎天柱学习冲哥的8051U试验箱教程(一)——点亮LED灯|实验箱已寄出

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:15
  • 最近打卡:2025-04-16 12:46:37

1

主题

11

回帖

175

积分

注册会员

积分
175
发表于 2025-1-2 14:49:44 | 显示全部楼层 |阅读模式

前言

  • 开始学习STC8051U单片机,由于没有试验箱一直停留在理论中没有前进,前几天佘经理(STC工作人员)说可以免费领取擎天柱用于学习,我就赶紧免费申请了一个。在此感谢一下STC官方考虑的如此周全,这样对我们刚入门的人特别友好,再感谢佘经理的大力支持。

学习前准备

  • 开始之前首先要准备STC官方发布的“单片机在线升级编程调试平台软件(v6.09D),远程现场升级APP发布”软件(软件简称“车规”)。
  • 图片1.png
  • 首先根据芯片型号选择擎天柱的芯片,擎天柱芯片型号在开发版中间的小黑方框上如图擎天柱的芯片为AI8051U-34K64
  • 图片2.png
  • 再选择端口,端口一般是自动选择的不需要手动。但是我的怎么会没有呢?我纠结了一会,问了问佘经理和狗哥,有两个方案,第一就是插上STC官方的烧录器就正常了,第二是在插上擎天柱前按住P32按钮然后再插上端口才能正常。

开始第三课学习

  • 前期的准备工作准备完毕。开始第三课的代码学习及应用

  • 新建工程:1、创建空工程;2、添加头文件;3、输入代码并编译。一共三个步骤是不是很简单?接着学吧!

    1. 创建空工程根据AI8051U技术手册6.5章(第243页)教程创建,心得不在重复描述。

**需要注意的是AI8051U技术手册6.5章6.5.4~6.5.8的设置。**

  1. 添加头文件根据AI8051U技术手册6.4章(第241页)教程,这里需要注意的是include最好使用#include”文件名”这种格式,避免工程发给被人出现缺失头文件。
  2. 输入代码 首先我们需要一个main函数,然后配置IO口,IO口配置详见技术手册13.2章(第474页),根据冲哥的点亮第一个灯的教程怎么写代码都不能点亮擎天柱的灯,后来找原因发现擎天柱的端口与8051U实验箱的端口不一样,擎天柱没有P40的三极管控制端口和擎天柱的端口是P20控制而8051U试验箱端口是P0,根据冲哥的教程改了一下代码就可以正常写入并点亮灯。代码如下:

````

   #include "ai8051u.h"		//调用头文件

    //注意:擎天柱的LED端口在P2,且没有三极管的电源控制,所以只要控制P2端口即可

    void main(void)

        {

            P2M0 = 0;		//P2端口(P20-P27)为准双向口

            P2M1 = 0;


            while(1)

            {

                P20 = 0;	//P20端口输出0V

                P21 = 0;	//P21端口输出0V

            }

        }

结束语

  • 好了点灯完成,理论与实操还是存在很多问题的,不做一个眼高手低的人,多实践吧同学!!
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:15
  • 最近打卡:2025-04-16 12:46:37

1

主题

11

回帖

175

积分

注册会员

积分
175
发表于 2025-1-3 16:09:22 | 显示全部楼层

用擎天柱学习冲哥的8051U试验箱教程(二)——USB不停电下载

前言

  • 是不是每次下载都要按一遍P32按钮?如果已经加外壳了是不是就麻烦的很了?别慌!STC给出了解决方案——USB不停电下载

了解USB不停电下载

  • 在了解USB不停电下载前首先要了解一下8051U的USB中断的应用原理,详见下图:
    微信截图_20250103134148.png

如果想让USB中断工作首选要关闭EUSB然后再打开EA(总中断开关)才能正常工作。首先我们现在代码中增加EUSB = 1(关闭EUSB中断开关)然后EA = 0 (关闭总中断开关)。

  • 解决的USB中断优先问题,我们再解决中断是放到程序中强制执行还是等程序运行结束后执行,这里就用到了查询命令(查询命令是运行结束后执行)或者是中断命令(插入是强制中断)。所以我们需要把stc_usb_cdc_32.LIB库文件给放进来,用stc_usb_cdc_32.LIB还需要用到stc32_stc8_usb.h头文件,两个文件一起放到文件中。
  • 好了基本算设置好了,我们还需要用USB之前最好把USB给初始化,这里给代码添加一句usb_init();
  • 最后重点来了,不想每次下载都按按钮需要对芯片的寄存器中添加一句口令,让ISP识别到,例如口令:天龙盖地虎,回令:小鸡炖蘑菇。哈哈没这么简单!ISP已经给我预设值了口令@STCISP#,如图:
    微信图片_20250103143926.png

所以我们先打开寄存器把口令@STCISP#输入进去。根据8051U技术手册4.1.2章(第205页)打开需要用P-SW2寄存器的EAXFR后输入口令@STCISP#。具体详见下面代码:

}

#include "ai8051u.h"		//调用头文件
#include "stc32_stc8_usb.h"		//调用头文件
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";

void main()
{
//P_SW2 |= 0x80;
EAXFR = 1;
P0M1 = 0x00;   P0M0 = 0x00;
P1M1 = 0x00;   P1M0 = 0x00;
P2M1 = 0x00;   P2M0 = 0x00;
P3M1 = 0x00;   P3M0 = 0x00;
P4M1 = 0x00;   P4M0 = 0x00;
P5M1 = 0x00;   P5M0 = 0x00;
P6M1 = 0x00;   P6M0 = 0x00;
P7M1 = 0x00;   P7M0 = 0x00;
usb_init();                                     //USB CDC 接口配置

EA = 1;
//IE2 |= 0x80;
EUSB = 1;

while (DeviceState != DEVSTATE_CONFIGURED);     //等待USB完成配置

while (1)
{
    if (bUsbOutReady)
    {
        USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
  
        usb_OUT_done();
    }
 
	P20 = 0;	//P20端口输出0V
	P21 = 0;	//P21端口输出0V
	P22 = 0;
	P23 = 0;	//P23端口输出0V
	P24 = 1;
	P25 = 0;
	P26 = 0;
}
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:15
  • 最近打卡:2025-04-16 12:46:37

1

主题

11

回帖

175

积分

注册会员

积分
175
发表于 2025-1-6 17:34:53 | 显示全部楼层

用擎天柱学习冲哥的8051U试验箱教程(三)——C语言基础

前言

-不得不说冲哥还是有先见之名的^v^ ,准备正式进入讲解前先把C语言基础在给巩固一下。好了我们开始学习吧!

基础

1、 USB-CDC串口之Printf函数,这个函数是一个代码调试的时候最好用的函数,如果没这个函数调试的时候就去吐血吧!!!,用函数前需要先在stc32_stc8_usb.h头文件中#define PRINTF_HID 前(代码第6行)去掉//

2、 #define为自定义函数名,例如#define Y X 意识是用define函数,下面代码中凡是出现X的地方都可以用Y代替。

3、 数的进制:2进制、10进制、16进制 ,细节满满文字不好表达一切都在脑子中吧!

4、 数据的基础类型:细节满满文字不好表达一切都在脑子中吧!需要注意的是前面是否加UN,如果有就是正数型

5、 C语言的常用运算符

  • 算数运算符:+、-、*、/、%、++、-

  • 关系运算符:==、!=、>、<、>=、<=

  • 逻辑运算符:&&、II、!

  • 赋值运算符:=、+=、-=、*=、/=、%=、<<=、>>=、&=、^=、I=

  • 按位运算符:&、I、^、-、<<、>>

总结

-运算符很烧脑,但是又少不了

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:15
  • 最近打卡:2025-04-16 12:46:37

1

主题

11

回帖

175

积分

注册会员

积分
175
发表于 2025-1-7 21:49:46 | 显示全部楼层

用擎天柱学习冲哥的8051U试验箱教程(四)——I/o输出输入(第六集)

前言

什么是GPIO?GPIO通用为输入输出端口,简称引脚。引脚状态只有高电平(1)和低电平(0)。

学习

  • 引脚的工作模式一共有四种模式,准双向口、推挽输出、高阻输出和开漏输出
  • 直流特性,按VDD3.3V来说,如果开启施密特触发最高电压为1.18V,最低电压0.99v
  • 任务1:按下P32按钮灯亮,松开按钮灯灭

//=========================================================================//

	//任务一、按下P32按钮灯亮,松开按钮灯灭


	if (P32==0)			//检测按钮是否按下

	{

	    P21 = 0;	//P20端口输出0V

	}

	else

	{

		P21 = 1;

	}

//=========================================================================//

  • 任务二:按下P32按钮灯灭,松开按钮灯亮(把P32==0改为==1就行了)

//=========================================================================//

	//任务二、按下P32按钮灯灭,松开按钮灯亮


	if (P32==1)			//检测按钮是否按下

	{

	    P21 = 0;	//P20端口输出0V

	}

	else

	{

		P21 = 1;

	}

//=========================================================================//

  • 任务三:按一下灯亮,按一下灯灭。

任务三相对来说比较复杂一点,首先是需要让电平高低转换,第二防止抖动,还要添加延时。

//=========================================================================//

	//任务三、按一下灯亮,按一下灯灭。




	if (P32==0)			//检测按钮是否按下

	{

		Delay20us();

		if (P32==0)

	

			state=!state;

			P21 = state;	//P20端口输出0V

			printf("state:%d\\r\\n",(int)state);

		while (P32==0);

	}

//=========================================================================//

  • 课后任务1:按一下P32按钮灯亮,按一下P33安灯灯灭

      //=========================================================================//
    
      //课后任务1:按一下P32按钮灯亮,按一下P33安灯灯灭
    
    
    
    
      if (P32==0)			//检测按钮是否按下
    
      {
    
      	Delay20us();
    
      	if (P32==0)
    
      		P21 = 0;	//P20端口输出0V
    
      	while (P32==0);
    
      }
    
    
      if (P33==0)			//检测按钮是否按下
    
      {
    
      	Delay20us();
    
      	if (P33==0)
    
      		P21 = 1;	//P20端口输出0V
    
      	while (P33==0);
    
      }
    

//=========================================================================//

  • 课后任务2:按一下亮一课灯,在按一下亮两颗灯,直到全亮(变量+加法和乘法),这个有点复杂,需要想想怎做比较好!
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:15
  • 最近打卡:2025-04-16 12:46:37

1

主题

11

回帖

175

积分

注册会员

积分
175
发表于 2025-1-8 16:18:08 | 显示全部楼层

用擎天柱学习冲哥的8051U试验箱教程(五)——定时器中断(第七集)

前言

什么是定时器中断?在单片机编程中,定时器中断是一种重要的中断类型,它允许程序在特定时间间隔执行特定任务。51单片机定时器模式为24位,时钟为T1和T12,它们可以通过寄存器配置来实现定时功能。

学习

- 定时器中断的意义

最初学习定时器时,我遇到一个问题:如何让LED每三秒闪烁一次,同时还能响应按键操作?起初,我采用了简单的Delay方式来实现LED闪烁。然而,这种方法有一个很大的缺点,即程序在延时过程中处于“忙等待”状态,导致系统无法响应按键操作。后来我了解到,这正是单片机单核特性的限制。在这种情况下,引入定时器中断便成为了最佳解决方案。

定时器中断的最大优势在于,它能在固定时间内触发一个中断,打断主程序执行其他任务。这样,主程序可以在等待的同时,处理其他任务,大大提升了系统的响应速度和多任务能力。

- 定时器的配置和使用

学习定时器配置时,我发现一个非常实用的工具:ISP软件中的定时器计算器。通过它可以快速计算出定时器的初值,大大简化了参数配置过程。

配置流程总结:

1、确定系统时钟频率,这是计算定时器参数的基础。

2、选择定时器模式,8051提供四种定时器模式,通常选择Mode 1(16位自动重载)。

3、计算初值,根据系统需求计算出TH和TL寄存器的初始值,确保定时器在规定时间内溢出

4、使能中断,开启ET0和EA位,确保定时器溢出时触发中断。

5、编写中断服务函数,在中断函数中加入LED翻转或其他任务的逻辑。

6、通过这些步骤,我成功编写了一个定时器驱动LED闪烁的程序,也进一步加深了对寄存器配置和中断服务函数的理解。

- Keil乱码问题的解决

在编码过程中,我也遇到了一个小插曲:在Keil中打印汉字时,控制台输出乱码。通过查资料发现,可以通过在字符串中加入“\xFD”编码,或修改Keil的二进制文件来解决。最终我选择了直接在字符串中添加**\xFD**的方法,更加简单且稳定。

示例:

printf("数ý\xfd学");  // 显示“数学”
image.png

## 结束语

中断有点烧脑,配置相对复杂但是有挑战性,我会以往的克服艰难学习。

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:15
  • 最近打卡:2025-04-16 12:46:37

1

主题

11

回帖

175

积分

注册会员

积分
175
发表于 2025-1-13 10:52:17 | 显示全部楼层

更新到第七集了——实验箱到了

学习到了第七集了马上要学习数码管了,但是擎天柱不具备数码管,所以就向SCT厂家佘经理申请了试验箱,厂家很爽快的帮我申请了,在此感谢佘经理,仅两天就收到实验箱的还是顺丰快递,为STC的服务点赞。贴出收到的实验箱。

7500095b7bd17d80a394b5726bed5e1.jpg

9869e9edf0443a369a4f363fbb90281.jpg

94ef5474ed70cbe2df7b63e866be040.jpg

a1c6d4c0387f9bc92c4b492c504207a.jpg

回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-6 16:31 , Processed in 0.177546 second(s), 83 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表