找回密码
 立即注册
查看: 975|回复: 11

学习《Ai8051U教学视频》学习心得,送强大的 Ai8051U实验箱 | 已送

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-02 07:55:56
已绑定手机

19

主题

3190

回帖

4870

积分

论坛元老

积分
4870
发表于 2024-12-9 22:28:55 | 显示全部楼层 |阅读模式
第一集-序言
图片1.png
开篇说到,哪怕梦想让我们遍体鳞伤,这一次我们也要勇往直前,
人总要有梦想,学习单片机也是一部分,刚开始学习单片机的时候总是遇到各种各样的问题,有时候是自己不小心输出指令,有时候又是因为逻辑问题,遇到这些问题的时候,不知道如何解决的时候,让我失去信心,不想去学单片机,但是梦想油让我坚持下去。但是有了国芯交流社区,让我能快速解决问题,并不断了解芯片功能,学习芯片的各种使用,也提供了各种芯片方便我们学习,所以这边要感谢国芯平台。好了感慨完了,开始进入正题。
8051U相对于之前型号的国芯芯片强在哪里呢?一张图给了答案。
图片2.png
图片3.png

1、屏幕显示和视频播放(flash编程器)这得益于8051U相比之前型号的国芯芯片有更强的RAM资源,性能不输ARM32位芯片。
2、2.IIS录放音,之前芯片无I2S功能这个新增的可以实现音频录制和播放。
3、PWM_DMA,这个也是新增的实现更快更强大的功能。
4、频谱分析仪(上位机),这个感觉介绍的不是很多,还有待自己学习下。
5、手写计算器,看了介绍视频感觉蛮好玩的,但这些都需要AI计算。
6、QSPI,PWM移相,硬件乘除,单精度浮点QSPI可以实现更快速的SPI通信但必须硬件支持,其它那些更多更多运用在算法和运算上,感觉现在自己的实力还不是能很好的运用。

最后一张图是关于AI8051U的功能介绍,以及编译器的选择等。这些可以先了解以后在实际使用中,才会对芯片更有了解。

这节课就学习到这了。

回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-02 07:55:56
已绑定手机

19

主题

3190

回帖

4870

积分

论坛元老

积分
4870
发表于 2024-12-9 22:33:59 | 显示全部楼层
第二课、硬件及工具介绍
俗话说:工欲善其事,必先利其器要学好一样东西必须先了解它的结构和功能,以及如何去使用它,所以这节课主要是去了解AI8051U的硬件结构和编译器的选择和使用以及程序的下载。
首先看图了解AI8051U的硬件。
图片4.png 图片5.png 图片6.png

立体声线路输出
立体声耳机输出
话简录音
示波器BNC输入
OLED显示屏SPI/I2C8/7线接口
TF卡插座
USB转双串口
USB-TypeC
USB Link 1D接口
USB-TypeA
8路流水灯
RTC电池
LCD对比度调节
外部并行总线扩展32KSRAM(需自行焊接)
8位数码管
TFT彩屏
QSPI/SPI FLASH
电源按键(按下断电)
复位按键
红外接收
红外发射
矩阵键盘
Ai8051U
ADC键盘
TO、T1按键
INTO、INT1按键
掉电检测电压调节
32768Hz无源晶振
24C02 EEPROM
DS18B20温度传感器
TLV320AIC23B I2SDAC
LMV358
74HC4051、TP2604S
TP2604S
AI8H2K12U USB转双串口
SP3485
无源峰鸣器(这个应该是压电蜂鸣器吧)
以上是AI8051U带的硬件部分。

了解硬件就开始软件部分,AI8051U可以使用keil C51 SDCC、IAR等51编译器,也可以使用keil C251编译器。这些因之前已经安装就不在多写了。
图片7.png

这些论坛已经有很多相关内容了,且我这边已经安装完成,就不重复了。
图片8.png

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-02 07:55:56
已绑定手机

19

主题

3190

回帖

4870

积分

论坛元老

积分
4870
发表于 2024-12-9 22:36:10 | 显示全部楼层
第三课\03.点亮第一个LED
首先要打开一个LED灯就要有电势差,AI8051ULED采用共阳模式,所以要让LED亮的前提是LED灯的电源导通和,GPIO为低,LED才会亮。知道怎么让LED亮了,但是IO也有模式控制不是上电就可以直接可以让IO控制也必须对IO进行配置,默认配置成准双向口就可以。IO默认输出高电平所以要把IO置零。
图片9.png 图片10.png

