神农鼎 发表于 2024-11-30 18:13:34

lao4jiadian 发表于 2024-11-28 11:11
不亏啊?打卡学习,去官方申请一个AI8051U实验箱,等我学完32G的例程的时候,8051的所有视频例程都完善了.学习 ...

32G12K128分享学习芯路历程后,我们送您 Ai8051U实验箱

神农鼎 发表于 2024-11-30 18:17:34

阿白凌坤 发表于 2024-11-29 19:16
好像CAN接口没有引出

他有 CAN-屠龙刀

lao4jiadian 发表于 2024-12-1 07:56:28

本帖最后由 lao4jiadian 于 2024-12-1 13:26 编辑

第四集:建立工程点亮第一颗LED上
1.LED点亮原理。
小实验,为什么LED能点亮?
高低电平概念:输出电压=VCC就是高电平,输
出电压=GND(一般是OV)就是低电平,分别用1和0来表示。
GPIO (general purpose intput output)是通用输入输出端口的简称,可以通过软件来读取其输入电平,或者控制他输出高低电平。
P0是一组GPIO口,从P0.0到P0.70-7总共有8个,P0.0是一组的其中一个GPIO口.
   可以同时操作一组IO,也能单独操作一个IO.
2.新建工程
   跟着手册: 《STC32G12K128实验箱-V9.4使用说明书》新建工程.












3.点亮第一个LED
STC32G特殊功能寄存器介绍


打开AIapp-ISP-v6.94Z.exe---选择芯片型号:STC32G12K128--打开程序文件--按住INT0按键不放---点按一下ON/OFF按钮---放开INT0按钮---ISP列表中弹出STC USB Writer (HID1)--点击下载按钮--等待烧录成功.
一个LED 成功点



4.实现自动下载工程
可以勾选每次下載前都重新裝载目标文件
                当目标文件变化时自动装载并发送下载命令


小技巧
1.怎么控制单独的一个引脚?sbit PO0 = PO^O;.1/选择P0.0引脚
2.怎么控制这个引脚输出电平?P00 = 1;//输出低电平·
3.书写规范一行一句,大括号缩进(需要设置),缩进四格,注释完整
4.注释符号// 单行注释/* */ 多行注释
5.CTRL+F打开快速搜索框---点击Find in Files选项卡---搜索下拉框内输入需要搜索的内容---点击Find All按钮---Find In Files选项卡中就会出现搜索结果,双击就可以跳转到结果位置.



lao4jiadian 发表于 2024-12-1 21:03:47

本帖最后由 lao4jiadian 于 2024-12-2 16:44 编辑

第5天,·实现自动下载工程不断电下载
   第1种方法:向寄存器IAP_CONTR,写入0x60,即可实现不停电ISP下载。
   第2种方法:使用STC-ISP下载软件发送的用户下载命令(USB项目)


把STC32G-DEMO-CODE-V9.6文件夹里的COMM复制到工程目录.
不例程:76-通过USB HID协议打印数据信息-可用于调试 文件夹复制到工程目录,参考一下.
引用头文件的简介
         路径中“./”、“../”、“/”代表的含义是什么?
       “./”:代表目前所在的目录。“../”:代表上一层目录。“/”:代表根目录。
         #include "./COMM/stc32_stc8_usb.h"含义就是:包含本文件夹下COMM文件夹内的stc32_stc8_usb.h         头文件


书写完毕后,显示蓝色的文字的都是关键词,显示黑色的文字是我们自己定义的名字.
typedef类型定义(重命名)
stc32_stc8_usb.h头文件里的sfr的简单认识,体会.
KEIL报错排除方法.
函数声明 函数定义与编译顺序

没发现冲哥说的设置USB时钟源的有关代码,看有用的代码好像只有一下几行,其他好像都是设置端口模式的代码.
    WTST = 0;//设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
    EAXFR = 1; //扩展寄存器(XFR)访问使能
    CKCON = 0; //提高访问XRAM速度
把以上3行代码复制到USB初始化语句的前面,编译后测试,竟然可以了,好神奇啊!
尝试单独注释这几行代码,发现起作用的只有扩展寄存器(XFR)访问使能语句.

总结:不停电下载在STC32G单片机最小代码如下6行(注意定义的顺序):
char *USER_DEVICEDESC = NULL;      //不定义会报错误L127,L128
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
EAXFR = 1; //扩展寄存器(XFR)访问使能
usb_init();//USB初始化
EA = 1;      //IE寄存器--EA中断总开关

