解读void wifi_init(void) { // unsigned char x,FLAG = 0; // for(x = 0;x < 100;x ++) // send_buf[x] = '\0'; USART2TxStr("AT+RST\r\n"); LCD_ShowString(30,190,200,16,16,"wait for the connection"); delay_ms(1000); CLR_Buf2(); //清除串口2接收缓存 Flag_usart2_receive_OK = 0; USART2TxStr("AT+CWMODE=2\r\n"); // Serial_SendString("AT+CWMODE=3\r\n"); wait_OK();//等待接收到OK字符串 // LCD_ShowString(0,70,"AT+CWMODE=3"); //连接已知WiFi USART2TxStr("AT+CWSAP=\"esp\",\"88888888\",6,4\r\n"); // USART1TxStr("AT+CWJAP=\"。。。。。\",\"88888888\"\r\n"); LCD_ShowString(30,200,200,16,16,"connection succeeded"); wait_OK();//等待接收到OK字符串 //启动多模块连接 USART2TxStr("AT+CIPMUX=1\r\n"); wait_OK();//等待接收到OK字符串 USART2TxStr("AT+CIPSERVER=1,8080\r\n"); // USART2TxStr("AT+CIPSTART=4,\"TCP\",\"192.168.1.118\",123456\r\n");//6000 wait_OK();//等待接收到OK字符串 USART2TxStr("AT+CIFSR\r\n"); wait_OK(); delay_ms(500); LCD_Clear(WHITE); }
时间: 2023-09-28 14:04:03 浏览: 174
这段代码定义了一个名为 wifi_init 的函数,该函数没有参数和返回值(即 void 类型)。在函数体内部,首先发送了一个 AT+RST 命令,然后在 LCD 上显示一条连接等待消息,并延时 1 秒钟。接下来,清空了 USART2 的接收缓存和标志变量 Flag_usart2_receive_OK,发送了一个 AT+CWMODE=2 命令,并等待接收到 OK 字符串。然后,连接已知 WiFi 并发送一个 AT+CWSAP 命令,再次等待接收到 OK 字符串并在 LCD 上显示连接成功消息。之后,启动了多模块连接并发送一个 AT+CIPSERVER 命令,再次等待接收到 OK 字符串。最后,发送一个 AT+CIFSR 命令,并等待接收到 OK 字符串,并延时 500ms。最后,清空 LCD 屏幕。
相关问题
在这段主函数代码的基础上写一个ISD1820语音芯片采集和存储的代码,语音存储在ISD1820芯片内部:#include "led.h" #include "delay.h" #include "sys.h" #include "usart.h" #include <stdio.h> #include "timer.h" #include "key.h" #include "myled.h" #include "lcd1602.h" char dis0[17]; //暂存数组 unsigned char disFlag=0;//更新显示标志 static unsigned char rekey =0; unsigned char playMode =0; //设置标志 int main(void) { delay_init(); //延时函数初始化 uart_init(9600); //串口初始化为115200 // uart2_init(9600) ; TIM3_Int_Init(499,7199);//5ms 初始化定时器 MyLED_Init(); //初始化输出 KEY_Init(); //初始化输入 Lcd_GPIO_init(); //初始化lcd引脚 Lcd_Init(); //初始化lcd屏幕 delay_ms(20); Lcd_Puts(0,0,(u8 *)"Loop Playback "); //初始化显示 //Key trigger Lcd_Puts(0,1,(u8 *)"Sound recording "); //初始化显示 playMode =0;//初始化方式 while(1) { if(disFlag == 1) { disFlag = 0;//清空标志 if(key3==0){//录音 yy_rec = 1; //录音中 Lcd_Puts(0,1,(u8 *)"Sound recording "); //显示 } else{ yy_rec = 0; //停止录音 Lcd_Puts(0,1,(u8 *)" "); } if(playMode == 0){//手动播报 Lcd_Puts(0,0,(u8 *)"Key trigger "); } else{//循环播报 yy_play = !yy_play; //播报 Lcd_Puts(0,0,(u8 *)"Loop Playback "); //初始化显示 // } } if((key1==0)||(key2==0)) //检测到按键按下 { delay_ms(10); //小抖动 if(rekey==0) { if(key1==0) //检测是否按下 { rekey=1; if(playMode ) { //播放方式 playMode = 0; } else{ playMode = 1; } } else if(key2==0)//设置值键 { rekey=1; yy_play =1; //上电动作下 delay_ms(200); yy_play =0;//关闭运行 } } } else { rekey=0; //防止重复检测到按键 } } }
好的,以下是基于主函数代码的ISD1820语音芯片采集和存储的代码,语音存储在ISD1820芯片内部的实现方法:
```
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include <stdio.h>
#include "timer.h"
#include "key.h"
#include "myled.h"
#include "lcd1602.h"
char dis0[17]; //暂存数组
unsigned char disFlag=0;//更新显示标志
static unsigned char rekey =0;
unsigned char playMode =0; //设置标志
void ISD1820_Record()
{
USART_SendData(USART1, 0x22); // 发送指令,开始录音
while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); // 等待发送完成
delay_ms(5000); // 录音 5 秒
USART_SendData(USART1, 0x77); // 发送指令,停止录音
while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); // 等待发送完成
delay_ms(1000); // 停止录音后需要等待一段时间,让 ISD1820 完成存储操作
}
int main(void)
{
delay_init(); //延时函数初始化
uart_init(9600); //串口初始化为115200
TIM3_Int_Init(499,7199);//5ms 初始化定时器
MyLED_Init(); //初始化输出
KEY_Init(); //初始化输入
Lcd_GPIO_init(); //初始化lcd引脚
Lcd_Init(); //初始化lcd屏幕
delay_ms(20);
Lcd_Puts(0,0,(u8 *)"Loop Playback "); //初始化显示
Lcd_Puts(0,1,(u8 *)"Sound recording "); //初始化显示
playMode = 0; //初始化方式
while (1)
{
if (disFlag == 1)
{
disFlag = 0; //清空标志
if (key3 == 0) { //录音
ISD1820_Record(); //调用录音函数
Lcd_Puts(0,1,(u8 *)" "); //清空屏幕
}
if (playMode == 0) { //手动播放
if (key1 == 0) { //检测到按键按下
delay_ms(10); //小抖动
if (rekey == 0) {
rekey = 1;
yy_play = 1; //播放语音
delay_ms(200);
yy_play = 0; //关闭运行
}
}
} else { //循环播放
if (yy_play == 0) { //检测到播放结束
yy_play = 1; //播放语音
}
}
}
if ((key1 == 0) || (key2 == 0)) { //检测到按键按下
delay_ms(10); //小抖动
if (rekey == 0) {
if (key1 == 0) { //检测是否按下
rekey = 1;
if (playMode) { //播放方式
playMode = 0;
Lcd_Puts(0,0,(u8 *)"Key trigger ");
} else {
playMode = 1;
Lcd_Puts(0,0,(u8 *)"Loop Playback ");
}
} else if (key2 == 0) { //设置值键
rekey = 1;
yy_play = 1; //播放语音
delay_ms(200);
yy_play = 0; //关闭运行
}
}
} else {
rekey = 0; //防止重复检测到按键
}
}
}
```
以上代码中,我们在 `ISD1820_Record()` 函数中实现了 ISD1820 语音芯片的录音功能。在 `main()` 函数中,当检测到 `key3` 按键按下时,调用 `ISD1820_Record()` 函数进行录音。在录音结束后,清空屏幕。
此外,我们还调整了 `main()` 函数中的逻辑,以适应录音功能的实现。当 `playMode` 为 0 时,表示手动播放模式,此时按下 `key1` 按键会触发播放语音的动作。当 `playMode` 为 1 时,表示循环播放模式,程序会自动循环播放录制的语音。我们在 `ISD1820_Record()` 函数中加入了延时操作,以确保 ISD1820 芯片在录音结束后能够完成存储操作。
完善代码#include <reg52.h> #include "uart.h" #include <stdlib.h> sbit AD0808_CS = P3^0; //?????? sbit AD0808_CLK = P3^1; //?????? sbit AD0808_DI = P3^2; //???????? sbit AD0808_DO = P3^3; //???????? void AD0808_Convert(unsigned int *data) { unsigned char i; unsigned int result = 0; AD0808_CS = 0; //??AD0808 AD0808_CLK = 0; //?????? AD0808_DI = 1; //???????? for(i = 0; i < 8; i++) //?AD0808???????? { AD0808_CLK = 1; AD0808_CLK = 0; } for(i = 0; i < 12; i++) //?????????? { AD0808_CLK = 1; result = (result << 1) | AD0808_DO; AD0808_CLK = 0; } AD0808_CS = 1; //??AD0808 *data = result; } void delay_ms(int xms) { unsigned char i; for( ; xms > 0; xms--) for(i = 110; i > 0; i--); } float Data[1] = {0}; void main() { unsigned char i = 0; uart_init(); while(1) { if(Rec_flag) //??????? { delay_ms(1); unsigned int result = 0; AD0808_Convert(&result); //??AD0808???? Data[0] = (float)result * 5.0 / 4096.0; //???????????,???????5V i++; SendData(); Rec_flag = 0; } } }
这段代码还是缺少一些定义和实现,我帮你补充一下:
```
void uart_init(void) //串口初始化
{
TMOD = 0x20; //定时器1模式2(8位自动重装载)
TH1 = 0xfd; //波特率9600
TL1 = TH1;
TR1 = 1; //启动定时器1
SM0 = 0; //串口工作方式
SM1 = 1;
REN = 1; //串口接收使能
EA = 1; //总中断使能
ES = 1; //串口中断使能
}
void SendData() //发送数据
{
unsigned char i;
for(i=0;i<1;i++)
{
SBUF = Data[i]; //通过串口发送数据
while(TI==0);
TI=0;
}
}
```
这段代码中,uart_init函数用于初始化串口,包括设置定时器1的工作模式和波特率等。SendData函数用于将Data数组中的数据通过串口发送出去。需要注意的是,由于发送的是浮点数,所以需要一次发送一个字节,否则会出现数据不正确的情况。
还有一些宏定义也是缺少的,你需要自己根据需要进行定义。例如:
```
#define Rec_flag P3_2
```
这个宏定义是用来表示接收标志位的引脚,你需要根据实际情况进行定义。
阅读全文