2019-07-14 13:01:29 weixin_43216060 阅读数 350
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

    3419 人正在学习 去看看 朱有鹏

基于单片机的烟雾监测报警与控制系统

(给手机打电话或发短信报警)
现在有很多场所对烟雾浓度的要求很严格,比如在电梯里烟雾浓度超过一定的阈值就要求报警并采取一系列的控制措施。又比如目前大部分学校,普遍都有几千甚至几万的住宿学生,安全防范压力极大,现在学生宿舍普遍六至八人一间,有些学校甚至更多。而且随着经济条件的改善,和生活水平提高,学生们使用各种电器设备数量日益增长。虽然各个学校都出各种规章制度,严禁学生私自搭线或使用大功率电器,但仍然防不胜防。在学生宿舍人员密集的地方,部分人员安全意识淡薄,上述行为可能会导致群死群伤的事情发生,因此电梯、学生宿舍等公共场所进行烟雾监测监控也是一个必然的趋势。
我本文介绍的是基于单片机技术,利用sim900a(GSM模块),烟雾传感器MQ-2等模块制作一个烟雾监测报警与控制系统,此系统主要分为三个部分

1、烟雾监测:我选用的烟雾传感器是MQ-2

MQ-2电路图:
在这里插入图片描述
MQ-2实物图: 在这里插入图片描述在这里插入图片描述
MQ-2烟雾传感器存在两种输出模式AO(模拟量输出),DO(数字量输出);若用DO(数字量输出)则可通过如图的电位器调节来控制输出电压大小从而控制单片机对信号的反馈来影响阈值,若用AO(模拟量输出)可通过单片机的内部程序代码来设置烟雾阈值。

如需程序代码等资料可联系我。本人QQ:1163845390

**
MQ-2烟雾传感器的应用领域很广,可用于家庭和工厂的气体泄漏监测装置,适宜于液化气、苯、烷、酒精、氢气、烟雾等的探测。故因此,MQ-2可以准确来说是一个多种气体探测器。MQ-2的探测范围极其的广泛。它的优点:灵敏度高、响应快、稳定性好、寿命长、驱动电路简单。
MQ-2型烟雾传感器属于二氧化锡半导体气敏材料,属于表面离子式N型半导体。处于200~300摄氏度时,二氧化锡吸附空气中的氧,形成氧的负离子吸附,使半导体中的电子密度减少,从而使其电阻值增加。当与烟雾接触时,如果晶粒间界处的势垒收到烟雾的调至而变化,就会引起表面导电率的变化。利用这一点就可以获得这种烟雾存在的信息,烟雾的浓度越大,导电率越大,输出电阻越低,则输出的模拟信号就越大。MQ-2型传感器对天然气、液化石油气等烟雾有很高的灵敏度,尤其对烷类烟雾更为敏感。也具有良好的抗干扰性,可准确排除有刺激性非可燃性烟雾的干扰信息。
(经过测试:对烷类的感应度比纸张木材燃烧产生的烟雾要好的多,输出的电压升高的比较快)。
MQ-2型传感器具有良好的重复性和长期的稳定性。初始稳定,响应时间短,长时间工作性能好。需要注意的是:在使用之前必须加热一段时间,否则其输出的电阻和电压不准确。
其检测可燃气体与烟雾的范围是100~10000ppm(ppm为体积浓度。 1ppm=1立方厘米/1立方米)
电路设计电压范围宽,24V以下均可,加热电压5±0.2V
需要注意:加热电压。如果过高,会导致内部的信号线熔断,从而器件报废。
*

2、报警系统:我采用①蜂鸣器报警和②通过sim900a模块(GSM模块)给手机打电话报警

①蜂鸣器分为有源蜂鸣器和无源蜂鸣器
有源蜂鸣器和无源蜂鸣器的差别主要差别为:
1、有源蜂鸣器和无源蜂鸣器的根本区别是产品对输入信号的要求不一样。
2、有源蜂鸣器工作的理想信号是直流电,通常标示为VCC、VDD等。因为蜂鸣器内部有一简单的振荡电路,能将恒定的直流电转化成一定频率的脉冲信号,从面实出磁场交变,带动钼片振动发音。
3、但是在某些有源蜂鸣器在特定的交流信号下也可以工作,只是对交流信号的电压和频率要求很高,此种工作方式一般不采用。
4、而无源蜂鸣器没有内部驱动电路,有些公司和工厂称为讯响器,国标中称为声响器。无源蜂鸣器工作的理想信号方波。如果给预直流信号蜂鸣器是不响应的,因为磁路恒定,钼片不能振动发音。

我采用的是有源蜂鸣器与PNP三极管结合的电路,通过控制PNP的导通和截止来控制蜂鸣器的开启和关闭
电路图如下:
在这里插入图片描述
PE5引脚输出为高电平时,pnp截止,蜂鸣器两端都为低电平,蜂鸣器关闭;PE5引脚输出为低电平时,pnp导通,蜂鸣器开启;当烟雾传感器检测到烟雾浓度超过阈值时,输出信号给单片机,当单片机收到烟雾浓度过高的信号时,控制PE5引脚的高低电平,来控制蜂鸣器的开启和关闭(实现报警)。

②通过sim900a模块(GSM模块)给手机打电话报警
sim900a实物图:
在这里插入图片描述sim900a与单片机连接,当烟雾传感器检测到烟雾浓度超过阈值时,输出信号给单片机,当单片机收到烟雾浓度过高的信号时,发送一系列指令给sim900a,来控制sim900a给手机打电话或者发短信(报警)

如需sim900a的详细资料及指令代码可联系我 ,本人QQ:1163845390

3、控制系统:我采用的是L298N模块和电机来模拟开关门窗

L298N是专用驱动集成电路,属于H桥集成电路,与L293D的差别是其输出电流增大,功率增强。其输出电流为2A,最高电流4A,最高工作电压50V,可以驱动感性负载,如大功率直流电机,步进电机,电磁阀等,特别是其输入端可以与单片机直接相联,从而很方便地受单片机控制。当驱动直流电机时,可以直接控制步进电机,并可以实现电机正转与反转,实现此功能只需改变输入端的逻辑电平。
  L298N芯片可以驱动两个二相电机,也可以驱动一个四相电机,输出电压最高可达50V,可以直接通过电源来调节输出电压;可以直接用单片机的IO口提供信号;而且电路简单,使用比较方便。
  L298N可接受标准TTL逻辑电平信号VSS,VSS可接4.5~7V电压。4脚VS接电源电压,VS电压范围VIH为+2.5~46V。输出电流可达2A,可驱动电感性负载。1脚和15脚下管的发射极分别单独引出以便接入电流采样电阻,形成电流传感信号。L298可驱动2个电动机,OUT1,OUT2和OUT3,OUT4之间可分别接电动机,本实验装置我们选用驱动一台电动机。5,7,10,12脚接输入控制电平,控制电机的正反转。EnA,EnB接控制使能端,控制电机的停转。下图是L298N内部原理图:
在这里插入图片描述

总之,三个部分(烟雾检测、报警、模拟控制)与单片机连接,烟雾传感器MQ-2检测到烟雾浓度超过阈值就发送一个信号给单片机,单片机接收到信号后控制蜂鸣器和sim900a报警并控制L298N模拟开窗或开门。本次设计很好的运用了单片机和传感器、GSM模块等结合的知识,提高了一系列公共场所的安全保障。

实物图(制作的比较简易,但功能都完全具备):
在这里插入图片描述

2016-01-04 20:47:58 NK_test 阅读数 3827
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

    3419 人正在学习 去看看 朱有鹏

