找回密码
 立即注册
查看: 532|回复: 13

第一集

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:9
  • 最近打卡:2025-03-31 17:35:10
已绑定手机

6

主题

27

回帖

122

积分

注册会员

积分
122
发表于 2025-3-27 19:26:07 | 显示全部楼层 |阅读模式
AI8051是一个可兼容8为何32位的单片机供电电源可在1.9-5.5VFlsah64KSRAM34K其中利用IAO技术将Flash当做EEPROW。15个AD转换器。6个定时器。支持USB,4个USART。芯片内部有42MZHZ的时钟源。可利用TFPU实现高速运算。两组高级PWM。
MCU有4个时钟源高速IRC,(32K)IRC,外部4M-40M晶振PLL时钟


同时MCU提供两个低功耗模式。IDLE,STOP模式。
内部自带一个USB可以直接提供下载和仿真。
有PDIP40,LQFP44,LQFP48封装可兼容89C52,12C5A60S2
截图202503271921429825.jpg

回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:9
  • 最近打卡:2025-03-31 17:35:10
已绑定手机

6

主题

27

回帖

122

积分

注册会员

积分
122
发表于 2025-3-28 13:07:34 | 显示全部楼层
32位编程时使用Keilc251。8位使用C251/IAR/SDCC编译

可前往Keil下载C251
辅助编程下载软件
选择芯片型号此处选择AI8051U因为使用32位所以选择后面有32的
找到keil编译生成的.hex文件下载 选择主频
二级制文件 串口和USB助手 点击这个可下载芯片的Pack包daoC251中
这些工具帮助初始化配置
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:9
  • 最近打卡:2025-03-31 17:35:10
已绑定手机

6

主题

27

回帖

122

积分

注册会员

积分
122
发表于 2025-3-28 13:08:51 | 显示全部楼层

第三集




AI8051U一共有45个P4.7为复位引脚P3.0P3.1默认为双向口其他的默认为高阻输入

PX寄存器配置电平和读取d电平高低
配置工作模式00为双向口01为推挽输出10为高阻输入11为开漏模式
可通过软件延时因为系统频率为40MHZ使用延迟也要选40MHZ
#include "AI8051U.h"         头文件包含了寄存器地址

void main()
{
    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;    将所有的口全部配置双向口
   
    while (1)
    {

        P20=0;   向p2的0口写低电平
    }
}
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:9
  • 最近打卡:2025-03-31 17:35:10
已绑定手机

6

主题

27

回帖

122

积分

注册会员

积分
122
发表于 2025-3-28 13:10:35 | 显示全部楼层

第四集

USB不停电下载

因为UBS改了跟视频的操作有不同也踩了一两个坑 D:\Desktop\STC\STC_USB_LIBRARY\范例程序\STC-CDC范例程序(查询方式)\stc32g_cdc_query_demo找到文件路径
将这些文件直接复制到自己的文件下

#include "AI8051U.h"
#include "stc32_stc8_usb.h"
#include "math.h"
#include "stdio.h"
#include "ai_usb.h"

添加头文件 再将main里的全部复制到自己的文件下。
set_usb_ispcmd("@STCISP#");直接添加这个代码或修改里面的字符串可以修改命令。
*** ERROR L128: REFERENCE MADE TO UNRESOLVED EXTERNAL如果报这个错 点Target选项卡--Memory Model选择XSmall模式、勾选4字节对齐

*** WARNING L57: UNCALLED FUNCTION, IGNORED FOR OVERLAY PROCESS  添加REMOVEUNUSED

软件设置先手动下载 出现这个便是成功了

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:9
  • 最近打卡:2025-03-31 17:35:10
已绑定手机

6

主题

27

回帖

122

积分

注册会员

积分
122
发表于 2025-3-28 13:11:35 | 显示全部楼层

第五集

