初级会员

- 积分
- 126
- 金钱
- 126
- 注册时间
- 2014-3-20
- 在线时间
- 16 小时
|
发表于 2015-8-3 11:06:28
|
显示全部楼层
TTS.c
/* 引脚链接用的串口3
VCC--+5V
GND--GND
BUSY--PD2
RXD--PB10
TXD--PB11
喇叭按电路图正负接
*/
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "tts.h"
//发声程序
#define LEN_OFFSET 2 //长度字节的偏移量(本例中长度不超过255字节,因此只使用1字节长度)
//数据包头(0xFD + 2字节长度 + 1字节命令字 + 1字节命令参数)
unsigned char head[] = {0xfd,0x00,0x00,0x01,0x00};
/****/
u8 text1[]={"[v16]欢迎使用水肥一体化智能控制系统"};
u8 text2[]={"当前空气温度为 度"};
u8 text3[]={"湿度为百分之 "};
u8 text4[]={"土壤湿度为百分之 "};
u8 text5[]={"光照强度为 "};
u8 text6[]={"已浇水量 升"}; //已浇水量 12.5 升
u8 text7[]={"在浇水在施肥"};
u8 text8[]={"在浇水没有施肥"};
u8 text9[]={"没有浇水没有施肥"};
u8 text10[]={"您设定的土壤相对湿度下限值为 "};
u8 text11[]={"您设定的土壤相对湿度上限值为 "};
u8 text12[]={"播报完毕,谢谢"};
void TTS_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); //使能PD端口时钟
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_2; //
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOD, &GPIO_InitStructure); //根据设定参数初始化GPIOD.6
}
void Speech(unsigned char *buf, unsigned char len)
{
unsigned char i = 0; //循环计数变量
unsigned char xor = 0x00; //校验码初始化
head[LEN_OFFSET] = len + 3; //计算正文长度(1命令字 + 1命令参数 + 文字长度 + 1校验位)
//发送数据包头(0xFD + 2字节长度 + 1字节命令字 + 1字节命令参数)
for(i = 0; i < 5; i++)
{
xor ^= head[i];
UART3_SendByte(head[i]);
delay_ms(2);
}
//发送文字内容
for(i = 0; i < len; i++)
{
xor ^= buf[i];
UART3_SendByte(buf[i]);
delay_ms(2);
}
UART3_SendByte(xor); //发送校验位
}
TTS.h
#ifndef __tts_H
#define __tts_H
extern u8 text1[];
extern u8 text2[];
extern u8 text3[];
extern u8 text4[];
extern u8 text5[];
extern u8 text6[];
extern u8 text7[];
extern u8 text8[];
extern u8 text9[];
extern u8 text10[];
extern u8 text11[];
extern u8 text12[];
#define TTS_Busy PDin(2)
void TTS_Init(void);
void Speech(unsigned char *buf, unsigned char len);// 语音播报程序
#endif
usart.c
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include <string.h>
#if 1
#pragma import(__use_no_semihosting)
//标准库需要的支持函数
struct __FILE
{
int handle;
};
FILE __stdout;
//定义_sys_exit()以避免使用半主机模式
_sys_exit(int x)
{
x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{
while((USART1->SR&0X40)==0);//循环发送,直到发送完毕
USART1->DR = (u8) ch;
return ch;
}
#endif
/*使用microLib的方法*/
/*
int fputc(int ch, FILE *f)
{
USART_SendData(USART1, (uint8_t) ch);
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {}
return ch;
}
int GetKey (void) {
while (!(USART1->SR & USART_FLAG_RXNE));
return ((int)(USART1->DR & 0x1FF));
}
*/
//串口1发送单个字节
void UART1_SendByte(u16 Data)
{
EXTI->IMR = 0x00000000;
while (!(USART1->SR & USART_FLAG_TXE));
USART1->DR = (Data & (uint16_t)0x01FF);
EXTI->IMR = 0xfffff;
}
//串口2发送单个字节
void UART2_SendByte(u16 Data)
{
EXTI->IMR = 0x00000000;
while (!(USART2->SR & USART_FLAG_TXE));
USART2->DR = (Data & (uint16_t)0x01FF);
EXTI->IMR = 0xfffff;
}
//串口3发送单个字节
void UART3_SendByte(u16 Data)
{
EXTI->IMR = 0x00000000;
while (!(USART3->SR & USART_FLAG_TXE));
USART3->DR = (Data & (uint16_t)0x01FF);
EXTI->IMR = 0xfffff;
}
//串口1发送字符串
void UART1Write(char* data)
{
u16 i,len;
len=strlen((char*)data);
// DIR485_H ;
for (i=0; i<len; i++){
UART1_SendByte(data[i]);
}
}
//串口2发送字符串
void UART2Write(char* data)
{
u16 i,len;
len=strlen((char*)data);
for (i=0; i<len; i++){
UART2_SendByte(data[i]);
}
}
//串口3发送字符串
void UART3Write(char* data)
{
u16 i,len;
len=strlen((char*)data);
for (i=0; i<len; i++){
UART3_SendByte(data[i]);
}
}
//串口1发送HEX
void UART1Write_Hex(char* data, int len)
{
u16 i,len1;
len1=len;
for (i=0; i<len1; i++){
UART1_SendByte(data[i]);
}
}
//串口2发送HEX
void UART2Write_Hex(char* data, int len)
{
u16 i,len1;
len1=len;
for (i=0; i<len1; i++){
UART2_SendByte(data[i]);
}
}
void uart_init(u32 bound)
{
//GPIO端口设置
//GPIO端口设置
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
USART_DeInit(USART1); //复位串口1
USART_DeInit(USART2); //复位串口2
USART_DeInit(USART3); //复位串口2
//USART1_TX PA.9
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//USART1_RX PA.10
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//USART2_TX PA.2
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//USART2_RX PA.3
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//USART3_TX PB.10
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB.10
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化PB10
//USART3_RX PB.11
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化PB11
//Usart1 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器USART1
//Usart2 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器USART1
//Usart3 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
//USART 初始化设置
USART_InitStructure.USART_BaudRate = bound;//一般设置为9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启中断1
USART_Cmd(USART1, ENABLE); //使能串口
USART_Init(USART2, &USART_InitStructure);
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启中断2
USART_Cmd(USART2, ENABLE); //使能串口
USART_Init(USART3, &USART_InitStructure); //初始化串口3
USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//开启中断3
USART_Cmd(USART3, ENABLE); //使能串口3
}
unsigned int tmpdata;
void USART3_IRQHandler(void) //串口3中断服务程序
{
if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) //接收中断
{
USART_ClearITPendingBit(USART3,USART_IT_RXNE);
tmpdata=USART_ReceiveData(USART3);//(USART3->DR); //读取接收到的数据
}
}
usart.h
#ifndef __USART_H
#define __USART_H
#include "stdio.h"
void uart_init(u32 bound);
void UART1_SendByte(u16 Data);
void UART2_SendByte(u16 Data);
void UART3_SendByte(u16 Data);
void UART1Write(char* data);
void UART1Write_Hex(char* data, int len);
void UART2Write(char* data);
void UART2Write_Hex(char* data, int len);
void UART3Write(char* data);
#endif
|
|