帮室友做的一个简单的单片机实验: 使用热敏电阻测温,当温度超过34摄氏度之后就会向指定手机拨打报警电话。

硬件要求: STC89C52单片机,SIM900A GSM模块,价格都在60元左右;另外还需要3根杜邦线,一个SIM卡(移动/联通)

仔细查看用户手册,按照下图连线:


另外我们使用TTL电平,注意以下问题:



好了,硬件连接完毕。

单片机的代码没啥好说的,以前做过一个温度计的实验,可以参考我的博客  http://blog.csdn.net/nk_test/article/details/50375196

然后再结合上SIM900A就可以了。

#include <reg52.h>

#define uchar unsigned char
#define uint unsigned int


#define  PCF8591 0x90
sbit SCL=P2^0;
sbit SDA=P2^1; 
sbit spk=P1^4;
sbit WEI=P2^7;  //wei
sbit DUAN=P2^6; //duan

unsigned char code dofly_DuanMa[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};// 显示段码值0~9
unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码


//以下是你的51单片机的晶振大小
#define FOSC_110592M
//#define FOSC_12M

//以下是开机后拨打的手机号,改成自己想要打的号码即可。
uchar num[] = "ATD15700085721;\r";

void delay(int z)
{
	while(z--);
}


void Screen(int i,int n)
{

     P0=0;
     DUAN=1;
	 DUAN=0;
     
     P0=dofly_WeiMa[i];
     WEI=1;
	 WEI=0;
    
     P0=dofly_DuanMa[n]; 
     DUAN=1;  
     DUAN=0;

	 delay(250);

}
void Get_out_print(uchar temperatureNum)
{
    if(temperatureNum/100>0)
	{
	   Screen(3,temperatureNum/100);
	   temperatureNum%=100;
	}

	if(temperatureNum/10>0)
	 {
	     Screen(4,temperatureNum/10);
        
	 }
      
	 Screen(5,temperatureNum%10);
	 Screen(7,12); //显示c

}

//注意,无论接收到信号还是发送完信号,都会进中断服务程序的
/*初始化程序(必须使用,否则无法收发),次程序将会使用定时器1*/
void SerialInti()//初始化程序(必须使用,否则无法收发)
{
	TMOD=0x20;//定时器1操作模式2:8位自动重载定时器

#ifdef FOSC_12M		   //在这里根据晶振大小设置不同的数值初始化串口
	TH1=0xf3;//装入初值,波特率2400
	TL1=0xf3;	
#else 	
	TH1=0xfd;//装入初值,波特率9600
	TL1=0xfd;
#endif //end of SOC_12M
	
	TR1=1;//打开定时器
	SM0=0;//设置串行通讯工作模式,(10为一部发送,波特率可变,由定时器1的溢出率控制)
	SM1=1;//(同上)在此模式下,定时器溢出一次就发送一个位的数据
	REN=1;//串行接收允许位(要先设置sm0sm1再开串行允许)
	EA=1;//开总中断
	ES=1;//开串行口中断	
}


/*串行通讯中断,收发完成将进入该中断*/
void Serial_interrupt() interrupt 4 
{
//	a=SBUF;
	P2=SBUF;
	RI=0;//接收中断信号清零,表示将继续接收
//	flag=1;//进入中断的标志符号
}

//串行口连续发送char型数组,遇到终止号/0将停止
void Uart1Sends(uchar *str)
{
	while(*str!='\0')
	{
		SBUF=*str;
		while(!TI);//等待发送完成信号(TI=1)出现
		TI=0;
		str++;
	}
}

//延时函数大概是1s钟,不过延时大的话不准...
void DelaySec(int sec)
{
	uint i , j= 0;

	for(i=0; i<sec; i++)
	{
		for(j=0; j<65535; j++)
		{	
		}
	}
}

void delay()   //延时4-5个微秒
{;;}

void delay_1ms(uint z)
{
 uint x,y;
 for(x=z;x>0;x--)
           for(y=110;y>0;y--)
                 ;
}

void start()
{
  SDA=1;
    delay();
  SCL=1;
    delay();
  SDA=0;
    delay();
}

void stop()
{
  SDA=0;
    delay();
  SCL=1;
    delay();
  SDA=1;
    delay();
}


void respons()
{
  uchar i;
  SCL=1;
    delay();
  while((SDA==1)&&(i<250))
           i++;
      SCL=0;
    delay();
}

void init() 
{
  SDA=1;
    delay();
  SCL=1;
    delay();    
}

uchar read_byte()  //总线上读取一个字节
{
    uchar i,k;
    SCL=0;
    delay();
    SDA=1;
    delay();
   for(i=0;i<8;i++)
   {
         SCL=1;
            delay();
          k=(k<<1)|SDA;
             SCL=0;
            delay();
   }
  return k;

}

void write_byte(uchar date)
{
     uchar i,temp;
     temp=date;
     for(i=0;i<8;i++)
     {
         temp=temp<<1;
          SCL=0; 
          delay();
          SDA=CY;
          delay();
          SCL=1;
          delay();            
     }   
     SCL=0;
       delay();
     SDA=1;
       delay();
}



void write_address(uchar control,uchar date)
{
        start();
        write_byte(PCF8591);  //发送地址字节,选择器件     
        respons();
        write_byte(control);  //发送控制字节,选择通道
        respons();
        write_byte(date);    //重新发送地址字节,选择器件
        respons();           //接受数据
        stop();

}

uchar read_address(uchar control)
{
       uchar date;
       start();
       write_byte(PCF8591);
       respons();
       write_byte(control);
       respons();
       start();
       write_byte(PCF8591+1);
       respons();
       date=read_byte();
       stop();
       return date;

}
uchar temperatureNum=0;
int flagg=0;
void main()
{
	uchar i = 0;
	WEI=0;
	DUAN=0;

    TMOD= 0x01;		     
    EA=1;
    ET0=1; 
    TR0=1;              
    init();
	SerialInti();
   while(1)
   {
   	temperatureNum=read_address(0x41);  //确定路
	Get_out_print(151-temperatureNum);

	if(flagg) 
    { 
	
	while(1)
	{
		Uart1Sends(num);

		DelaySec(30);//打通后延时30秒
		Uart1Sends("ATH\r");   //挂断电话

		DelaySec(3);//延时3秒
	}
	}
	}


}

void Timer0_isr(void) interrupt 1 
{
   TH0=0xfe;
   TL0=0;
   if(temperatureNum<118)
 	flagg=1;

}



2019-09-20 17:13:56 qq_37592111 阅读数 82
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

    3419 人正在学习 去看看 朱有鹏

15单片机通过WIFI模块ESP8266实现手机远程监控可燃气体浓度
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