C语音常见数据类型
int:基本整型,通常占4字节(32位),范围:-2,147,483,648 ~ 2,147,483,647
short:短整型,占2字节(16位),范围:-32,768 ~ 32,767
long:长整型,占4字节(32位)或8字节(64位),范围:-2³¹ ~ 2³¹-1(32位)或更大
无符号类型(如 unsigned int):仅表示非负数,范围翻倍(如 unsigned int:0 ~ 4,294,967,295)
float:单精度浮点型,占4字节,精度约6-7位有效数字,范围:±3.4e-38 ~ ±3.4e+38
double:双精度浮点型,占8字节,精度约15-16位,范围:±1.7e-308 ~ ±1.7e+308
long double:扩展精度浮点型,占16字节(或更多),精度更高
char:占1字节,存储ASCII字符或小整数(-128 ~ 127)。unsigned char范围:0
格式字符
%d / %i/。                                                         
%u:以十进制形式输出无符号整数。
%o:以八进制形式输出无符号整数(不带前缀)。
%x / %X:以十六进制形式输出无符号整数(不带前缀,x小写,X大写)。
%ld / %lu:长整型和无符号长整型(需加l修饰符)。
%f:以小数形式输出单精度浮点数(默认保留6位小数)。
%lf:用于double类型的输入输出。
%e / %E:以指数形式输出浮点数(e小写,E大写)。
%g / %G:自动选择%f%e中较短的格式(不输出无意义的零)。
%c:输出单个字符。
%s:输出字符串(以\0结尾)。
%p:输出指针地址(十六进制形式)。
%n:记录已输出的字符数(需配合指针参数)。
%%:输出百分号字符。
运算符




运算符
描述
示例(a=10, b=3)

+
加法
a + b = 13

-
减法
a - b = 7

*
乘法
a * b = 30

/
除法
a / b = 3(整数除法)

%
取模(余数)
a % b = 1

++
自增
a++(先取值后加1)

--
自减
--b(先减1后取值)

运算符
描述
示例(a=5, b=3)

==
等于
a == b → 0

!=
不等于
a != b → 1

>
大于
a > b → 1

<
小于
a < b → 0

>=
大于等于
a >= b → 1

<=
小于等于
a <= b → 0

运算符
描述
示例(a=1, b=0)

&&
逻辑与
a && b → 0

||
逻辑或
a || b → 1

!
逻辑非
!a → 0

运算符
描述
示例(a=5,二进制0101)

&
按位与
a & 3(0101 & 0011)→ 0001(1)

|
按位或
a | 2(0101 | 0010)→ 0111(7)

^
按位异或
a ^ 3(0101 ^ 0011)→ 0110(6)

~
按位取反
~a → 1010(补码表示,实际值依赖类型)

<<
左移
a << 1 → 1010(10)

>>
右移
a >> 1 → 0010(2)

运算符
描述
等价于

=
赋值
a = b

+=
加后赋值
a += b → a = a + b

-=
减后赋值
a -= b → a = a - b

*=
乘后赋值
a *= b → a = a * b

/=
除后赋值
a /= b → a = a / b

%=
取模后赋值
a %= b → a = a % b

&=
位与后赋值
a &= b → a = a & b

`
=`
位或后赋值

^=
异或后赋值
a ^= b → a = a ^ b

<<=
左移后赋值
a <<= 1 → a = a << 1

>>=
右移后赋值
a >>= 1 → a = a >> 1

优先级
运算符

1
() [] -> . ++ --(后缀)

2
! ~ ++ -- + - * & sizeof(前缀)

3
* / %

4
+ -

5
<< >>

6
< <= > >=

7
== !=

8
&

9
^

10
|

11
&&

12
||

13
?:(三元运算符)

14
= += -= *= /= %= <<= >>= &= ^= |=

15
,(逗号运算符)

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:9
  • 最近打卡:2025-03-31 17:35:10
已绑定手机

6

主题

27

回帖

122

积分

注册会员

