神农鼎
发表于 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
赋值:名称[索引] = 数值
数组流水灯: