学习打卡早日申请上实验箱
DAY1第一讲:
本次使用的是STC的32位8051单片机(STC32G12K128),介绍单片机的应用如医疗,工业控制,汽车电子等,51单片机相比于STM32来的易上手,行业应用广,没有出现淘汰的情况,性能稳定。
边看视频边做项目提升能力。小学生也可以学,说明单片机入门不会难。
做项目开发汇编不是必要的,用C就可以实现。最好能掌握寄存器开发,方便后期的移植,调试等。STC资料全,案例多,技术支持到位。
1、静下心沉住气
2、多动手
3、举一反三,多思考
4、多看官网,多看手册,有问题多交流
5、逛论坛,吸收别人的东西
6、尝试做项目,竞赛题
第二讲:
实验箱硬件介绍
红外发射,红外接收,电位器(电压比较用),数码管,8个LED灯(流水灯),万能板(自己实现外设),NTC测温,18B20,ADC按键(0-4095,基准电压用来校准),PWM模拟DAC,
24C02存储单元,矩阵键盘,独立按键,LCD接口(12864),LED(电源指示灯),RS232接口,FLASH扩展(内存更大),测试接口(调试用),蜂鸣电路
STC32G12K128基本性能:工作电压19.-5.5V,FLASH为128K
想用实验箱实现环境温度采集,报警,并能使用红外进行电器开关(如空调,风扇等带红外功能的电器),实现温度调节的功能。
第三讲:
开发环境搭建
STC-ISP,STC手册,PDF阅读器,C251开发环境搭建,程序包下载,编译
1、STC-ISP
不仅能下载 STC全系程序,还集成虚拟显示功能,范例,在线生成工具,驱动等。软件很小,但功能很全,就是界面有点乱,需要一点时间适应一下布局。
下载地址:https://stcai.com/gjrj
2、STC手册
STC-ISP内就可以下载,方便
3、PDF用WPS查看(WPS已有,福昕要另外下载)
PDF目录可跳转,书签使用,ctrl+f搜索
4、C251开发环境搭建
手册上有下载地址:https://www.keil.com/download/product/
5、程序包下载
主要问题在添加头文件和型号,可以用STC-ISP导入。
编译成功
WIN10驱动可以不安装,没有真板,下载只能等有工具箱再进行,不过进入下载模式的方式要先知道在哪里找,方法如下:
进入 USB 下载模式需要先按住实验箱上的 P3.2/INT0 按键/接地, 然后按一下 ON/OFF 电源按键/断电, 接着松开 ON/OFF 电源按键/上电, 最后可松开
P3.2/INT0 按键。 正常情况下就能识别出“STC USB Writer (HID1)” 设备
USB下载功能电路
本帖最后由 lospring 于 2023-10-1 00:21 编辑
第四讲
P4.0(控制二极管基极)和P6.0(LED形成对地通路)都要低电平才能点亮对应的LED灯
1、IO模式设置及IO对应的寄存器查找
2、sbit操作
3、注释格式
4、自动下载工程:警告很多,没有HEX文件生成。头文件也和视频不同,需要改成#include "COMM/STC32G.H"
#include "COMM/stc32_stc8_usb.h"
看提示大概是MODEL类型不对,修改成XSMALL后编译成功
第五讲
记录
第六讲
延时函数
void delay_ms(u16 ms)
{
u16 i;
do{
i=MAIN_Fosc/6000;
while(--i);
}while(--ms);
}
灯闪烁
P40=0;
P60=0;
delay_ms(500);
P60=1;
delay_ms(500);
#ifndef __XX_H
#define __XX_H
#endif
本帖最后由 lospring 于 2023-10-3 16:33 编辑
第七讲
按键点灯
#include "COMM/STC32G.H"
#include "COMM/stc32_stc8_usb.h"
#define MAIN_Fosc 24000000UL //定义主时钟
#define key P32
#define key1 P33
char *USER_STCISPCMD="@STCISP#";
char *USER_DEVICEDESC=NULL;
char *USER_PRODUCTDESC=NULL;
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; //设置为准双向口
}
void delay_ms(u16 ms)
{
u16 i;
do{
i=MAIN_Fosc/6000;
while(--i);
}while(--ms);
}
void main()
{
P0M0=0X00;//设置IO模式,P0M0与P0M1一起控制。
P0M1=0X00;
P4M0=0X00;
P4M1=0X00;
P6M0=0X00;
P6M1=0X00;
sys_init();
usb_init();
EA=1;
P6=0XFE;
while(1)
{
if(DeviceState != DEVSTATE_CONFIGURED)
continue;
if(bUsbOutReady)
{
usb_OUT_done();
printf("Hello World");
}
P40=0;
if(key==0)
{
delay_ms(10);
if(key==0)
{
printf("按键P32已按下\r\n");
P60=0;
}
}
else
{
P60=1;
}
//-------------------按下按键状态翻转-----------------
// if(key1==0)
// {
// delay_ms(10);
// if(key1==0)
// {
// printf("按键P33已按下,led状态翻转\r\n");
// P67=!P67;
// while(key1==0)
// {
//
// }
// }
// }
// }
//-------------------按下按键,led左移一个单位点亮-----------------
if(key1==0)
{
delay_ms(10);
if(key1==0)
{
printf("按键P33已按下,led左移一位\r\n");
P6=((P6<<1)+1);
if(P6==0XFF)
{
P6=0xFE;
}
while(key1==0)
{
}
}
}
}
}
#快捷键,alt+shift可以选择一列数据如
0XFE
0XFD
0XFB
0XF7
0XEF
0XDF
0XBF
0X7F
通过上面方式可以快速选择FE,FD,FB。。。。
#数组操作
u8 LED_TAB={
FE,
FD,
FB,
F7,
EF,
DF,
BF,
7F
};
第八讲
蜂鸣器驱动
#include "COMM/STC32G.H"
#include "COMM/stc32_stc8_usb.h"
#define MAIN_Fosc 24000000UL //定义主时钟
#define key P32
#define key1 P33
#define BEEP P54
char *USER_STCISPCMD="@STCISP#";
char *USER_DEVICEDESC=NULL;
char *USER_PRODUCTDESC=NULL;
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; //设置为准双向口
}
void delay_ms(u16 ms)
{
u16 i;
do{
i=MAIN_Fosc/6000;
while(--i);
}while(--ms);
}
void main()
{
P0M0=0X00;//设置IO模式,P0M0与P0M1一起控制。
P0M1=0X00;
P4M0=0X00;
P4M1=0X00;
P6M0=0X00;
P6M1=0X00;
sys_init();
usb_init();
EA=1;
P6=0XFE;
while(1)
{
if(DeviceState != DEVSTATE_CONFIGURED)
continue;
if(bUsbOutReady)
{
usb_OUT_done();
}
if(key==0)
{
delay_ms(10);
if(key==0)
{
while(key==0);
BEEP=!BEEP;
}
}
}
}
小项目核心代码
void Test(void)
{
if(key==0) //开关机键
{
delay_ms(10);
if(key==0)
{
while(key==0);//按键按下,等待松开
//---------------还没开机状态下,执行开机功能--------------
if(Run_Flag==0)// 没有开机
{
Run_Flag=1;//开机变量改为1,表示已开机
BEEP=0; //打开蜂鸣器
delay_ms(10);//延时10ms
BEEP=1; //关闭蜂鸣器
P40=0; //打开LED总电源(对应三极管)
P6=0X00; //点亮全部LED
delay_ms(200);//延时200ms
P6=0XFF; //熄灭全部LED
}
//---------------已开机状态下,执行关机功能--------------
else
{
Run_Flag==0;//开机变量改为0,表示已关机
BEEP=0; //打开蜂鸣器
delay_ms(10);//延时10ms
BEEP=1; //关闭蜂鸣器
P6=0XFF; //熄灭全部LED
Run_MODE=0; //模式清0
}
}
}
if(key1==0)
{
delay_ms(10);
if(key1==0)
{
while(key1==0);//按键按下,等待松开
BEEP=0; //打开蜂鸣器
delay_ms(10);//延时10ms
BEEP=1; //关闭蜂鸣器
Run_MODE++;
if(Run_MODE>8)
{
Run_MODE=1;
}
P6=~(1<<(Run_MODE-1));
}
}
}
页:
[1]