积分
122
发表于 2025-3-28 13:12:57 | 显示全部楼层

第六集

作为IO口最多有45个可以配置4种模式如下PX为端口其中地址为0x80#include <AI8051U.H> 中定义了它们的地址 PX为端口其中地址为0x80#include <AI8051U.H> 中定义了它们的地址但要注意不能同时将P30P32P31配为0SFR定义了特殊功能寄存器如果要使用要将EAXFR寄存器为1如果不用的话其实也没有 必要 同时IO口也有电压的耐受电压否则会坏



#include <AI8051U.H>                //包含AI8051U的头文件
#include "intrins.h"                //使用_nop_()函数所必须要包含的头文件,
                                    //否则延时函数中调用的_nop_()函数没有被头文件引用过来,
                                    //会导致编译器找不到这个而函数而报错。

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口配置工具”来生成。
                                    
    while(1)                        
    {                               //LED循环自动闪烁部分
        P0 = ~P0;                   //对P0端口取反
//      P00 = ~P00;                //对单个端口取反
        Delay500ms();               //调用延时函数,延时0.5s

    }
}

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:9
  • 最近打卡:2025-03-31 17:35:10
已绑定手机

6

主题

27

回帖

122

积分

注册会员

积分
122
发表于 2025-3-28 13:13:33 | 显示全部楼层

第七集


芯片有6个定时器都是支持16位加8位分频的
TMOD寄存器控制模式具体以下配置
如果要配置定时器的话TMOD=0X00就行注意定时器的脉冲来源是内部系统时钟
TMXPS分频器根据公式如果8分频填7就行
AUXR控制CPU为定时器提供脉冲的速度 TH0,TL0提供重装载值。公式如下
工作在IT模式(AUXR.6/T1x12=1)时的输出时钟频率=(SYSclk)(TMIPS+1)(256-THI)/2,工作在12T模式(AUXR.6/TIx12=0)时的输出时钟频率 =(SYSclk)(TM1PS+1)/12/(256-TH1)/2


void Timer0_Init(void)               
{
        TM0PS = 0x32;                        //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
        AUXR &= 0x7F;                        //定时器时钟12T模式
        TMOD &= 0xF0;                        //设置定时器模式
        TL0 = 0xB1;                                //设置定时初始值
        TH0 = 0x00;                                //设置定时初始值
        TF0 = 0;                                //清除TF0标志
        TR0 = 1;                                //定时器0开始计时
        ET0 = 1;                                //使能定时器0中断
  
}


void gpio_Init(void)
{
        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口都初始化为准双向口工作模式的程序,
}




void main(void)
{
  
    EAXFR = 1;                      //允许访问扩展的特殊寄存器,XFR
    WTST = 0;                       //设置取程序代码等待时间,
                                    //赋值为 0表示不等待,程序以最快速度运行
    CKCON = 0;                      //设置访问片内的 xdata速度,
                                    //赋值为 0表示用最快速度访问,不增加额外的等待时间
    gpio_Init();
   
    Timer0_Init();                                //可以使用AIapp-ISP软件的“I/O口配置工具”来生成。
   
    EA=1;   

  
    while(1)                        
    {      
      int i=0;

   

    }
}
int c=0;
void Timer0_Isr(void) interrupt 1
{
  if(c==0)
  {
    P21=0;
    c=1;
  }
  else
  {
    P21=1;
    c=0;
  }
}
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:9
  • 最近打卡:2025-03-31 17:35:10
已绑定手机

6

主题

27

回帖

122

积分

注册会员

积分
122
发表于 2025-3-28 16:57:52 | 显示全部楼层

第八集

启动定时器0的中断100ms进一次中断
在中断中对tim1000ms,tim500ms加一
每加一次就是100ms当tim500ms加到5就是500ms当tim1000ms加到10就是1s
然后就进行一次IO翻转


void gpio_Init(void)
{
        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口都初始化为准双向口工作模式的程序,
}