一,系统方案
1、方案描述
当烟雾报警系统处于正常环境中,系统会主动向手机终端发送实时温度,和当前环境中的可燃气体数值。当烟雾报警系统处于达到可燃气体检测设定值时或当温度达到预设定值时,单片机控制端会自动启动继电器进行断气和开窗指令,并且通过互联网向手机终端发送报警,提醒人们采取相应的指示。
2、原理框图在这里插入图片描述3、设计好的实物图在这里插入图片描述
4、设计系统原理图在这里插入图片描述
二、系统软件设计
1、单片机软件设计
系统采用15单片机(51内核高速单片机内置8通道10位高速ADC,速度可达30万次/秒)
主函数展示:
main()
{

LCD1602_Init();	//初始化LCD
WriteString(0,0,"TEMP: ");//LCD中写入 TEMP:
WriteString(12,0,"C"); //LCD中写入 C
WriteString(0,1,"KAD:");//LCD中写入KAD
WriteString(10,1,"M%");//LCD中写入PPM
ADC_P11_init();//初始化ADC 
esp8266_init();	//初始化ESP8266
delay1ms();	 //一毫秒延时

while(1)
{
	Process_receiveData();	//处理接收数据,并控制继电器操作
  	LcdDisplayDS18B20(Ds18b20ReadTemp());//LCD显示ds18b20数据
	LcdDisplayADC(ADData); //LCD显示AD采集MQ-2数据
	ESP8266_Set("AT+CIPSEND=0,18");	//向esp8266发送传输18字节数据请求
 	Delay100ms() ;	
  	Temp_data(Ds18b20ReadTemp()); //获取ds18b20温度传感器数据
	ESP8266_ArraySends(ds18b20Wd_buf,8);		//发送ds18b20温度数组
	Delay100ms() ;
	ADC_data(ADData); //获取AD采集	数据
	ESP8266_ArraySends(	ADC_datas_buf,6); //发送AD采集数组
	Delay100ms() ;
	//AlertLogic();	处理接受设置上限值
	//ESP8266_ArraySends(AlertLogic_buf,3);返回上限数据结果	
	ESP8266_ArraySends(Recive_table,4);//返回接收数据
	Delay100ms() ;
	ControlLogic();

}

}
串口初始化以及ESP8266初始化函数:
/*********************************************************************
名称: 初始化esp8266
作用: 配置esp8266参数
*********************************************************************/
void esp8266_init()
{
UsartConfiguration();
ms_delay(500);
/ESP8266_Set(“AT+CWMODE=1”);选择WiFi模式1
ms_delay(500);
ESP8266_Set(“AT+RST”);
ms_delay(1000);
ESP8266_Set("AT+CWJAP=“haqimeme”,“guoxuan@123"”);
ms_delay(3000);
ESP8266_Set("AT+CIPSTA=“192.168.1.113”,“192.168.1.1”,“255.255.255.0"”);
ms_delay(1000);
ESP8266_Set(“AT+RST”);
ms_delay(6000);
ESP8266_Set(“AT+CIPMUX=1”);
ms_delay(500);
//ESP8266_Set(“AT+CIFSR”); //查看ip地址
ESP8266_Set(“AT+CIPSERVER=1,8080”);
ms_delay(500);
ESP8266_Set(“AT+CIPSTO=0”);
/

ESP8266_Set("AT+CIPMUX=1");//允许多连接
ms_delay(500);

// ESP8266_Set(“AT+CIFSR”); //查看ip地址
ESP8266_Set(“AT+CIPSERVER=1,8080”);
ms_delay(500);

ES = 1;				//开串口中断

}

/*******************************************************************************

  • 函 数 名 : UsartConfiguration()
  • 函数功能 : 设置串口
  • 输 入 : 无
  • 输 出 : 无
    *******************************************************************************/

void UsartConfiguration()
{
ACC = P_SW1;
ACC &= ~(S1_S0|S1_S1);//S1_S0=1,S1_S1=0;
ACC |= S1_S0; //(P3.6/RxD_2,P3.7/TxD_2)
P_SW1 = ACC;

TMOD = 0x20;	// 0010 0000 定时器1工作于方式2(8位自动重装方式)l
TH1  = 0xFD;	// 波特率:9600 /11.0592MHZ
TL1  = 0xFD;	// 波特率:9600 /11.0592MHZ		    
TR1  = 1;  	//下面代码设置定串口
AUXR &= 0xBE;  //先对需要设置的位进行清零 1011 1110
AUXR = 0x00;             // 很关键,使用定时器1作为波特率发生器,S1ST2=0
SCON = 0x50; 	// 0101 0000 SM0.SM1=01(最普遍的8位通信),REN=1(允许接受)
ES = 1;                         //开放串口中断
EA = 1;                         //开放CPU中断

}
esp8266发送数组函数
/*********************************************************************************

  • 函数名 :ESP8266_ArraySends
  • 函数功能 :发送数组
  • 输出 :无
  • 输入 :发送数组,发送数组位数
    *********************************************************************************/

void ESP8266_ArraySends(uint send_data[],uchar num)

{
uchar i;

	for(i=0; i<num; i++)	//	  sizeof(send_data)求出send_data[]数组的长度。例如:sizeof(Wd_buf)=8.	         sizeof(send_data)/sizeof(*send_data)
	{
	/*	SBUF = send_data[i];   //将要发送的数据放入到发送寄存器
		while(!TI);		  //等待发送数据完成
		TI=0;			  //清除发送完成标志位
	*/	
		Send_Uart(send_data[i]);
	}

	 
	 ms_delay(50);		  //延时一下再发

}
esp8266在收到数据并转发给单片机时的数据格式:+IPD,<client号>,<收到的字符长度>:收到的字符,比如+IPD,0,5:hello,其中+PID是固定的;0代表的是TCP客户端编号,esp8266最多支持5个客户端同时连接,也就是说客户端编号是0到4,在本设计中由于只有一个客户端与esp8266相连,所以客户端编号是0;5代表收到的字符长度;hello是收到的字符。在本例中esp8266发送给单片机的数据是+IPD,0,1:1,我们把接收到的字符串缓存到字符数组中,所以在处理收到的数据逻辑中,首先判断是否是以’+'和’I’开始的,否则视作无效数据,然后判断数组中的第十个数据,因为第十个数据才是上位机发送过来的数据。
/*********************************************************************
名称:串行通讯中断
作用:发送或接收结束后进入该函数,对相应的标志位软件清0,实现模块对数
据正常的收发。
********************************************************************/

void Uart_Interrupt() interrupt 4 using 1
{

  if(RI)
  {
 	EA=0;
  	    
	Recive_esp8266mode[j]=SBUF; 
	RI=0;
	j++;
		
	if(j==2)
	{		
		 if(Recive_esp8266mode[0]=='+'&&Recive_esp8266mode[1]=='I')	 //判断接收到数据是否是上位机发送的数据
		 {
			;			
		 }
		 else
		 {
			j=0;
	   	 }
	}	  
	if(j==13)
	{
		j=0;				   
		Recivedata_flag=1;
	}

		 EA=1;	  
	}

}
2、Android APP软件开发部分
Android APP软件开发环境为Android studio ,界面简洁终端ID输入的是IP地址192.168.1.112,端口号是8080;因为esp8266选择的是WiFi模式一与家中的路由器组成局域网,在通过指令AT+CIPSTA=“192.168.1.112”,“192.168.1.1”,“255.255.255.0”);//设置静态IP方便连接互联网时能够寻址。连接互联网时需要公网ip,这里博主通过花生壳解析域名获取公网IP达到访问系统效果。

