学习《Ai8051U教学视频》心得打卡
第一集序言AI8051U 对比于STC32G有了以下增强,8051U的强大之处
1.屏幕显示和视频播放(flash编程器),因为优化了QSPI的一些flash芯片读写的内容,对于视频尤其是大容量视频播放有了一个质的提升
2.IIS录放音,IIS录放音已经做全了。演示中的代码下载前要将频率修改为36.864MHz
3.PWM DMA,之前的PWM没办法更好的兼容DMA,现在可以了
4.频谱分析仪(上位机),因为有了一些硬件的浮点乘除单元可以更好的实现
5.手写计算器,已经从STC进化到了AI
6.QSPI,PWM移相,硬件乘除,单精度浮点,一些最新的功能
AI8051U参数:
Ai8051U,USB型1T8051,支持32位和8位指令集,RMB2.3
管脚兼容天王级别的:89C52RC,12C5A60S2
要兼容8位8051指令集,可以用KeilC51/IAR/SDCC编译器
===就相当于更强大的8H8K64U
要兼容32位8051指令集,可以用KeilC251编译器,双核兼容设计
===就相当于更强大的32G12K128,32G8K64
34K SRAM(2K edata, 32K xdata), 64K Flash
TFPU@120MHz,硬件浮点/硬件三角函数 运算器
DMA支持PWM,DMA支持外设直接到外设,P2P
120MHz-PWM支持硬件移相,16位PWM;
真12位ADC USB,4组串口,12位ADC,轨到轨比较器
QSPI,SPI,12S,12C,TFT-i8080/M6800接口
PDIP40,LQFP44, LQFP48封装
--哪怕梦想让我们拼的遍体鳞伤,这一次我们也要勇往直前
AI8051U教学视频学习心得打卡 第一集
学习AI8051U的视频是一次非常重要的实践机会,它不仅让我对AI技术有了更深入的理解,还让我在实践中锻炼了自己的动手能力和解决问题的能力。这是一次充满挑战的学习过程,但也是一次成长的机会。
首先,我学习了AI8051U的基本概念和核心原理。这门课程让我对AI的基本工作原理有了清晰的认识,特别是如何通过设计算法来实现复杂的目标,比如图像识别和自然语言处理等。通过课程中的案例和实验,我学会了如何将理论知识应用到实际项目中。
在学习过程中,我遇到了一些问题,比如如何选择合适的算法和参数,如何处理大数据和大数据分析等。这些挑战让我意识到自己在AI技术学习上的不足,也让我学会了如何不断调整学习方法,以适应新的知识和技能。
通过实践,我学会了如何使用AI8051U的硬件和软件工具。这包括如何编写Python代码来开发AI模型,如何处理数据集,以及如何进行模型的优化和评估。这些技能不仅提高了我的技术能力,还让我对AI的应用前景有了更清晰的认识。
此外,学习过程中我还学到了团队合作的重要性。在实验中,我和其他小组成员一起完成项目,这不仅让我学会了如何分工合作,还让我体会到了团队协作的魅力。通过集体学习和合作,我更加深刻地理解了AI技术的复杂性和重要性。
这次学习经历让我对AI技术充满了兴趣和热情。我认识到,AI技术正在深刻改变我们的生活和工作方式,它将为人类带来巨大的进步和机遇。未来,我希望能够继续深入学习AI技术,为社会发展贡献自己的力量。
总之,学习AI8051U的视频是一次非常宝贵的学习机会。通过这次学习,我不仅掌握了AI技术的核心知识,还学会了如何将理论知识应用到实际项目中,培养了我的问题解决能力和团队协作能力。这将对我未来的学习和职业发展产生深远的影响。
总结:
这次学习AI8051U的视频是一次非常重要的实践机会,不仅让我对AI技术有了更深入的理解,还让我在实践中锻炼了自己的动手能力和解决问题的能力。通过这次学习,我学会了如何使用AI8051U的硬件和软件工具,并且认识到AI技术正在深刻改变我们的生活和工作方式。未来,我希望能够继续深入学习AI技术,为社会发展贡献自己的力量。
[本文内容由国芯人工智能辅助生成,仅供参考] 第二集 硬件以及工具介绍
1:实验箱硬件部分:
硬件功能模块,如图实验箱整体功能布局(我还没有试验箱,先截个屏{:ciya:})
有个疑问老师说的那个示波器输入进来调节波形调的是什么呢,如果我们调节了是不是意味着信号失真了呢?
2:软件和工具
开发工具依然还是keil(STC是不是也应该推出自己的开发工具了{:touxiao:}),下载软件ISP功能更强大了{:qiang:}
MCU型号添加:在ISP软件 keil仿真设置 添加型号 ...点击后选择keil路径即可
进入下载模式,先按住P3.2按键,然后按下off 松开off后即进入下载模式
--哪怕梦想让我们拼的遍体鳞伤,这一次我们也要勇往直前
第三集点亮第一颗LED
新建工程的设置
target
output,64K以内可以选80,超过64K必须选择386
用ISP软件生成头文件 选择芯片型号,选择keil格式头文件,然后点击保存文件,选择路径保存即可
第一段代码点亮第一个灯如下
#include "ai8051u.h"
void main(void)
{
P0M0 = 0x00;
P0M1 = 0x00;
P4M0 = 0x00;
P4M1 = 0x00;
P40 = 0;
while(1)
{
P00 = 0;
}
}
P0M0 = 0x00; ... IO口模式设置将P0 和P4口各8个引脚全部设置为准双向口
P40 = 0;开启三极管给LED供电,P00 = 0;第一个灯给0形成回路点亮第一个灯
--哪怕梦想让我们拼的遍体鳞伤,这一次我们也要勇往直前
第四集 USB不停电下载
下载所需文件(STC官网-软件工具-库函数-USB库文件)
添加库函数和头文件到工程
在main.c中添加代码
因为新的USB库做了修改所以老师讲的一些语句已经不需要再添加,重新参考历程修改代码如下
(因为USB库更新了所以不知到命令在哪里设置了,还是先保持默认不变)
#include "ai8051u.h"
#include "stc32_stc8_usb.h"
void usb_callback();
void main(void)
{
EAXFR = 1; //允许访问扩展的特殊寄存器,XFR
WTST = 0; //设置取程序代码等待时间,
//赋值为0表示不等待,程序以最快速度运行
CKCON = 0; //设置访问片内的xdata速度,
//赋值为 0表示用最快速度访问,
//不增加额外的等待时间
P0M1 = 0x00; P0M0 = 0x00;
P1M1 = 0x00; P1M0 = 0x00;
P2M1 = 0x00; P2M0 = 0x00;
P3M1 = 0x00; P3M0 = 0x00;
P4M1 = 0x00; P4M0 = 0x00;
P5M1 = 0x00; P5M0 = 0x00;
P6M1 = 0x00; P6M0 = 0x00;
P7M1 = 0x00; P7M0 = 0x00;
usb_init(); //USB CDC 接口配置
set_usb_OUT_callback(usb_callback); //设置中断回调回调函数
EA = 1;
P40 = 0;
while(1)
{
P00 = 0;
}
}
void usb_callback()
{
USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
}
--哪怕梦想让我们拼的遍体鳞伤,这一次我们也要勇往直前
第五集语言基础
一.C语言USB-CDC串口之printf函数的实现
1.打开USB库中的PRINTF HID宏定义(去掉/)
2.理解PRINTF的函数原型的定义
#define printf printf hid
int printf hid (const char *fmt; .….);
二.数的进制:2进制、10进制、16进制
三.数据的基本类型
四.C语言常用运算符
--哪怕梦想让我们拼的遍体鳞伤,这一次我们也要勇往直前
第六集IO输入输出
GPIO 工作模式
高低电平限值
按键检测
任务:
任务实现代码:
#include "ai8051u.h"
#include "stc32_stc8_usb.h"
#define MAIN_Fosc 24000000L //定义主时钟
void usb_callback();
void Delay20ms(void) //@24.000MHz
{
unsigned long edata i;
_nop_();
_nop_();
i = 119998UL;
while (i) i--;
}
void main(void)
{
EAXFR = 1; //允许访问扩展的特殊寄存器,XFR
WTST = 0; //设置取程序代码等待时间,
//赋值为0表示不等待,程序以最快速度运行
CKCON = 0; //设置访问片内的xdata速度,
//赋值为 0表示用最快速度访问,
//不增加额外的等待时间
P0M1 = 0x00; P0M0 = 0x00;
P1M1 = 0x00; P1M0 = 0x00;
P2M1 = 0x00; P2M0 = 0x00;
P3M1 = 0x00; P3M0 = 0x00;
P4M1 = 0x00; P4M0 = 0x00;
P5M1 = 0x00; P5M0 = 0x00;
P6M1 = 0x00; P6M0 = 0x00;
P7M1 = 0x00; P7M0 = 0x00;
usb_init(); //USB CDC 接口配置
set_usb_OUT_callback(usb_callback); //设置中断回调回调函数
EA = 1;
P40 = 0;
while(1)
{
/*//任务1
if(P32 == 0)
{
P20 = 0;
}
else
{
P20 = 1;
}
//任务2
if(P32 == 1)
{
P20 = 0;
}
else
{
P20 = 1;
}*/
//任务3
if(P32 == 0)
{
Delay20ms();
if(P32 == 0)
{
P20 = !P20;
while(P32 == 0);
}
}
}
}
void usb_callback()
{
USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
}
课后练习练习代码
#include "ai8051u.h"
#include "stc32_stc8_usb.h"
#define MAIN_Fosc 24000000L //定义主时钟
void usb_callback();
void Delay20ms(void) //@24.000MHz
{
unsigned long edata i;
_nop_();
_nop_();
i = 119998UL;
while (i) i--;
}
void main(void)
{
EAXFR = 1; //允许访问扩展的特殊寄存器,XFR
WTST = 0; //设置取程序代码等待时间,
//赋值为0表示不等待,程序以最快速度运行
CKCON = 0; //设置访问片内的xdata速度,
//赋值为 0表示用最快速度访问,
//不增加额外的等待时间
P0M1 = 0x00; P0M0 = 0x00;
P1M1 = 0x00; P1M0 = 0x00;
P2M1 = 0x00; P2M0 = 0x00;
P3M1 = 0x00; P3M0 = 0x00;
P4M1 = 0x00; P4M0 = 0x00;
P5M1 = 0x00; P5M0 = 0x00;
P6M1 = 0x00; P6M0 = 0x00;
P7M1 = 0x00; P7M0 = 0x00;
usb_init(); //USB CDC 接口配置
set_usb_OUT_callback(usb_callback); //设置中断回调回调函数
EA = 1;
P40 = 0;
P2 = 0xff;
while(1)
{
/*//任务1
if(P32 == 0)
{
P20 = 0;
}
if(P33 == 0)
{
P20 = 1;
}*/
//任务2
if(P32 == 0)
{
Delay20ms();
if(P32 == 0)
{
P2 = P2 << 1;
while(P32 == 0);
}
}
}
}
void usb_callback()
{
USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
}
--哪怕梦想让我们拼的遍体鳞伤,这一次我们也要勇往直前
第七集 定时器中断
定时器应用:
打印”数”乱码问题:
定时器要配置的寄存器:
定时时间计算:
函数定义、声明和调用:
任务:
任务1:LED灯三秒取反一次,这期间任意时刻按下按钮,串口打印按键次数。
完成任务1时遇到个问题,生成定时器时忘记勾选使能中断生成代码如下:
void Timer0_Init(void) //3秒@24.000MHz
{
TM0PS = 0x5B; //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x3F; //设置定时初始值
TH0 = 0x01; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}
勾选使能中断后生成代码如下:
void Timer0_Isr(void) interrupt 1
{
}
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中断
}
误以为两次生成Timer0_Init代码一致,所以只拷贝了中断代码,导致程序不好用后排查是不进中断,最终排查到第一次生成代码中缺少了一句ET0 = 1;//使能定时器0中断
写代码还是要仔细,按部就班的去做不要偷懒啊{:lenghan:}
任务2:灯按一下点亮三秒后熄灭。
任务3:救护车灯控制器,按下报警按钮,红蓝交替闪烁(LED1和LED2 ·表示红和蓝灯);再按一下报警按钮,红蓝灯停止。
任务代码:
#include "ai8051u.h"
#include "stc32_stc8_usb.h"
#define MAIN_Fosc 24000000L //定义主时钟
#define u8 unsigned char
void usb_callback();
u8 count = 1;
bit key_count = 0;
void Delay20ms(void) //@24.000MHz
{
unsigned long edata i;
_nop_();
_nop_();
i = 119998UL;
while (i) i--;
}
//任务1 2
//void Timer0_Init(void) //3秒@24.000MHz
//{
//TM0PS = 0x5B; //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
//AUXR &= 0x7F; //定时器时钟12T模式
//TMOD &= 0xF0; //设置定时器模式
//TL0 = 0x3F; //设置定时初始值
//TH0 = 0x01; //设置定时初始值
//TF0 = 0; //清除TF0标志
////任务1 TR0 = 1; //定时器0开始计时
//ET0 = 1; //使能定时器0中断
//}
void Timer0_Init(void) //300毫秒@24.000MHz
{
TM0PS = 0x09; //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xA0; //设置定时初始值
TH0 = 0x15; //设置定时初始值
TF0 = 0; //清除TF0标志
ET0 = 1; //使能定时器0中断
}
void main(void)
{
EAXFR = 1; //允许访问扩展的特殊寄存器,XFR
WTST = 0; //设置取程序代码等待时间,
//赋值为0表示不等待,程序以最快速度运行
CKCON = 0; //设置访问片内的xdata速度,
//赋值为 0表示用最快速度访问,
//不增加额外的等待时间
P0M1 = 0x00; P0M0 = 0x00;
P1M1 = 0x00; P1M0 = 0x00;
P2M1 = 0x00; P2M0 = 0x00;
P3M1 = 0x00; P3M0 = 0x00;
P4M1 = 0x00; P4M0 = 0x00;
P5M1 = 0x00; P5M0 = 0x00;
P6M1 = 0x00; P6M0 = 0x00;
P7M1 = 0x00; P7M0 = 0x00;
usb_init(); //USB CDC 接口配置
set_usb_OUT_callback(usb_callback); //设置中断回调回调函数
Timer0_Init();
EA = 1;
while(1)
{
// //任务1
// if(P32 == 0)
// {
// Delay20ms();
// if(P32 == 0)
// {
// printf("按键按下次数\xfd: %d\r\n",count);
// count ++ ;
// while(P32 == 0);
// }
// }
// //任务2
// if(P32 == 0)
// {
// Delay20ms();
// if(P32 == 0)
// {
// TR0 = 1;
// P20 = 0;
// while(P32 == 0);
// }
// }
//任务3
if(P32 == 0)
{
Delay20ms();
if(P32 == 0)
{
key_count = !key_count;
if(key_count == 1)
{
TR0 = 1;
P20 = 0;
P21 = 1;
}
else
{
TR0 = 0;
P20 = 1;
P21 = 1;
}
while(P32 == 0);
}
}
}
}
void Timer0_Isr(void) interrupt 1
{
////任务1:LED灯三秒取反一次,这期间任意时刻按下按钮,串口打印按键次数。
//P20 = !P20;
////任务2:灯按一下点亮三秒后熄灭。
//P20 = 1;
//TR0 = 0;
//任务3:救护车灯控制器,按下报警按钮,红蓝交替闪烁(LED1和LED2 ·表示红和蓝灯);再按一下报警按钮,红蓝灯停止
P20 = !P20;
P21 = !P21;
}
void usb_callback()
{
USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
}
思考:定时器一次只能定时一次,如果我有很多个定时任务怎么办?
个人答案:
取一个基准时钟,比如一个任务2秒,一个任务3秒,一个任务5秒,则定时器定时1秒,没次进中断做计数和判断,任务1进两次执行一次,任务2进三次执行一次,任务3进五次执行一次。
参考代码:
#include "ai8051u.h"
#include "stc32_stc8_usb.h"
#define MAIN_Fosc 24000000L //定义主时钟
#define u8 unsigned char
void usb_callback();
u8 interrupt_count = 0;
void Timer0_Init(void) //1秒@24.000MHz
{
TM0PS = 0x1E; //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xFC; //设置定时初始值
TH0 = 0x03; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
}
void main(void)
{
EAXFR = 1; //允许访问扩展的特殊寄存器,XFR
WTST = 0; //设置取程序代码等待时间,
//赋值为0表示不等待,程序以最快速度运行
CKCON = 0; //设置访问片内的xdata速度,
//赋值为 0表示用最快速度访问,
//不增加额外的等待时间
P0M1 = 0x00; P0M0 = 0x00;
P1M1 = 0x00; P1M0 = 0x00;
P2M1 = 0x00; P2M0 = 0x00;
P3M1 = 0x00; P3M0 = 0x00;
P4M1 = 0x00; P4M0 = 0x00;
P5M1 = 0x00; P5M0 = 0x00;
P6M1 = 0x00; P6M0 = 0x00;
P7M1 = 0x00; P7M0 = 0x00;
usb_init(); //USB CDC 接口配置
set_usb_OUT_callback(usb_callback); //设置中断回调回调函数
Timer0_Init();
EA = 1;
while(1);
}
void Timer0_Isr(void) interrupt 1
{
interrupt_count++;
printf("秒数\XFD:%d\r\n",interrupt_count);
switch (interrupt_count%5)
{
case 2:P20 = !P20;break;
case 3:P21 = !P21;break;
case 0:P22 = !P22;break;
}
}
void usb_callback()
{
USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
}
课后练习
练习代码:
#include "ai8051u.h"
#include "stc32_stc8_usb.h"
#define MAIN_Fosc 24000000L //定义主时钟
#define u8 unsigned char
void usb_callback();
u8count = 0;
bit key_count = 0;
bit sec_count = 0;
void Delay20ms(void) //@24.000MHz
{
unsigned long edata i;
_nop_();
_nop_();
i = 119998UL;
while (i) i--;
}
void Timer0_Init(void) //1秒@24.000MHz
{
TM0PS = 0x1E; //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xFC; //设置定时初始值
TH0 = 0x03; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 0; //定时器0开始计时
ET0 = 1; //使能定时器0中断
}
void main(void)
{
EAXFR = 1; //允许访问扩展的特殊寄存器,XFR
WTST = 0; //设置取程序代码等待时间,
//赋值为0表示不等待,程序以最快速度运行
CKCON = 0; //设置访问片内的xdata速度,
//赋值为 0表示用最快速度访问,
//不增加额外的等待时间
P0M1 = 0x00; P0M0 = 0x00;
P1M1 = 0x00; P1M0 = 0x00;
P2M1 = 0x00; P2M0 = 0x00;
P3M1 = 0x00; P3M0 = 0x00;
P4M1 = 0x00; P4M0 = 0x00;
P5M1 = 0x00; P5M0 = 0x00;
P6M1 = 0x00; P6M0 = 0x00;
P7M1 = 0x00; P7M0 = 0x00;
usb_init(); //USB CDC 接口配置
set_usb_OUT_callback(usb_callback); //设置中断回调回调函数
Timer0_Init();
EA = 1;
while(1)
{
if(P32 == 0)
{
Delay20ms();
if(P32 == 0)
{
key_count = !key_count;
if(key_count == 1)
{
printf("双倍功德时间\r\n");
}
else
{
printf("单倍功德时间\r\n");
}
while(P32 == 0);
}
}
if(P33 == 0)
{
Delay20ms();
if(P33 == 0)
{
if(key_count == 1)
{
count = count+2;
printf("功德+2,当前功德%d\r\n",count);
TR0 = 1;
P20 = 0;
}
else
{
count = count+1;
printf("功德+1,当前功德%d\r\n",count);
TR0 = 1;
P20 = 0;
}
}
while(P33 == 0);
}
}
}
void Timer0_Isr(void) interrupt 1
{
sec_count = !sec_count;
if(key_count == 1)
{
if(sec_count == 0)
{
TR0 = 0;
P20 = 1;
}
}
else
{
TR0 = 0;
P20 = 1;
}
}
void usb_callback()
{
USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
}
--哪怕梦想让我们拼的遍体鳞伤,这一次我们也要勇往直前
第八集 定时器周期性调度任务
(前1-7集感觉就是带小白入门,从本集开始难度飙升,半吊子的我学起来有一丢丢吃力了{:xiaoku:})
本集主要内容如下:
1.常见的错误介绍
2.周期性任务介绍
3.数组
4.按键不再用while检测按键抬起,防止冲突其他任务,改用定时器计数
5.多文件的建立
6.用结构体去创建多任务
任务1:用一个定时器实现这个任务。LED1实现0.3秒取反一次,LED2实现0.6 秒取反一次,LED3 0.9秒取反一次
周期性任务代码:
#include "ai8051u.h"
#include "stc32_stc8_usb.h"
#define MAIN_Fosc 24000000L //定义主时钟
#define u8 unsigned char
#define u16 unsigned int
void usb_callback();
u8 interrupt_count = 0;
u16 LED1_count = 0;
u16 LED2_count = 0;
u16 LED3_count = 0;
void Timer0_Init(void) //1毫秒@24.000MHz
{
TM0PS = 0x00; //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x30; //设置定时初始值
TH0 = 0xF8; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
}
void main(void)
{
EAXFR = 1; //允许访问扩展的特殊寄存器,XFR
WTST = 0; //设置取程序代码等待时间,
//赋值为0表示不等待,程序以最快速度运行
CKCON = 0; //设置访问片内的xdata速度,
//赋值为 0表示用最快速度访问,
//不增加额外的等待时间
P0M1 = 0x00; P0M0 = 0x00;
P1M1 = 0x00; P1M0 = 0x00;
P2M1 = 0x00; P2M0 = 0x00;
P3M1 = 0x00; P3M0 = 0x00;
P4M1 = 0x00; P4M0 = 0x00;
P5M1 = 0x00; P5M0 = 0x00;
P6M1 = 0x00; P6M0 = 0x00;
P7M1 = 0x00; P7M0 = 0x00;
usb_init(); //USB CDC 接口配置
set_usb_OUT_callback(usb_callback); //设置中断回调回调函数
Timer0_Init();
EA = 1;
while(1)
{
if(LED1_count == 300)
{
LED1_count = 0;
P20 = !P20;
}
if(LED2_count == 600)
{
LED2_count = 0;
P21 = !P21;
}
if(LED3_count == 900)
{
LED3_count = 0;
P22 = !P22;
}
}
}
void Timer0_Isr(void) interrupt 1
{
LED1_count++;
LED2_count++;
LED3_count++;
}
void usb_callback()
{
USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
}
数组方式实现:
#include "ai8051u.h"
#include "stc32_stc8_usb.h"
#define MAIN_Fosc 24000000L //定义主时钟
#define u8 unsigned char
#define u16 unsigned int
void usb_callback();
u8 interrupt_count = 0;
//u16 LED1_count = 0;
//u16 LED2_count = 0;
//u16 LED3_count = 0;
u16 count={0,0,0};
void Timer0_Init(void) //1毫秒@24.000MHz
{
TM0PS = 0x00; //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x30; //设置定时初始值
TH0 = 0xF8; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
}
void main(void)
{
EAXFR = 1; //允许访问扩展的特殊寄存器,XFR
WTST = 0; //设置取程序代码等待时间,
//赋值为0表示不等待,程序以最快速度运行
CKCON = 0; //设置访问片内的xdata速度,
//赋值为 0表示用最快速度访问,
//不增加额外的等待时间
P0M1 = 0x00; P0M0 = 0x00;
P1M1 = 0x00; P1M0 = 0x00;
P2M1 = 0x00; P2M0 = 0x00;
P3M1 = 0x00; P3M0 = 0x00;
P4M1 = 0x00; P4M0 = 0x00;
P5M1 = 0x00; P5M0 = 0x00;
P6M1 = 0x00; P6M0 = 0x00;
P7M1 = 0x00; P7M0 = 0x00;
usb_init(); //USB CDC 接口配置
set_usb_OUT_callback(usb_callback); //设置中断回调回调函数
Timer0_Init();
EA = 1;
while(1)
{
}
}
void Timer0_Isr(void) interrupt 1
{
u8 i;
for( i=0;i<3;i++)
{
count++;
if(count == 300)
{
count = 0;
P20 = !P20;
}
if(count == 600)
{
count = 0;
P21 = !P21;
}
if(count == 900)
{
count = 0;
P22 = !P22;
}
}
}
void usb_callback()
{
USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
}
任务2:数组点亮LED,实现流水灯
实现代码:
#include "ai8051u.h"
#include "stc32_stc8_usb.h"
#define MAIN_Fosc 24000000L //定义主时钟
#define u8 unsigned char
#define u16 unsigned int
void usb_callback();
u8 interrupt_count = 0;
u16 count={0,0,0};
u16 led={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x40,0x20,0x10,0x08,0x04,0x02};
u8 j=0;
void Timer0_Init(void) //1毫秒@24.000MHz
{
TM0PS = 0x00; //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x30; //设置定时初始值
TH0 = 0xF8; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
}
void main(void)
{
EAXFR = 1; //允许访问扩展的特殊寄存器,XFR
WTST = 0; //设置取程序代码等待时间,
//赋值为0表示不等待,程序以最快速度运行
CKCON = 0; //设置访问片内的xdata速度,
//赋值为 0表示用最快速度访问,
//不增加额外的等待时间
P0M1 = 0x00; P0M0 = 0x00;
P1M1 = 0x00; P1M0 = 0x00;
P2M1 = 0x00; P2M0 = 0x00;
P3M1 = 0x00; P3M0 = 0x00;
P4M1 = 0x00; P4M0 = 0x00;
P5M1 = 0x00; P5M0 = 0x00;
P6M1 = 0x00; P6M0 = 0x00;
P7M1 = 0x00; P7M0 = 0x00;
usb_init(); //USB CDC 接口配置
set_usb_OUT_callback(usb_callback); //设置中断回调回调函数
Timer0_Init();
EA = 1;
while(1)
{
}
}
void Timer0_Isr(void) interrupt 1
{
u8 i;
for( i=0;i<3;i++)
{
count++;
if(count == 300)
{
count = 0;
P2 = ~led;
j++;
if(j > 13){j =0;}
}
}
}
void usb_callback()
{
USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
}
任务3:按键1按一下,LED通过数组移动一下
实现代码:
#include "ai8051u.h"
#include "stc32_stc8_usb.h"
#define MAIN_Fosc 24000000L //定义主时钟
#define u8 unsigned char
#define u16 unsigned int
void usb_callback();
u8 interrupt_count = 0;
u16 count={0,0,0};
u16 led={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x40,0x20,0x10,0x08,0x04,0x02};
u8 j = 0,key_num = 0;
void Timer0_Init(void) //1毫秒@24.000MHz
{
TM0PS = 0x00; //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x30; //设置定时初始值
TH0 = 0xF8; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
}
void main(void)
{
EAXFR = 1; //允许访问扩展的特殊寄存器,XFR
WTST = 0; //设置取程序代码等待时间,
//赋值为0表示不等待,程序以最快速度运行
CKCON = 0; //设置访问片内的xdata速度,
//赋值为 0表示用最快速度访问,
//不增加额外的等待时间
P0M1 = 0x00; P0M0 = 0x00;
P1M1 = 0x00; P1M0 = 0x00;
P2M1 = 0x00; P2M0 = 0x00;
P3M1 = 0x00; P3M0 = 0x00;
P4M1 = 0x00; P4M0 = 0x00;
P5M1 = 0x00; P5M0 = 0x00;
P6M1 = 0x00; P6M0 = 0x00;
P7M1 = 0x00; P7M0 = 0x00;
usb_init(); //USB CDC 接口配置
set_usb_OUT_callback(usb_callback); //设置中断回调回调函数
Timer0_Init();
EA = 1;
while(1)
{
P2 = ~led;
if(count == 1000)
{
count = 0;
printf("AI8051U\r\n");
}
if(count == 10)
{
count = 0;
if(P32 == 0)
{
key_num++;
if(key_num == 5)
{
j++;
if(j > 13){j =0;}
}
}
else
{
key_num = 0;
}
}
}
}
void Timer0_Isr(void) interrupt 1
{
u8 i;
for( i=0;i<3;i++)
{
count++;
}
}
void usb_callback()
{
USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
}
多文件
多任务
--哪怕梦想让我们拼的遍体鳞伤,这一次我们也要勇往直前
第九集数码管主要内容如下摘要1.数码管介绍数码管外观
2.数码管显示原理 生成段码3数码管静态显示任务1:数码管静态的显示一个数字
4数码管动态显示任务2:数码管显示"12345678"任务3:数码管显示“00-00-00”分别代表时分秒,每过1秒钟秒+1
5.虚拟显示LED和数码管
任务1:数码管静态的显示一个数字任务2:数码管显示"12345678"任务3:数码管显示“00-00-00”分别代表时分秒,每过1秒钟秒+1虚拟现实
任务代码:
所用硬件原理图拓展训练:拓展代码:
--哪怕梦想让我们拼的遍体鳞伤,这一次我们也要勇往直前
页:
[1]
2