找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9641|回复: 4
打印 上一主题 下一主题
收起左侧

51单片机NY3P035语音播报源程序原理图

[复制链接]
跳转到指定楼层
楼主
51单片机语音播报模块:
以8位STC89C52单片机为控制核心,利用DHT11、GY-30、MQ-2传感器实时采集温湿度、光照强度、气体浓度等环境参数,用户可以通过LCD1602液晶查看当前环境参数数据。NY3P035芯片控制语音播报,加入蓝牙通信接口电路,手机连接蓝牙模块,下位机和上位机进行通信,手机蓝牙串口界面可以接收当前的环境数据,手机发命令给单片机,可控制语音的播报。
实物图:


单片机源程序如下:
  1. #include <reg51.h>
  2. #include <intrins.h>
  3. #include <uart.h>
  4. #define uchar unsigned char
  5. #define uint unsigned int

  6. uchar write_add[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};       //数据的地址
  7. uchar read_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};
  8. uchar code table3[]="                ";                         //清屏内容


  9. sbit rs=P1^0;                  //LCD1602
  10. sbit rw=P1^1;                   //LCD1602
  11. sbit e=P2^5;                  //LCD1602

  12. sbit SCL=P1^5;        //IIC时钟引脚定义                  //BH1750fvi光照强度传感器
  13. sbit SDA=P1^6;        //IIC数据引脚定义



  14. sbit cs=P3^6;                                  //TLC2543
  15. sbit clk=P2^7;
  16. sbit sdi=P2^6;
  17. sbit sdo=P2^4;
  18. sbit flag=P3^4;
  19. sbit bit7=B^7;


  20. sbit Data =P1^3;          //DHT11

  21. int temperature;                                                //全局变量 温度
  22. int Count;                                                                   //T0中断次数

  23. sbit KEY1=P3^5;                  //播放语音
  24. //sbit KEY2=P3^6;                  //暂停

  25. sbit BUSY=P2^0;                  //语音芯片
  26. sbit DATA=P2^1;                  //语音芯片
  27. sbit RST=P2^2;                  //语音芯片         


  28. void delay_ms( uint ms);
  29. void delay1();
  30. void ADC_read( uint ch);
  31. void volt_result();
  32. void disp_volt(uint value);

  33. uchar y;
  34. uchar first,second,third,forth;
  35. bit date;
  36. uint adval=0;
  37. uint volt=0;
  38. uchar temppp=0;
  39. uchar flag_table[3]={0};
  40. uchar flagx;
  41. bit SetFlag=0;     //更新时间标志位

  42. uchar shi,ge;
  43. uchar  temp,tempp;                  //八个bit数据位的变量
  44. uchar  comdata;                      //总线接收到的数据
  45. uchar  T_data_H_temp,T_data_L_temp,RH_data_H_temp,RH_data_L_temp,checkdata_temp,temp_data;
  46. uchar  T_data_H,T_data_L,RH_data_H,RH_data_L,checkdata;
  47. void music(uchar k);



  48. uchar uart_wendu_shi,uart_wendu_ge,uart_shidu_shi,uart_shidu_ge;
  49. uchar uart_sun_shi,uart_sun_ge;

  50. #define          SlaveAddress   0x46 //定义器件在IIC总线中的从地址,根据ALT  ADDRESS地址引脚不同修改
  51.                               //ALT  ADDRESS引脚接地时地址为0x46,接电源时地址为0xB8
  52. typedef   unsigned char BYTE;
  53. typedef   unsigned short WORD;

  54. BYTE    BUF[8];                         //接收数据缓存区              
  55. uchar   gee,shii,bai,qian,wan;            //显示变量
  56. int     dis_data;   

  57. void delay_nms(unsigned int k);

  58. void Init_BH1750(void);

  59. void WriteDataLCM(uchar dataW);
  60. void WriteCommandLCM(uchar CMD,uchar Attribc);
  61. void DisplayOneChar(uchar X,uchar Y,uchar DData);
  62. void conversion(uint temp_data);

  63. void  Single_Write_BH1750(uchar REG_Address);      //单个写入数据
  64. uchar Single_Read_BH1750(uchar REG_Address);       //单个读取内部寄存器数据
  65. void  Multiple_Read_BH1750();                      //连续的读取内部寄存器数据
  66. //------------------------------------
  67. void Delay5us();
  68. void Delay5ms();
  69. void BH1750_Start();                    //起始信号
  70. void BH1750_Stop();                     //停止信号
  71. void BH1750_SendACK(bit ack);           //应答ACK
  72. bit  BH1750_RecvACK();                  //读ack
  73. void BH1750_SendByte(BYTE dat);         //IIC单个字节写
  74. BYTE BH1750_RecvByte();                 //IIC单个字节读

  75. /*********************************************************************************************************************/
  76. void delay1(uint z)                                                                   //延时1ms函数
  77. {
  78.         uint x,y;
  79.         for(x=z;x>0;x--)
  80.                 for(y=80;y>0;y--);
  81. }

  82. /***********************************
  83. 延时 BH1750
  84. ************************************/

  85. /**************************************
  86. 延时5微秒(STC90C52RC@12M)
  87. 不同的工作环境,需要调整此函数,注意时钟过快时需要修改
  88. 当改用1T的MCU时,请调整此延时函数
  89. **************************************/
  90. void Delay5us()
  91. {
  92.     _nop_();_nop_();_nop_();_nop_();
  93.     _nop_();_nop_();_nop_();_nop_();
  94.         _nop_();_nop_();_nop_();_nop_();
  95.         _nop_();_nop_();_nop_();_nop_();
  96. }

  97. /**************************************
  98. 延时5毫秒(STC90C52RC@12M)
  99. 不同的工作环境,需要调整此函数
  100. 当改用1T的MCU时,请调整此延时函数
  101. **************************************/
  102. void Delay5ms()
  103. {
  104.     WORD n = 560;

  105.     while (n--);
  106. }

  107. //毫秒延时**************************
  108. void delay_nms(unsigned int k)        
  109. {                                                
  110. unsigned int i,j;                                
  111. for(i=0;i<k;i++)
  112. {                        
  113. for(j=0;j<121;j++)                        
  114. {;}}                                                
  115. }

  116. /*******************************/

  117. void write_com(uchar com)                         //写指令函数
  118. {
  119.         rw=0;
  120.         delay1(5);
  121.         rs=0;
  122.         delay1(5);
  123.         e=1;
  124.         delay1(5);
  125.         P0=com;
  126.         delay1(5);
  127.         e=0;
  128.         delay1(5);        
  129. }

  130. void write_date(uchar date)                        //写数据函数
  131. {                                                                        
  132.         rw=0;
  133.         delay1(5);
  134.         rs=1;
  135.         delay1(5);
  136.         e=1;
  137.         delay1(5);
  138.         P0=date;
  139.         delay1(5);
  140.         e=0;
  141.         delay1(5);        
  142. }

  143. void LCDinit()                                                    //初始化函数
  144. {        
  145.         uchar num;
  146.         e=0;                                                    // 时序表e初始为0
  147.         write_com(0x38);                        //设置16*2显示,5*7点阵,8位数据接口
  148.         write_com(0x0c);                                //设置光标
  149.         write_com(0x06);                                //光标自动加1,光标输入方式
  150.         write_com(0x01);                                //清屏
  151.         write_com(0x80);                                //设置初始显示位置
  152.         for(num=0;num<16;num++)
  153.         {
  154. //                write_date(table1[num]);
  155.                 delay1(5);
  156.         }
  157.         write_com(0x80+0x40);
  158.         for(num=0;num<16;num++)
  159.         {
  160. //                write_date(table2[num]);
  161.                 delay1(5);
  162.         }                                          
  163. }

  164. void SetTime_dispaly(uchar add,uchar dat)         //第一个:参数的地址,第二个:参数的内容
  165. {

  166.         shi=dat/10;                                                        //把温度的十位提取出来
  167.         ge=dat%10;                                                        //把温度的个位提取出来
  168.         write_com(add);                                                    //要写的地址
  169.         write_date(0x30+shi);                                //十位的内容   1602字符库
  170.         write_date(0x30+ge);                                //个位的内容   1602字符库
  171. }

  172. void Date_dispaly(uchar add,uchar dat)         //第一个:参数的地址,第二个:参数的内容
  173. {
  174. //        uchar shi,ge;
  175.         shi=dat/16;                                                        //把温度的十位提取出来
  176.         ge=dat%16;                                                        //把温度的个位提取出来
  177.         write_com(add);                                                    //要写的地址
  178.         write_date(0x30+shi);                                //十位的内容   1602字符库
  179.         write_date(0x30+ge);                                //个位的内容   1602字符库        
  180.                                           
  181. }

  182. void LCD_Clean(uchar i)                                        //液晶屏清除显示
  183. {
  184.         uchar num;
  185.         if(i==1)
  186.         {
  187.                 write_com(0x80);                                //设置初始显示位置
  188.                 for(num=0;num<16;num++)                        //显示第一行内容
  189.                 {
  190.                         write_date(table3[num]);
  191.                         delay1(1);
  192.                 }
  193.         }
  194.         if(i==2)
  195.         {
  196.                 write_com(0x80+0x40);
  197.                 for(num=0;num<16;num++)                        //显示第二行内容
  198.                 {
  199.                         write_date(table3[num]);
  200.                         delay1(1);
  201.                 }
  202.         }
  203. }

  204. void LCD_Display_String(unsigned char line,unsigned char *string)
  205. {                                                                                 //液晶屏显示内容,把要显示的内容写到对应的位置
  206.         unsigned char i;
  207.         unsigned char address=0;
  208.         if(line==1)
  209.         {
  210.                 address=0x80;                                         //0X80是第1行的第1个位置  ,0x81第2位
  211.         }
  212.         else if(line==2)
  213.         {
  214.                 address=0x80+0x40;                          //0X80+0x40是第2行的第1个位置  ,0X80+0x40+1是第2行第2位
  215.         }
  216.         
  217.         for(i=0;i<16;i++)
  218.         {
  219.                 write_com(address);
  220.                 write_date(string[i]);
  221.                 address++;
  222.         }
  223. }

  224. /***********************************************语音*****************************************************************/
  225. void music(uchar k)                                                  
  226. {
  227.         RST=1;
  228.         delay(2);
  229.         RST=0;                                                                  //发送复位脉冲,即起始信号
  230.         delay(2);
  231.         while(k>0)                                                          //发送K个脉冲,播放第K段内容
  232.         {
  233.                 DATA=1;
  234.                 delay(1);
  235.                 DATA=0;
  236.                 delay(1);
  237.                 k--;
  238.         }
  239. }

  240. void Voice(void)
  241. {        
  242.             
  243.         if(KEY1==0)                                                           //按键按下,播放温湿度。
  244.         {
  245.                 delay_nms(10);
  246.                 if(KEY1==0)
  247.                 {                                                                  
  248.                         music(23);                                           //你好
  249.                         while(!BUSY);
  250.                         delay(1000);                                   //中间间隔约1s
  251.                 //        music(24);                                           //我是语音播报环境测试仪
  252.                 //        while(!BUSY);
  253.                 //        delay(500);                                       //中间间隔约0.5s
  254.                         music(19);                                           //播放“现在温度是
  255.                         while(!BUSY);                                   //等待播完
  256.                         if(T_data_H/10==1)                           //温度大于10小于20
  257.                         {
  258.                                 music(12);                                      //播放“十”
  259.                                 while(!BUSY);                           //等待播完
  260.                         }
  261.                         if(T_data_H/10>1)                           //温度大于20
  262.                         {
  263.                                 music(T_data_H/10+2);           //播放“高位”
  264.                                 while(!BUSY);                           //等待播完
  265.                                 music(12);                                   //播放“十”
  266.                                 while(!BUSY);                           //等待播完
  267.                         }
  268.                         if((T_data_H%10)!=0)                   //低位不等于0
  269.                         {
  270.                                 music(T_data_H%10+2);           //播放“低位”
  271.                                 while(!BUSY);                           //等待播完
  272.                         }
  273.                         if(T_data_H==0)                                   //温度等于0
  274.                         {
  275.                                 music(1);                                     //播放“低位”
  276.                                 while(!BUSY);                           //等待播完
  277.                         }
  278.                         music(18);                                           //播放“度”
  279.                         while(!BUSY);                                   //等待播完



  280.                         delay(1000);                                   //中间间隔约1s
  281.                         music(20);                                           //播放“现在湿度是”
  282.                         while(!BUSY);                                   //等待播完
  283.                         music(17);                                           //播放“百分之”
  284.                         while(!BUSY);                                   //等待播完
  285.                         if(RH_data_H/10==1)                           //湿度大于10小于20
  286.                         {
  287.                                 music(12);                                      //播放“十”
  288.                                 while(!BUSY);                           //等待播完
  289.                         }
  290.                         if(RH_data_H/10>1)                           //湿度大于20
  291.                         {
  292.                                 music(RH_data_H/10+2);           //播放“高位”
  293.                                 while(!BUSY);                           //等待播完
  294.                                 music(12);                                   //播放“十”
  295.                                 while(!BUSY);                           //等待播完
  296.                         }
  297.                         if((RH_data_H%10)!=0)                   //低位不等于0
  298.                         {
  299.                                 music(RH_data_H%10+2);           //播放“低位”
  300.                                 while(!BUSY);                           //等待播完
  301.                         }
  302.                         if(RH_data_H==0)                           //湿度等于0
  303.                         {
  304.                                 music(2);                                     //播放“低位”
  305.                                 while(!BUSY);                           //等待播完
  306.                          }


  307.                                 delay(1000);                                    //间隔1S
  308.                                 music(21);                                     //光照强度是
  309.                                 while(!BUSY);
  310.                                 if(tempp/10==1)                             //光照强度大于10小于20
  311.                         {
  312.                                 music(12);                                        //播放“十”
  313.                                 while(!BUSY);                             //等待播完
  314.                         }
  315.                         if(tempp/10>1)                                 //光照强度大于20
  316.                         {
  317.                                 music(tempp/10+2);                 //播放“高位”
  318.                                 while(!BUSY);                             //等待播完
  319.                                 music(12);                                     //播放“十”
  320.                                 while(!BUSY);                             //等待播完
  321.                         }
  322.                         if((tempp%10)!=0)                         //低位不等于0
  323.                         {
  324.                                 music(tempp%10+2);                 //播放“低位”
  325.                                 while(!BUSY);                             //等待播完
  326.                         }
  327.                         if(tempp==0)                                 //光照强度等于0
  328.                         {
  329.                                 music(2);                                       //播放“低位”
  330.                                 while(!BUSY);                             //等待播完
  331.                          }        
  332.                         



  333.                          delay(1000);
  334.                          music(22);
  335.                          while(!BUSY);
  336.                          music(17);
  337.                          while(!BUSY);
  338.                          if(volt/10==1)                           //烟雾浓度大于10小于20
  339.                         {
  340.                                 music(12);                                      //播放“十”
  341.                                 while(!BUSY);                           //等待播完
  342.                         }
  343.                         if(volt/10>1)                               //烟雾浓度大于20
  344.                         {
  345.                                 music(volt/10+2);               //播放“高位”
  346.                                 while(!BUSY);                           //等待播完
  347.                                 music(12);                                   //播放“十”
  348.                                 while(!BUSY);                           //等待播完
  349.                         }
  350.                         if((volt%10)!=0)                       //低位不等于0
  351.                         {
  352.                                 music(volt%10+2);               //播放“低位”
  353.                                 while(!BUSY);                           //等待播完
  354.                         }
  355.                         if(volt==0)                                   //烟雾浓度等于0
  356.                         {
  357.                                 music(2);                                     //播放“低位”
  358.                                 while(!BUSY);                           //等待播完
  359.                          }

  360.         
  361.                 }
  362.         }
  363. }        
  364. /*******************************温湿度DHT11*************************************************/
  365. void Delay_DHT(uint j)
  366. {      
  367.         uchar i;
  368.     for(;j>0;j--)
  369.           {         
  370.                 for(i=0;i<27;i++);
  371.           }
  372. }

  373. void  Delay_10us(void)                  //使用12M晶振的时间刚好为10us
  374. {
  375.         uchar i;
  376.         i--;
  377.         i--;
  378.         i--;
  379.         i--;
  380.         i--;
  381.         i--;
  382. }

  383. void  COM(void)
  384. {
  385.         uchar i;
  386.         for(i=0;i<8;i++)           
  387.         {
  388.                 while(!Data);
  389.                 Delay_10us();
  390.                 Delay_10us();
  391.                 Delay_10us();
  392.                 Delay_10us();
  393.                 Delay_10us();
  394.                 temp=0;
  395.                 if(Data)          //判断数据位是0还是1,发出低电平数据开始信号后,数据拉高,高电平的时间决定数据位为1或者0,
  396.                 temp=1;                    //当高电平时间小于30us时为0,大于30us且小于70us为1,大于70us则进入下一个bit
  397.                 while(Data);  //等待数据接受完
  398.                 comdata<<=1;  //左移一位
  399.                 comdata|=temp;//将该位赋给comdata      
  400.         }
  401. }

  402. void RH(void)
  403. {
  404.   //主机拉低18ms
  405.    Data=0;
  406.    Delay_DHT(180);
  407.    Data=1;
  408. //总线由上拉电阻拉高 主机延时20us
  409.    Delay_10us();
  410.    Delay_10us();
  411.    Delay_10us();
  412.    Delay_10us();
  413. //主机设为输入 判断从机响应信号
  414.    Data=1;
  415. //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行         
  416.    if(!Data)                 //T !         
  417.    {
  418.          //判断从机是否发出 80us 的低电平响应信号是否结束         
  419.            while(!Data);
  420.          //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
  421.            while(Data);
  422.          //数据接收状态                 
  423.                                                                            //部分用于以后扩展 , 现读出为零 . 操作流程如下 :
  424.                                                                         //一次完整的数据传输为 40bit, 高位先出。
  425.                                                                         //数据格式 :8bit 湿度整数数据 +8bit 湿度小数数据
  426.            COM();                                                //+8bi 温度整数数据 +8bit 温度小数数据
  427.            RH_data_H_temp=comdata;
  428.            COM();
  429.            RH_data_L_temp=comdata;
  430.            COM();
  431.            T_data_H_temp=comdata;
  432.            COM();
  433.            T_data_L_temp=comdata;
  434.            COM();
  435.            checkdata_temp=comdata;

  436.            Data=1;                                                //总线拉高,进入空闲模式
  437.          
  438.            temp=(T_data_H_temp+T_data_L_temp+RH_data_H_temp+RH_data_L_temp);
  439.            if(temp==checkdata_temp)                //数据校验
  440.            {
  441.                      RH_data_H=RH_data_H_temp;
  442.                      RH_data_L=RH_data_L_temp;
  443.                   T_data_H=T_data_H_temp;         //温湿度的分辨率都为1,小数部分都是0
  444.                      T_data_L=T_data_L_temp;
  445.                      checkdata=checkdata_temp;
  446.            }
  447.    }
  448. }
  449. /*********************************************************************************************************************/
  450. void Timer_init(void)
  451. {
  452.         TMOD=0x11;                                              //设置定时器0为工作方式1
  453.         TH0=(65536-50000)/256;              //50MS定时
  454.         TL0=(65536-50000)%256;
  455.         EA=1;                                                      //开定时器T0的中断        总中断
  456.         ET0=1;                                                   //允许T0中断
  457.         TR0=1;                                                   //开启定时器
  458. }

  459. /************************************************************************
  460. 光照强度BH1750
  461. *************************************************************************/


  462. void SetBH1750_dispaly(uchar addd,uchar temp_data)         //第一个:参数的地址,第二个:参数的内容
  463. {
  464.          uchar wan,qian,bai,shii,gee;
  465.          wan=temp_data/10000;
  466.          temp_data=temp_data%10000;
  467.          qian=temp_data/1000%10;
  468.          temp_data=temp_data%1000;
  469.          bai=temp_data/100%10;
  470.          temp_data=temp_data%100;
  471.          shii=temp_data/10%10;
  472.          temp_data=temp_data%10;
  473.          gee=temp_data/1%10;
  474.          write_com(addd);
  475.          write_date(0x30+wan);
  476.          write_date(0x30+qian);
  477.          write_date(0x30+bai);
  478.          write_date(0x30+shii);
  479.          write_date(0x30+gee);
  480.                  
  481. }                                         

  482. /**************************************
  483. 起始信号
  484. **************************************/
  485. void BH1750_Start()
  486. {
  487.     SDA = 1;                    //拉高数据线
  488.     SCL = 1;                    //拉高时钟线
  489.     Delay5us();                 //延时
  490.     SDA = 0;                    //产生下降沿
  491.     Delay5us();                 //延时
  492.     SCL = 0;                    //拉低时钟线
  493. }

  494. /**************************************
  495. 停止信号
  496. **************************************/
  497. void BH1750_Stop()
  498. {
  499.     SDA = 0;                    //拉低数据线
  500.     SCL = 1;                    //拉高时钟线
  501.     Delay5us();                 //延时
  502.     SDA = 1;                    //产生上升沿
  503.     Delay5us();                 //延时
  504. }

  505. /**************************************
  506. 发送应答信号
  507. 入口参数:ack (0:ACK 1:NAK)
  508. **************************************/
  509. void BH1750_SendACK(bit ack)
  510. {
  511.     SDA = ack;                  //写应答信号
  512.     SCL = 1;                    //拉高时钟线
  513.     Delay5us();                 //延时
  514.     SCL = 0;                    //拉低时钟线
  515.     Delay5us();                 //延时
  516. }

  517. /**************************************
  518. 接收应答信号
  519. **************************************/
  520. bit BH1750_RecvACK()
  521. {
  522.     SCL = 1;                    //拉高时钟线
  523.     Delay5us();                 //延时
  524.     CY = SDA;                   //读应答信号
  525.     SCL = 0;                    //拉低时钟线
  526.     Delay5us();                 //延时

  527.     return CY;
  528. }

  529. /**************************************
  530. 向IIC总线发送一个字节数据
  531. **************************************/
  532. void BH1750_SendByte(BYTE dat)
  533. {
  534.     BYTE i;

  535.     for (i=0; i<8; i++)         //8位计数器
  536.     {
  537.         dat <<= 1;              //移出数据的最高位
  538.         SDA = CY;               //送数据口
  539.         SCL = 1;                //拉高时钟线
  540.         Delay5us();             //延时
  541.         SCL = 0;                //拉低时钟线
  542.         Delay5us();             //延时
  543.     }
  544.     BH1750_RecvACK();
  545. }

  546. /**************************************
  547. 从IIC总线接收一个字节数据
  548. **************************************/
  549. BYTE BH1750_RecvByte()
  550. {
  551.     BYTE i;
  552.     BYTE dat = 0;

  553.     SDA = 1;                    //使能内部上拉,准备读取数据,
  554.     for (i=0; i<8; i++)         //8位计数器
  555.     {
  556.         dat <<= 1;
  557.         SCL = 1;                //拉高时钟线
  558.         Delay5us();             //延时
  559.         dat |= SDA;             //读数据               
  560.         SCL = 0;                //拉低时钟线
  561.         Delay5us();             //延时
  562.     }
  563.     return dat;
  564. }


  565. void Single_Write_BH1750(uchar REG_Address)
  566. {
  567.     BH1750_Start();                  //起始信号
  568.     BH1750_SendByte(SlaveAddress);   //发送设备地址+写信号
  569.     BH1750_SendByte(REG_Address);    //内部寄存器地址,
  570.   //  BH1750_SendByte(REG_data);       //内部寄存器数据,
  571.     BH1750_Stop();                   //发送停止信号
  572. }

  573. //*********************************************************
  574. //
  575. //连续读出BH1750内部数据
  576. //
  577. //*********************************************************
  578. void Multiple_read_BH1750(void)
  579. {   uchar i;        
  580.     BH1750_Start();                          //起始信号
  581.     BH1750_SendByte(SlaveAddress+1);         //发送设备地址+读信号
  582.         
  583.          for (i=0; i<3; i++)                      //连续读取2个地址数据,存储中BUF
  584.     {
  585.         BUF[i] = BH1750_RecvByte();          //BUF[0]存储0x32地址中的数据
  586.         if (i == 3)
  587.         {

  588.            BH1750_SendACK(1);                //最后一个数据需要回NOACK
  589.         }
  590.         else
  591.         {               
  592.           BH1750_SendACK(0);                //回应ACK
  593.        }
  594.    }

  595.     BH1750_Stop();                          //停止信号
  596.     Delay5ms();                                                //加延时
  597. }

  598. //初始化BH1750,根据需要请参考pdf进行修改****
  599. void Init_BH1750()
  600. {
  601.    Single_Write_BH1750(0x01);  

  602. }

  603. //2543
  604. void ADC_read( uint ch)
  605. {
  606.       uchar i;
  607.           sdo=1;
  608.           clk=0;
  609.           cs=1;
  610.           delay_nms(1);
  611.           cs=0;
  612.           B=ch;
  613.           for(i=8;i>0;i--)
  614.           {
  615.              date=sdo;
  616.                  sdi=bit7;
  617.                  clk=1;
  618.                  B=B<<1;
  619.                  clk=0;
  620.                  temppp=temppp<<1;
  621.                  if(date==1)
  622.                    {temppp++;}
  623.           }
  624.              adval=temppp;
  625.                  adval=adval<<4;
  626.                  for(i=4;i>0;i--)
  627.                  {
  628.                      date=sdo;
  629.                          temppp=temppp<<1;
  630.                          if(date==1)
  631.                             {temppp++;}
  632.                          clk=1;
  633.                          clk=0;
  634.                  }
  635.                  cs=1;
  636.                  adval=adval+temppp;
  637.                  volt=adval;
  638. }                  

  639. void ADC_dispaly(uchar adddd,uchar value)
  640. {
  641.      first=(uchar)(value/1000);
  642.          delay_nms(1);
  643.          second=(uchar)(value%1000/100);
  644.          delay_nms(1);
  645.          third=(uchar)(value%100/10);
  646.          delay_nms(1);
  647.          forth=(uchar)(value%10);
  648.          delay_nms(1);
  649.          write_com(adddd);
  650.          write_date(0x30+first);
  651.          write_date(0x30+second);
  652.          write_date(0x30+third);
  653.          write_date(0x30+forth);
  654.          


  655.          if(first>4)
  656.             {flagx=0;}
  657.           else
  658.             {flagx=1;}
  659.         flag_table[0]=flag_table[1]        ;
  660.         flag_table[1]=flag_table[2]        ;
  661.         flag_table[2]=flagx        ;

  662. }


  663. void main()
  664. {
  665.         delay_nms(100);               //延时100ms
  666.         BUSY=0;                           //语音芯片
  667.         DATA=0;                           //语音芯片
  668.         RST=0;
  669.         LCDinit();                           //液晶初始化
  670.         Init_BH1750();         //初始化BH1750
  671.         Timer_init();
  672.         init();                               //串口初始化


  673.         while(1)
  674.         {         
  675.                                 
  676.                         if(Count>=10)                                                                     //每0.5秒采一次温湿度,避免显示错乱,10*50ms=0.5s
  677.                 {
  678.                                 RH();                                                                           //读取温湿度
  679.                                 uart_wendu_shi=T_data_H/10;                 
  680.                     uart_wendu_ge=T_data_H%10;
  681.                                 uart_shidu_shi=RH_data_H/10;
  682.                                 uart_shidu_ge=RH_data_H%10;
  683.                                 
  684.                                                                                                       
  685.                                 SetTime_dispaly(0x80+2,T_data_H);                     //显示温度
  686.                                 SetTime_dispaly(0x80+0x40+2,RH_data_H);            //显示湿度
  687.                                 
  688.                  


  689.                                 write_com(0x80);                           
  690.                                 write_date(0x54);                           //写 T                 温度
  691.                                 write_com(0x80+0x40);                  
  692.                                 write_date(0x52);                           //写 R                 湿度
  693.                                 write_com(0x80+6);                           
  694.                                 write_date(0x53);                           //写 S                 光照强度
  695.                                 write_com(0x80+0x40+6);                  
  696.                                 write_date(0x57);                           //写 W                 气体烟雾

  697.                                                                                             
  698.                                 write_com(0x80+4);                           
  699.                                 write_date(0x43);                           //写 C
  700.                                 write_com(0x80+0x40+4);                                         
  701.                                 write_date(0x25);                           //写 %
  702.                                 write_com(0x80+13);
  703.                                 write_date(0x4C);                           //写 L
  704.                                 write_com(0x80+14);
  705.                                 write_date(0x78);                           //写 x
  706.                                 write_com(0x80+0x40+12);                                         
  707.                                 write_date(0x25);                           //写 %
  708.                                                                
  709.                                 Count=0;                                           //清零
  710.                                           
  711.                            
  712.                                 Single_Write_BH1750(0x01);          // power on
  713.                 Single_Write_BH1750(0x10);          // H- resolution mode
  714.                        delay_nms(180);                     //延时180ms
  715.                     Multiple_Read_BH1750();            //连续读出数据,存储在BUF中
  716.                       dis_data=BUF[0];
  717.                            dis_data=(dis_data<<8)+BUF[1];      //合成数据,即光照数据
  718.                         tempp=(float)dis_data/1.2;        
  719.                        
  720.                             SetBH1750_dispaly(0x80+8,tempp);
  721.                                 uart_sun_shi=tempp/10;                                          //串口
  722.                                 uart_sun_ge=tempp%10;                                           //
  723.                

  724.                                  if(K2==0)
  725.                 {
  726.                         delay_nms(20);
  727.                         if(!K2)
  728.                         {
  729.                                 while(!K2);                  
  730.                                 send(uart_wendu_shi,uart_wendu_ge,uart_shidu_shi,uart_shidu_ge,uart_sun_shi,uart_sun_ge);
  731.                         }
  732.                 }

  733.                                 ADC_read();
  734.                                 volt=volt*5000/4095;
  735.                                 ADC_dispaly(0x80+0x40+8,volt);
  736.         

  737.             y=SBUF;
  738.                 SetFlag=1;
  739.                    switch(y)
  740.                 {
  741.                         case 0x01 :KEY1=0;break;
  742.                         
  743.                  }

  744.          
  745.                 Voice();


  746.                    }
  747.                 }

  748.         }

  749. void Timer0() interrupt 1                                        //定时器T0中断函数
  750. {
  751.         TH0=(65536-50000)/256;                                        //赋初值=50ms
  752.         TL0=(65536-50000)%256;                                        //TH0=3C,TL0=B0
  753.         Count++;                                                                //每中断一次,Count加一,计数20次,表示1s的时间到
  754. }
复制代码

APP:无
上位机:无
单片机程序和原理图下载(仅供参考): 51单片机语音播报.7z (7.55 MB, 下载次数: 98)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:328014 发表于 2020-8-19 17:45 | 只看该作者
好资料,51hei有你更精彩
回复

使用道具 举报

板凳
ID:663502 发表于 2020-8-19 20:41 | 只看该作者
我正好需要这个产品,多谢多谢~~
回复

使用道具 举报

地板
ID:1088575 发表于 2023-7-15 15:42 | 只看该作者
不错不错,正好可以参考参考!
回复

使用道具 举报

5#
ID:688460 发表于 2023-7-16 08:05 | 只看该作者
没有上位机和手机APP程序,意义不大!完善它给你50积分
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表