在这里插入图片描述
Android APP软件逻辑接收代码:
class Myhandler extends Handler {
byte[] SocketReadData= new byte[socketclient.RC_DATA.length];
@Override
public void handleMessage(Message msg) {
SocketReadData=(byte[])msg.obj;
if(SocketReadData[0]==0&&SocketReadData[1]==1){

            Temp= SocketReadData[3]*10000+SocketReadData[4]*1000+SocketReadData[5]*100+SocketReadData[6]*10+SocketReadData[7];
            if(SocketReadData[2]==0){
                Temp=-(Temp/100);
            }
            else{
                Temp=Temp/100;
            }
        }else{
            Temp=0;

        }
        if(SocketReadData[8]==0&&SocketReadData[9]==2){
            KAD=SocketReadData[10]*1000+SocketReadData[11]*100+SocketReadData[12]*10+SocketReadData[13];
        }
        if ( KAD>550||Temp>50)
        {
            flag++;
            if(flag==2){//flag 为出发警报Activity标志位,数值为2 防止数据误发导致出发报警
                Intent intent1 = new Intent(SecondActivity.this, ThirdActivity.class);//显示intent
                startActivity(intent1);
            }

        }


        if(SocketReadData[14]==1&&SocketReadData[15]==1&&SocketReadData[16]==1&&SocketReadData[17]==1)
        {
            imageButton1.setImageDrawable(getResources().getDrawable(R.mipmap.shut));
            a=1;
        }
        if(SocketReadData[14]==1&&SocketReadData[15]==1&&SocketReadData[16]==2&&SocketReadData[17]==2)
        {
            imageButton1.setImageDrawable(getResources().getDrawable(R.mipmap.open));
            a=0;
        }
        /*if(SocketReadData[19]==1&&SocketReadData[20]==2&&SocketReadData[21]==1&&SocketReadData[22]==1)
        {
            imageButton2.setImageDrawable(getResources().getDrawable(R.mipmap.shut));
            b=1;
        }
        if(SocketReadData[19]==1&&SocketReadData[20]==2&&SocketReadData[21]==2&&SocketReadData[22]==2)
        {
            imageButton2.setImageDrawable(getResources().getDrawable(R.mipmap.open));
            b=0;
        }*/

        tvReceive.setText("DS18B20温度 :  "+ Temp+"℃"+"\n"+"KAD :  "+ KAD +"M%");
    }



}

Android APP软件逻辑向可燃气体监测系统发送数据代码:
public void sends(String j){
switch (j){
case “0x00156f4”:SD_DATA[1]=1;SD_DATA[2]=1;SD_DATA[3]=1;break;//闭合继电器1
case “0x00256f4”:SD_DATA[1]=1;SD_DATA[2]=2;SD_DATA[3]=2;break;//断开继电器1
// case “0x00356f4”:SD_DATA[1]=2;SD_DATA[2]=1;SD_DATA[3]=1;break;//闭合继电器2
// case “0x00456f4”:SD_DATA[1]=2;SD_DATA[2]=2;SD_DATA[3]=2;break;//闭合继电器2

                }
                socketclient.Sends(SD_DATA);
            }

        }

报警界面代码:
public class ThirdActivity extends AppCompatActivity {
MediaPlayer player;
Vibrator vibrator;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_third);
player = MediaPlayer.create(this, R.raw.huozaijingbaosheng);
player.start();
vibrator = (Vibrator)this.getSystemService(this.VIBRATOR_SERVICE);
long[] patter = {1000, 1000, 2000, 5000};//首先,这里使用的是一个长整型数组,数组的a[0]表示静止的时间,a[1]代表的是震动的时间,然后数组的a[2]表示静止的时间,a[3]代表的是震动的时间……依次类推下去,然后这里的代码有一点小小的改变:
vibrator.vibrate(patter, 0);//最后一行中vibrate的第二参数表示从哪里开始循环,比如这里的0表示这个数组在第一次循环完之后会从下标0开始循环到最后,这里的如果是-1表示不循环。

}
public void click(View v) {

            flag=0;
            player.release();
            vibrator.cancel();
            finish();
}

}

系统博主挂到淘宝上,如需详细资料可点击下面链接购买:
https://item.taobao.com/item.htm?spm=a2oq0.12575281.0.0.75dc1debztCHw3&ft=t&id=602060950301

2009-02-20 21:43:00 wangtingguang 阅读数 1873
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

    3419 人正在学习 去看看 朱有鹏

 

基于P89LPC932单片机与gpsOne

的车辆移动定位报警系统

 

 

摘要:介绍了一种以P89LPC932单片机为控制核心、结合CDMA业务和gpsOne而开发的车辆移动定位报警系统,结合GIS技术,与控制中心配合,可实现对车辆的报警,定位,和监控等多种应用. 整个系统由移动终端、CMDA网络和信息管理中心服务器3个部分组成;重点描述了移动终端的硬件组成、软件设计。系统有定位、发送震动报警信息、发送电池低电平报警信息等功能。实现了对车辆的短消息精确自动报誉、自动控制、自动信息查询等

 

 

关键词: CMDA;gpsOne; P89LPC932;单片机;短消息;远程报警

 

 

引言

     随着经济技术的发展,移动通信已成为人们日常工作、生活的一个必不可少的组成部分。移动定位,是移动通信网所提供的一种新功能。它通过无线定位技术来获得移动台的位置信息,提供给用户本人、移动通信网络或者其他外部实体,实现各种与位置相关的应用.gpsOne定位技术整合基于网络的和基于独立的GPS定位技术,使移动地位应用越来越普遍.将移动通信技术、gpsOne与计算机技术有机结合,则可在更广泛的领域为不同用户提供更加方便、快捷的信息服务.

    针对车辆的增多,以及最近几年频繁发生车辆被盗,车主希望车辆上能有一种隐藏式,安全的的报警定位终端.设计了一套基于中国联通的车辆报替与控制系统,它利用手机短信和单片机控制技术实现对车辆的远程控制,并利用车载CDMA模块的gpsOne定位系统,结合现有的自行开发的GIS软件,对远程移动或固定目标信息进行定位查询、自动求助报警等。该系统对车辆定位精确,报警及时,控制灵敏,硬件成本低,使用费用少。

1 系统方案的选择

综合考虑系统的可靠性、可行性、成本, 缩短开发时间。本文提出了基于P89LPC932单片机与gpsOne的车辆移动定位报警系统.利用单片机与CDMA模块联合设计了一个符合经济型系统功能需求的硬件解决方案。主控单片机负责控制CDMA模块发起定位请求,接收并解析CDMA模块收到的信号以获取当前的经纬度及其他信息。主控单片机还负责把系统的定位信息通过CDMA模块的短信功能发送给控制中心。

1.1 单片机的选择

LPC900 系列单片机因其出色的性价比,抗干扰能力强,功耗低等优点而被应用于多种嵌入式系统中。

P89LPC932是一款单片封装的微控制器, 是采用基于80C51内核增强型的高速低功耗FLASH 单片机。在同一时钟频率下,P89LPC932的速度为标准8051器件的6因此,只需要较低的时钟频率即可达到同样的性能,这无疑降低了功耗和EMI具有8kBFLASH程序存储器,5122PROM,256BRAM,512B附加片内RAMP89LPC932还集成了字节方式的I2C总线SPI接口UART通信接口E2PROM,ISP/IAP在线编程和远程编程方式等一系列有特色的功能部件,。适合于许多高集成度低成本的场合,可以满足多方面的性能要求LPC00系列在数据的采集通讯控制中也因其出色的性能而得到令人满意的效果。

1.2通信、定位方案的选择

(1) GPSONE定位技术及业务介绍

    基于CDMAGPSONE定位方案,采用的是A-GPS(见图1)Cell ID结合的混合定位方式。手机终端需要采用高通公司的支持GPSONE功能的芯片,该芯片可以接收卫星导航信息,然后再将接收到的信息通过网络发送到定位服务系统(PDE),计算出用户当前所处的位置。此种方案的定位精度高,可以达到5-50米左右(取决于能见度)。无论在室内还是室外,只要有CDMA 1X网络覆盖的地方即可实现定位.而且缩短了定位时间。结合GIS(地理信息系统)地图数据信息,向用户提供丰富的位置信息服务。

                         1 A-GPS系统方案联结图

综合了GPS(全球定位系统)CDMA1X(码分多址分组数据交换网络)、GIS(地理信息系统)、Internet网络和技术,中国联通采用gpsOne定位技术建成了目前世界最先进的移动位置服务网络.定位基本流程如( 2)

