依然老套路,安装在虚拟机里,为什么呢?为了模拟一个完全从0开始的环境。
首先准备需要的软件
1.
VSCODE,这个安装此处不再赘述,网上有很多教程,基本就是点下一步就完成了。
2.
vscode插件,其中包括 platformIO IDE,这是一个单片机开发的集成环境,内部直接包含编译器,可以帮助我们链接,编译,生成2进制文件,等于把makefile该干的事都干了。虽然它自称是IDE,但它是以插件的形式安装在其他编辑器或IDE上的IDE。
3.
二进制文件下载软件,STC官方提供的一个软件,后面会说明。
1.中文插件
2.C/C++ 语言包,微软官方提供的插件,可以做一些语法检查,智能提示等。
3.platformIO IDE 这个是重头戏,功能非常强大的一个IDE,我也只是略懂皮毛,有兴趣的小伙伴可以自行百度。反正我们能知道此处他就是帮我们,链接,编译,生成二进制文件就可以了,使用的编译器是sdcc。
安装的时间可能会有点长,等待右下角的进度条走完,安装完成以后右下角会提示重启vscode,如果还没有切换到中文环境又不认识英文,那么里面有个单词restar,看到这个单词说明装完了,直接重启vscode。
此处可以看到我圈出来了两个地方,一个是一只蚂蚁的头,一个是房子图标,蚂蚁头是IDE的主界面,房子是创建项目的界面,然后我们点击房子,然后跟着图示操作即可。
上图忘记了写项目名,大家可以写一下。
下面我们编写代码
delay.h
#ifndef __DELAY_H
#define __DELAY_H
#define MAIN_Fosc 11059200L //晶振频率,每秒
void delay_ms(unsigned int ms);
#endif
delay.c
#include
void delay_ms(unsigned int ms)
{
unsigned int i;
do
{
i = MAIN_Fosc / 1300000;
while (--i)
;
} while (--ms);
}
led_out.h
#ifndef __LED_OUT
#define __LED_OUT
#include "mcs51/stc12.h"
#include "mcs51/8052.h"
void led_pwm_out();
void led_out();
void ztim(void) __interrupt 1;
#endif
led_out.c
#include "led_out.h"
#include "delay.h"
#define MAIN_Fosc 11059200L //晶振频率
#define LED1 P1_1 //输出1
#define LED2 P1_2 //输出2
unsigned char CYCLE; //定义周期该数字X基准定时时间如果是10 则周期是10x 0.1ms
unsigned char PWM_ON; //定义高电平时间
void led_out()
{
while (1)
{
LED1 = 0;
LED2 = 1;
delay_ms(100);
LED1 = 1;
LED2 = 0;
delay_ms(100);
}
}
void led_pwm_out()
{
__bit ZFlag;
TMOD |= 0x01; //定时器设置 0.1ms in 12M crystal
TH0 = (65536 - 45872) / 256;
TL0 = (65536 - 45872) % 256; //定时0.1mS
IE = 0x82; //打开中断
TR0 = 1;
CYCLE = 50; // 时间可以调整这个是10调整8位PWM就是256步
while (!ZFlag)
{
delay_ms(25); //延时时间,从一个亮度到下一个亮度的间隔时间,速度快就能看到连续效果
PWM_ON++; //这个使用较长延时,以便能看清楚变化过程
if (PWM_ON == CYCLE)
{ //这个里可以添加其他程序如到最亮时候控制设备
ZFlag = 1;
}
}
while (ZFlag) //亮度递减同上,是个相反的过程
{
delay_ms(25); //延迟时间为20000*0.4=8000us
PWM_ON--;
if (PWM_ON == 0)
{
ZFlag = 0;
}
}
}
void ztim(void) __interrupt 1
{
static unsigned char count;
TH0 = (65536 - 100) / 256;
TL0 = (65536 - 100) % 256; //定时0.1mS
if (count == PWM_ON)
{
LED1 = 1;
LED2 = 0; //灯灭
}
count++;
if (count == CYCLE)
{
count = 0;
if (PWM_ON != 0) //如果开启时间是0 保持原来状态
{
LED1 = 0;
LED2 = 1; //灯灭
}
}
}
main.c
#define MAIN_Fosc 11059200L
#define LED1 P1_1
#define LED2 P1_2
#include "led_out.h"
void main()
{
//led_out();
led_pwm_out();
}
最后我们编译程序 在英文输入法下ctrl+shift+b会看到如下界面
可以看到没有出现问题,编译成功
然后我们找到二进制文件,将其复制到桌面
使用这个程序将文件下载到单片机,我这里就不在虚拟机里演示了,直接在我主机上演示,虚拟机没有安装ch340驱动,懒得折腾了,装完虚拟机又得恢复了。
总结:
相较于stm32环境的搭建这个还是很简单的,尤其在platformIO IDE的加持下,依然是那个原则,能用开源免费的尽量用开源免费的东西,sdcc和vscode都是开源免费的,paltformIO IDE不太清楚,有兴趣的小伙伴可以查查。相较于keil sdcc最大的好处就是没人查水表,让律师函见鬼去吧,当然它也不是没有缺点,网上例程少,语法和keil略有出入,头文件名字和keil不一样,编译出的文件体积要大一些(据说是因为sdcc严格的检查机制)。
下载器用的是isp淘宝随便搜一下一大把。
遇到的问题主要还是头文件的问题,网上的例程大多是基于keil,sdcc的头文件,语法和keil c51略有出入,但不是太大,稍微有点编程功底的人应该都能解决这些问题。
最后放一张演示图