学习《Ai8051U教学视频》体会
第一集 序言展示了基于8051U的一些高级功能,通过这些实现的功能展示了8051U的强大计算能力和配套的软硬件的良好支持。
第二课 工具介绍
实验箱
功能健全,满足各类产品的开发测试;
第三集 点亮第一颗LED
讲得很详细,非常适合入门学习。特别是讲了一些代码编写规范,从开始就培养好的编程习惯。要记得配置I/O模式,写了一个函数,以后复制粘贴就行了。总的来说这节课相对简单,基本都掌握了。由浅入深继续学习。
<h2>第4集 USB不停电下载</h2>
<p>USB不停电下载用到了STC官方提供的STC-USB库。创建项目时需要导入这个库,加入头文件。</p>
<pre><code>#include "ai8051u.h" //调用头文件
#include "stc32_stc8_usb.h"
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
void main(void)
{
P_SW2 |= 0x80; //B7位写1,使能访问XFR
usb_init();
IE2 |= 0x80; //使能USB中断
EA = 1;
while (DeviceState != DEVSTATE_CONFIGURED); //等待USB完成配置
while(1)
{
if (bUsbOutReady)
{
USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
usb_OUT_done();
}
P40 = 0;
P00 = 0;
P02 = 0;
}
}
</code></pre>
<p>串口的下载模式同时也改成了USB-CDC</p>
<p><img src="data/attachment/forum/202502/03/203008gxx1m2m4o9gtczqo.png" alt="" /></p>
<h2>第5集 C语言基础</h2>
<p>本集重新温习了一遍C语言的基本语法。</p>
<p>重点讲解了如何使用STC-USB库实现的printf函数,可以直接与上位机通信,方便调试及与单片机交互。</p>
<p>见代码:</p>
<pre><code>#include "ai8051u.h" //调用头文件
#include "stc32_stc8_usb.h" //调用头文件
#define u8 unsigned char // 8位无符号变量(0-255)
#define u16 unsigned int // 16位无符号变量(0-65535)
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
void main(void)
{
P_SW2 |= 0x80; // B7位写1,使能访问XFR
usb_init(); // USB CDC 接口配置
IE2 |= 0x80; // 使能USB中断
EA = 1; // IE |= 0X80;
while (DeviceState != DEVSTATE_CONFIGURED)
; // 等待USB完成配置
while (1)
{
if (bUsbOutReady) // 如果接收到了数据
{
printf("调试信息");
usb_OUT_done();
}
}
}
</code></pre>
<h2>第6集 IO输入输出</h2>
<p>讲解了 GPIO 的概念。1 高电平 0 低电平</p>
<pre><code> GPIO(General Purpose I/O Ports)意思为通用输入/输出端口,通俗地说,就是一些引脚,可以通过它们输出高低电平或者通过它们读入引脚的状态-是高电平或是低电平。
高电平就是指接近于电源正极电压的电平;也叫逻辑“1”; VDD最大电压不能超过5.5V。上限溢出允许0.3v内.
单片机输出高电平就是输出VCC电压,输出低电平就是输出GND的电压。
四种模式:准双向口、推挽输出、高阻输出、开漏模式。 灌电流(电源到管脚串电阻尽量大于1K,不小于470欧)和拉电流(管脚到Gnd,推挽/强上拉)的讲解
单片机电压3.3V,施密特触发器,低电平不能高于0.99V,高电平不能低于1.18V。
</code></pre>
<p>通过按键来检测io状态<br />
按键消抖。延时20ms</p>
<p>上代码</p>
<pre><code>#include "ai8051u.h" //调用头文件
#include "stc32_stc8_usb.h" //调用头文件
#include "intrins.h" //d调用头文件
#define u8 unsigned char // 8位无符号变量(0-255)
#define u16 unsigned int // 16位无符号变量(0-65535)
u8 state = 0; // 初始状态
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
void Delay20ms(void) //@24.000MHzDelay20ms();
{
unsigned long edata i;
_nop_();
_nop_();
i = 119998UL;
while (i)
i--;
}
void main(void)
{
WTST = 0;// 设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
EAXFR = 1; // 扩展寄存器(XFR)访问使能
CKCON = 0; // 提高访问XRAM速度
usb_init(); // USB CDC 接口配置
IE2 |= 0x80; // 使能USB中断
EA = 1; // IE |= 0X80;
while (DeviceState != DEVSTATE_CONFIGURED)
; // 等待USB完成配置
while (1)
{
if (bUsbOutReady) // 如果接收到了数据
{
usb_OUT_done(); //
}
// //任务1:按下P32按钮灯亮,松开P32按钮灯灭;
// if( P32 == 0 ) //判断P32按钮是否按下
// {
// P20 = 0;
// }
// else
// {
// P20 = 1;
// }
//
// 任务2:按下P32按钮灯灭,松开P32按钮灯亮;
// if( P32 == 1 ) //判断P32按钮是否按下
// {
// P20 = 0;
// }
// else
// {
// P20 = 1;
// }
// 任务3:按一下灯亮,按一下灯灭
if (P32 == 0) // 判断P32按钮是否按下
{
Delay20ms(); // 延时20ms消抖
if (P32 == 0)
{
state = !state; // 变量取反 0 1 0 1 0 1
P20 = state;
printf("state:%d\r\n", (int)state);
while (P32 == 0)
; // 等待P32松开
}
}
}
}
</code></pre>
<h2>第七集 定时器</h2>
<p>定时器是Ai8051U最重要的数字外设之一。</p>
<p>Ai8051U 系列单片机内部设置了 6 个 24 位定时器/计数器(8 位预分频+16 位计数)。6 个 16 位定时器 T0、T1、T2、T3、T4 和 T11 都具有计数方式和定时方式两种工作方式。</p>
<p><img src="data/attachment/forum/202502/03/203706ks8f9w8s3flq9uq5.png" alt="" /></p>
<p>下面的代码使用定时器0实现的简单的任务</p>
<pre><code>#include "ai8051u.h" //调用头文件
#include "stc32_stc8_usb.h" //调用头文件
#include "intrins.h" //d调用头文件
#define u8 unsigned char // 8位无符号变量(0-255)
#define u16 unsigned int // 16位无符号变量(0-65535)
u8 state = 0; // 初始状态
u8 Run_State = 0; // 运行状态
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
void Delay20ms(void) //@24.000MHzDelay20ms();
{
unsigned long edata i;
_nop_();
_nop_();
i = 119998UL;
while (i)
i--;
}
void Timer0_Init(void); // 3秒@24.000MHz //函数声明
void main(void)
{
int count = 1; // 按键计数变量
WTST = 0;// 设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
EAXFR = 1; // 扩展寄存器(XFR)访问使能
CKCON = 0; // 提高访问XRAM速度
usb_init(); // USB CDC 接口配置
IE2 |= 0x80; // 使能USB中断
EA = 1; // IE |= 0X80;
P40 = 0;
while (DeviceState != DEVSTATE_CONFIGURED)
; // 等待USB完成配置
while (1)
{
if (bUsbOutReady) // 如果接收到了数据
{
usb_OUT_done(); //
}
// 任务1:
if (P32 == 0) // 判断P32按钮是否按下
{
Delay20ms(); // 延时20ms消抖
if (P32 == 0)
{
printf("按键按下次数\xfd:%d 次\r\n", (int)count);
count++;
while (P32 == 0)
; // 等待P32松开
}
}
// 任务2:灯按一下点亮三秒后熄灭。
if (P32 == 0) // 判断P32按钮是否按下
{
Delay20ms(); // 延时20ms消抖
if (P32 == 0)
{
printf("按键按下次数\xfd:%d 次\r\n", (int)count);
count++;
P00 = 0;
Timer0_Init();
while (P32 == 0)
; // 等待P32松开
}
}
// 任务3:救护车灯控制器,按下报警按钮,红蓝交替闪烁(LED1和LED2表示红和蓝灯),再按一下报警按钮,红蓝灯停止。
if (P32 == 0) // 判断P32按钮是否按下
{
Delay20ms(); // 延时20ms消抖
if (P32 == 0)
{
Run_State = !Run_State; // 运行状态取反
if (Run_State == 1) // 运行
{
Timer0_Init();
}
else
{
TR0 = 0; // 关闭定时器
P00 = 1;
P01 = 1;
}
while (P32 == 0)
; // 等待P32松开
}
}
}
}
void Timer0_Init(void) // 500毫秒@24.000MHz
{
TM0PS = 0x0F; // 设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
AUXR &= 0x7F; // 定时器时钟12T模式
TMOD &= 0xF0; // 设置定时器模式
TL0 = 0xDC; // 设置定时初始值
TH0 = 0x0B; // 设置定时初始值
TF0 = 0; // 清除TF0标志
TR0 = 1; // 定时器0开始计时
ET0 = 1; // 使能定时器0中断
}
void Timer0_Isr(void) interrupt 1 // 3秒执行一次
{
state = !state;
P00 = state;
P01 = !state;
}
</code></pre>
<h2><a href="https://www.stcaimcu.com/forum.php?mod=attachment&aid=NjgyNjl8NGM2MDk4ZDR8MTczODU4MjM3MnwzNjY5N3wxMTkwMg%3D%3D">第八集-定时器周期性调度任务</a></h2>
<p>继续讲解定时器,讲解如何在实际项目中应用定时器解决问题。</p>
<p>目标是周期性执行3个任务。如下:</p>
<ul>
<li>任务1:用一个定时器实现,LED1实现0.3秒取反一次,LED2实现0.6秒取反一次,LED3 0.9秒取反一次。</li>
<li>任务2:数组点亮LED,实现流水灯。</li>
<li>任务3:按键1按一下,LED通过数组移动一下等。</li>
<li></li>
</ul>
<p>学完本集,主要有二点收获:</p>
<ol>
<li>代码的模块化管理</li>
<li>任务的合理分解</li>
</ol>
<p>随着功能的增加,代码量也直线上升,如何组织代码很关键,对以后的需求变化影响至关重要。</p>
<p><img src="data/attachment/forum/202502/03/204518nrtkzvuzu8x9mxz7.png" alt="image.png" title="image.png" /></p>
<h2><strong>第九集</strong> 数码管</h2>
<p>数码管是我们日常最常用的显示器件。</p>
<p>LED数码管由8个发光二极管构成,通过不同的组合可用来显示数字0~9、字符A~F和小数点“.”。</p>
<p>最大的收获就是学到了原来还可以通过AIapp-ISP虚拟仿真数码管和LED灯的显示。太好了!</p>
<p><img src="data/attachment/forum/202502/03/204724sm4fd1ephz169hey.png" alt="image.png" /></p>
<p>显示效果见下:</p>
<p><img src="data/attachment/forum/202502/03/204923mrszrzi9y6w67mr1.png" alt="image.png" title="image.png" /></p>
页:
[1]