2  基本定位服务流程

CDMA模块采用机卡分离并支持GPSOne功能的DTGS-800,它主要完成通过自身定位或网络定位的功能.该模块用于外部设备的接口包括:模块电源接口,3UART串口,模块控制接口和工作状态接口.在本系统中,单片机连接了该模块的第1个串口(2个串口用于和外部R-UIM卡通信),它同主控单片机之间采用标准的串行口进行通讯,通讯的最高波特率可以达到230.4KB.主控制器可以通过AT命令控制该模块按照一定的方式发起定位请求.该模块与SIM卡之间主要通过SIM_DATSIM_CLK信号线进行数据通信

 

 

2 系统功能的组成

车辆报普与控制系统设计的目标是:

(1) 当车辆布防之后.如果车载终端通过震动传感器检测到远程车辆遇到异常.通过CDMA发送短信到车主手机上.告诉车主发生异常情况.并可以向控制中心发送短信, 将当前车辆的有关信息(方位、速度、状态等)告知中心.并在中心的GIS软件上显示.

(2) 当车主驾车时,遇到劫匪.可以按报警按钮,单片机控制CDMA模块向求救中心发送求救短信.并把当前位置信息告知中心.为营救创造条件.

(3) 当车已经被盗后.通过中心发送指令,主动调当前车辆的位置、方向、速度等信息.为寻找被盗车辆创造条件

系统功能结构 如(3)所示

 

 

 

联通CDMA网络

短消息

控制中心

车主电话

求救电话

单片机

I/O

gpsOne

           3 系统功能结构图

 

3 硬件电路的设计

3.1 传感及控制线路的设计

    要想实现系统的自动报警,首先要收集车辆的异常信息,然后再通过相应的设备将这些信息发送给远程用户。对于车辆,在正常使用时有一定的状态,当用户远离车辆时应该设定一些正常状态参数,而当车辆出现异常,如剧烈震动、异常开锁、坐垫受压等情况时,应该能及时地检测出这些参数。为此,在这些有关的部位都安装了传感器,一旦出现异常情况,振动传感器能及时检测到震动.通过单片机的中断,连接传感器,获得异常,以便及时发出报警信号。对于布防报警按钮可以采用单片机扫描外部端口的方法.并且在程序中做软件滤波.

该部分的设计采用标准总线结构,通过电缆将外围主要部位的传感器、lED、按键等与系统I/O模块相连。当车辆出现异常情况时,用户要想通过短信系统对车辆实施远程控制,可以通过相应的控制线路来实现对车辆的报警、布防、调定位数据等。

(2)

3.2 模块及接口电路的设计

  (1) CDMA通信模块:主要用于建立无线信道,接收、发送.车载系统的短消息。

以及通过模块自带的gpsOne功能获得定位数据.为了缩短开发周期,该模块主要采用市面上销售的通用通用模块TDGS-800,并在电路板上安装一块已开通gpsOne定位服务的联通手机卡,通过相应的接口电路实现与单片机的数据通信。

(2) 单片机模块:主要用于对车载信号的数据处理以及实时控制,其中烧写了一套系统的控制处理软件,可对接收到的短消息、定位数据等进行解释、执行传输,同时还可对外部信息进行处理并对外部设备实施控制。单片机可择目前市面上具有Flash存储器的芯片P89LPC932,便于用户通过手机短信,利用串行行通信方式对Flash程序存储器重新配用户信息,实现系统管理和程序控制。

  系统的电路原理图如 (4)所示

 

                  4 系统电路原理图

4 软件系统的设计

车载软件总体结构才用前后台模式,前台程序主要由中断程序组成.主要是外部中断和串口中断,后台程序主要由三个任务程序组成.

控制中心GIS软件是由西安电子科技大学陈光达教授开发的GPS/GSM/GPRS智能车辆/船舶监控管理系统(GIS软件)组成.控制中心软件具有串口,可以连接短信猫.用于接收车载报警器发送的定位数据、报警、布防等信息,并在地图上显示.

下面主要论述车载软件:

4.1 中断程序

(1) 振动传感器中断程序

对于传感器中断,为了避免偶然振动引起的(如布防后行人.不小心碰了一下),此时的振动次数比较少.而真正发生盗车时.振动的次数肯定比较多.在程序中设置了灵敏度.即在一定的时间内振动传感器振动次数达到预定的值时才发送短信告知车主.

(2) 串口接收中断程序

串口接收的数据有gpsOne下行的定位数据,中心发送的短信数据,还有车载发送短信时CDMA模块回复的数据.不同的数据对应着不同的后台服务程序.程序的关键利用抓取关键字的方式.关键字选取3个字符.在程序中已经预定义了相应的含义.

(3)定时中断程序

为程序运行提供间隔.并且在程序中控制LED显示工作状态

4.2 后台服务程序

后台程序主要由三个任务组成.分别是:1.解析处理单片机通过串口接收的数据;2.CDMA模块发送相关的AT指令对模块进行控制,拼装相应的短信内容;3 .扫描I/0端口,对报警,布防按钮进行软件去毛刺

(1)任务1: Proc_GSMCMD();

在解析串口接收的数据时.由于情况很多.采用分支结构.又调用了一下程序进行细分为

PM_RING();处理接收打进的电话

PM_CMT();接收短信息 提示

PM_CMGSR();解析接收的短信内容

Proc_GPSCMD();处理接收的GPS数据

(2)任务2: Task_ATCMD();

在这个任务程序中只要是一些AT命令.比如来电挂机命令AT+CHV0,模式设置

AT+UGSM, AT+CMGF,删除短信AT+SMSD,读取短信AT+CMGR,gpsOne定位AT+GPSTART.并设置了优先级.

(3)任务3: SCAN_IN();

主要对I/0口进行扫描.为了兼顾实时性和不消耗CPU,运行任务3.要判断定时器周期性的置起的相应的标志,扫描间隔定位50ms.

对于模块发送短信需要一定的时间间隔.以及通过AT+GPSSTRT 获取定位数据后,模块再发送短信时网络需要切换时间(不然发送短信时就会出现没有网络的故障.)程序中特别加入了延时机制和对发送短信以及定位发生失败之后的重发机制.保证了程序的处理异常情况的能力.

    通过调试和实际运行.反应速度和可靠性满足了预定的要求.车辆的状态在控制中心软件的显示如 ( 5 控制中心软件)所以

                     5 控制中心软件

5 结束语

此方案在实际应用中其精度稳定性均达到设计要求,且系统具有集成化程度高抗干扰能力强等优点另外,本系统一方面自成体系,也可以通过串行口与上位机通讯,从而实现网络化管理同传统的定位系统相比-该方案具有系统成本低/定位精度高/定位速度快/通信费用低等特点.

 

 

参考文献

[1]周立功.LPC900系列FLASH单片机应用技术[M].北京:北京航空航天大学出版社,2003.

[2]广州周立功单片机发展有限公司            P89LPC932 Flash单片机使用指南

[3]  AnyDATA (Shanghai) Co., Ltd.            AnyDATA CDMA MODEM AT 手册

 

2019-12-13 15:09:37 u013053268 阅读数 368
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

    3419 人正在学习 去看看 朱有鹏

一个经典的单片机课程设计。

主要用到的模块和资源有:LCD12864中文液晶模块,at24c02存储器模块用于存用户密码,ds18b20温度传感器模块,ISD1802语音模块用于语音报警,红外接收探头,用于接收红外键盘的信息、矩阵键盘4*4、红外势热,用于检测人体,GSM模块用于发送报警短信或者拨打用户手机等。IO口输入输出、串口发送。

