安装Keil C51和C251
首先登录 Keil 官网,下载最新版的 C51和C251 安装包
手动在浏览器的地址栏输入以下网址:https://www.keil.com/download/product/

进入首页,我们可以看到C51和C251的下载链接,这里将这两个安装包都下载到桌面上

这里以C51作为示例,点击进入后,会让填入信息,这里随便填一些就可以了,然后点击Submit

点击完后,就可以出现C51V961.EXE,点击粗体蓝色字即可下载C51安装包。C251部分操作同上
双击下载的安装包开始安装。
点击“Next”(这里以C251安装为例,安装完C251后,再继续安装C51即可)

勾选“I agree to all the terms of the preceding License Agreement”,然后点击“Next”:

选择安装目录,然后点击“Next”:

填写个人信息,然后点击“Next”:

安装完成,点击“Finish”结束。

安装完成后,添加STC型号和头文件
这时候,Keil内还是没有STC单片机部分的型号及头文件,我们通过STC-ISP进行添加
STC-ISP的下载链接是:https://www.stcai.com/gjrj

点击软件下载即可下载最新版本的STC-ISP
使用 Keil 之前需要先安装仿真驱动。仿真驱动的安装步骤如下:
首先打开 ISP 下载软件,然后在软件右边功能区的“Keil 仿真设置”页面中点击“添加型号和头文件到
Keil 中添加仿真器驱动到 Keil 中”按钮:

按下后会出现如下画面:

将目录定位到 Keil 软件的安装目录,然后确定。安装成功后会弹出如下的提示框:

即表示驱动正确安装了
头文件默认复制到 Keil 安装目录下的“C251\INC\AI”目录中
在 C 代码中使用“#include <Ai8051U.H>”或者“#include "Ai8051U.H"”进行包含均可正确使用
建立一个新工程
新建一个项目文件夹
在一个纯英文目录下(例如D盘根目录)新建一个文件夹,用于存放项目的文件。不直接在桌面创建是因为路径有可能包含中文。
新建工程
打开Keil软件,在上方的‘Project’选项中,找到New uVision Project选项,进行新建工程。

选择刚才创建好的文件夹,填入一个工程名字(尽量是英文的),点击确定。

选择单片机
在上方的Database选项中选择‘STC MCU Database’,然后展开AI选项,找到其中的‘AI8051U-32Bit’选项点击,最后点击‘OK’以完成单片机选择。

设置4Byte字节对齐
选择完单片机后,项目是空白的。此时需要设置一下工程的选项。
在左侧的Project选项卡中,右键Target 1文件夹图标,然后选择‘Options for Target ‘Target 1’...’选项,进入后默认就是Target选项卡,如图所示点击‘4Byte Interrupt Frame Size’选项,以规范程序内部调用指针时候的对齐,防止出现奇怪的问题。


还是在Target选项卡,这次选择Memory Model为‘XSmall’模式

使用REMOVEUNUSED功能
接下来切换到L251 Misc选项卡,在Misc controls输入框中,输入大写的
‘REMOVEUNUSED’,以实现不使用的函数不进行调用。

选择输出HEX文件功能
接下来,切换到Output选项卡,勾选‘Creat HEX File’选项,否则编译后是不会创建HEX文件的。

程序编写:
首先是添加头文件,通过右键添加即可

然后,是添加常用头文件
#include "intrins.h" //使用_nop_()函数所必须要包含的头文件
#include "ai_usb.h" //使用usb所需要包含的头文件
延时函数通过STC-ISP软件进行生成:

IO部分初始化函数也由STC-ISP软件生成

以下是程序的完整代码:
(USB_CDC和USB_HID通过在工程内添加不同的LIB库实现切换,不需要改动代码)