点亮一个LED程序如下。因为没用AI8051U开发箱就不上传了。
图片11.png

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-02 07:55:56
已绑定手机

19

主题

3190

回帖

4870

积分

论坛元老

积分
4870
发表于 2024-12-9 23:16:44 | 显示全部楼层
第五集、不断电下载

如果每次下载都要按下P32在按ON/OFF,很麻烦,有没有用办法不按任何按键就能下载固件呢?有那就是不断电下载了,
图片12.png

需要USB初始化函数,及lib文件
程序需要使用XFR,所以要对P_SW2寄存器的第7位置1P_SW2= 0x80;但是为了P_SW28位为了防止因为对第7位置10-6位置零所以使用或运算,所以变成P_SW2|= 0x80,因为使用不断电下载需要使用USB中断,故IE2USB中断的控制和P_SW2一样,变成IE2|=0x80
由于开启了USB中断就需要使用所以要开启总中断EA=1其它就是USB初始化及控制指令部分了。
代码如下
  1. #include "ai8051u.h"                        //调用头文件
  2. #include "stc32_stc8_usb.h"                //调用头文件
  3. char *USER_DEVICEDESC = NULL;
  4. char *USER_PRODUCTDESC = NULL;
  5. char *USER_STCISPCMD = "@STCISP#";
  6. void GPIO_Init()
  7. {
  8.         P0M1 = 0x00;   P0M0 = 0x00;
  9.     P1M1 = 0x00;   P1M0 = 0x00;
  10.     P2M1 = 0x00;   P2M0 = 0x00;
  11.     P3M1 = 0x00;   P3M0 = 0x00;
  12.     P4M1 = 0x00;   P4M0 = 0x00;
  13.     P5M1 = 0x00;   P5M0 = 0x00;
  14.     P6M1 = 0x00;   P6M0 = 0x00;
  15.     P7M1 = 0x00;   P7M0 = 0x00;
  16. }
  17. void main(void)
  18. {
  19.     P_SW2 |= 0x80;                                            //B7位写1,使能访问XFR
  20.         GPIO_Init();
  21.         usb_init();                                     //USB CDC 接口配置
  22.         P40 = 0;                                                                                //P40端口输出0V
  23.     IE2 |= 0x80;                                    //使能USB中断
  24.     EA = 1;                                                                                        //IE |= 0X80;
  25.        
  26.         while (DeviceState != DEVSTATE_CONFIGURED);     //等待USB完成配置
  27.        
  28.         while(1)
  29.         {
  30.                
  31.         if (bUsbOutReady)
  32.         {
  33.             USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
  34.             
  35.             usb_OUT_done();
  36.         }
  37.                 P00 = 0;        //P00端口输出0V.打开P00的LED灯
  38.         }
  39. }
复制代码




回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-02 07:55:56
已绑定手机

19

主题

3190

回帖

4870

积分

论坛元老

积分
4870
发表于 2024-12-10 14:13:51 | 显示全部楼层
第五课 C语言基础
关于C语言基础。
这一讲开篇就开始讲解的是printf函数的定义及fmt格式控制字符串,但是我感觉在讲之前可以先说一下流程图,我个人感觉流程图虽然不是C语言的基础但是一开始就能把整个编程思路理清楚能让我们更快速的去开发程序。
#define printf  printf_hid
int printf_hid (const char *fmt, ...);
这是print函数的原型的定义,
fmt -- 是格式控制字符串,包含了两种类型的对象:普通字符和转换说明 。
普通字符:在输出时,普通字符将原样不动地复制到标准输出。
printf("8051U深度入门到3251大型实战视频\r\n");
转换说明:不直接输出,用于控制 printf 中参数的转换和打印。每个转换说明都由一个百分号字符(%)开始,以转换说明符结束,从而说明输出数据的类型、宽度、精度等。
        printf("8051U深度入门到3251大型实战视频,%s\r\n","加油");
