51单片机语音播报模块:
以8位STC89C52单片机为控制核心,利用DHT11、GY-30、MQ-2传感器实时采集温湿度、光照强度、气体浓度等环境参数,用户可以通过LCD1602液晶查看当前环境参数数据。NY3P035芯片控制语音播报,加入蓝牙通信接口电路,手机连接蓝牙模块,下位机和上位机进行通信,手机蓝牙串口界面可以接收当前的环境数据,手机发命令给单片机,可控制语音的播报。
实物图:
单片机源程序如下:
#include
#include
#include
#define uchar unsigned char
#define uint unsigned int
uchar write_add[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80}; //数据的地址
uchar read_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};
uchar code table3[]=" "; //清屏内容
sbit rs=P1^0; //LCD1602
sbit rw=P1^1; //LCD1602
sbit e=P2^5; //LCD1602
sbit SCL=P1^5; //IIC时钟引脚定义 //BH1750fvi光照强度传感器
sbit SDA=P1^6; //IIC数据引脚定义
sbit cs=P3^6; //TLC2543
sbit clk=P2^7;
sbit sdi=P2^6;
sbit sdo=P2^4;
sbit flag=P3^4;
sbit bit7=B^7;
sbit Data =P1^3; //DHT11
int temperature; //全局变量 温度
int Count; //T0中断次数
sbit KEY1=P3^5; //播放语音
//sbit KEY2=P3^6; //暂停
sbit BUSY=P2^0; //语音芯片
sbit DATA=P2^1; //语音芯片
sbit RST=P2^2; //语音芯片
void delay_ms( uint ms);
void delay1();
void ADC_read( uint ch);
void volt_result();
void disp_volt(uint value);
uchar y;
uchar first,second,third,forth;
bit date;
uint adval=0;
uint volt=0;
uchar temppp=0;
uchar flag_table[3]={0};
uchar flagx;
bit SetFlag=0; //更新时间标志位
uchar shi,ge;
uchar temp,tempp; //八个bit数据位的变量
uchar comdata; //总线接收到的数据
uchar T_data_H_temp,T_data_L_temp,RH_data_H_temp,RH_data_L_temp,checkdata_temp,temp_data;
uchar T_data_H,T_data_L,RH_data_H,RH_data_L,checkdata;
void music(uchar k);
uchar uart_wendu_shi,uart_wendu_ge,uart_shidu_shi,uart_shidu_ge;
uchar uart_sun_shi,uart_sun_ge;
#define SlaveAddress 0x46 //定义器件在IIC总线中的从地址,根据ALT ADDRESS地址引脚不同修改
//ALT ADDRESS引脚接地时地址为0x46,接电源时地址为0xB8
typedef unsigned char BYTE;
typedef unsigned short WORD;
BYTE BUF[8]; //接收数据缓存区
uchar gee,shii,bai,qian,wan; //显示变量
int dis_data;
void delay_nms(unsigned int k);
void Init_BH1750(void);
void WriteDataLCM(uchar dataW);
void WriteCommandLCM(uchar CMD,uchar Attribc);
void DisplayOneChar(uchar X,uchar Y,uchar DData);
void conversion(uint temp_data);
void Single_Write_BH1750(uchar REG_Address); //单个写入数据
uchar Single_Read_BH1750(uchar REG_Address); //单个读取内部寄存器数据
void Multiple_Read_BH1750(); //连续的读取内部寄存器数据
//------------------------------------
void Delay5us();
void Delay5ms();
void BH1750_Start(); //起始信号
void BH1750_Stop(); //停止信号
void BH1750_SendACK(bit ack); //应答ACK
bit BH1750_RecvACK(); //读ack
void BH1750_SendByte(BYTE dat); //IIC单个字节写
BYTE BH1750_RecvByte(); //IIC单个字节读
/*********************************************************************************************************************/
void delay1(uint z) //延时1ms函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=80;y>0;y--);
}
/***********************************
延时 BH1750
************************************/
/**************************************
延时5微秒(STC90C52RC@12M)
不同的工作环境,需要调整此函数,注意时钟过快时需要修改
当改用1T的MCU时,请调整此延时函数
**************************************/
void Delay5us()
{
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
}
/**************************************
延时5毫秒(STC90C52RC@12M)
不同的工作环境,需要调整此函数
当改用1T的MCU时,请调整此延时函数
**************************************/
void Delay5ms()
{
WORD n = 560;
while (n--);
}
//毫秒延时**************************
void delay_nms(unsigned int k)
{
unsigned int i,j;
for(i=0;i { for(j=0;j<121;j++) {;}} } /*******************************/ void write_com(uchar com) //写指令函数 { rw=0; delay1(5); rs=0; delay1(5); e=1; delay1(5); P0=com; delay1(5); e=0; delay1(5); } void write_date(uchar date) //写数据函数 { rw=0; delay1(5); rs=1; delay1(5); e=1; delay1(5); P0=date; delay1(5); e=0; delay1(5); } void LCDinit() //初始化函数 { uchar num; e=0; // 时序表e初始为0 write_com(0x38); //设置16*2显示,5*7点阵,8位数据接口 write_com(0x0c); //设置光标 write_com(0x06); //光标自动加1,光标输入方式
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』