#include <AI8051U.H> //包含AI8051U的头文件
#include "intrins.h" //使用_nop_()函数所必须要包含的头文件
#include "ai_usb.h" //使用usb所需要包含的头文件
#define PRINTF_SEGLED
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
void Delay500ms(void) //@40MHz
{
unsigned long edata i;
_nop_();
_nop_();
i = 4999998UL;
while (i) i--;
}
void main(void)
{
EAXFR = 1; //使能拓展寄存器访问
CKCON = 0; //设置访问片内扩展的xdata部分速度为最快
WTST = 0; //设置取程序代码不等待,以最快速度运行
P0M0 = 0x00; P0M1 = 0x00;
P1M0 = 0x00; P1M1 = 0x00;
P2M0 = 0x00; P2M1 = 0x00;
P3M0 = 0x00; P3M1 = 0x00;
P4M0 = 0x00; P4M1 = 0x00;
P5M0 = 0x00; P5M1 = 0x00;
P6M0 = 0x00; P6M1 = 0x00;
P7M0 = 0x00; P7M1 = 0x00;
usb_init(); //USB 接口配置
EA = 1;//打开总中断
while (DeviceState != DEVSTATE_CONFIGURED); //等待USB完成配置
P40 = 0;//打开LED部分的供电
while(1)
{
//使用USB串口控制来手动控制LED部分
if(bUsbOutReady)
{
P2 ^= UsbOutBuffer[0];
LED40_SetPort(2,P2);
usb_OUT_done();
}
}
}
下载用户程序到实验箱
首先使用 USB 线将实验箱与电脑正确连接。
然后打开 AIapp-ISP-v6.94F 或以上版本。

硬件 USB 下载用户程序步骤:
- 将 P3.2 与 GND 短接按键按下;P3.2 在用户区可做其他用途
- 上电,或停电再上电,电脑端识别出 USB,此时可松开 P3.2 按键
- 点击电脑端 ISP 软件的【下载 / 编程】按钮,下载成功
另外:如果P4.7/nRST 已被设置为复位脚,通电状态下,外部手动复位也可进入 USB 下载
可以不用再按P32和电源两个按键了


文件正确打开后,点击界面中的“下载 / 编程”按钮开始下载代码。

下载成功,会出现如下画面:

下载完成后:
如果使用的HID方式,可以通过USB-HID助手的中断输入输出来进行数据交换。
设备名字叫STC HID Demo,同时也可以使用右侧的多字符串发送进行控制LED灯。

如果使用USB-CDC方式,则需要到CDC串口助手部分

此时就可以看到串口扫描部分出现了USB-CDC端口COM75(因不同电脑,这个COM号有所不同)
此时通过串口助手打开对应的CDC串口,在右侧的多字符串发送部分对对应的指令进行命名,按照如图所示格式输入后,按下按键即可完成对应LED的亮/灭的取反,十分直观。
当然,也可以使用非串口方式,通过死循环延时和IO取反来实现LED的闪烁。
#include <AI8051U.H> //包含AI8051U的头文件
#include "intrins.h" //使用_nop_()函数所必须要包含的头文件
void Delay500ms(void) //@40MHz
{
unsigned long edata i;
_nop_();
_nop_();
i = 4999998UL;
while (i) i--;
}
void main(void)
{
EAXFR = 1; //使能拓展寄存器访问
CKCON = 0; //设置访问片内扩展的xdata部分速度为最快
WTST = 0; //设置取程序代码不等待,以最快速度运行
P0M0 = 0x00; P0M1 = 0x00;
P1M0 = 0x00; P1M1 = 0x00;
P2M0 = 0x00; P2M1 = 0x00;
P3M0 = 0x00; P3M1 = 0x00;
P4M0 = 0x00; P4M1 = 0x00;
P5M0 = 0x00; P5M1 = 0x00;
P6M0 = 0x00; P6M1 = 0x00;
P7M0 = 0x00; P7M1 = 0x00;
P40 = 0;//打开LED部分的供电
while(1)
{
//LED循环自动闪烁部分
P0 = ~P0;//对P0端口取反
//P00 = ~P00;//对单个端口取反
Delay500ms();//延时0.5s
}
}