
#include "motor.h"
#include "delay.h"
#include "uart.h"
#include "reg52.h"
#include "timer.h"
sbit speedIO = P3^2; //外部中断0
unsigned int speedCnt = 0; //统计格子,脉冲次数
extern unsigned int speed; //速度
extern char signal; //主程序1s后可以发速度数据的信号
void Ex0Init(){
EX0 = 1;//允许中断
//EA = 1;在串口初始化函数中已经打开了总中断
IT0 = 1;//外部中断的下降沿触发
}
void main(){
Timer0Init();
UartInit();//串口相关初始化
Ex0Init(); //外部中断初始化
while(1){
if(signal){//定时器1s到点,把signal置一,主程序发送速度
SendString("speed:");
SendByte(speed);//速度发出去//用sendByte不合理
signal = 0;//清0
}
}
}
void speedHelper() interrupt 0{//下降沿触发,即轮子转的时候产生高电平再到低电平//外部中断处理函数
speedCnt++;//码盘转动了一个格子
}

#include "motor.h"
#include "delay.h"
#include "uart.h"
#include "reg52.h"
#include "timer.h"
#include "stdio.h"
sbit speedIO = P3^2; //外部中断0
unsigned int speedCnt = 0; //统计格子,脉冲次数
extern unsigned int speed; //速度
extern char signal; //主程序发速度数据的信号
char speedMes[24]; //主程序发速度数据的字符串缓冲区
void Ex0Init(){
EX0 = 1;//允许中断
//EA = 1;在串口初始化函数中已经打开了总中断
IT0 = 1;//外部中断的下降沿触发
}
void main(){
Timer0Init();
UartInit();//串口相关初始化
Ex0Init(); //外部中断初始化
while(1){
if(signal){//定时器1s到点,把signal置一,主程序发送速度
sprintf(speedMes,"speed:%d cm/s",speed);//字符串拼装,speed的值格式化为字符串,写入speedMes字符串缓冲区
SendString(speedMes);//速度发出去
signal = 0;//清0
}
}
}
void speedHelper() interrupt 0{//下降沿触发,即轮子转的时候产生高电平再到低电平//外部中断处理函数
speedCnt++;//码盘转动了一个格子
}
#include "reg52.h"
#include "intrins.h"
#include "OLED.h"
void main(){
Oled_Init();
Oled_Clear();
Oled_Show_Str(2,2,"speed:35cm/s");
while(1);//不让程序结束
}
#include "motor.h"
#include "delay.h"
#include "uart.h"
#include "reg52.h"
#include "timer.h"
#include "stdio.h"
#include "OLED.h"
sbit speedIO = P3^2; //外部中断0
unsigned int speedCnt = 0; //统计格子,脉冲次数
extern unsigned int speed; //速度
extern char signal; //主程序发速度数据的信号
char speedMes[24]; //主程序发速度数据的字符串缓冲区
void Ex0Init(){
EX0 = 1;//允许中断
//EA = 1;在串口初始化函数中已经打开了总中断
IT0 = 1;//外部中断的下降沿触发
}
void main(){
Timer0Init();
UartInit();//串口相关初始化
Ex0Init(); //外部中断初始化
Oled_Init();
Oled_Clear();
while(1){
if(signal){//定时器1s到点,把signal置一,主程序发送速度
sprintf(speedMes,"speed:%d cm/s",speed);//字符串拼装,speed的值格式化为字符串,写入speedMes字符串缓冲区
SendString(speedMes);//速度发出去
signal = 0;//清0
Oled_Show_Str(2,2,speedMes);
}
}
}
void speedHelper() interrupt 0{//下降沿触发,即轮子转的时候产生高电平再到低电平//外部中断处理函数
speedCnt++;//码盘转动了一个格子
}
#include "motor.h"
#include "delay.h"
#include "uart.h"
#include "reg52.h"
#include "timer.h"
#include "stdio.h"
#include "OLED.h"
#include "esp8266.h"
sbit speedIO = P3^2; //外部中断0
unsigned int speedCnt = 0; //统计格子,脉冲次数
extern unsigned int speed; //速度
extern char signal; //主程序发速度数据的信号
char speedMes[24]; //主程序发速度数据的字符串缓冲区
//4 发送数据
code char sendData [] = "AT+CIPSEND=0,6\r\n";
void Ex0Init(){
EX0 = 1;//允许中断
//EA = 1;在串口初始化函数中已经打开了总中断
IT0 = 1;//外部中断的下降沿触发
}
void main(){
Timer0Init();
UartInit();//串口相关初始化
Delay1000ms();//给espwifi模块上电时间
initWifi_AP();//初始化wifi工作在ap模式
waitConnect();//等待客户端的连接
Ex0Init(); //外部中断初始化
Oled_Init(); //oled初始化
Oled_Clear(); //OLED清屏
while(1){
if(signal){//定时器1s到点,把signal置一,主程序发送速度
SendString(sendData);//4 发送数据
Delay1000ms();
sprintf(speedMes,"speed:%d cm/s",speed);//字符串拼装,speed的值格式化为字符串,写入speedMes字符串缓冲区
SendString(speedMes);//速度发出去
signal = 0;//清0
Oled_Show_Str(2,2,speedMes);
}
}
}
void speedHelper() interrupt 0{//下降沿触发,即轮子转的时候产生高电平再到低电平//外部中断处理函数
speedCnt++;//码盘转动了一个格子
}

