【实验箱已收到】感叹AI芯片越来越强悍之学习AI8051U芯片
第一节 初识AI8051UAI8051U加强了QSPI功能,做全了IIS录放音功能,兼容了PWM DMA,通过硬件浮点乘除单元实现了频谱分析仪功能,
居然实现了手写识别计算器(运行了AI算法,真牛)!!!做为电子狂魔的我们,对它的强悍功能很是佩服.
高帧率的视频显示,8080的8位并口就可以很好的支持各种显示目的.
感谢官方提供的各种非常实用的例程包,这样可以让我们在学习中有一个很好的参考,甚至还可以利用 这些例程来开发更多更
实用的产品!!!
并且很好的支持了触摸操作,强大,强大.
IIS数字录放音的演示
WS2812的时钟,如果需要,可以使用PWM+DMA实现1千多颗2812的驱动效果
频谱分析功能的演示,因为芯片运行速度足够已然,实现了快速的FFT数据刷新{:qiang:}
AI8051U实现了手写计算器,这个真的强大到了超乎想像的地步了
还可以做了个FLASH编程器,这个功能挺实用的.
通过以上的学习,知道了AI8051U这些更加强大的功能,坚定了学好,用好AI8051U的决心!!
STC打卡第二课硬件及工具介绍冲哥哪怕梦想让我们拼的遍体鳞伤,这一次我们也要勇往直前!一硬件资源介绍:图1
图2
1烧写程序和调试接口
附赠的USB数据,可以直接连接电脑,给实验板烧写程序.还可以使用LINK1D,连接实验板上的LINK1D口进行烧写和调试程序,(强烈建议入手一个哦)还可以使用TYPEC的数据线连接,进行数据的下载(兼容多种类的数据线)
2,USB转双串口功能…板载一个USB转双串口的芯片(最高波特率10M左右),方便做此类的通讯实验.3,TF卡座,可以跑文件系统等4,示波器接口,配一个示波器笔,配合示波器例程,学习示波器,使用示波器,功能强大.5,立体声音频耳机和线路输出和MIC头,可以做录放音实验哦..厉害了STC.6,OLED接口,支持SPI,IIC;7,板载8LED,可以做流水灯,运行状态指示等8,8位数码管,可以方便 的做关于数码管显示,等功能 的实验.9,TFT并口彩屏接口,可以用来做手写计算器,动画播放,等TFT相关显示类的实验.10,掉电检测,可以做电压跌落检测实验.11,红外接收,红外发射功能,,,这个不用多说了,很实用的功能.12,矩阵键盘,基础而又要必须掌握的功能实验.13,ADC键盘,做产品时会用到的功能,实用.14,主控芯片AI8051U 强大易用,资料丰富.15,T0 T1 按键 ,可以得用定时器中断来进行计数,等实验.16,INT0,INT1,按键 ,可以用来做外部中断的实验.17,实验板的复位按键 ,电源开关按键,电源开关按键 配合P32引脚做让主控芯片强制进入下载模式,方便程序的烧写.18,QSPI的FLASH芯片 ,可以存储大量数据,比如动画短片,字库等 ….还可以做FLASH编程器实验19,RTC电池,保证主控内部RTC断电后的连续计时.20,24C02 EEPROM,可以做IIC读写实验.21,DS18B20数字温度传感器,做温度检测实验,学习单线通讯.22,蜂鸣器23,SP3485芯片,485通讯实验功能.24,TP2604S触摸控制芯片,,SPI通讯25,AI8H2K12UUSB转双串口芯片.二编译环境的配置步骤:1安装KEILC251 软件 2 下载STCISP软件 3 ,添加头文件 4 下载KEIL中断插件软件 5,下载代码包和手册
三烧写程序的方法:用USB数据线连接电脑,打开ISP软件,按下P32按钮不放,再按一下电源按钮,这时ISP软件中扫描串口中出现(HID1)USBWriter时,就可以选择一个HEX文件进行烧写.同时还需要对频率等选项进行配置,这就需要根据代码的要求进行配置.点击下载/编程即可将编译好的固件烧写到单片机中,然后就可以通过实验板观察运行结果. 通过以上的学习,对8051U实验箱硬件,编译环境安装设置,下载第一个程序的步骤有了完整的概念.让我们扬帆起航,一起进入AI8051的世界!
打卡第三课 点亮第一颗LED流程:1 添加头文件(利用ISP软件参考手册6.3章)2, 新建一个KEILC251工程,并设置工程参数(参考手册6.5章)3,编辑代码,编译并烧写到单片机中.4,观察运行结果 1,添加头文件(利用ISP软件参考手册6.3章)这一步比较简单,打开ISP软件,右侧KEIL仿真设置中,,找到添加型号和头文件Keil中…点击后找到KEIL251的安装目录 ,点击确定即可.图22,新建一个工程打开 Keil 软件,并点击“Project”菜单中的“NewuVision Project ...”项
将目录定位在准备好的项目文件夹中,并输入项目名称(例如:Demo)选择目标单片机型号 在弹出的“Select aCPU Data Base File”窗口中选择“AI MCU Database”_选择确定的单片机型号ai8051u._添加源代码文件到项目_设置项目 1(“CPU Mode”选择 Source 模式) 编译代码:#include "ai8051u.h" //调用头文件 void main(void){ P0M0= 0; //P0端口(P00-P07)为准双向口 P0M1= 0; P4M0= 0; //P4端口为准双向口 P4M1= 0; while(1) { P40= 0; //P40端口输出0V P00= 0; //P00端口输出0V P01= 0; //P01端口输出0V }}运行结果
对于以上这些,好多人像我一样,都已经轻车熟路了吧.搞定.
打卡第四课 USB不停电下载
常规的程序下载,需要按下P32,然后断电重启单片机,然后才能下载,对于代码调试来说有点繁琐,那么能不能快速下载呢? 有,,有,,有,,哈哈
ISP软件直接点击下载按钮以后,实现程序直接的下载到单片机中!!! 不再需要断电,也不需要按下按钮….方便 ,快捷,,,,,真香.
那么如何实现这个功能呢,,往下看,图中例出了实现不停电下载的流程.
图1
看起来不复杂,,做起来也不复杂.
第一步,下载USB库文件和USB库例程
根据官方的说明: Ai8051U根据所选的8位/32位模式可使用相同位数的库文件
例程中使用了STC32G的USB CDC库文件例程.
关于例程的说明 :
两大类 CDC 和 HID建议个人使用CDC类型
两大类又分为,查询模式和中断模式.
第二步,创建一个工程(移植)
添加头文件,将stc_usb_cdc_32.LIB, stc32_stc8_usb.h文件复制到工程文件夹中,然后在工程中添加stc_usb_cdc_32.LIB文件(需要将文件类型设置为*.*或*.LIB才能找到),并定义头文件:#incledu “stc32_stc8_usb.h”
在主函数中添加USB初始化函数:usb_init();
把命令参数添加进来:
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
这里的"@STCISP#"是ISP软件中默认内部下载命令,这个也可以自定义哦,只要代码中设置的字符串和ISP软件中自定义命令设置相同即可.
图4
一个重要的寄存器设置!!!
P_SW2 |=0X80; //扩展RAM区特殊功能寄存器功能 打开 (EAXFR:1)
相关中断的设置
IE2 |=0X80; //使能USB中断
EA = 1;//打开总中断
再添加USB配置是否完成的检测语句:
while (DeviceState != DEVSTATE_CONFIGURED); //等待USB完成配置
只有检测到USB配置完成以后,才能进行相关USB的操作,否则会出现意想不到的结果.
代码编写好以后,编译,下载到单片机中,就可以进行不断电进行下载了.
将ISP软件主界面中最下方的:当目标文件变化时自动加载并发送下载命令勾选上.
只要重新编译一下代码,,ISP软件就会自动的发送自定义命令到单片机,,单片机接收到这个自定义命令以后,就会自动重启到系统ISP区,然后自动下载HEX固件.
通过本次学习,掌握了不停电下载固件的方法!!! 打卡第五课C语言基础结合个人的实际情况,再学习一下C语言基础,这样有助于对基础知识更加深入的理解;课程主要内容:1.C语言 USB-CDC串口之printf函数的实现2.数的进制:2进制、10进制、16进制3.数据的基本类型4.C语言常用运算符 开始L很重要哦1.C语言 USB-CDC串口之printf函数的实现它可以快速打印出数据,帮助我们快速的开发,很有用哦图5-2图5-3 printf函数的原型Int printf_hid(const char *fmt,…);参数:fmt 是格式控制字符串,包含了两种类型的对象:普通字符和转换说明图5-42.数的进制:2进制、10进制、16进制这个很基础的东东,,运算的基础,复习一下图5-53.数据的基本类型这个常用的两三种都熟练了,别的还真的不太熟练,用的时候会查一下表.图5-64.C语言常用运算符常用运算符这个也很基础哦,常用 的+-*/ ,其中注意的是/ 是取整数部分 %取模运算,只得到余数部分++--自加自减图5-7
关系运算符:==!= >< >= <=图5-8
逻辑运算符:图5-9
赋值运算符:图5-10
位运算符图5-11
其他运算符图5-12 哇,总结一下,原来有这么多的运算符,你都用过吗!哈哈哈.都用过,有的用的多,有的用的少,多少都有用.
<p>8051这芯片的确是很强悍的。</p>
打卡第六课 I/O输入输出1.什么是GPIO2.按键输入检测3.课后小练 1.什么是GPIOGPIO(General Purpose I/O Ports)意思为通用输入/输出端口,通俗地说,就是一些引脚,可以通过它们输出高低电平或者通过它们读入引脚的状态-是高电平或是低电平。图6-1 高低电平的概念 高电平:接近于电源正极电压的电平,也叫逻辑”1”, 低电平:输出GND的电压,俗称”0”
图6-2 端口模式的配置 理解拉电流,和灌电流,通俗的来说,拉电流就是让IO口输出高电平来驱动,灌电流就是让端口输出低电平来驱动.(这样理解是否正确呢?)关于高低电平信号电压的定义,参照手册中高低电平的电压来确定…..图6-3 端口复位以后,默认都是高电平!!!! 在准双向口模式下的输入检测:图6-4
如何在代码中实现对IO输入的检测 呢,一般可以使用判断来实现:if(P32== 0) //如果P32端口为低电平时,执行相应的代码 在这里有一个关键要处理 ,就是按键拉动,只要是按键就绕不开这个问题包括按下时的抖动和松开时的抖动;拉动的本质,见下图:图6-5; 在代码中对于按下时的前沿抖动,可以用延时来消抖,松开时有一个松开检测. 课后任务1:按一下P32按钮灯亮,按一下P33按钮灯灭;课后任务2:按一下亮一颗灯,在按一下亮两颗灯,直到全亮(变量+加法和乘法)通过以上的学习,学习了关于8051U单片机在使用过程中,对于I/O的配置,以及按键使用的基础知识,包括8051U单片机软件延时代码的生成.
打卡第七课 8051U深度入门到32位 之 定时器中断哪怕梦想让我们拼的遍体鳞伤,这一次我们也要勇往直前! 关于定时器,单片机中最重要,也是最基础的一个单元,也是曾经花费最多时间理解的一个东东(谁让我笨呢…..) 1.定时器的介绍2.定时器的应用3.函数的定义、声明、调用
1定时器的介绍问题:LED三秒闪烁一下,这三秒按下按键但是没有反应了?这怎么办呢?答:因为MCU单核的,同一时间只能执行一个事情,没有特殊情况不能被打断。所以这里就要引入一个特殊的情况,定时器中断。定时器作用: (1) 用于计时系统,可实现软件计时,或者使程序每隔一固定时间完成一项操作 (2) 替代长时间的Delay,提高程序的运行效率和处理速度(可以打断主循环)定时器的配置,可以使用ISP软件中的定时器计算器,可以很方便的得到定时器参数的配置代码;在这里需要注意系统时钟要确定下来.时钟确定下来以后,就可以根据时钟来计算参数.图7-1 有的同学要问了,定时器中断是怎么执行的呢??通过学习,我们就会知道了.首先,通过ISP软件配置好定时器的参数,然后把ISP软件生成的定时器初始化代码,加入到我们的代码工程中.然后添加定时器中断的函数…..,简单吧,其实也不复杂!图7-2-3 定时器的初始化函数,在主函数中进行调用
图7-4 定时器中断函数放在末尾 这里补充了一个关于keil0xfd的问题解决方法.其实就是KEIL软件对某些汉字不支持产生乱码,对于这些汉字使用时可以在汉字后面加上”\0xfd”printf("数学");//Keil 编译后打印会显示乱码 printf("数\xfd 学");//显示正常GB2312 中,包含 0xfd 编码的汉字如下: 褒饼昌除待谍洱俘庚过糊积箭烬君魁 例笼慢谬凝琵讫驱三升数她听妄锡淆 旋妖引育札正铸 佚冽邶埤荦蔟摭啐 帻猃恺泯潺妪纨琮椠辇挲臊忑睚铨稞 瘕颀螨簖酏觚鳊鼾还有一种另类的方法,绕过这个问题,但不推荐,可能会产生莫名奇妙的问题,想尝试的同学可以试一下哦:使用HexEditor编辑Keil安装目录下的/keil/c51/bin/c51.exe文件,搜索80FBFD改成80FBFF,如果使用汇编则修改A51.exe.C251.EXE,A251.EXE没有试过,有改过的同学反馈一下哦.2定时器的应用 :分频:图7-5 TM0PS
图7-6 AUXR的1T 12T模式也属于分频的范畴
图7-7 C/T 设置定时器为定时或计数模式
图7-8 定时器的软件或外部引脚控制模式
图7-9 TH计数寄存器(可以这么叫么)
图7-10定时器定时时间计算公式
所以说: 16位自动重载定时器的本质就是从设定值数到65536(溢出)之后置位一次标志位,如果使能ET0就可以进入中断!定时器看起来挺复杂的哦,学过了,会用了,才知它的好处. 3.函数的定义、声明、调用图7-11 函数的定义 声明 调用的格式 规则 来一个例子:图7-12
图7-13 任务哦
思考:定时器一次只能定时一次,如果我有很多个定时任务怎么办? 我的理解是,定时器做规定时间的定时,当定时中断时,在定时中断函数内进行多任务的判断,如果某一个任务到达了规定的时间,则输出结果.课后小练:图7-14 通过以上的学习,复习了定时器的参数配置,定时时间的计算原理,以及多任务下,定时器中断的使用.
打卡第八课 定时器周斯性任务调度摘要:1.周期性任务介绍2.文件的创建(.c和.h)3.结构体的介绍4.结构体数组的周期性任务调度下面开始学习:1.周期性任务介绍每隔一定的时间去执行一个规定的任务;任务1:用一个定时器实现这个任务。LED1实现0.3秒取反一次,LED2实现0.6秒取反一次,LED3 0.9秒取反一次通过一个变量计数,假设这个变量1ms自加一次,加到300即为300ms,加到600就是600ms;计数到达后重新清0;SbitLED1 =P1^0;//定义LED1的IO口SbitLED2 =P1^2; //定义LED2的IO口SbitLED3 =P1^3; //定义LED3的IO口 unsigned int tim0_300ms;unsigned int tim0_600ms;unsigned int tim0_900ms;tim0_300ms = 0;//初始化tim0_600ms = 0;//初始化tim0_900ms = 0;//初始化……void tim0(void) interrupt 1//1ms定时中断时间{ tim0_300ms++; //每1ms 进入中断时变量自加1 if(tim0_300ms==300)//当变量 加到300时{ LED1 = !LED1; // LED1实现0.3秒取反一次tim0_300ms=0;// 计数到达后重新清0} if(tim0_600ms==600)//当变量 加到300时{ LED2 = !LED2; //LED2实现0.6秒取反一次tim0_600ms=0;// 计数到达后重新清0 } if(tim0_900ms==900)//当变量 加到300时{ LED3 = !LED3; //LED2实现0.9秒取反一次 tim0_900ms=0;// 计数到达后重新清0}}我自信的写出了以上的代码,相信它可以实现任务的要求.棒……哈哈哈教程中,冲哥又使用了一个数组,利用循环在定时中断中进行循环计数,并在主函数中进行计数值的判断,从面对相应有LED端口进行操作,也实现了任务的要求 . 任务2 利用数组实现流水灯 加难度了哦注意事项:LED是0点亮,1熄灭数组长度需要把握好流水灯移动的时间实现的方法:定义一个数组 u8state={0x01,0x02,0x04x0x08,0x10,0x20,0x40,0x80};这样定义比较直观,使用的时候把数组中的值,进行取,赋值给端口就可以实现点亮一个灯哦.在定时器中断中进行计数,当计数到达规定的时间,对另一个索引变量进行加1,然后以索引值的数组对应值取反后赋值给端口.索引变量值范围0-7图8-1
任务3:按键1按一下,LED通过数组移动一下;注意事项:按键不能在通过while判断是否按下松开了可以通过按键按下计数图8-3
图8-4 实现的代码,很简单哦.
图8-5 加入按键消抖后的代码,让程序跑起来更可靠. 2.文件的创建(.c和.h)这个已经不陌生了,一个好的工程结构,对于代码编写和调试很重要创建程序文件三步,把硬件需要的初始化弄一个config.c 新建文件并保存 添加到工程 添加引用路径 图8-6 3.结构体的介绍 将相同属性,总结到一起构成变量组合体.定义一个大类,包含相同属性的小类.图8-7 结构体 通过对结构体的学习,掌握了结构体在代码中的应用,以前对这个结构体总有一种懵懵懂懂的感觉 ,通过冲哥的讲解,顿时明了,思路清晰了起来.学到了,感谢.
打卡第九课数码管摘要1.数码管介绍2.数码管显示原理3.数码管静态显示4.数码管动态显示5.虚拟显示--LED和数码管下面开始学习了: 1.数码管介绍图9-1 各种数码管 本质就是发光二极管哦,多个发光二极管的组合. 图9-2 8字数码管的内部原理图
共阳数码管:所有发光二极管的正极连在一起共阴数码管:所有发光二极管的负极连在一起图9-3 4位数码管的原理图,看起来复杂,其实一点也不简单……
图9-4-5数码管的显示原理,实验箱使用了两片74595来驱动8位数码管,一片负责位(LED1-8)的驱动,一片负责段(a-dp)的驱动!数码管的静态显示,
图9-674595的控制代码,很简单
图9-7
我们如何来正确显示需要的数字呢?根据数码管的属性,(共阴,共阳)取得数字的显示数组,可以用ISP工具中的段码生成工具来直接生成数码管的字模.图9-8 ISP软件中的数码管字模生成工具
共阴数码管的字模,定义成一个数组,使用的时候可以将字模的值赋值给数据端口;U8 displaynum[]={ 0x3F, /*'0', 0*/ 0x06, /*'1', 1*/ 0x5B, /*'2', 2*/ 0x4F, /*'3', 3*/ 0x66, /*'4', 4*/ 0x6D, /*'5', 5*/ 0x7D, /*'6', 6*/ 0x07, /*'7', 7*/ 0x7F, /*'8', 8*/ 0x6F, /*'9', 9*/ 0x77, /*'A', 10*/ 0x7C, /*'B', 11*/ 0x39, /*'C', 12*/ 0x5E, /*'D', 13*/ 0x79, /*'E', 14*/ 0x71, /*'F', 15*/ 0x40, /*'-', 16*/ 0x00, /*' ', 17*/ 0x80, /*'.', 18*/}; 数码管的动态显示:按照一定的时间间隔,利用人眼视觉停留特性,循环点亮8个数码管,让我们看到8个数码管同时点亮来显示数值.利用ISP工具中的虚拟数码管,也可以来做数码管的实验,图9-11 虚拟显示时的端口位对应图
图9-12 虚拟显示时的状态
图9-13 虚拟显示的命令说明
课后小题:图9-14
通过以上的学习,熟悉了数码管静态显示和动态显示的原理及代码编写,并且学习了使用ISP软件提供虚拟数码管来显示的方法和技巧.
页:
[1]
2