转换说明简介:
1.类型:根据不同的 fmt 字符串,函数可能需要一系列的附加参数,每个
参数包含了一个要被插入的值,替换了 fmt 参数中指定的每个 % 标签。
关于附加参数,既可以是变量,也可以是常量。
2.位置:printf()函数的普通字符和转换说明放在" "双引号内,附加参数
放在双引号外,每个附加参数之间用逗号隔开。
3.数量:printf() 的附加参数与转换说明符是⼀⼀对应关系,如果有 n 个转
换说明符, printf() 的参数就应该有 n + 1 个。如果参数个数少于对应的转
换说明符,printf() 可能会输出内存中的任意值。
转换说明简介:
1.类型:根据不同的 fmt 字符串,函数可能需要一系列的附加参数,每个
参数包含了一个要被插入的值,替换了 fmt 参数中指定的每个 % 标签。
关于附加参数,既可以是变量,也可以是常量。
2.位置:printf()函数的普通字符和转换说明放在" "双引号内,附加参数
放在双引号外,每个附加参数之间用逗号隔开。
3.数量:printf() 的附加参数与转换说明符是⼀⼀对应关系,如果有 n 个转
换说明符, printf() 的参数就应该有 n + 1 个。如果参数个数少于对应的转
换说明符,printf() 可能会输出内存中的任意值。
printf("今天是%d%d%d\r\n",24,11,16);这段直接使用C语言编译显示如下

图片1.png 图片2.png
1.转换说明符
      %a(%A)     浮点数、十六进制数字和p-(P-)记数法(C99)
      %c      字符
      %d       有符号十进制整数
      %f       浮点数(包括float和double)
      %e(%E)     浮点数指数输出[e-(E-)记数法]
      %g(%G)     浮点数不显无意义的零"0"
      %i       有符号十进制整数(与%d相同)
      %u       无符号十进制整数
      %o       八进制整数    e.g.     0123
      %x(%X)     十六进制整数 e.g.   0x1234
      %p       指针
      %s       字符串
      %%       "%"
2.标志
      左对齐:"-"   e.g.   "%-20s"
      右对齐:"+" e.g.   "%+20s"
      空格:若符号为正,则显示空格,负则显示"-"   e.g.   "% "      
      #:对c,s,d,u类无影响;对o类,在输出时加前缀o;对x类,在输出时加前缀0x
           e,g,f 类当结果有小数时才给出小数点。
3.格式字符串(格式)
      [标志][输出最少宽度][.精度][长度]类型
     "-md" :左对齐,若m比实际少时,按实际输出。
     "%m.ns":输出m位,取字符串(左起)n位,左补空格,当n>m or m省略时m=n
                      e.g.    "%7.2s"   输入CHINA
                                             输出"     CH"
     "%m.nf":输出浮点数,m为宽度,n为小数点右边数位
                      e.g.    "%"    输入3852.99
                                               输出3853.0
      长度:为h短整形量,l为长整形量
接下来就是ASCII了,正常我们显示的字都是ASCII字不是进制数。
还有就是计算机采用的进制数了,有数的进制:2进制、10进制、16进制
2进制转16进制一般是421模式的,16进制转2进制就是反过来算。
C51数据的基本类型有:
bit,signed char,unsigned char,enum,signed short int,unsigned short int,signed int,unsigned int,
unsigned int,signed long int,float,double,idata*,data*,pdata*,near*,xdata*,code*,far*,huge*,
sbit,sfr,sfr16
如果想要使用64位的变量,需要在程序文件里面添加:#pragma float64
常用运算符:+、-、*、/
逻辑运算符:
&:逻辑与and两个都为真结果为真)
|:逻辑或(or两个中任一个结果为真)
!:逻辑非(not真变假、假变真)
运算符:
==:判断运算符,判断两边数是否相等。
=:赋值运算符,把右边的操作数赋给左边的操作数
+=:加且赋值运算符,把左边的操作数加上右边的操作数结果再赋给左边的操作数
=:减且赋值运算符,把左边的操作数减去右边的操作数结果再赋给左边的操作数
*=:乘且赋值运算符,把左边的操作数乘右边的操作数结果再赋给左边的操作数
/=:除且赋值运算符,把左边的操作数除以右边的操作数结果再赋给左边的操作数
%=:求模且赋值运算符,把两个操作数的模运算结果赋给左边的操作数
<<=:左移且赋值运算符
>>=:右移且赋值运算符
&=:按位与且赋值运算符
^=:按位异或且赋值运算符
|=:按位或且赋值运算符