在反复下载的时候,咨询查看,未下载之前,ISP软件显示连接到了一个HID\VID_34BF\PID_FF01的设备,终于明白了不停电下载的实现原理.
总结`:写入以上代码后,单片机创建了一个USB_HID接口,一直连在电脑上,下载时ISP软件通过USB_HID接口发出用户命令,单片机收到信息后,复位到USB下载模式,实现不停电下载.
同理USB_CDC为虚拟串口实现的不停电下载.


lao4jiadian 发表于 2024-12-2 21:17:52

第6天:C语言printf函数 运算符和进制数
1.C语言 printf函数的实现
主函数添加程序:
if(DeviceState != EVSTATE_CONFIGURED) continue;
if (bUsbOutReady)
{
usb_OUT_done();//接收应答(固定格式)
}

常规用法:printf("Hello World!”);printf(“室内温度:%.2frin”, 11.2);

格式字符       含义
%d                以十进制整数形式输出
%ld               以十进制长整形输出
%f               以单精度浮点型输出
%lf                以双精度浮点型输出
%o                以八进制整型输出整数。
%x或%X       以十六进制形式输出整数
%u               以十进制无符号整形输出
%i                以十进制整形输出(与%d无异)
%c               输出单个字符
%s               输出字符串
%e或%E      以指数形式输出
%g或%G   自适应数据输出(数据够大或够小则以指数形式输出,否则以小数形式输出
%р            输出地址

标志       含义                                                                                                         实例
n.mn      表示整数占几行,m表示小数占几行                                                         %2.3f
-             输出的结果左对齐                                                                                     %-d
空格      输出值为正时冠以空格,为负时冠以负号
#            输出带有前导的数据(八进制为0~~~,十六进制为X~~~,~表示数字)      %#d

转义字符      释义
\?                  在书写连续多个问好时使用,防止他们被解析成三字字词
\'                  用于表示字符常量
\"                  用于表示一个字符内部的双引号
\\                  用于表示一个反斜杠,防止它被解释为一个转义序列符
\a                  警告字符,蜂鸣
\b               退格符
\f                  换页符
\n               换行符
\r                  回车
\t                  水平制表符(8个空格)
\v               垂直制表符
\ddd            ddd表示1-3个八进制的数字。如:\120
\xdd             dd表示2个十六进制数字,   如:\x30

ASCII字符代码表(0-127)

2.数的进制:2进制、10进制、16进制
   80H=0x80   等于10进制的128
二进制--十进制--十六进制的转换方法

lao4jiadian 发表于 2024-12-3 19:47:56

本帖最后由 lao4jiadian 于 2024-12-3 21:10 编辑

第7天学习内容(第5集下)
C语言常用运算符
算术运算符

加(+)减(一)乘(*)除(/)运算逻辑与普通数学一致,运算优先级别与普通数学一致
模(余)运算符(%) :不允许出现浮点型,余数正负取决于被除数正负
自增(++i, -i; i++; i-)

位运算符
右移(>>)左移(<<)   数值按2进制表示法,进行移位操作.右移最高位加入0.左移最低位加入0
按位与(&)             2个位比较,都为1时=1否则=0
按位或(|)               2个位比较,有1时=1都不等于1时=0
按位异或(^)            2个位比较,值相反时=1 相同时=0
取反(~)                     数值按2进制表示法,按位取反(1变0,0变1)

赋值运算符
+= 加赋值(a+=3 等价于 a=a+3)
-= 减赋值
*=乘赋值
/= 除赋值
%= 求余赋值
&= 按位与赋值
|=按位或赋值
^=按位异或赋值
<<=左移位赋值
>>=右移位赋值

printf("%u \r\n",1<<2)            0000 0001<<2    0000 0100=4
printf("%u \r\n",0x11&0x10)   0001 0001 & 0001 0000=16
printf("%u \r\n",0x11|0x10)   0001 0001 | 0001 0000=17
printf("%u \r\n",~0x11)         ~0000 0000 0001 0001=65518


数据类型                              位数   字节               值范围
bit                                          1                            0 or 1
signed char                            8      1            -128-+127
unsigned char                        8      1                  0- 255
enum (结构体时讲)            8/16   1 or 2            -128-+127 or-32768— +32767
signed short int                  16      2               -32768 - +32767
unsigned short int                16      2                0 — 65535
signed int                           16      2                -32768-+32767
unsigned int                         16      2                0- 65535
signed long int                     32      4               -2147483648- +2147483647
unsigned long int               32      4            0- 4294967295
float                                    32      4            + 1.175494E-38 — +3.402823E+38
double                                  32      4            +1.175494Е-38 - +3.402823E+38
sbit                                        1                           0 or 1                   未讲解
sfr                                          8          1               0- 255                  未讲解
sfr16                                    16         2                0- 65535             未讲解


lao4jiadian 发表于 2024-12-5 20:09:59

第8天学习内容(第六集: LED闪烁和花式点灯上)
STC-ISP软件与STC32G手册的更新方法1.直接去官网下载2.在原ISP软件里更新.
1.基于Delay实现的LED闪烁
define 命令的简介. define指令将一个标识符(宏名)映射到一个指定的文本或符号.‌
typedef命令简介.新定义的名称在右面,后面需要加分号.define命令新定义的名称在左面,不需要加分号
while do while 的用法,执行流程.
delay函数原理简介.自增,自减介绍.
双灯1秒闪烁




lao4jiadian 发表于 2024-12-5 21:19:43

第9天学习内容(第六集: LED闪烁和花式点灯下)
2.函数的使用
在模块化编程里,.函数使用分为如下三步
1:函数定义
返回值·函数名称(入口参数)
{
函数要执行的功能
}
@返回值:没有返回值就是void
@函数名称:避开关键词,不重复,非特殊字符随便取
@入口参数:类型+名称,多个参数用", "隔开,空就写void
2.函数声明
返回值 函数名称(入口参数);
3.函数调用
函数名称(入口参数);


模块化编程知识
新建xxx.c +xxx.h文件,代表一个功能块。


xxx.h格式:
#ifndef __XXX_H
#define __XXX_H
调用头文件
函数声明...
#endif


xxx.c格式
#include “xxx.h”
函数定义


添加文件一定要记得引用路径和添加到工程里
为什么要添加引用路径,想不明白
函数的使用(定义、声明、调用)模块化编程是:把声明和定义放到模块里,程序中直接调用前,先包含相应的头文件.
SOS救援灯
        P60 = 0;                        //点亮
        P67 = 0;                        //点亮       
        delay_ms(200);
        P60 = 1;                        //熄灭
        P67 = 1;                        //熄灭       
        delay_ms(200);
        P60 = 0;                        //点亮
        P67 = 0;                        //点亮       
        delay_ms(200);
        P60 = 1;                        //熄灭
        P67 = 1;                        //熄灭               
        delay_ms(200);
        P60 = 0;                        //点亮
        P67 = 0;                        //点亮       
        delay_ms(200);
        P60 = 1;                        //熄灭
        P67 = 1;                        //熄灭               
        delay_ms(200);


        P60 = 0;                        //点亮
        P67 = 0;                        //点亮       
        delay_ms(500);
        P60 = 1;                        //熄灭
        P67 = 1;                        //熄灭               
        delay_ms(500);
        P60 = 0;                        //点亮
        P67 = 0;                        //点亮       
        delay_ms(500);
        P60 = 1;                        //熄灭
        P67 = 1;                        //熄灭               
        delay_ms(500);
        P60 = 0;                        //点亮
        P67 = 0;                        //点亮
        delay_ms(500);
        P60 = 1;                        //熄灭
        P67 = 1;                        //熄灭               
        delay_ms(500);
       
        P60 = 0;                        //点亮
        P67 = 0;                        //点亮       
        delay_ms(200);
        P60 = 1;                        //熄灭
        P67 = 1;                        //熄灭               
        delay_ms(200);
        P60 = 0;                        //点亮
        P67 = 0;                        //点亮       
        delay_ms(200);
        P60 = 1;                        //熄灭
        P67 = 1;                        //熄灭               
        delay_ms(200);
        P60 = 0;                        //点亮
        P67 = 0;                        //点亮
        delay_ms(200);
        P60 = 1;                        //熄灭
        P67 = 1;                        //熄灭       
        delay_ms(200);       
       
        delay_ms(1000);       
        P6=0x00;                               //全亮结束
        delay_ms(1000);       
        P6=0xff;       
        delay_ms(1000);       




East Wind 41 发表于 2024-12-6 21:16:17

第10天学习内容(第七集:按键点灯上)
1.SOS求救灯代码讲解
2.按键的原理

3.按键消抖原理(按下后10毫秒再检测一次)

4.按键C代码的实现,演示
5.按键控制LED小灯亮灭代码实现
6.按键按下逻辑的C代码控制方法(如按键按下只执行一次,松开按键执行代码)




East Wind 41 发表于 2024-12-9 21:46:04

第11天学习内容(第七集:按键点灯下)
1.按键长按,短按功能代码实现
2.松开按键时,执行动作的代码实现
小技巧:不确认程序执行优先级时,把优先执行的代码用括号括起来.
         weil 有大括号时不愿加分号,省略时要加分号.


数组的使用方法

数组使用分为如下两步
1.定义方式
类型 名称[长度] = { 数值 };
2.使用 C程序中,数组的索引开始值为0
赋值:名称[索引] = 数值   


数组流水灯:





页: 1 [2] 3
查看完整版本: 32G12K128实验箱学习打卡ORSTC32位8051单片机原理及C语言程序设计视频教程