2021.06.17 18:54:41
实验板到手,第一步当然是下载资料啦。自然要去官网下载:
顺便,这官网挺瞎眼的(
由于官网过于瞎眼,故将下载链接直接贴出来。
这个是烧录用的工具。
直接放上下载站的链接。直链在此:点击下载(不一定稳定)。下载站上有注册教程。
初步练习后,大致梳理如下。
构思&设计电路。没啥好说的,咱也不会,就……边做边查呗(
写好程序。个人习惯vim/vs code,比较方便。只要引入头文件 reg52.h ,后续开发照着C语言通常的流程即可。
编译程序。使用上文提供的 Keil 编译程序,生成.hex文件(其实我挺好奇能不能用gcc……虽然估计不行)。这个.hex文件(看后缀,即十六进制文件)就是目标程序了。
烧录程序。使用上面提到的 STC-ISP 工具进行烧录即可。烧录操作后面写,可先参考这篇文章。
好了,到这里就是测试程序了(回想起被wer支配的恐惧)。
Q:打开Keil新建工程,找不到stc51单片机怎么办?
A:看这儿。用stc-isp导入一下数据库到keil安装目录就好了。
Q:Keil要激活才能用?
A:别担心,网上激活教程一大把。看这儿。文章里提到的注册机,已经包含在了我提供的Keil安装包里,下好之后照着文章操作就好。
Q:烧录程序失败?
A:stc51通病(貌似)。烧录按钮点了之后断一下开发板的电,然后重新上电即可。
开发板到了。所以储物间又上了一本资料。还挺全的,初期入门用吧。
代码其实很简单。MCU的编程方式和传统C语言程序相比挺怪的。代码如下:
/*Example-1_switch-led*/
#include "reg52.h"
typedef unsigned int u16;
sbit LED=P2^0;
sbit LED_1=P2^1;
void delay(u16 i)
{
while(i--);
}
void main()
{
LED_1=0;
while(1)
{
LED=0;
delay(50000);
LED=1;
delay(50000);
}
}
写完之后,keil编译生成.hex文件,丢到stc-isp里一下载,完事儿。目测成功。不过这里面还有一点坑:
点击下图这个魔术棒标志。
如下图,勾选Create hex file即可。
然后编译。输出的信息里有下图这样的creating hex file from XXX就说明应该没啥问题。
回头看看这个程序。它和传统C语言程序的区别主要是这几点:
其他的,基本和常规C语言没什么区别。所以,后面主要学习的,应该就是引脚的相关内容了。
《关于我报名比赛后才开始学MCU编程这件事》
ESP8266因为便宜和足够强大,所以在物联网上有着很广泛的应用。它的使用也比较简单,指令较少。
#include "reg52.h"
#include <stdio.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
[5]; //回传的数组
uchar ReceiveData;
uchar countnumber
void uart_init() //串口的初始化
{
//[email protected]
&= 0x7F; //波特率不倍速
PCON = 0x50; //8位数据,可变波特率
SCON |= 0x40; //定时器1时钟为Fosc,即1T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
AUXR &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TMOD = 0xDC; //设定定时初值
TL1 = 0xDC; //设定定时器重装值
TH1 = 0; //禁止定时器1中断
ET1 = 1; //启动定时器1
TR1 = 1;
EA = 1;
ES }
void delayms(uint xms) //延时
{
, j;
uint ifor (i = xms; i > 0; i--)
for (j = 110; j > 0; j--)
;
}
void Sent_ZF(uchar dat) //发送一个字节
{
= 0;
ES = 0;
TI = dat;
SBUF while (!TI)
;
= 0;
TI = 1;
ES }
void send(uchar *string) //发送字符串
{
while (*string)
{
(*string++);
Sent_ZF}
}
void Uart1() interrupt 4 //串口1 接收数据4wei(收到8266回传的OK,其实是\r\nOK)
{ //当然是因为目前8266里面刷的AT固件是出厂默认固件
;
uchar aif (RI == 1)
{
//RI=0; //复位中断请求标志,接收数据后置1
= SBUF; //接收数据
a = 0; //复位中断请求标志,接收数据后置1
RI
*(ReceiveData + countnumber) = a;
++;
countnumber
if (countnumber > 4)
{
= 0;
countnumber }
}
}
(uchar *p) //比较字符串
uchar data_compare{
if (strstr(ReceiveData, p) != NULL)
return 1;
else
return 0;
}
void wifi_init() //初始化wifi模块
{
while (1)
{
("AT+RST\r\n"); //往串口发重启指令
sendif (data_compare("OK"))
break;
(600); //适当延时,给wifi模块一点反应时间
delayms}
(ReceiveData, 0, 5);
memset
while (1)
{
("AT+CWMODE=1\r\n"); //选择STA模式
sendif (data_compare("OK"))
break;
(600); //适当延时,给wifi模块一点反应时间
delayms}
(ReceiveData, 0, 5);
memset
while (1)
{
("AT+CIPMUX=0\r\n"); //单通道模式
sendif (data_compare("OK"))
break;
(600); //适当延时,给wifi模块一点反应时间
delayms}
(ReceiveData, 0, 5);
memset
while (1)
{
("AT+CIPSTART=\"TCP\",\"192.168.1.100\",8080\r\n"); //往串口发重启指令
sendif (data_compare("OK"))
break;
(600); //适当延时,给wifi模块一点反应时间
delayms}
(ReceiveData, 0, 5);
memset
while (1)
{
("AT+CIPMODE=1\r\n"); //选择透传
sendif (data_compare("OK"))
break;
(600); //适当延时,给wifi模块一点反应时间
delayms}
(ReceiveData, 0, 5);
memset
while (1)
{
("AT+CIPSEND\r\n"); //发送数据命令
sendif (data_compare("OK"))
break;
(600); //适当延时,给wifi模块一点反应时间
delayms}
(ReceiveData, 0, 5);
memset}
void main()
{
= 0; //蜂鸣器
P27 ();
uart_init(2000);
delayms(); //就可连上服务端了
wifi_init
while (1)
{
//do something
;
}
}