编译环境:Uv4 for c51

主要的文件有:

 

#ifndef _GLOBAL_
	#define _GLOBAL_
	#include<reg52.h>
	#define uint unsigned int
	#define uchar unsigned char
	
	sbit led=P2^0;
	sbit beep=P2^3;
	sbit Play=P2^4;
	sbit PlayL=P2^5;
	#include "key.h"
	#include "ds18b20.h"
	#include "12864.h"
	#include "at24c02.h"
	#include "app.h"
	#include "gsm.h"
	#include "hongwai.h"
	#include "heat.h"
#endif

 

 

1、矩阵扫描程序:(分别扫描行列)

 

#include "key.h"

#define key P1 
 bit getnew = 0; 
uchar keynum;

code uchar keyout[4] = {0x7f,0xbf,0xdf,0xef}; 
uchar Input_Code(void)
{
	getnew = 0; 
	key_input();
	if(getnew == 1)
	{
		getnew = 0;
		switch (keynum)
		{
			case 1:return 'D';break;
			case 2:return 'C';break;
			case 3:return 'B';break;
			case 4:return 'A';break;
			case 5:return '#';break;
			case 6:return '9';break;
			case 7:return '6';break;
			case 8:return '3';break;
			case 9:return '0';break;
			case 10:return '8';break;
			case 11:return '5';break;
			case 12:return '2';break;
			case 13:return '*';break;
			case 14:return '7';break;
			case 15:return '4';break;
			case 16:return '1';break;
           		default:return keynum;break;
		}
	}
	else return 0;
	
}
static void key_input(void) 
{
	uchar i;
	key = 0X0F;
	if((key|0XF0) != 0XFF)
	{
		delay(10);
		if((key|0XF0) != 0XFF)
		{
			for(i = 0;i < 4;i++)
			{
				key = keyout[i];
				keynum = key;
				while((key|0XF0) != 0XFF);
				switch(keynum|0XF0)
				{
					case 0XF7:
						keynum = (i*4+1);
						getnew = 1;
						return ;break;
					case 0XFB:
						keynum = (i*4+2);
						getnew = 1;
						return ;break;
					case 0XFD:
						keynum = (i*4+3);
						getnew = 1;
						return ;break;
					case 0XFE:
						keynum = (i*4+4);
						getnew = 1;
						return ;break;
				}
			}
		}
	}
}


2、温度传感器读取温度

 

 

#include"DS18B20.h"

int temp; 
float temp_get()  
{
  float tt;
  uchar a,b;
  temp_start();
  temp_reset();
  temp_delay(1);
  temp_writebyte(0xcc);  
  temp_writebyte(0xbe); 
  a=temp_readbyte();
  b=temp_readbyte();
  temp=b;
  temp<<=8;
  temp=temp|a;
  tt=temp*0.0625;
  tt=(uint)(tt*10+0.5);
  tt=tt/10;
  return tt;
}


static void temp_delay(uint count)      
{
  uint i;
  while(count)
  {
    i=200;
    while(i>0)
    i--;
    count--;
  }
}
static void temp_reset(void)      
{
  uint i;
  DS=0;
  i=103;
  while(i>0)i--;
  DS=1;
  i=4;
  while(i>0)i--;
}

static bit temp_readbit(void)     
{
   uint i;
   bit dat;
   DS=0;i++; 
   DS=1;i++;i++;
   dat=DS;
   i=8;while(i>0)i--;
   return (dat);
}

static uchar temp_readbyte(void)   
{
  uchar i,j,dat;
  dat=0;
  for(i=1;i<=8;i++)
  {
    j=temp_readbit();
    dat=(j<<7)|(dat>>1);   
  }
  return(dat);
}
static void temp_writebyte(uchar dat)   
{
  uint i;
  uchar j;
  bit testb;
  for(j=1;j<=8;j++)
  {
    testb=dat&0x01;
    dat=dat>>1;
    if(testb)     
    {
      DS=0;
      i++;i++;
      DS=1;
      i=8;while(i>0)i--;
    }
    else
    {
      DS=0;       
      i=8;while(i>0)i--;
      DS=1;
      i++;i++;
    }

  }
}
static void temp_start(void)   
{
  temp_reset();
  temp_delay(1);
  temp_writebyte(0xcc);  
  temp_writebyte(0x44); 
}

//static void temp_readrom() 
//{
//  uchar sn1,sn2;
//  temp_reset();
//  temp_delay(1);
//  temp_writebyte(0x33);
//  sn1=temp_readbyte();
//  sn2=temp_readbyte();
//}

 

 

3、12864液晶显示

 

#include "12864.h"

sbit LCD_RS  =  P3^5;          
sbit LCD_RW  =  P3^6;            
sbit LCD_EN  =  P3^7;          
sbit LCD_PSB =  P2^1;  
#define delay_nop(); {_nop_();_nop_();_nop_();_nop_();};
#define data_port P0

void delay(uint ms)
{      
	uchar i;
	while(ms--)
	{
		for(i=0;i<120;i++);
	}
}
void lcd_init()		
{ 
	 LCD_PSB = 1;         
	 lcd_writecmd(0x34);      
	 delay(5);
	 lcd_writecmd(0x30);      
	 delay(5);
	 lcd_writecmd(0x0C);     
	 delay(5);
	 lcd_writecmd(0x01);      
	 delay(5);
}

void lcd_clean(void)
{
	lcd_writecmd(0x01);      
	delay(5);
}

void lcd_show(uchar x, uchar y,uchar *cn) 
{
	uchar i = 0;
	lcd_pos(x,y);;
    	while(cn[i] != '\0')
       lcd_writedata(cn[i++]);
}



bit lcd_busy()		
 {                          
	bit result;
	LCD_RS = 0;
	LCD_RW = 1;
	LCD_EN = 1;
	delay_nop();
	result = (bit)(P0&0x80);
	LCD_EN = 0;
	return(result); 
 }
 
void lcd_pos(uchar x,uchar y)		
{                          
   uchar  pos;
   if (y==0)
     {y=0x80;}
   else if (y==1)
     {y=0x90;}
   else if (y==2)
     {y=0x88;}
   else if (y==3)
     {y=0x98;}
   pos = x+y ;  
   lcd_writecmd(pos);    
}

void lcd_writecmd(uchar cmd)		
{                          
	while(lcd_busy());
	LCD_RS = 0;
	LCD_RW = 0;
	LCD_EN = 0;
	_nop_();
	_nop_(); 
	data_port = cmd;
	delay_nop();
	LCD_EN = 1;
	delay_nop();
	LCD_EN = 0;  
}
void lcd_writedata(uchar dat)		
{                          
	while(lcd_busy());
	LCD_RS = 1;
	LCD_RW = 0;
	LCD_EN = 0;
	data_port = dat;
	delay_nop();
	LCD_EN = 1;
	delay_nop();
	LCD_EN = 0; 
}

 


4、红外键盘输入

 

 

 

/*
Óõ½Òý½Å: 3.2
Óõ½ÍâÉè: ¶¨Ê±Æ÷0 ¡¢ÍⲿÖÐ¶Ï 0
Ïȵ÷ÓÃir_init()½øÐгõʼ»¯,ÔÙµ÷ÓÃir_get()µÃµ½ºìÍâ½ÓÊÕµÄÖµ
*/
#include "hongwai.h"