进入官网,注册并登陆
创建产品

Pin脚配置

唤醒词自定义和唤醒回复配置

命令词自定义
1)“基础信息”配置


2)“控制详情”配置:添加控制



3)“识别灵敏度”配置:中

6. 发音人配置

7. 其他配置

8. 发布版本

9. 半小时左右后下载sdk固件











#include "reg52.h"
#include "hc04.h"
#include "delay.h"
#include "sg90.h"
#include "motor.h"
#include "OLED.h"
#define MIDDLE 0
#define LEFT 1
#define RIGHT 2
#define XJ 3
#define GS 4
#define BZ 5
#define ST 6
sbit A25 = P1^5;
sbit A26 = P1^6;
sbit A27 = P1^7;
sbit leftSensorXJ = P2^7;
sbit rightSensorXJ = P2^6;
sbit leftSensorGS = P2^5;
sbit rightSensorGS = P2^4;
char dir;
double disMiddle;
double disLeft;
double disRight;
void xunjiMode(){
if(leftSensorXJ == 0 && rightSensorXJ == 0){//左右都反射回来,都低电平,直走,灯都亮
goForward();
}
if(leftSensorXJ == 1 && rightSensorXJ == 0){//左边没反射回来,左高电平,左转,右灯亮
goLeft();
}
if(leftSensorXJ == 0 && rightSensorXJ == 1){//右边没反射回来,右高电平,右转,左灯亮
goRight();
}
if(leftSensorXJ == 1 && rightSensorXJ == 1){//左右都没反射回来,都高电平,停,灯都不亮
stop();
}
}
void gensuiMode(){
if(leftSensorGS == 0 && rightSensorGS == 0){//两边都反射回来了,都低电平,直走
goForward();
}
if(leftSensorGS == 1 && rightSensorGS == 0){//右边反射回来了,右低电平,右转
goRight();
}
if(leftSensorGS == 0 && rightSensorGS == 1){//左边反射回来了,左低电平,左转
goLeft();
}
if(leftSensorGS == 1 && rightSensorGS == 1){//两边都没反射回来,都高电平,停
stop();
}
}
void bizhangMode(){
if(dir != MIDDLE){
sgMiddle();
dir = MIDDLE;
Delay300ms();
}
disMiddle = getDistance();
if(disMiddle > 35){
//前进
goForward();
}else if(disMiddle < 10){
goBack();
}else{
//停止
stop();
//sg左转 测左边距离
sgLeft();
Delay300ms();
disLeft = getDistance();
sgMiddle();
Delay300ms();
//sg右转 测右边距离
sgRight();
dir = RIGHT;
Delay300ms();
disRight = getDistance();
if(disLeft < disRight){
goRight();
Delay150ms();
stop();
}
if(disLeft > disRight){
goLeft();
Delay150ms();
stop();
}
}
}
void main(){
int mark = 0;
Timer0Init();//定时器0初始化(为舵机)
Timer1Init();//定时器1初始化(为超声波测距)
sgMiddle(); //舵机初始化位置(避障)
Delay2000ms();
dir = MIDDLE;
Oled_Init(); //OLED初始化
Oled_Clear();
Oled_Show_Str(2,2,"-----Ready----");
while(1){
//满足寻迹模式的条件
if(A25 == 0 && A26 == 1 && A27 == 1){
if(mark != XJ){
Oled_Clear();
Oled_Show_Str(2,2,"-----XunJi----");
}
mark = XJ;
xunjiMode();
}
//满足跟随模式的条件
if(A25 == 1 && A26 == 0 && A27 == 1){
if(mark != GS){
Oled_Clear();
Oled_Show_Str(2,2,"-----GenSui----");
}
mark = GS;
gensuiMode();
}
//满足避障模式的条件
if(A25 == 1 && A26 == 1 && A27 == 0){
if(mark != BZ){
Oled_Clear();
Oled_Show_Str(2,2,"-----BiZhang----");
mark = BZ;
bizhangMode();
}
}
//满足stop的条件
if(A25 == 0 && A26 == 0 && A27 == 0){
if(mark != ST){
Oled_Clear();
Oled_Show_Str(2,2,"-----STOP----");
mark = ST;
stop();
}
}
}
}