以下是示例程序
  1. #include "ai8051u.h"                        //调用头文件
  2. #include "stc32_stc8_usb.h"                //调用头文件
  3. #define u8  unsigned char                //8位无符号变量(0-255)
  4. #define u16 unsigned int                //16位无符号变量(0-65535)       
  5.        
  6. u8 X = 10;
  7. u8 Y = 10;
  8. char *USER_DEVICEDESC = NULL;
  9. char *USER_PRODUCTDESC = NULL;
  10. char *USER_STCISPCMD = "@STCISP#";
  11. void GPIO_Init()
  12. {
  13.         P0M1 = 0x00;   P0M0 = 0x00;
  14.     P1M1 = 0x00;   P1M0 = 0x00;
  15.     P2M1 = 0x00;   P2M0 = 0x00;
  16.     P3M1 = 0x00;   P3M0 = 0x00;
  17.     P4M1 = 0x00;   P4M0 = 0x00;
  18.     P5M1 = 0x00;   P5M0 = 0x00;
  19.     P6M1 = 0x00;   P6M0 = 0x00;
  20.     P7M1 = 0x00;   P7M0 = 0x00;
  21. }
  22. void main(void)
  23. {
  24.     P_SW2 |= 0x80;                //B7位写1,使能访问XFR
  25.        
  26.         usb_init();                                     //USB CDC 接口配置
  27.     IE2 |= 0x80;                                    //使能USB中断
  28.     EA = 1;                                                                                        //IE |= 0X80;
  29.        
  30.         while (DeviceState != DEVSTATE_CONFIGURED);     //等待USB完成配置
  31.        
  32.         while(1)
  33.         {
  34.                
  35.         if (bUsbOutReady)                                                        //如果接收到了数据
  36.         {
  37.             //USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
  38.             
  39.                         if( X && Y )        //如果条件为真,输出什么
  40.                         {
  41.                                 printf("条件为真\r\n");
  42.                         }
  43.                         else
  44.                         {
  45.                                 printf("条件为假\r\n");
  46.                         }
  47.                                
  48.                        
  49.             usb_OUT_done();                                                        //
  50.         }
  51.                
  52.         }
  53. }
复制代码



回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-02 07:55:56
已绑定手机

19

主题

3190

回帖

4870

积分

论坛元老