uchar irtime;		/*ÓÃÓÚ¼Æʱ*/
uchar ir_data;	/*ºìÍâ×îºóµÄµ½µÄÖµ*/
uchar ircord[4];	/*´æ·Å½âµÃµÄÂð*/
uchar irdata[33];		/*´æ·ÅºìÍâÂë*/
static bit startflag = 0; 	/*ÊÇ·ñ¿ªÊ¼´¦Àí±ê־λ*/
static bit getnew = 0; 

void HW_Init(void)		/*ºìÍâ³õʼ»¯*/
{
	timer0_init();
	EX0_init();
}
uchar HW_get(void)	/*·µ»ØºìÍâµÃµ½µÄÖµ*/
{	
	if(getnew == 1)
	{
		getnew = 0;
		switch (ir_data)
		{
			case 0x16:return '0';break;
			case 0x0c:return '1';break;
			case 0x18:return '2';break;//2
			case 0x5e:return '3';break;//3
			case 0x08:return '4';break;//4
			case 0x1c:return '5';break;
			case 0x5a:return '6';break;
			case 0x42:return '7';break;
			case 0x52:return '8';break;
			case 0x4a:return '9';break;
			case 0x19:return '*';break;
			case 0x0d:return '#';break;
           		default:return ir_data;break;
		}
	}
	else return 0;
}

/*ÄÚ²¿º¯Êý*/
static void timer0_init(void)		/*¶¨Ê±Æ÷0³õʼ»¯*/
{
	TMOD|=0x02;/*¶¨Ê±Æ÷0¹¤×÷·½Ê½2£¬TH0ÊÇÖØ×°Öµ£¬TL0ÊdzõÖµ*/
	TH0=0x00;/*ÖØÔØÖµ*/
	TL0=0x00; /*³õʼ»¯Öµ*/
	ET0=1;/*¿ªÖжÏ*/
	TR0=1;
}

static void EX0_init(void)		/*ÍⲿÖжÏ0³õʼ»¯*/
{
	IT0 = 1;/*Ö¸¶¨ÍⲿÖжÏ0ϽµÑØ´¥·¢£¬INT0 (P3.2)*/
	EX0 = 1;/*ʹÄÜÍⲿÖжÏ*/
	EA = 1;/*¿ª×ÜÖжÏ*/
}

static void ircordpro(void)		/*ºìÍâÂëÖµ´¦Àíº¯Êý*/
{ 
 	uchar i, j, k;
	uchar value;
	 k=1;
	 for(i=0;i<4;i++) /*´¦ÀíÒ»¶ÎºìÍâÂë4¸ö×Ö½Ú*/
	{
		for(j=1;j<=8;j++) /*´¦Àí1¸ö×Ö½Ú8λ*/
		{
			/*´óÓÚijֵΪ1£¬Õâ¸öºÍ¾§ÕñÓоø¶Ô¹Øϵ£¬ÕâÀïʹÓÃ12M¼ÆË㣬´ËÖµ¿ÉÒÔÓÐÒ»¶¨Îó²î*/
			if(irdata[k]>7)value|=0x80;
			if(j<8)value>>=1;
			k++;
		}
		ircord[i]=value;
		value=0;     
	} 
	 if(ircord[2] == ~ircord[3])
	 {
		 ir_data = ircord[2];
		 getnew = 1;
	 }
}

/*Öжϴ¦Àíº¯Êý*/
void tim0_isr (void) interrupt 1 using 1
{
	irtime++;	/*ÓÃÓÚ¼ÆÊý2¸öϽµÑØÖ®¼äµÄʱ¼ä*/
}
void EX0_ISR (void) interrupt 0	/*ÍⲿÖжÏ0·þÎñº¯Êý*/
{
	static uchar  i;             /*½ÓÊÕºìÍâÐźŴ¦Àí*/
	if(startflag)                         
	{
		if(irtime<63&&irtime>=33)i=0;		/*Òýµ¼Âë TC9012µÄÍ·Â룬9ms+4.5ms*/
		irdata[i]=irtime;		/*´æ´¢Ã¿¸öµçƽµÄ³ÖÐøʱ¼ä£¬ÓÃÓÚÒÔºóÅжÏÊÇ0»¹ÊÇ1*/
		irtime=0;
		i++;
		if(i==33)
		{
			i=0;
			ircordpro();		/*ºìÍâÂëÖµ´¦Àí*/
		}
	}
	else
	{
		irtime=0;
		startflag=1;
	}
}


5、GSM发送短信

 

 

#include "gsm.h"


/*********************************************************** 
º¯ÊýÃû³Æ£ºPrint_Char 
º¯Êý¹¦ÄÜ£º·¢Ë͵¥¸ö×Ö·û     
          Èë¿Ú²ÎÊý:ch      ³ö¿Ú²ÎÊý£ºÎÞ 
***********************************************************/
void Print_Char(uchar ch)//·¢Ë͵¥¸ö×Ö·û
{
	SBUF=ch; //ËÍÈ뻺³åÇø
	while(!TI); //µÈ´ý·¢ËÍÍê±Ï
	TI=0; //Èí¼þÇåÁã
}

/*********************************************************** 
º¯ÊýÃû³Æ£ºPrint_Str 
º¯Êý¹¦ÄÜ£º·¢ËÍ×Ö·û´®     
          Èë¿Ú²ÎÊý:*str    ³ö¿Ú²ÎÊý£ºÎÞ 
***********************************************************/
void Print_Str(uchar *str1)//·¢ËÍ×Ö·û´®
{

		unsigned char i = 0;
		while(str1[i] != '\0')
		{
		   SBUF = str1[i];
		   while(!TI);     // µÈÌØÊý¾Ý´«ËÍ
		   TI = 0;      // Çå³ýÊý¾Ý´«ËͱêÖ¾
		   i++;      // ÏÂÒ»¸ö×Ö·û
		}

}


 
/*********************************************************** 
º¯ÊýÃû³Æ£ºIni_UART 
º¯Êý¹¦ÄÜ£º´®¿Ú³õʼ»¯¡¢¶¨Ê±Æ÷³õʼ»¯     
          Èë¿Ú²ÎÊý:ÎÞ     ³ö¿Ú²ÎÊý£ºÎÞ 
***********************************************************/ 
void Init_UART(void)//´®¿Ú³õʼ»¯¡¢¶¨Ê±Æ÷³õʼ»¯
{
		TMOD=0x20;
		TH1=0xfa;
		TL1=0xfa;     //UART²¨ÌØÂÊÉèÖÃ:9600 
		TR1=1;
		SM0=0;
		SM1=1;
		REN=1;
		EA=1;
		PCON=0x80;
}
 


void Send_Message(void)
{		
	lcd_clean();
	lcd_show(0,0,"    °²È«¾¯¸æ");
	lcd_show(0,1,"±¨¾¯¶ÌÐÅ·¢ËÍÖÐ..");
	
	Print_Str("AT+CNMI=2,1");
	Print_Str("\r\n");

	delay(200);
	Print_Str("AT+CMGF=1");
	Print_Str("\r\n");
	delay(200);

	Print_Str("AT+CMGS=\"1111111111\"");//phone number
	Print_Str("\r\n");
	delay(1000);
	Print_Str("Smart House System: Warning, your house is under danger! ");
	Print_Char(0x1a);    //·¢ËͶÌÐÅ  
	delay(10);
	lcd_show(0,2,"    ÒÑ·¢ËÍ");
	delay(2000);
	lcd_clean();
}
//	Print_Str("AT+CPMS=\"SM\"");
//	delay(1000);

 


6、AT24C02存储器芯片(IIC接口)

 

 

 

#include "at24c02.h"

sbit sda=P2^7;                         
sbit scl=P2^6;


