- #include<reg52.h>
- #include<intrins.h>
- #include "sim800.h"
- #define uchar unsigned char
- #define uint unsigned int
- #define K_MG_MV 120/66
- typedef unsigned char U8; /* defined for unsigned 8-bits integer variable 无符号8位整型变量 */
- typedef unsigned int U16; /* defined for unsigned 16-bits integer variable 无符号16位整型变量 */
- /********测试GSM是否启动**********/
- int test_boot;
- /********测试GSM是否注册网络**********/
- int test_net_register;
- /********GSM串口接收数据缓存**********/
- unsigned char idata GSM_receive[60];
- /********GSM串口接收计数器**********/
- unsigned char GSMDATA_count;
- unsigned char *content_temp = "Warning: over temperature\r\n";
- unsigned char *content_smoke = "Warning: excessive smoke concentration\r\n";
- unsigned char *content_body = "Warning: body entry\r\n";
- unsigned char str_yw[12];//烟雾值
- unsigned char T_baojing = 30; //温度报警值
- unsigned int C_baojing = 500; //烟雾浓度报警值
- unsigned char T_buff[3]; //报警缓存
- unsigned char H_buff[3];
- unsigned char C_buff[4];
- bit sf_flag=0; //设防标志
- unsigned char moshi=0;
- unsigned char data1;
- long Value;
- sbit bADcs=P3^4;
- sbit bADcl=P3^6;
- sbit bADda=P3^5;
- sbit sf_led = P1^3;// 设防指示灯
- sbit shefang= P1^4;// 设防按键
- sbit shezhi = P1^5; // 设置
- sbit jia = P1^6; // 加
- sbit jian = P1^7; // 减
- sbit BUZZER = P2^0; // LED蜂鸣器
- sbit Infra = P3^2; // 人体红外模块
- unsigned char IntToString(unsigned char *str, int dat);
- extern bit Start18B20();
- extern bit Get18B20Temp(int *temp); // ;;;;;、‘
- extern void InitLcd1602();
- extern void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str);
- float intT, decT; //温度值的整数和小数部分
-
- long kssj() //开始收集
- {
- unsigned char i;
- bADcs = 0;//当ADC0832未工作时其CS输入端应为高电平,此时芯片禁用.
- bADcl=0;
- bADda=1;
- bADcl=1;
- bADcl=0;//i down
- bADda=1;
- bADcl=1;
- bADcl=0; // 2 down
- bADda=0;
- bADcl=1;
- bADcl=0; // 3 down
- bADda=1;
- bADcl=1;
- bADcl=0; // 4 down
- for(i=8;i>0;i--)
- {
-
- data1<<=1;
- bADcl=0;
- bADcl=1;
- if(bADda==1) data1|=0x01;
- bADda=1;
- }
- bADcs=1;
-
- Value=data1*1.0/256*500;
-
- Value=Value*K_MG_MV;
- Value=Value-5;
- if(Value<0)Value=0;
- return Value;
- }
- void Key_set_scan()
- {
-
- if(shezhi==0)
- {
- Delay_Ms(10);
- if(shezhi==0)
- {
- while(!shezhi);
- InitLcd1602(); //初始化液晶
- moshi++;
- if(moshi >= 3)moshi = 0;
- if(moshi == 0)
- {
- LcdShowStr(0, 0,"T: C");
- LcdShowStr(7, 0,"C: PPM");
- }
- else if(moshi == 1)
- {
- LcdShowStr(0, 1,"Set_T: C");
- }
- else if(moshi == 2)
- {
- LcdShowStr(0, 1,"Set_C: PPM");
- }
- }
- }
-
- if(jia==0)
- {
- Delay_Ms(10);
- if(jia==0)
- {
- if(moshi==1)
- {
- T_baojing++ ;
- if( T_baojing>=99 )T_baojing =99;
- }
- if(moshi==2)
- {
- C_baojing++ ;
- if( C_baojing>=999 )C_baojing =999;
- }
- }
- }
- if(jian == 0)
- {
- Delay_Ms(10);
- if(jian == 0)
- {
- if(moshi==1)
- {
- T_baojing-- ;
- if( T_baojing<=0 )T_baojing =0;
- }
- if(moshi==2)
- {
- C_baojing-- ;
- if( C_baojing<=0 )C_baojing =0;
- }
- }
- }
- if(shefang == 0)
- {
- Delay_Ms(10);
- if(shefang == 0)
- {
- while(!shefang);
- sf_flag =~ sf_flag;
- if(sf_flag == 1) sf_led = 0;
- else sf_led = 1;
- }
- }
-
- }
- void wendu()
- {
- bit res;
- int temp; //读取到的当前温度值
-
- unsigned char len;
- unsigned char str_wd[5]; //温度缓冲区
- Get18B20Temp(&temp); //读取当前温度
- res = Get18B20Temp(&temp); //读取当前温度
- if (res) //读取成功时,刷新当前温度显示
- {
- intT = temp >> 4; //分离出温度值整数部分
- decT = temp & 0xF; //分离出温度值小数部分
- len = IntToString(str_wd, intT); //整数部分转换为字符串
- str_wd[len++] = '.'; //添加小数点
- decT = (decT*10) / 16; //二进制的小数部分转换为1位十进制位
- str_wd[len++] = decT + '0'; //十进制小数位再转换为ASCII字符
- str_wd[len] = '\0'; //添加字符串结束符
- LcdShowStr(2, 0, str_wd); //显示到液晶屏上
- }
- Start18B20();
- }
- /************主函数****************/
- void main()
- {
- unsigned char i;
- sf_flag = 0;
- Uart_Init();
- InitLcd1602(); //初始化液晶
- Start18B20();
- LcdShowStr(0, 0,"T: C");
- LcdShowStr(7, 0,"C: PPM");
- for(i = 0;i < 20;i++)//等待网络稳定
- {
- Delay_Ms(1000);
- }
- //测试是否已经开机,同时自适应波特率
- while(test_boot==No)
- {
- Send_String("AT\r\n");
- Delay_Ms(100);
- }
- test_boot=No;
- //测试是否注册到网络
- while(test_net_register==No)
- {
- Send_String("AT+CREG?\r\n");
- Delay_Ms(100);
- }
- test_net_register=No;
- Receive_message(); //配置成接受短信模式
-
-
- while(1)
- {
- Key_set_scan();//按键扫描
- if(moshi == 0) //设置模式切换
- {
- kssj(); //开始收集 ,电压采集检测烟雾浓度
- Value = Value-100;//烟雾浓度校准
- IntToString(str_yw,Value); //转换成字符串
- LcdShowStr(9, 0, str_yw); //烟雾浓度显示到液晶屏上
- wendu(); //温度检测并显示
- if(sf_flag == 1)
- {
- if(Value>=C_baojing||intT>T_baojing||Infra==1)
- {
- BUZZER = 0;
- if(intT > T_baojing)
- { /*1234567890123456*/
- LcdShowStr(0,1,"temp");
- // Send_message(content_temp); //发温度超标短信
- } else LcdShowStr(0, 1," ");
- if(Value >= C_baojing)
- { /*1234567890123456*/
- LcdShowStr(5,1,"smoke");
- // Send_message(content_smoke); //发烟雾浓度超标短信
- } else LcdShowStr(5, 1," ");
- if(Infra == 1)
- { /*1234567890123456*/
- LcdShowStr(11, 1,"body");
- // Send_message(content_body); //发人体进入短信
- } else LcdShowStr(11,1," ");
- }
- else
- {
- BUZZER = 1; /*1234567890123456*/
- LcdShowStr(0, 1," System normal ");
- }
- }
- }
- else if(moshi == 1) //设置温度上限模式
- {
- T_buff[0] = T_baojing/10+0x30;
- T_buff[1] = T_baojing%10+0x30;
- T_buff[2] = '\0';
- LcdShowStr(6, 1,T_buff);
- }
- else if(moshi == 2) //设置烟雾浓度上限模式
- {
- C_buff[0] = C_baojing/100+0x30;
- C_buff[1] = C_baojing%100/10+0x30;
- C_buff[2] = C_baojing%10+0x30;
- C_buff[4] = '\0';
- LcdShowStr(6, 1,C_buff);
- }
-
- }
- }
- /* 整型数转换为字符串,str-字符串指针,dat-待转换数,返回值-字符串长度 */
- unsigned char IntToString(unsigned char *str, int dat)
- {
- signed char i = 0;
- unsigned char len = 0;
- unsigned char buf[6];
-
- if (dat < 0) //如果为负数,首先
-
- {
- dat = -dat;
- *str++ = '-';
- len++;
- }
- do { //先转换为低位在前的十进制数组
- buf[i++] = dat % 10;
- dat /= 10;
- } while (dat > 0);
- len += i; //i最后的值就是有效字符的个数
- while (i-- > 0) //将数组值转换为ASCII码反向拷贝到接收指针上
- {
- *str++ = buf[i] + '0';
- }
- *str = '\0'; //添加字符串结束符
-
- return len; //返回字符串长度
- }
- /*****************************************************************************
- 串口中断
- /****************************************************************************/
- void uart(void) interrupt 4
- {
- unsigned char UART_data;
- if(RI)
- {
- UART_data=SBUF;
- if(UART_data=='\n')
- {
- if(GSM_receive[0]=='O'&&GSM_receive[1]=='K')
- {
- test_boot=Yes;
- }
- //else
- // test_boot=No;
- if(GSM_receive[0]=='+'&&GSM_receive[1]=='C'&&GSM_receive[2]=='R'&&GSM_receive[3]=='E'&&GSM_receive[4]=='G')
- {
- if(GSM_receive[7]=='1'||GSM_receive[9]=='1'||GSM_receive[9]=='5')
- {
- test_net_register=Yes;
- }
- }
- // else
- // test_net_register=No;
- if((GSM_receive[0]=='O')&&(GSM_receive[1]=='P')&&(GSM_receive[2]=='E')&&(GSM_receive[3]=='N')) //大写OPEN
- {
- // CZ = 0;LcdShowStr(5, 1,"Open ");
- }
- if((GSM_receive[0]=='C')&&(GSM_receive[1]=='L')&&(GSM_receive[2]=='O')&&(GSM_receive[3]=='S')&&(GSM_receive[4]=='E'))
- {
- // CZ = 1;LcdShowStr(5, 1,"Close");
- }
- GSMDATA_count=0;
- }
- else
- {
- GSM_receive[GSMDATA_count]=UART_data;
- GSMDATA_count++;
- }
- }
- RI=0;
- }