32G12K128 学习笔记(冲哥视频)
第一节了解什么是单片机,单片机能做什么,又有什么功能和用途。学习单片机能做什么。以及学习单片机是否有年龄限制,又要如何去学习单片机,
总之,学习单片机要多动手多思考,多实践,错了不要紧,只要努力多动手多实践一定会学好的。
第二集 了解硬件
这节课主要介绍STC开发箱所集成的硬件部分有哪些,视频中采用的是STC开发箱9.4板,里面有红外接收发射,通过可调电阻调节电压的比较部分,还有数码管,LED,eeprom,flash,3种常见按键。和RS232接口。还有蜂鸣器。和PWM模拟DAC。还有2种测温模块,模拟的NTC,数字的18B20.还有屏幕接口。了解完这些硬件就大概能知道STC开发板能做什么。STC32G又提供了哪些资源。课后作业:自己思考并想做什么作品
第三集
由于之前已经下载好了,编译器keilC251和STC的stcisp还有数据手册和例程,所以这节课就快速略过。 第四课(上)
这节课开始讲解如何点亮一个灯,LED作为二极管也有压降,然后必须有电流流过灯才会亮,要怎样才有电流流过,那2边就要有压差,单片机又是怎么控制灯的亮灭呢?就需要通过IO来控制,而单片机的IO就只会产生2种信号,一个高电平,一个低电平。STC实验箱采用共阳供电,供电有一个PNP三极管通过P4.0控制,P4.0低电平时PNP管导通,有P6控制的LED灯获得高电平,如果P6引脚也为高电平时2边电压相等,LED不会亮,只有P6的IO引脚输出低电平LED才会亮,那要怎么让单片机IO口输出低电平呢?那就要通过控制寄存器来实现,那又怎么知道寄存器在那呢?C51提供了一条关键字sfr目的就是告诉编译器我要用到的寄存器地址在哪?sbit是定义特殊功能寄存器的位变量。知道这些我们就可以编写程序了。
sfr P4 = 0xc0; //P4地址
sfr P4M1 = 0xB3; //P4口配置寄存器1
sfr P4M0 = 0xB4; //P4口配置寄存器0
sfr P6 = 0xe8; //P6寄存器地址
sfr P6M1 = 0xcc;//P6口配置寄存器1
sfr P6M0 = 0xcb;//P6口配置寄存器0
sbit P40 = P4^0; //三极管控制引脚
sbit P60 = P6^0;//LED控制引脚
void main()
{
P4M0 = 0x00;//配置IO口
P4M1 = 0x00;
P6M0 = 0x00;
P6M1 = 0x00;
while(1) //死循环
{
P40 = 0;//P4.0置0
P60 = 0;
}
}
写完程序编译完成生成HEX文件之后就是下载程序了。下载完成后就可以看到结果,由于我这边使用的是屠龙刀3,只有P2口有LED灯所以程序不一样
sfr P2 = 0xa0;
sfr P2M1 = 0x95;
sfr P2M0 = 0x96;
sbit P20 = P2^0;
void main()
{
P2M1=0x00;//设置准双向口
P2M0=0x00;
while(1)
{
P20 =0;//点亮P20
}
} 第四课(下)
已经完成了程序的编写,但是要怎么下载呢?STC提供了2种下载方式,通过TTL线下载,直接USB下载。如果不想在使用一条TTL下载线,直接使用USB下载每次都要按P3.2和开机键,这样很麻烦,有没有办法不按按键就能直接下载吗?答案是有,通过一个特殊功能寄存器IAP_CONTR,像改寄存器写入0x60;STC单片机将复位进入ISP区,STC提供了一个USB的lib文件里面有USB操作。以及如何根据例程排错。由于视频较早很现在库可能有所差别所以这边根据最新例程对程序进行修改并编译测试是否有无问题。hid代码如下,并附带工程文件。#include "./comm/stc32g.h"
#include "./comm/stc32_stc8_usb.h"
#include <stdio.h>
#include "config.h"
void sys_init();
//USB调试及复位所需定义
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#"; //设置自动复位到ISP区的用户接口命令
void main()
{
sys_init();
usb_init();//USB初始化
EA = 1;
while (1)
{
P20=0;
}
}
void sys_init()
{
WTST = 0;//设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
EAXFR = 1; //扩展寄存器(XFR)访问使能
CKCON = 0; //提高访问XRAM速度
P0M1 = 0x30; P0M0 = 0x30; //设置P0.4、P0.5为漏极开路(实验箱加了上拉电阻到3.3V)
P1M1 = 0x32; P1M0 = 0x32; //设置P1.1、P1.4、P1.5为漏极开路(实验箱加了上拉电阻到3.3V), P1.1在PWM当DAC电路通过电阻串联到P2.3
P2M1 = 0x3c; P2M0 = 0x3c; //设置P2.2~P2.5为漏极开路(实验箱加了上拉电阻到3.3V),设置开漏模式需要断开PWM当DAC电路中的R2电阻
P3M1 = 0x50; P3M0 = 0x50; //设置P3.4、P3.6为漏极开路(实验箱加了上拉电阻到3.3V)
P4M1 = 0x3c; P4M0 = 0x3c; //设置P4.2~P4.5为漏极开路(实验箱加了上拉电阻到3.3V)
P5M1 = 0x0c; P5M0 = 0x0c; //设置P5.2、P5.3为漏极开路(实验箱加了上拉电阻到3.3V)
P6M1 = 0xff; P6M0 = 0xff; //设置为漏极开路(实验箱加了上拉电阻到3.3V)
P7M1 = 0x00; P7M0 = 0x00; //设置为准双向口
}
经常在论坛见你?你才学?? zhange 发表于 2024-6-27 05:34
经常在论坛见你?你才学??
之前主要使用的是图形化编程,s4a的这个虽然简单像搭积木,但是功能限制且支持的硬件少,虽然也有mixly这种,但是用起来感觉也不是特别好,且arduino大部分使用库函数对寄存器这块学习几乎没有,像真正了解单片机也不是很好,所以像重新通过寄存器来了解单片机,现在就开始学习c251了。因为有图形化的基础对单片机会了解一点。因为像让用图形化实现复杂点的程序所以有点逻辑思维能力。{:5_336:} 第五课(上)
C语言printf的实现
首先了解一下printf的格式字符有哪些,如%d,%u以及它的含义,以及如何实现使用CDC实现printf函数发送字符。代码如下#include "./comm/stc32g.h"
#include "./comm/stc32_stc8_usb.h"
#include <stdio.h>
void sys_init();
//USB调试及复位所需定义
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#"; //设置自动复位到ISP区的用户接口命令
void main()
{
sys_init();
usb_init();//USB初始化
EUSB =1;
EA = 1;
while(DeviceState != DEVSTATE_CONFIGURED);
while (1)
{
if(bUsbOutReady)
{
//USB_SendData(UsbOutBuffer,OutNumber);
usb_OUT_done();
printf("hello world");
}
P20=0;
}
}
void sys_init()
{
WTST = 0;//设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
EAXFR = 1; //扩展寄存器(XFR)访问使能
CKCON = 0; //提高访问XRAM速度
P0M1 = 0x30; P0M0 = 0x30; //设置P0.4、P0.5为漏极开路(实验箱加了上拉电阻到3.3V)
P1M1 = 0x32; P1M0 = 0x32; //设置P1.1、P1.4、P1.5为漏极开路(实验箱加了上拉电阻到3.3V), P1.1在PWM当DAC电路通过电阻串联到P2.3
P2M1 = 0x3c; P2M0 = 0x3c; //设置P2.2~P2.5为漏极开路(实验箱加了上拉电阻到3.3V),设置开漏模式需要断开PWM当DAC电路中的R2电阻
P3M1 = 0x50; P3M0 = 0x50; //设置P3.4、P3.6为漏极开路(实验箱加了上拉电阻到3.3V)
P4M1 = 0x3c; P4M0 = 0x3c; //设置P4.2~P4.5为漏极开路(实验箱加了上拉电阻到3.3V)
P5M1 = 0x0c; P5M0 = 0x0c; //设置P5.2、P5.3为漏极开路(实验箱加了上拉电阻到3.3V)
P6M1 = 0xff; P6M0 = 0xff; //设置为漏极开路(实验箱加了上拉电阻到3.3V)
P7M1 = 0x00; P7M0 = 0x00; //设置为准双向口
//设置USB使用的时钟源
//IRC48MCR = 0x80; //使能内部48M高速IRC
// while (!(IRC48MCR & 0x01));//等待时钟稳定
//USBCLK = 0x00; //使用CDC功能需要使用这两行,HID功能禁用这两行。
//USBCON = 0x90;
}
但是如果直接复制usb的头文件和lib会出现警告,通过研究发现要在usb头文件中开启printf功能
#define PRINTF_HID //printf输出直接重定向到USB HID接口
要把这段注释取消掉因为这个定义了printf的重定向,代码在后面
int printf_hid (const char *fmt, ...);
#if defined PRINTF_SEGLED
#define printfSEG7_ShowString
#elif defined PRINTF_HID
#define printfprintf_hid
#endif
这段把printf定义到int printf_hid (const char *fmt, ...);如果没有这个定义printf不会起作用。
把这段代码写好之后,编译上传,CDC串口就会输出字符串。hello world。
通过这节课,我这边了解了printf的字符定义,为下节课做好准备。以及了解怎么去根据错误提示去排错。 第五课(下)C语言运算符和ACSII码和进制和数据基础类型
关于ACSII码网上有大量说明,这边就不在重复,计算机有4种进制 ,2,8,10,16,我们日常使用的是10进制,而计算机使用最多就是2进制和16进制。2进制转16进制是4位和1位。16进制转2进制反之。
C语言的运算符有2种数学运算和逻辑运算2种分别是
一、算术运算符
加(+)减(—)乘(*)除(/)
模(余)运算符(%):不允许出现浮点型,余数正负取决于被除数正负
自增(++i,–i;i++,i–)
二、位运算符(逻辑运算)
右移(>>)左移(<<)
按位与(&)
按位或(|)
按位异或(^)
取反(~)
还有计算机存储数据的基础类型有哪些,会占用多少字节。
这些都可以通过printf对2个数进行计算并输出结果,这也是这节课的内容。
本帖最后由 ldj7501 于 2024-6-28 07:47 编辑
必须mark一下{:4_165:}
请问视频可以在哪里下载?
页:
[1]
2