AI8051u学习打卡(感悟)
(AI8051U简介)对比前代大幅度增强
支持32位和8位指令集, RMB2.3
管脚兼容89C52RC,12C5A60S2
兼容 8位8051指令集,可以用 Keil C51/IAR/SDCC 编译器
兼容 32位8051指令集,可以用 Keil C251 编译器,双核兼容设计
QSPI优化完善,屏幕显示增强
IIS优化
PWM_DMA,支持PWM硬件移项,DMA_P2P优化,支持外设to外设DMA
硬件乘除,单精度浮点,三角函数
,
二(开发所需硬件及工具介绍)
!!!最重要的实验箱!!!
试验箱在手,基本不需要另外买其他硬件。
软件方面:
Keil软件,芯片手册,官方代码包,stcisp
keil安装配置后需要通过stcisp添加头文件,中断拓展插件
keil软件配置截图
三(点亮LED)
下面是常规的新建工程
新建工程选项
选择文件夹,输入工程名
选择芯片型号
添加main函数
添加头文件
写主循环固定格式代码
接下来就是点亮LED主程序
参考数据手册的IO口说明
主程序如下
#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不停电下载)
STC的单片机下载程序必须要手动按下按钮才可以,操作比较繁琐
现在有一个可以解放双手的办法,不需要再去按按钮
修改stcisp软件设置
这是未设置;
设置成这样;
首先需要到stc官网下载例程和库
软件工具,库函数
这个usb库文件跟官网视频不同,官网视频库函数和示例代码是分开的
但是应该是改了,现在只需要下载一次就可以
下图是文件下载后的压缩包
我们用的是轮询模式CDC
所以库函数和示例代码全部用轮询CDC
下一步导入例程和库文件
找到32位的例程打开
查看寄存器配置
主要是配置中断寄存器使能
IE2 |= 0x80; //使能USB中断
EA = 1; //使能总中断
然后打开之前的代码
修改和融合后变成这样
下载后就可以实现想要的无按键下载
五
USB-CDC串口printf函数
串口对于调试来说非常重要,这是所有单片机入门必须要会的
下图是函数原型解释
此处需要根据注释调整函数重定向
改完定义就可以直接使用printf函数
下一个就是类型转换
下图是函数类型转换的解释
以上是CDC串口相干
下面是C语言相关的基础知识
下图是进制转换相关图表
数据长度和容量图表
运算符图表
六(GPIO输入输出)
GPIO(General Purpose I/O Ports)通用输入/输出端口
GPIO的本质就是对引脚输出电平的控制和引脚输入电平的读取
手册中有详细的端口触发电压介绍
端口模式介绍
IO口相关寄存器介绍
端口施密特触发器寄存器介绍
端口上下拉电阻寄存器介绍
端口模式配置寄存器介绍
以上配置寄存器已经全部了解
以下是代码实现原理
电路部分
程序直接读取按键的IO的电平
软件部分
主循环代码以及注释;
//任务1:按下P32按钮灯亮,松开P32按钮灯灭;
if( P32 == 0 ) //判断P32按钮是否按下
{
P00 = 0;
}
else
{
P00 = 1;
}
//任务2:按下P32按钮灯灭,松开P32按钮灯亮;
if( P32 == 1 ) //判断P32按钮是否按下
{
P00 = 0;
}
else
{
P00 = 1;
}
//任务3:按一下灯亮,按一下灯灭
if( P32 == 0 ) //判断P32按钮是否按下
{
Delay20ms(); //延时20ms消抖
if( P32 == 0 )
{
state = !state; //变量取反 0 1 0 1 0 1
P00 = state;
printf("state:%d\r\n",(int)state);
while( P32 == 0 ); //等待P32松开
}
}
七(定时器中断)
定时器作用:
用于计时系统,可实现软件计时,或者使程序每隔一固定时间完成一项操作
替代长时间的Delay,提高程序的运行效率和处理速度(中断可以打断主循环)
官方手册中定时器的寄存器介绍
以定时器0举例看手册
定时器控制寄存器TCON
定时器0就需要找TF0和TR0
定时器模式控制寄存器
定时器0计数寄存器
定时器中断请求寄存器
定时器0模式0框图已经配置说明
下图是配置说明以及计算方法
这里不得不提,中文版的寄存器手册太方便了,哈哈
这里的寄存器配置即便是中文版的,也是有缺陷的,比如翻找手册太慢了,再比如自己计算很容易出错
所以stc官方的stcisp软件已经有了全自动的配置生成工具
下面放配置截图
当然还有手册中中断入口函数的说明
带注释的配置
void Timer0_Isr(void) interrupt 1
这个函数是中断入口,使能中断以后必须要有入口
一些简单的比如io反转可以直接放进去,
这也是开启定时器中断的最终目的,把会阻塞主循环的简单功能放到定时器中断,这样主循环会空出时间做一些实时需要处理的问题,比如按键检测
下面放上测试代码
void Timer0_Init(void); //3秒@24.000MHz //函数声明
void main(void)
{
P0M1 = 0x00; P0M0 = 0x00;
P3M1 = 0x00; P3M0 = 0x00;
Timer0_Init(); //定时器初始化
while(1)
{
if( P32 == 0 )
{
p01=0;
}
{
}
void Timer0_Init(void) //3秒@24.000MHz 函数定义
{
TM0PS = 0x5B; //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x3F; //设置定时初始值
TH0 = 0x01; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
EA = 1; //使能总中断
}
void Timer0_Isr(void) interrupt 1 //3秒执行一次
{
state = !state;
P00 = state;
}
页:
[1]