学习了Ai8051U学习视频的第三集,点亮一个led,
我了解到Ai8051U使用的keil是跟stm32一样的arm版本,还需要用isp软件给keil一键安装Ai8051U的头文件。
点亮led的代码过程与STC8的一样,先配置引脚的工作模式,再开设置引脚的高低电平。
代码如下:
#include "ai8051U.h"
void main(void)
{
P0M1=0X00;//配置P0口工作模式为双向模式
P0M0=0X00;
P4M1=0X00;//配置P1口工作模式为双向模式
P4M0=0X00;
while(1)
{
P40=0;
P00=0;
}
}
PNM0,PNM1要同时设置才能对某一个或者某几个引脚起作用。
看了视频才知道,用P00点亮led是因为P40配置低电平启动一个三极管,这个三极管的作用是给P0口做开关。所以要点亮P00口的led,需要把P40和P00都设置为低电平。
今天学习了Ai8051U深度入门课程的第四节,USB不停电下载,学习到了1.下载usb库,2.ISP软件和Keil程序中引用usb库、相关头文件,3.修改寄存器,可以免去了下载rhex文件时还要按两个按键,实现Ai8051U的不停电下载,USB不停电下载功能是真的好,我就因为不懂STC8G1A08A的下载方法,在下载这个环节卡了一个多月,哈哈哈。
今天学习了 Ai8051U深度入门视频课的第五集 C语言基础,学习了Ai8051U的USB-CDC模拟串口的设置和printf函数的使用(usb-cdc模拟串口就是usb通信速率最快可到12M,所以在ISP软件中设置任何波特率都可以,速度都是一样的),变量类型的使用以及用错可能出现的现象,还复习了C语言算数运算符,关系运算符,赋值运算符等C语言基础知识。温故而知新。
今天学习了Ai8051U深度入门第六集 I/O输入输出,学习到了 PNM0 PNM1组合配置一个或几个I/O接口,有四种模式,
PNM1 PNM0 工作模式
0 0 准双向口既能做输入也能做输出
0 1 推挽输出
1 0 高阻输入
1 1 开漏模式
端口触发施密特要注意触发的高电平和低电平是否达到要求。
还通过按P32按键点亮P00的LED灯学习了if else语句和 变量取反控制led灯
可以用while()语句钳住led状态。
代码调用延时函数Delay之前还要设置寄存器 WTST EAXFR,CKCON
今天学习了《Ai805U深度入门》学习视频第七集 定时器中断
定时器非常有用,可以避免delay一根筋的浪费cpu时钟,使用定时器可以让单片机执行多个任务,提高效率
在printf打印的时候汉字“数”出不来,因为字符串中不吭含有带0xFD编码的汉字,否则keil编译时会跳过0xFD,因为keil编译器使用了0xfd、0xfe和0xff这三个字符编码,
解决办法也很简单,在0xfd编码的字符后面增加一个0xfd就可以了,
例如printf(“数\xdf学”),"\x"表示后面的1-2个字符为16进制数,“\xfd”表示16进制数0xfd插入到字符串中。因为“数”的汉字编码是0xcafd,keil会跳过其中的fd,再手动添加fd就可以正常显示汉字“数”
还学习了时钟计算方法,学习了定时频率计算和定时时间计算。
还学习了函数的定义、声明、调用
返回值类型 函数名(入口参数)
{
//函数体
函数执行的代码;
return返回值;
}
返回值类型 函数名(入口参数);
函数名(入口参数);
定时器看起来使用的时候比delay多几个步骤,但是灵活性非常高,可以最大程度发挥cpu时钟资源,实现很多需要的功能
今天学习了西西坛主推荐的视频“printf_usb("Hello World !\r\n")及usb不停电下载”,学习了ISP软件V6.95v中AIcube的使用,
AiCube实验一
在isp软件中点击AiCube,点击新建-》选择单片机型号-》数目项目名称-》设置项目保存路径-》选择单文件项目
在AiCube项目创建助手中,可以使用图形化I/O口配置,左键选择管脚功能,右键配置管脚模式,需要注意的是,在软件界面右侧选中管脚并设置管脚模式后,还要在软件界面左侧在相应的管脚大类中打勾选中,按F5创建工程
在生成的keil5工程中修改代码,例如isp软件范例代码,深圳大学的,程序编译完成后
在ISP6.59Y中,打开程序文件-》IRC调节模式选择不调节,使用内部预制频率-》IRC频率选择40MHz-》点击下载,还可以设置不停电下载,在“收到用户命令后复位到ISP监控程序区”把下面的三个勾都勾上,之后keil工程编译之后就可以自动下载
AiCube实验二
USB-CDC查询方式 printf_usb打印返回
步骤与实验一类似,点击回送“Hello World”就接收到“Hello World ”
AiCube实验 三
USB-CDC中断方式 printf_usb打印返回
步骤与实验一类似,点击回送“Hello World”就接收到“Hello World ”
今天学习了西西坛主推荐的第二个视频,实验一直接输出,实验二查询方式,实验三中断方式
内容与推荐的第一个视频类似,但是使用的isp软件版本是6.95W,推荐的第一个视频版本是6.95Y,两个版本中间相隔7天左右,软件更新的真快,我学习STC8G1K08A的时候,就用了5个版本的isp,很明显的能看到添加Keil5 C51头文件的数量是不断增加的。
在AiCube中生成HEX格式选项中,超过64k就选HEX-386,一般选80就够了。
整体的内容与7月11日的视频内容类似,但是两个视频中都强调了用户程序要放在//《AICUBE_USER_INCLUDE_BEGIN》 //《AICUBE_USER_INCLUDE_END》之间,好像是用Aicube再次添加功能的时候,用户自己写的程序会被保留,提高效率。
还可以在keil中点击windows-》Split,把编程界面四分屏。
今天使用了吴经理赠送的擎天柱核心板,实验了前几天学的点灯程序,从isp软件中找LED实例程序,但是下载程序要按P32和gnd,弄了几遍就烦了,又尝试usb不停电下载,真的非常方便,按照冲哥视频里教授的方法一步一步做就能实现,但是出现了报错,是Lib文件里有char *USER_STCISPCMD ="@STCISP#"; 程序里再出现char *USER_STCISPCMD ="@STCISP#";就出现重定义报错,注释掉就一切正常了 ,于是开启了点灯大师的第一步。
#include <AI8051U.H> //包含AI8051U的头文件
#include "intrins.h" //使用_nop_()函数所必须要包含的头文件,
//否则延时函数中调用的_nop_()函数没有被头文件引用过来,
//会导致编译器找不到这个而函数而报错。
#include "stc32_stc8_usb.h" //不断电下载头文件
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--; //循环等待
}
//上面延时函数部分代码可使用AIapp-ISP软件的“软件延时计算器”工具来生成。
void main(void)
{
EAXFR = 1; //允许访问扩展的特殊寄存器,XFR
//(32 位模式请使用这句,注释下一句)
P_SW2 |= 0x80; //允许访问扩展的特殊寄存器,XFR
//(8位模式请使用这句,注释上一句)。
WTST = 0; //设置取程序代码等待时间,
//赋值为 0表示不等待,程序以最快速度运行
CKCON = 0; //设置访问片内的 xdata速度,
//赋值为 0表示用最快速度访问,不增加额外的等待时间
P0M0 = 0x00; P0M1 = 0x00; //设置P0口为准双向口模式
P1M0 = 0x00; P1M1 = 0x00; //设置P1口为准双向口模式
P2M0 = 0x00; P2M1 = 0x00; //设置P2口为准双向口模式
P3M0 = 0x00; P3M1 = 0x00; //设置P3口为准双向口模式
P4M0 = 0x00; P4M1 = 0x00; //设置P4口为准双向口模式
P5M0 = 0x00; P5M1 = 0x00; //设置P5口为准双向口模式
P6M0 = 0x00; P6M1 = 0x00; //设置P6口为准双向口模式
P7M0 = 0x00; P7M1 = 0x00; //设置P7口为准双向口模式
//上面的将所有I/O口都初始化为准双向口工作模式的程序,
//可以使用AIapp-ISP软件的“I/O口配置工具”来生成。
usb_init(); //USB CDC 接口配置
IE2 |=0x80; //使能USB中断
EA = 1;
while (DeviceState != DEVSTATE_CONFIGURED);//等待USB完成配置
P40 = 0; //打开LED部分的供电
while(1)
{
if (bUsbOutReady)
{
USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
usb_OUT_done();
}
//LED循环自动闪烁部分
P2 = ~P2; //对P0端口取反
// P00 = ~P00; //对单个端口取反
Delay500ms(); //调用延时函数,延时0.5s
}
}
#include <AI8051U.H> //包含AI8051U的头文件
#include "intrins.h" //使用_nop_()函数所必须要包含的头文件,
//否则延时函数中调用的_nop_()函数没有被头文件引用过来,
//会导致编译器找不到这个而函数而报错。
#include "stc32_stc8_usb.h" //不断电下载头文件
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--; //循环等待
}
//上面延时函数部分代码可使用AIapp-ISP软件的“软件延时计算器”工具来生成。
void main(void)
{
EAXFR = 1; //允许访问扩展的特殊寄存器,XFR
//(32 位模式请使用这句,注释下一句)
P_SW2 |= 0x80; //允许访问扩展的特殊寄存器,XFR
//(8位模式请使用这句,注释上一句)。
WTST = 0; //设置取程序代码等待时间,
//赋值为 0表示不等待,程序以最快速度运行
CKCON = 0; //设置访问片内的 xdata速度,
//赋值为 0表示用最快速度访问,不增加额外的等待时间
P0M0 = 0x00; P0M1 = 0x00; //设置P0口为准双向口模式
P1M0 = 0x00; P1M1 = 0x00; //设置P1口为准双向口模式
P2M0 = 0x00; P2M1 = 0x00; //设置P2口为准双向口模式
P3M0 = 0x00; P3M1 = 0x00; //设置P3口为准双向口模式
P4M0 = 0x00; P4M1 = 0x00; //设置P4口为准双向口模式
P5M0 = 0x00; P5M1 = 0x00; //设置P5口为准双向口模式
P6M0 = 0x00; P6M1 = 0x00; //设置P6口为准双向口模式
P7M0 = 0x00; P7M1 = 0x00; //设置P7口为准双向口模式
//上面的将所有I/O口都初始化为准双向口工作模式的程序,
//可以使用AIapp-ISP软件的“I/O口配置工具”来生成。
usb_init(); //USB CDC 接口配置
IE2 |=0x80; //使能USB中断
EA = 1;
while (DeviceState != DEVSTATE_CONFIGURED);//等待USB完成配置
P40 = 0; //打开LED部分的供电
while(1)
{
if (bUsbOutReady)
{
USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
usb_OUT_done();
}
//LED循环自动闪烁部分
P2 = ~P2; //对P0端口取反
// P00 = ~P00; //对单个端口取反
Delay500ms(); //调用延时函数,延时0.5s
}
}
不停电下载的所有程序,char *USER_STCISPCMD ="@STCISP#";出现报错说是LIB文件里有,重定义,注释掉就一切正常了
今天收到了Ai8051实验箱,非常感谢STC公司,也十分感谢吴经理。收到实验箱后,我就烧写了USB不断电下载程序,能省很多时间,我会使用实验箱认真的从第一节课学习到最后一节课,争取多学习知识,然后做出简单高效耐用可量产的产品。
attach://119445.jpg