void Timer0_Init(void)               
{
        TM0PS = 0x05;                        //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
        AUXR &= 0x7F;                        //定时器时钟12T模式
        TMOD &= 0xF0;                        //设置定时器模式
        TL0 = 0xFC;                                //设置定时初始值
        TH0 = 0x26;                                //设置定时初始值
        TF0 = 0;                                //清除TF0标志
        TR0 = 1;                                //定时器0开始计时
        ET0 = 1;                                //使能定时器0中断
}
int tim1000ms;
int tim500ms;

void main(void)
{

    EAXFR = 1;                      //允许访问扩展的特殊寄存器,XFR
    WTST = 0;                       //设置取程序代码等待时间,
                                    //赋值为 0表示不等待,程序以最快速度运行
    CKCON = 0;                      //设置访问片内的 xdata速度,
                                    //赋值为 0表示用最快速度访问,不增加额外的等待时间
    gpio_Init();

    Timer0_Init();                                //可以使用AIapp-ISP软件的“I/O口配置工具”来生成。

    EA=1;   


    while(1)                        
    {      
    }
}
int c=0;
void Timer0_Isr(void) interrupt 1
{
  tim1000ms++;tim500ms++;
  if(tim1000ms==10)
  {
     P20!=P20;tim1000ms=0;
  }
  if(tim500ms==10)
  {
     P22!=P22;tim500ms=0;
  }
  if(c==0)
  {
    P21=0;
    c=1;
  }
  else
  {
    P21=1;
    c=0;
  }
}
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:9
  • 最近打卡:2025-03-31 17:35:10
已绑定手机

6

主题

27

回帖

122

积分

注册会员

积分
122
发表于 2025-3-29 16:09:47 | 显示全部楼层

第九集

数码管分为共阴共阳极。

截图202503291534065493.jpg 对于实验箱为共阴极 截图202503291535257243.jpg 8为数据位为4个选择引脚
截图202503291537136585.jpg 一A为最低位0011 1111就为0
同时使用2个74HC595芯片
15和1到7脚QA--QH:并行数据输出9脚QH非:串行数据输出
10 脚SCLK非(MR):低电平复位引脚11 脚SCK ( SHCP) :移位寄存器时钟输入12脚RCK ( STCP):存储寄存器时钟输入13脚G非(OE):输出有效
14 脚SER ( DS) :串行数据输入



回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:9
  • 最近打卡:2025-03-31 17:35:10
已绑定手机

6

主题

27

回帖

122

积分

注册会员

积分
122
发表于 2025-3-29 16:20:07 | 显示全部楼层

第十集

void LED40_SendData(BYTE *dat, BYTE size);//控制DIP40的各个管脚上的LED状态
void LED40_SetPort(BYTE port, BYTE dat);//控制DIP40的指定管脚上LED的状态
void LED40_SetBit(BYTE port, BYTE bt);//控制DIP40的指定管脚输出高电平
void LED40_ClrBit(BYTE port, BYTE bt); //控制DIP40的指定管脚输出低电平

int SEG7_ShowString(const char *fmt, ...);//在数码管上显示字符串
void SEG7_ShowLong(long n, char radix);//在数码管上显示4字节长整形数
void SEG7_ShowFloat(float f);//在数码管上显示IEEE754模式单精度浮点数
void SEG7_ShowCode(BYTE *cod);//在数码管上直接显示所给的段码
截图202503291616209240.jpg
使用虚拟键盘电脑向串口发送以上格式字符串
LED40_ClrBit(1,UsbOutBuffer[5]&0x0f);仅仅接收【5】屏蔽高八位

截图202503291614208235.jpg LED40_SetPort(2,~0x01);
        LED40_ClrBit(1,0);
截图202503291614491795.jpg SEG7_ShowFloat(3.14);




回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 18:01 , Processed in 0.198762 second(s), 99 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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