void nop()
{
	_nop_();
	_nop_();
}

//void delay1(unsigned int m)
//{	
//	unsigned int n;
//  	for(n=0;n<m;n++);
//}

void AT24C02_Init()  
{
	scl=1;
	nop();
	sda=1;
	nop();
}

void start()       
{
	sda=1;
	nop();
	scl=1;
	nop();
	sda=0;
	nop();
	scl=0;
	nop();
}

void stop()        
{
	sda=0;
	nop();
	scl=1;
	nop();
	sda=1;
	nop();
}

void writebyte(unsigned char j)  
{
	unsigned char i,temp;
   	temp=j;
   	for (i=0;i<8;i++)
   {
	   temp=temp<<1;
	   scl=0;
	   nop();
	   sda=CY;		
	   nop();
	   scl=1;		
	   nop();
   }
   scl=0;
   nop();
   sda=1;
   nop();
}

unsigned char readbyte()   
{
   unsigned char i,j,k=0;
   scl=0; nop(); sda=1;
   for (i=0;i<8;i++)
   {  
		nop(); scl=1; nop();
      	if(sda==1) 
		j=1;
      	else
		j=0;
      	k=(k<<1)|j;
	  	scl=0;
	}
   	nop();
	return(k);
}

void clock()         
{
   unsigned char i=0;
   scl=1;
   nop();
   while((sda==1)&&(i<255))
   	  i++;
   scl=0;
   nop();
}


uchar read24c02( uchar address)
{
   unsigned char i;
   start();
   writebyte(0xa0);
   clock();
   writebyte(address);
   clock();
   start();
   writebyte(0xa1);
   clock();
   i=readbyte();
   stop();
   delay(10);
   return(i);
}


//void write24c02(unsigned char address,unsigned char info)
//{
//   start();
//   writebyte(0xa0);
//   clock();
//   writebyte(address);
//   clock();
//   writebyte(info);
//   clock();
//   stop();
//   delay(500); 
//}


主要业务逻辑函数app.c

 

 

#include "app.h"
uchar CodeInput[5]=0;		//keyborad input
uchar CodeRead[5];			//at24c02 read
//uint ErrorTime = 0;			//input wrong code
uint Lock_STA=1;

/*ϵͳ¹¤×÷½çÃæ*/
void Main_Menu(void)
{
	lcd_show(0,0,"ÖÇÄܼҾӱ¨¾¯ÏµÍ³");
	if(Lock_STA){
		lcd_show(0,1,"    ¹¤×÷ÖÐ..");
		lcd_show(0,2,"°´ÈÎÒâ¼üÊäÈëÃÜÂë: ");
	}
}

/*Óû§Ö÷½çÃæ*/
void Wel_Menu()
{	
	uchar key_temp='0';
	uint cnt=0;
	Lock_STA=0;				//ÄܽøÈ뻶ӭҳÃ棬֤Ã÷ÒѾ­½âËø
	
		lcd_clean();
		lcd_show(0,0,"    ÌøתÖÐ..");
		delay(800);
	lcd_clean();
	lcd_show(1,0,"Welcome Home");
		lcd_show(0,1,"ζȣº");
		lcd_show(4,1,"¡æ");
//	lcd_show(0,1,"°´* ¼üÍ˳ö");
//	lcd_show(0,2,"°´D ¼ü·¢ËͶÌÐÅ");
	while(1){
		if(cnt%100 == 0)		/*ÿ1 ÃëË¢Ò»´ÎζÈ*/
		{	
			cnt=0;
			Get_Temperture();
	
		}
		cnt++;
		delay(10);
		lcd_show(0,2,"°´* ¼üÖØÐÂÉÏËø");
		if(Input_Code()=='*') {Lock_STA=1;break;}
//		key_temp=Input_Code();//||HW_get();
//		switch(key_temp){
//			case '1': ;break;					//code Adjust
//			case '*': Lock_STA=1;return;break;					//lock again
//			case '#': ;break;					
//			case 'A': ;break;
//			default: break;
//		}
	}
	lcd_show(3,3,"ÒÑËø¶¨");
	delay(500);
}
/*¶ÁȡζȲ¢ÏÔʾ*/
void Get_Temperture()
{
			uchar temp_num = 0;		/*ÓÃÓÚ´¢´æζÈÖµ*/
			uchar tempstr[3] = 0;		/*ÓÃÓÚ´¢´æζÈÖµ×Ö·û´®*/
			temp_num = temp_get();
			tempstr[0] = (temp_num/10)+'0';
			tempstr[1] = (temp_num%10)+'0';
			tempstr[2] = '\0';
			lcd_show(3,1,tempstr);
}
/*ÊäÈëÃÜÂ룬ÒÔ#ºÅ¼ü½áÊø*/
void Code_Input()
{
	uchar key_temp='0',tempcode[2]=0;
	uint cnt=0,count=0;
	while(key_temp!='#'){
		if(((key_temp=Input_Code())!=0)||((key_temp=HW_get())!=0)){				
			tempcode[0]=key_temp;
			tempcode[1]='\0';
			lcd_show(cnt,3,tempcode);
			CodeInput[cnt]=key_temp;
			cnt++;
			if(cnt>=8)cnt=0;
			led=~led;
		}
	}
	cnt--;
	CodeInput[cnt]='\0';
//	lcd_show(4,3,CodeInput);
}

//void Code_Init()
//{	
//	uint cnt_24=0;
//	for(cnt_24=0;cnt_24<4;cnt_24++){		//дÈë³õʼÃÜÂë
//		write24c02(cnt_24+16,'1');
//	}
//}

void Read_Code()
{

	uint cnt_24,count=0;
	for(cnt_24=0;cnt_24<4;cnt_24++){		//´Ó´æ´¢Æ÷¶ÁÃÜÂë
		CodeRead[count]=read24c02(cnt_24+16);
		count++;
	}
	CodeRead[count]='\0';
//	lcd_show(0,3,CodeRead);
}

//Input Code Accepted, return 1;
int  Code_Judge()
{//CodeRead:´Ó´æ´¢Æ÷¶Áµ½µÄÃÜÂë
 //CodeInput:´Ó¼üÅÌÊäÈëµÄÃÜÂë
	uint i;
	Read_Code();
	for(i=0;i<sizeof(CodeRead);i++){
		if(CodeInput[i]==CodeRead[i])		
			continue;
		else break;
	}
	if(i>=sizeof(CodeRead))	return 1;
	else	return 0;
}

void USER_Ammited()
{
	uint ErrorCnt=0;
	while(1)
	{
		lcd_clean();
		Main_Menu();			//main menu 
		Code_Input();			//key in code
	
		if(Code_Judge()){				//ÃÜÂëÑéÖ¤	
			break;	
		}			
		else{
				ErrorCnt++;
				if(ErrorCnt>=3) 
					{Vol_Display();Send_Message();return;}		//ÃÜÂëÊäÈë´ÎÊý³¬¹ý3´Î£¬·¢Ëͱ¨¾¯¶ÌÐÅ
				lcd_show(0,2,"ÃÜÂë´íÎó£¬ÇëÖØÊÔ");
				beep = 0;
				delay(2000);
				beep = ~beep;
		}
	}	
	Wel_Menu();					//enter welcome menu
}

void Vol_Display()
{
	Play=1;
	Play=0;
	Play=0;
}

void Heat_Warning()
{//
	uchar temp_num = 0;			
	temp_num = temp_get();
	if(temp_num=='50'||temp_num=='51'||temp_num=='52')
		Send_Message();
}

 

 

 

 

 

没有更多推荐了,返回首页