使用stc15单片机最小系统在万用板进行焊接 功能
1手机app控制(温度查询 报警 语音控制 调节亮度 查询亮度)
2语音串口控制 可以进行播报语音数据 控制
3检测人体 可以进行开关操作 或者手机振动 可以进行更改
4eerom保存温度的上下限
5使用串口连接433模块进行组网
单片机源程序如下:
- #include "mode.h"
- #include "config.h"
- #include "uart.h"
- #include "new.h"
- #include "pwm.h"
- #include "stdio.h"
- #include<string.h> //运算符函数
- extern xdata u8 uart1_shou[uatr];//串口1 接收的数据
- extern xdata u8 uart2_shou[uatr];
- extern xdata u8 uart3_shou[uatr];//串口1 接收的数据
- extern xdata u8 uart4_shou[uatr];
- extern int mode1;
- extern int mode2;
- extern int mode3;
- extern int mode4;
- extern unsigned char ds_18b20num[]; //用来保存温度
- extern unsigned char ds_18b20H[]; //用来保存温度
- extern unsigned char ds_18b20L[]; //用来保存温度
- extern unsigned char ADC_nume[7];//光照强度 数组
- extern bit run_18b20;//是否启动温度报警 标志位默认开启
- unsigned int rgb_r,rgb_g,rgb_b,reb_num;
- extern bit ET0_run;
- int run=1;//是否启动语音识别标志位 默认开启 可以在手机或者上位机软件中关闭
- void delay_ms(uint ms)
- {
- uint i;
- do{
- i = (uint)(MAIN_Fosc / 13000);
- while(--i) ; //14T per loop
- }while(--ms);
- }
- /*******************************************************************************
- * 函数名 : UART_1
- * 描述 : 串口1 接收到数据进行动作
- * 输入 :
- * 输出 :
- * 返回 :
- * 注意 :
- *******************************************************************************/
- void UART_1()
- {
- int ge,shi,bai;
-
- if(mode1!=0)//串口第一个字节不等于0 则表示有数据到来
- {
- ET0 = 0;//串口接收到数据 关闭定时器0的中断 防止乱码错误
- delay_ms(15);//延时一段时间 确定数据接收完成
-
- if(uart1_shou[0]=='H')//设置温度上限 上限数据
- {
- strcpy(ds_18b20H,uart1_shou+1);//将输入的数据 拷贝另外的数组中
- IapEraseSector(IAP_ADDRESS);//删除扇区数据 将数据全部写为ff
- delay_ms(15);//延时 确定删除完成 防止出现错误
- IapWrite_n(IAP_ADDRESS,ds_18b20H,5);//向eerom写入数据
- UART(1,"温度上限 设置完成");//向窗口发送数据 表示设置完成
- UART(1,ds_18b20H);//并将设置的数据发送到串口1
- }
- else if(uart1_shou[0]=='L')//设置温度上限 下限数据
- {
- strcpy(ds_18b20L,uart1_shou+1);//与上面同理
- IapEraseSector(IAP_ADDRESS1);//
- delay_ms(15);
- IapWrite_n(IAP_ADDRESS1,ds_18b20L,5);
- UART(1,"温度下限 设置完成");
- UART(1,ds_18b20L);
- }
- else if(uart1_shou[0]=='R')
- {
- bai=uart1_shou[1]-0x30;
- shi=uart1_shou[2]-0x30;
- ge =uart1_shou[3]-0x30;
- rgb_r=(bai*100)+(shi*10)+ge;
- PWM_NUM(rgb_r,rgb_g,rgb_b);
- UART(1,"RGB颜色 红色设置完成");
- }
- else if(uart1_shou[0]=='G')
- {
- bai=uart1_shou[1]-0x30;
- shi=uart1_shou[2]-0x30;
- ge =uart1_shou[3]-0x30;
- rgb_g=(bai*100)+(shi*10)+ge;
- PWM_NUM(rgb_r,rgb_g,rgb_b);
- UART(1,"RGB颜色 绿色设置完成");
- }
- else if(uart1_shou[0]=='B')
- {
- bai=uart1_shou[1]-0x30;
- shi=uart1_shou[2]-0x30;
- ge =uart1_shou[3]-0x30;
- rgb_b=(bai*100)+(shi*10)+ge;
- PWM_NUM(rgb_r,rgb_g,rgb_b);
- UART(1,"RGB颜色 蓝色设置完成");
- }
- else if(uart1_shou[0]=='M')
- {
- UART(2,"voice,");
- UART2_SendData(uart1_shou[1]);
- UART(2,",$");
-
-
- UART(1,"语音模块音量设置完成");
- }
-
-
- if(Find(1,"打开呼吸灯"))//串口第一个字节不等于0 则表示有数据到来)//串口第一个字节不等于0 则表示有数据到来
- {
- ET0_run= 1;//串口接收到数据 关闭定时器0的中断 防止乱码错误
- PWM_NUM(0,0,0);
- UART(1,"呼吸灯已开启");
- }
- else if(Find(1,"关闭呼吸灯"))//串口第一个字节不等于0 则表示有数据到来)//串口第一个字节不等于0 则表示有数据到来
- {
- ET0_run = 0;//串口接收到数据 关闭定时器0的中断 防止乱码错误
- PWM_NUM(rgb_r,rgb_g,rgb_b);
- UART(1,"呼吸灯已关闭");
- }
- else if(Find(1,"获取语音识别指令"))//串口第一个字节不等于0 则表示有数据到来)//串口第一个字节不等于0 则表示有数据到来
- {
- UART2_SendString("all$");
- delay_ms(1000);
- UART1_SendString(uart2_shou);
- }
- else if(Find(1,"打开灯光"))//串口第一个字节不等于0 则表示有数据到来)//串口第一个字节不等于0 则表示有数据到来
- {
- LED=0;
- UART(1,"灯光开启");
- }
- else if(Find(1,"关闭灯光"))//串口第一个字节不等于0 则表示有数据到来)//串口第一个字节不等于0 则表示有数据到来
- {
- LED=1;
- UART(1,"灯光关闭");
- }
- else if(Find(1,"重启语音模块"))//串口第一个字节不等于0 则表示有数据到来)//串口第一个字节不等于0 则表示有数据到来
- {
- UART_shouq(2,"reset$ ","重启成功!",2000);
- UART(1,"语音模块重启完成");
- }
- else if(Find(1,"打开指令触发"))//串口第一个字节不等于0 则表示有数据到来)//串口第一个字节不等于0 则表示有数据到来
- {
- UART_shouq(2,"PasswordTrigger,1,$","设置成功",2000);
- UART(1,"已设置成指令触发");
- }
- else if(Find(1,"关闭指令触发"))//串口第一个字节不等于0 则表示有数据到来)//串口第一个字节不等于0 则表示有数据到来
- {
- UART_shouq(2,"PasswordTrigger,0,$","设置成功",2000);
- UART(1,"已取消指令触发");
- }
- else if(Find(1,"温度查询"))//串口第一个字节不等于0 则表示有数据到来)//串口第一个字节不等于0 则表示有数据到来
- {
- UART(1,ds_18b20num);
- }
- else if(Find(1,"开启温度报警"))//串口第一个字节不等于0 则表示有数据到来)//串口第一个字节不等于0 则表示有数据到来
- {
- run_18b20=1;
- UART(1,"温度报警已开启");
- }
- else if(Find(1,"关闭温度报警"))//串口第一个字节不等于0 则表示有数据到来)//串口第一个字节不等于0 则表示有数据到来
- {
- run_18b20=0;
- UART(1,"温度报警已关闭");
- }
- else if(Find(1,"查询温度上限"))//串口第一个字节不等于0 则表示有数据到来)//串口第一个字节不等于0 则表示有数据到来
- { UART(1,"温度上限为");
- UART(1,ds_18b20H);
- }
- else if(Find(1,"查询温度下限"))//串口第一个字节不等于0 则表示有数据到来)//串口第一个字节不等于0 则表示有数据到来
- {
- UART(1,"温度下限为");
- UART(1,ds_18b20L);
- }
- else if(Find(1,"关闭语音识别"))//串口第一个字节不等于0 则表示有数据到来)//串口第一个字节不等于0 则表示有数据到来
- {
- run=0;
- UART(1,"已关闭语音识别");
- }
- else if(Find(1,"打开语音识别"))//串口第一个字节不等于0 则表示有数据到来)//串口第一个字节不等于0 则表示有数据到来
- {
- run=1;
- UART(1,"已打开语音识别");
- }
- else if(Find(1,"查询光照强度"))//串口第一个字节不等于0 则表示有数据到来)//串口第一个字节不等于0 则表示有数据到来
- {
- run=1;
- UART(1,"A");
- UART(1,ADC_nume);
- }
- else if(Find(1,"打开红灯"))//串口第一个字节不等于0 则表示有数据到来)//串口第一个字节不等于0 则表示有数据到来
- {
- pwm3(100);
- UART(1,"红灯已打开");
- }
- else if(Find(1,"打开绿灯"))//串口第一个字节不等于0 则表示有数据到来)//串口第一个字节不等于0 则表示有数据到来
- {
- pwm4(100);
- UART(1,"绿灯已打开");
- }
- else if(Find(1,"打开蓝灯"))//串口第一个字节不等于0 则表示有数据到来)//串口第一个字节不等于0 则表示有数据到来
- {
- pwm5(100);
- UART(1,"蓝灯已打开");
- }
-
- else if(Find(1,"关闭红灯"))//串口第一个字节不等于0 则表示有数据到来)//串口第一个字节不等于0 则表示有数据到来
- {
- pwm3(0);
- UART(1,"红灯已关闭");
- }
- else if(Find(1,"关闭绿灯"))//串口第一个字节不等于0 则表示有数据到来)//串口第一个字节不等于0 则表示有数据到来
- {
- pwm4(0);
- UART(1,"绿灯已关闭");
- }
- else if(Find(1,"关闭蓝灯"))//串口第一个字节不等于0 则表示有数据到来)//串口第一个字节不等于0 则表示有数据到来
- {
- pwm5(0);
- UART(1,"蓝灯已关闭");
- }
- ET0 = ET0_run;
- CLR_Buf1(1);//操作完成 清除数组中的数据
- }
- }
- /*******************************************************************************
- * 函数名 : UART_2()
- * 描述 : 串口2接收到数据进行动作
- * 输入 :
- * 输出 :
- * 返回 :
- * 注意 :
- *******************************************************************************/
- void UART_2()
- {
-
- if(mode2!=0&&run==1)//串口第一个字节不等于0 则表示有数据到来
- { ET0 = 0;
- delay_ms(15);
- if(uart2_shou[0]==101)//开灯
- {
- LED=0;
- UART(2,"play,051,$");//播放音乐 表示开关灯完成
- } else if(uart2_shou[0]==102)//关灯
- {
- LED=1;
- UART(2,"play,052,$");//播放音乐 表示开关灯完成
- }
- else if(uart2_shou[0]==103)//查询关键词
- {
- UART_shouq(2,"PasswordTrigger,1,$","设置成功",2000);
- UART(2,"play,053,$");//播放音乐 表示开关灯完成
- }
- else if(uart2_shou[0]==104)//允许指令触发 、
- {
- UART_shouq(2,"PasswordTrigger,0,$","设置成功",2000);
- UART(2,"play,054,$");//播放音乐 表示开关灯完成
- }
- else if(uart2_shou[0]==105)//打开红色
- {
- ET0_run=0;
- rgb_r=100;
- PWM_NUM(rgb_r,rgb_g,rgb_b);
- UART(2,"play,055,$");//播放音乐 表示开关灯完成
- }
- else if(uart2_shou[0]==106)//打开绿色
- {
- ET0_run=0;
- rgb_g=100;
- PWM_NUM(rgb_r,rgb_g,rgb_b);
- UART(2,"play,056,$");//播放音乐 表示开关灯完成
- }
- else if(uart2_shou[0]==107)//打开蓝色
- {
- ET0_run=0;
- rgb_b=100;
- PWM_NUM(rgb_r,rgb_g,rgb_b);
- UART(2,"play,057,$");//播放音乐 表示开关灯完成
- }
- else if(uart2_shou[0]==108)//关闭红色
- {
- ET0_run=0;
- rgb_r=0;
- PWM_NUM(rgb_r,rgb_g,rgb_b);
- UART(2,"play,058,$");//播放音乐 表示开关灯完成
- }
- else if(uart2_shou[0]==109)//关闭绿色
- {
- ET0_run=0;
- rgb_g=0;
- PWM_NUM(rgb_r,rgb_g,rgb_b);
- UART(2,"play,059,$");//播放音乐 表示开关灯完成
- }
- else if(uart2_shou[0]==110)//关闭蓝色
- {
- ET0_run=0;
- rgb_b=0;
- PWM_NUM(rgb_r,rgb_g,rgb_b);
- UART(2,"play,060,$");//播放音乐 表示开关灯完成
- }
- else if(uart2_shou[0]==111)//打开呼吸灯
- {
- ET0_run=1;
- UART(2,"play,061,$");//播放音乐 表示开关灯完成
- }
- else if(uart2_shou[0]==112)//关闭呼吸灯
- {
- ET0_run=0;
- UART(2,"play,062,$");//播放音乐 表示开关灯完成
- }
- else if(uart2_shou[0]==113)//打开温度报警
- {
- run_18b20=1;
- UART(2,"play,063,$");//播放音乐 表示开关灯完成
- }
- else if(uart2_shou[0]==114)//关闭温度报警
- {
- run_18b20=0;
- UART(2,"play,064,$");//播放音乐 表示开关灯完成
- }
- else if(uart2_shou[0]==115)//查询温度数据上限
- {
- MOR_DS18B20(2,1);
- }
- else if(uart2_shou[0]==116)//查询温度下限
- {
- MOR_DS18B20(1,1);
-
- }
- else if(uart2_shou[0]==117)//查询温度数据
- {
- MOR_DS18B20(0,1);
- }
- ET0 = ET0_run;
- CLR_Buf1(2);//操作完成 清除数组中的数据
- }
- }
- /*******************************************************************************
- * 函数名 : UART_3
- * 描述 : 串口3 接收到数据进行动作
- * 输入 :
- * 输出 :
- * 返回 :
- * 注意 :
- *******************************************************************************/
- void UART_3()
- {
- if(mode3!=0)//串口第一个字节不等于0 则表示有数据到来
- {
- delay_ms(15);
- UART(3,uart3_shou);
- UART3_SendString("ok");
-
- CLR_Buf1(3);//操作完成 清除数组中的数据
- }
- }
- /*******************************************************************************
- * 函数名 : Find
- * 描述 : 串口2接收到数据进行动作
- * 输入 :
- * 输出 :
- * 返回 :
- * 注意 :
- *******************************************************************************/
- void UART_4()
- {
- if(mode4!=0)//串口第一个字节不等于0 则表示有数据到来
- {
- delay_ms(15);
- UART(4,uart4_shou);
- UART4_SendString("ok");
-
- CLR_Buf1(4);//操作完成 清除数组中的数据
- }
- }
- void MOR_DS18B20(uint a,bit run)
- {
- unsigned char MODE_DS18B20[10];//240为 “当前温度为”
- while(run)
- {
- if(a==0)
- {
- strcpy(MODE_DS18B20,"play,067,$"); //查询温度
- }else if(a==1)
- {
- strcpy(MODE_DS18B20,"play,066,$"); //温度下限
- }else if(a==2)
- {
- strcpy(MODE_DS18B20,"play,065,$"); //温度上限
- }
- UART(2,MODE_DS18B20);//当播报声音
- delay_ms(2000);//延时防止语音冲突
- strcpy(MODE_DS18B20,"play,000,$");
- if(a==0)
- {
- if(ds_18b20num[1]!=0)//温度在两位数
- {
- MODE_DS18B20[7]=ds_18b20num[1];//播报温度 十位
- UART(2,MODE_DS18B20);
- delay_ms(800); //延时
- UART(2,"play,010,$");//十
- delay_ms(800); //延时
- MODE_DS18B20[7]=ds_18b20num[2];//播报温度 个位
- UART(2,MODE_DS18B20);
- delay_ms(800);
- UART(2,"play,068,$");//度
- }
- else//温度在一位数
- {
- MODE_DS18B20[7]=ds_18b20num[2];
- UART(2,MODE_DS18B20);//当前温度为
- delay_ms(1000);
- UART(2,"play,068,$");//度
- }
- }else if (a==1)
- {
- if(ds_18b20L[1]!=0)//温度在两位数
- {
- MODE_DS18B20[7]=ds_18b20L[1];//播报温度 十位
- UART(2,MODE_DS18B20);
- delay_ms(800); //延时
- UART(2,"play,010,$");//十
- delay_ms(800); //延时
- MODE_DS18B20[7]=ds_18b20L[2];//播报温度 个位
- UART(2,MODE_DS18B20);
- delay_ms(800);
- UART(2,"play,068,$");//度
- }
- else//温度在一位数
- {
- MODE_DS18B20[7]=ds_18b20L[2];
- UART(2,MODE_DS18B20);//当前温度为
- delay_ms(1000);
- UART(2,"play,068,$");//度
- }
- }else if (a==2)
- {
- if(ds_18b20H[1]!=0)//温度在两位数
- {
- MODE_DS18B20[7]=ds_18b20H[1];//播报温度 十位
- UART(2,MODE_DS18B20);
- delay_ms(800); //延时
- UART(2,"play,010,$");//十
- delay_ms(800); //延时
- MODE_DS18B20[7]=ds_18b20H[2];//播报温度 个位
- UART(2,MODE_DS18B20);
- delay_ms(800);
- UART(2,"play,068,$");//度
- }
- else//温度在一位数
- {
- MODE_DS18B20[7]=ds_18b20H[2];
- UART(2,MODE_DS18B20);//当前温度为
- delay_ms(1000);
- UART(2,"play,068,$");//度
- }
- }
- run=0;
- }
- }
- /*******************************************************************************
- * 函数名 : Find
- * 描述 : 判断缓存中是否含有指定的字符串
- * 输入 :
- * 输出 :
- * 返回 : unsigned char:1 找到指定字符,0 未找到指定字符
- * 注意 :
- *******************************************************************************/
- bit Find(int q,u8 *a)
- {
- if(q==1)
- {
- if(strstr(uart1_shou,a)!=NULL)
- return 1;
- else
- return 0;
- }
- else if(q==1)
- {
- if(strstr(uart2_shou,a)!=NULL)
- return 1;
- else
- return 0;
- }
- else if(q==3)
- {
- if(strstr(uart3_shou,a)!=NULL)
- return 1;
- else
- return 0;
- }
- else if(q==4)
- {
- if(strstr(uart4_shou,a)!=NULL)
- return 1;
- else
- return 0;
- }return 0;
- }
- //清除串口缓存数据
- void CLR_Buf1(int a)
- {
- int k;
- if(a==1)
- {
- for(k=0;k<uatr;k++) //将缓存内容清零
- {
- uart1_shou[k] = 0x00;
- mode1=0;
- }
- }
- else if(a==2)
- {
- for(k=0;k<uatr;k++) //将缓存内容清零
- {
- uart2_shou[k] = 0x00;
- mode2=0;
- }
- } if(a==3)
- {
- for(k=0;k<uatr;k++) //将缓存内容清零
- {
- uart3_shou[k] = 0x00;
- mode3=0;
- }
- }
- else if(a==4)
- {
- for(k=0;k<uatr;k++) //将缓存内容清零
- {
- uart4_shou[k] = 0x00;
- mode4=0;
- }
- }
- }
复制代码
所有资料51hei提供下载:
断电保存版本程序.rar
(296.85 KB, 下载次数: 36)
|