积分
4870
发表于 2024-12-10 15:54:48 | 显示全部楼层
第六课:IO输出。
这几课讲了什么是GPIO,GPIO有什么功能,又是通过那个寄存器来控制GPIO的工作模式。并讲解了,这3种任务的实现。
图片3.png
图片4.png
图片5.png
图片6.png
图片7.png
任务1:按下P32按钮灯亮,松开P32按钮灯灭;
任务2:按下P32按钮灯灭,松开P32按钮灯亮;
任务3:按一下灯亮,按一下灯灭;
以及机械按键的抖动以及如何使用软件防抖的,接下来是课后小练:
按一下P32按钮灯亮,按一下P33按钮灯灭 代码如下:
  1. #include "ai8051u.h"                        //调用头文件
  2. #include "stc32_stc8_usb.h"                //调用头文件
  3. #include "intrins.h"                        //d调用头文件
  4. #define u8  unsigned char                //8位无符号变量(0-255)
  5. #define u16 unsigned int                //16位无符号变量(0-65535)       
  6.        
  7. u8 state = 0;                                        //初始状态
  8. char *USER_DEVICEDESC = NULL;
  9. char *USER_PRODUCTDESC = NULL;
  10. char *USER_STCISPCMD = "@STCISP#";
  11. void Delay20ms(void)        //@24.000MHz  Delay20ms();
  12. {
  13.         unsigned long edata i;
  14.         _nop_();
  15.         _nop_();
  16.         i = 119998UL;
  17.         while (i) i--;
  18. }
  19. void main(void)
  20. {
  21.     WTST = 0;                                                                                  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
  22.     EAXFR = 1;                                                                                 //扩展寄存器(XFR)访问使能
  23.     CKCON = 0;                                                                                 //提高访问XRAM速度
  24.        
  25.     P0M1 = 0x00;   P0M0 = 0x00;
  26.     P1M1 = 0x00;   P1M0 = 0x00;
  27.     P2M1 = 0x00;   P2M0 = 0x00;
  28.     P3M1 = 0x00;   P3M0 = 0x00;
  29.     P4M1 = 0x00;   P4M0 = 0x00;
  30.     P5M1 = 0x00;   P5M0 = 0x00;
  31.     P6M1 = 0x00;   P6M0 = 0x00;
  32.     P7M1 = 0x00;   P7M0 = 0x00;
  33.        
  34.         usb_init();                                     //USB CDC 接口配置
  35.     IE2 |= 0x80;                                    //使能USB中断
  36.     EA = 1;                                                                                        //IE |= 0X80;
  37.        
  38.         P40 = 0;
  39.        
  40.         while (DeviceState != DEVSTATE_CONFIGURED);     //等待USB完成配置
  41.        
  42.         while(1)
  43.         {
  44.                
  45.         if (bUsbOutReady)                                                        //如果接收到了数据
  46.         {
  47.             //USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
  48.             
  49.             usb_OUT_done();                                                        //
  50.         }
  51.                 按下P32按钮灯;
  52.                 if( P32 == 0 )        P00 = 0;
  53.                        
  54.                
  55.                        
  56.                         //按下P33按钮灯;
  57.                 if( P33 == 1 )        P00 = 1;                                                        //判断P33按钮是否按下
  58.         }
复制代码
按一下亮一颗灯,在按一下亮两颗灯,直到全亮(变量+加法和乘法)
  1. #include "ai8051u.h"                        //调用头文件
  2. #include "stc32_stc8_usb.h"                //调用头文件
  3. #include "intrins.h"                        //d调用头文件
  4. #define u8  unsigned char                //8位无符号变量(0-255)
  5. #define u16 unsigned int                //16位无符号变量(0-65535)       
  6. #define ON  0
  7. #define OFF 1       
  8. u8 state = 0;                                        //初始状态
  9. u8 code LEDState[8] ={0xfd.0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00} //LED从P0从0开始亮到7全亮。
  10. char *USER_DEVICEDESC = NULL;
  11. char *USER_PRODUCTDESC = NULL;
  12. char *USER_STCISPCMD = "@STCISP#";
  13. void Delay20ms(void)        //@24.000MHz  Delay20ms();
  14. {
  15.         unsigned long edata i;
  16.         _nop_();
  17.         _nop_();
  18.         i = 119998UL;
  19.         while (i) i--;
  20. }
  21. void main(void)
  22. {
  23.     WTST = 0;                                                                                  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
  24.     EAXFR = 1;                                                                                 //扩展寄存器(XFR)访问使能
  25.     CKCON = 0;                                                                                 //提高访问XRAM速度
  26.        
  27.     P0M1 = 0x00;   P0M0 = 0x00;
  28.     P1M1 = 0x00;   P1M0 = 0x00;
  29.     P2M1 = 0x00;   P2M0 = 0x00;
  30.     P3M1 = 0x00;   P3M0 = 0x00;
  31.     P4M1 = 0x00;   P4M0 = 0x00;
  32.     P5M1 = 0x00;   P5M0 = 0x00;
  33.     P6M1 = 0x00;   P6M0 = 0x00;
  34.     P7M1 = 0x00;   P7M0 = 0x00;
  35.        
  36.         usb_init();                                     //USB CDC 接口配置
  37.     IE2 |= 0x80;                                    //使能USB中断
  38.     EA = 1;                                                                                        //IE |= 0X80;
  39.        
  40.         P40 = 0;
  41.        
  42.         while (DeviceState != DEVSTATE_CONFIGURED);     //等待USB完成配置
  43.        
  44.         while(1)
  45.         {
  46.                
  47.         if (bUsbOutReady)                                                        //如果接收到了数据
  48.         {
  49.             //USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
  50.             
  51.             usb_OUT_done();                                                        //
  52.         }
  53.                
  54. //                //任务1:按下P32按钮灯亮,松开P32按钮灯灭;
  55. //                if( P32 == 0 )                                                                //判断P32按钮是否按下
  56. //                {
  57. //                        P00 = 0;
  58. //                }
  59. //                else
  60. //                {
  61. //                        P00 = 1;
  62. //                }
  63. //               
  64.                
  65.                
  66. //                //任务2:按下P32按钮灯灭,松开P32按钮灯亮;
  67. //                if( P32 == 1 )                                                                //判断P32按钮是否按下
  68. //                {
  69. //                        P00 = 0;
  70. //                }
  71. //                else
  72. //                {
  73. //                        P00 = 1;
  74. //                }
  75.                
  76.                 //任务3:按一下灯亮,按一下灯灭
  77.                 if( P32 == 0 )                                                                //判断P32按钮是否按下
  78.                 {
  79.                         Delay20ms();                                                        //延时20ms消抖
  80.                         if( P32 == 0 )
  81.                         {
  82.                                 //state = !state;                                                //变量取反 0 1 0 1 0 1
  83.                         state++;
  84.                         P0 = LEDState[state];
  85.                         if(state==8)         state=0;
  86.                                 while( P32 == 0 );                                        //等待P32松开
  87.                                
  88.                         }
  89.                 }
  90.                
  91.         }
  92. }
复制代码

这个使用数组法。


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-02 07:55:56
已绑定手机

19

主题

3190

回帖

4870

积分

论坛元老

积分
4870
发表于 2024-12-10 18:18:48 | 显示全部楼层
第七集:讲解了定时器的使用和如何使用ISP软件生成定时时间,同时讲解了中断的使用,此处用定时器中断进行演示,定时器的优势是计时准确,且可以通过定时器,进行多任务操作。
图片8.png
作业代码如下:
  1. #include "ai8051u.h"                        //调用头文件
  2. #include "stc32_stc8_usb.h"                //调用头文件
  3. #include "intrins.h"                        //d调用头文件
  4. #define u8  unsigned char                //8位无符号变量(0-255)
  5. #define u16 unsigned int                //16位无符号变量(0-65535)       
  6.        
  7. u8 state = 0;                                        //初始状态
  8. u8 Run_State = 0;                                //运行状态
  9. u8 gd_state = 0;
  10. u8 count = 0;
  11. u8 time = 0;
  12. char *USER_DEVICEDESC = NULL;
  13. char *USER_PRODUCTDESC = NULL;
  14. char *USER_STCISPCMD = "@STCISP#";
  15. void Delay20ms(void)        //@24.000MHz  Delay20ms();
  16. {
  17.         unsigned long edata i;
  18.         _nop_();
  19.         _nop_();
  20.         i = 119998UL;
  21.         while (i) i--;
  22. }
  23. void Timer0_Init(void);                //3秒@24.000MHz                //函数声明
  24. void main(void)
  25. {
  26.         int count=1;                                                                        //按键计数变量
  27.        
  28.     WTST = 0;                                                                                  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
  29.     EAXFR = 1;                                                                                 //扩展寄存器(XFR)访问使能
  30.     CKCON = 0;                                                                                 //提高访问XRAM速度
  31.        
  32.     P0M1 = 0x00;   P0M0 = 0x00;
  33.     P1M1 = 0x00;   P1M0 = 0x00;
  34.     P2M1 = 0x00;   P2M0 = 0x00;
  35.     P3M1 = 0x00;   P3M0 = 0x00;
  36.     P4M1 = 0x00;   P4M0 = 0x00;
  37.     P5M1 = 0x00;   P5M0 = 0x00;
  38.     P6M1 = 0x00;   P6M0 = 0x00;
  39.     P7M1 = 0x00;   P7M0 = 0x00;
  40.        
  41.         usb_init();                                     //USB CDC 接口配置
  42.     IE2 |= 0x80;                                    //使能USB中断
  43. //        Timer0_Init();                                                                        //定时器初始化
  44.        
  45.     EA = 1;                                                                                        //IE |= 0X80;
  46.        
  47.         P40 = 0;
  48.        
  49.         while (DeviceState != DEVSTATE_CONFIGURED);     //等待USB完成配置
  50.        
  51.         while(1)
  52.         {
  53.                 if(!P32)
  54.                 {
  55.                         Delay20ms();
  56.                         if(!P32)
  57.                         {
  58.                                 key1_state=!key1_state;
  59.                                 if(gd_state==1)
  60.                                 {
  61.                                 printf("双倍功德时间");
  62.                                 count=count+2;
  63.                                 }
  64.                                 if(gd_state==0)
  65.                                 {
  66.                                 printf("单倍功德时间");
  67.                                 count=count+1;
  68.                                 }
  69.                                 while(!P32)
  70.                         }
  71.                 }
  72.                 if(!P33)
  73.                 {
  74.                 Delay20ms();
  75.                 if(!P33)
  76.                 {
  77.                 if(gd_state==1)
  78.                 {
  79.                 printf("功德+2  当前功德:%d\r\n”,count);
  80.                 }
  81.                 if(gd_state==0)
  82.                 {
  83.                 printf("功德+1  当前功德:%d\r\n”,count);
  84.                 }
  85.                 }
  86.                 }
  87.         }
  88.                
  89. }
  90. void Timer0_Init(void)                //1秒@24.000MHz
  91. {
  92.         TM0PS = 0x1E;                        //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
  93.         AUXR &= 0x7F;                        //定时器时钟12T模式
  94.         TMOD &= 0xF0;                        //设置定时器模式
  95.         TL0 = 0xFC;                                //设置定时初始值
  96.         TH0 = 0x03;                                //设置定时初始值
  97.         TF0 = 0;                                //清除TF0标志
  98.         TR0 = 1;                                //定时器0开始计时
  99.         ET0 = 1;                                //使能定时器0中断
  100. }
  101. void Timer0_Isr(void) interrupt 1                //1秒执行一次
  102. {
  103.         time++;
  104.         if(gd_state==0&&time==1)
  105.         {
  106.         P00 = !state;
  107. time=0;
  108.         }
  109.         if(gd_state==1&&time==2)
  110.         {
  111.         P00 = !state;
  112.         time=0;
  113.         }
  114.        
  115. }
复制代码



回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-04-27 14:40:11
已绑定手机

16

主题

468

回帖

2165

积分

版主

积分
2165
QQ
发表于 2024-12-12 09:34:10 | 显示全部楼层

昨天已安排试验箱支持继续学习,请注意查收

www.STCAI.com
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:337
  • 最近打卡:2025-04-30 07:42:48

19

主题

205

回帖

816

积分

高级会员

积分
816
发表于 2024-12-13 14:56:12 | 显示全部楼层
so*** 发表于 2024-12-10 18:18
第七集:讲解了定时器的使用和如何使用ISP软件生成定时时间,同时讲解了中断的使用,此处用定时器中断进行 ...

好思维!
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-02 07:55:56
已绑定手机

19

主题

3190

回帖

4870

积分

论坛元老

积分
4870
发表于 2024-12-14 17:41:26 | 显示全部楼层
第8集 定时器周期性调度任务
这集讲定时器周期性调度任务,它使用了定时器,和数组和数据结构。
  1. <div>
  2. </div><div>typedef struct
  3. {
  4.     u8 Run;               //任务状态:Run/Stop
  5.     u16 TIMCount;         //定时计数器
  6.     u16 TRITime;          //重载计数器
  7.     void (*TaskHook) (void); //任务函数
  8. } TASK_COMPONENTS;   
  9. </div>
复制代码
这是个数据结构通过typedef把名字替换成TASK_COMPONENTS,也就是说要调用这个数据结构的时候只要使用TASK_COMPONENTS就可以了。
这段static TASK_COMPONENTS Task_Comps[]把数据结构添加进数组Task_Comps里面,这样就可以把数据结构和数组复用了。


  1. static TASK_COMPONENTS Task_Comps[]=
  2. {
  3. //状态  计数  周期  函数
  4.        
  5. {0, 300,   300,   LED0_Blink},      /* task 1 Period: 300ms */
  6. {0, 600,   600,   LED1_Blink},      /* task 1 Period: 600ms */
  7. {0, 900,   900,   LED2_Blink},      /* task 1 Period: 600ms */  
  8. {0, 10,    10,    KEY_Task},      /* task 1 Period: 600ms */         
  9. };
复制代码
void Task_Marks_Handler_Callback(void)这是回调函数作用是在定时器中断中对数据结构中TIMCount进行自减,通过ifTasks_Max对所有任务数都进行操作。
如果满足Task_Comps.TIMCount = Task_Comps.TRITime; 也就是计数和周期一致就开始执行任务。
void Task_Pro_Handler_Callback(void)这个函数放在main主函数的while里面让它一直在循环去执行任务。
其实定时时间不一定要1ms可以根据自己情况去调节,如果太短可能在复杂任务情况会对程序造成影响。
还有void (*TaskHook) (void)中定义任务的头文件一定要添加进调度程序里面否则会报错且程序不知道自己要执行什么。



回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 18:09 , Processed in 0.141902 second(s), 112 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表