Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)
单片机源程序如下:
- #include <REGX52.H>
- #include <LCD1602.H>
- #include <eeprom52.h>
- #include <DS18B20.h>
- #include <HX711.h>
- #include <BJDJ.h>
- #define uchar unsigned char
- #define uint unsigned int
- //---------------------------->Dispose
- sbit FIR1 = P1^0;
- sbit FIR2 = P1^1;
- uchar delay_time=0; //检测延时2s
- uchar yanshi_time=0;
- uchar count_time=0; //锁车5s倒计时
- bit count_flag=0;
- //---------------------------->Timer
- uint ms = 0;
- uint time=0;
- //---------------------------->Display
- bit Read_Weight = 0; //重量标志位
- bit Read_Temp = 0; //温度标志位
- int temp = 0;
- sbit alarm = P3^5; //继电器 0导通, 门未锁
- uchar Door = 1;
- //---------------------------->Key
- sbit key1 = P3^3; //控制继电器
- sbit key2 = P3^4; //控制布防、撤防
- bit key1_flag=0;
- bit key2_flag=0;
- ////---------------------------->电机驱动
- uint Stop_time = 0; //半圈计数变量
- uchar zhuan = 0; //正反转标志
- //---------------------------->Police
- sbit beep = P2^4;
- bit beep1 = 0;
- ///--------------------------------------------->GSMsim800
- //-----> Uart1 And GSM Definition
- unsigned char xdata Uart1_Buff[50]; //串口1缓冲数组
- unsigned char Uart1_Count=0; //串口1累加变量
- unsigned char Quest_flag=1; //GSM状态标志位,等于0,进行初始化,等于一是进入发短信区域
- unsigned int GSM_Send_Time=0; //AT指令发送间隔时间
- unsigned char GSM_Num=0; //AT指令指向
- unsigned char GSM_Send=0; //发送短信使能标志位
- unsigned char GSM_Send_Num=0; //短信编号
- unsigned char Phone[12]={'\0'}; //定义手机号存储数组
- bit memory_flag=0;
- bit cx_flag=0;
- //初始化显示,主要用在上电校准称重的时候显示界面
- void display_int()
- {
-
- LCD1602_write(0,0x80);
- LCD1602_writebyte(" Welcome ");
- LCD1602_write(0,0xC0);
- LCD1602_writebyte(" initialize... ");
- }
- void delay(uint z)
- {
- while(z--);
- }
- void UartSend(unsigned char dat) //发送一个字节
- {
- SBUF=dat;
- while(!TI);
- TI=0;
- }
- void UartSendString(char *s) //发送一串数据
- {
- while (*s)
- {
- UartSend(*s++);
- }
- }
- void keyscan()
- {
- if(!key1)
- {
- if(key1_flag==1)
- {
- key1_flag=0;
- Door=(Door+1)%2; //0 门锁
- }
- }
- else key1_flag = 1;
- if(!key2)
- {
- if(key2_flag==1)
- {
- key2_flag=0;
- if(cx_flag==1)
- {
- beep1=0;
- zhuan=2;
- cx_flag=0;
- }
- }
- }
- else key2_flag = 1;
- }
- void display()
- {
- //第一行显示重量数据,有超重显示横杠的设定
- LCD1602_write(0,0x80);
- LCD1602_writebyte("Weight:");
- if(Weight_Shiwu<10000)
- {
- LCD1602_write(1,0x30+Weight_Shiwu/1000%10);
- LCD1602_write(1,'.');
- LCD1602_write(1,0x30+Weight_Shiwu/100%10);
- LCD1602_write(1,0x30+Weight_Shiwu/10%10);
- LCD1602_write(1,0x30+Weight_Shiwu%10);
- }
- else
- {
- LCD1602_write(1,'-');
- LCD1602_write(1,'.');
- LCD1602_write(1,'-');
- LCD1602_write(1,'-');
- LCD1602_write(1,'-');
-
- }
- LCD1602_writebyte("Kg ");
- LCD1602_write(0,0xC0);
- LCD1602_writebyte("Dr: ");
- if(alarm==0) LCD1602_writebyte("Open ");
- else LCD1602_writebyte("Close ");
-
- LCD1602_write(1,0x30+temp/100%10);
- LCD1602_write(1,0x30+temp/10%10);
- LCD1602_writebyte(".");
- LCD1602_write(1,0x30+temp%10);
- LCD1602_write(1,0xdf);
- LCD1602_writebyte("C");
- //
- // LCD1602_write(1,0x30+count_time/10%10);
- // LCD1602_write(1,0x30+count_time%10);
- // LCD1602_writebyte(" ");
- // LCD1602_write(1,0x30+delay_time/10%10);
- // LCD1602_write(1,0x30+delay_time%10);
- // LCD1602_write(0,0xc0);
- // LCD1602_write(1,0x30+yanshi_time/10%10);
- // LCD1602_write(1,0x30+yanshi_time%10);
- }
- void GSM_Init() //GSM函数
- {
- unsigned char G_Tab[20];
- if(Quest_flag==1) //开始查询GSM状态//此时还没有初始化完成,首先,先初始化 ,发AT,能够响应上,关回显,设置短信处理方式
- {
- switch(GSM_Num)
- {
- case 0: UartSendString("AT\r\n"); break; //AT
- case 1: UartSendString("ATE1\r\n"); break;//关回显
- case 2: UartSendString("AT+CNMI=3,2,2,0,1\r\n"); break;//设置
- case 3: UartSendString("AT+CMGF=1\r\n"); break; //配制
- case 4: UartSendString("AT+COPS?\r\n"); break; //查询网络
- case 5: Quest_flag=0; GSM_Num=0; break; //初始化彻底结束
- }
- GSM_Send_Time=100;
- }
- else
- {
-
- GSM_Send_Time=100;
- if(GSM_Send==1) //发送短信标志
- {
- Phone[11]='\0';
- if(GSM_Send_Num==0) //Num 是短信编号,就是发送哪条短信,这个是返回Set End 的
- {
- switch(GSM_Num)
- {
- case 0: UartSendString("AT+CMGF=1\r\n"); break;
-
- case 1: UartSendString("AT+CMGS=\"");
- UartSendString(Phone);
- UartSendString("\"\r\n"); break; //AT+CMGS="13343851798"
-
- case 2: UartSendString("Set End"); GSM_Num=3; GSM_Send_Time=5; break;
-
- case 3: G_Tab[0]=0x1a;
- UartSend(G_Tab[0]); break;
- case 4: GSM_Num=0; GSM_Send=0; break;
-
- }
- }
- else if(GSM_Send_Num==1)
- {
- switch(GSM_Num)
- {
- case 0: UartSendString("AT+CMGF=0\r\n"); break;
- case 1: UartSendString("AT+CMGS=67\r\n"); break;
-
- case 2: UartSendString("0011000D9168"); //12
- G_Tab[0]=Phone[1]; //11
- G_Tab[1]=Phone[0];
- G_Tab[2]=Phone[3];
- G_Tab[3]=Phone[2];
- G_Tab[4]=Phone[5];
- G_Tab[5]=Phone[4];
- G_Tab[6]=Phone[7];
- G_Tab[7]=Phone[6];
- G_Tab[8]=Phone[9];
- G_Tab[9]=Phone[8];
- G_Tab[10]='F';
- G_Tab[11]=Phone[10];
- UartSendString(G_Tab); //8 52
- UartSendString("0008A934"); //末尾两位数是发送的短信长度,每个汉字占两个字节(18个字节转16进制为12)
- UartSendString("8BF76CE8610FFF0C5F53524D6E295EA6FF1A0020");//请注意当前温度:空 36
- UartSendString("003"); //数据16
- UartSend(0x30+temp/100%10);
- UartSendString("003");
- UartSend(0x30+temp/10%10);
- UartSendString("002E"); //.
- UartSendString("003");
- UartSend(0x30+temp%10);
- UartSendString("21030020FF0C"); //℃,符号12
- UartSendString("00208F6651856709905775595E7C513F3002"); //车内有遗留幼儿。 32
- GSM_Num=3; GSM_Send_Time=5; break;
- case 3: G_Tab[0]=0x1a;
- UartSend(0x1a); break;
- case 4: GSM_Num=0; GSM_Send=0; break;
- }
- }
- }
- else GSM_Num=0;
- }
- }
- void dispose() //处理函数
- {
- if(Read_Weight==1)
- {
- Read_Weight=0;
- Get_Weight();
- }
- if(Read_Temp==1)
- {
- Read_Temp=0;
- temp=Temper();
- }
- if(Door==1)
- {
- alarm=0; //车门打开
- }
- else
- {
- alarm=1;
- count_flag=1;
- }
- }
- void police() //报警函数
- {
- static only=0;
- if(count_flag==1)
- {
- count_flag=0;
- if(only==1)
- {
- count_time=5; //检测倒计时5s
- only=0;
- }
-
- } else only=1;
-
- if(alarm==1&&count_time==0)
- {
- if(FIR1==1)
- {
- delay_time=3; //延时检测2s
- if(FIR2==1&&Weight_Shiwu>3000&&Weight_Shiwu<10*1000)
- {
- beep1=1; //报警
- zhuan=1;
- cx_flag=1;
- GSM_Send=1;
- GSM_Send_Num=1;
- }
- } else if(FIR2==1&&delay_time!=0)
- {
- if(Weight_Shiwu>3000&&Weight_Shiwu<10*1000)
- {
- beep1=1; //报警
- zhuan=1;
- cx_flag=1;
- GSM_Send=1;
- GSM_Send_Num=1;
- }
- }
- if(FIR2==1)
- {
- yanshi_time=3; //延时检测2s
- if(FIR1==1&&Weight_Shiwu>3000&&Weight_Shiwu<10*1000)
- {
- beep1=1; //报警
- zhuan=1;
- cx_flag=1;
- GSM_Send=1;
- GSM_Send_Num=1;
- }
- } else if(FIR1==1&&yanshi_time!=0)
- {
- if(Weight_Shiwu>3000&&Weight_Shiwu<10*1000)
- {
- beep1=1; //报警
- zhuan=1;
- cx_flag=1;
- GSM_Send=1;
- GSM_Send_Num=1;
- }
- }
- }
- }
- void memory() //存储函数
- {
- unsigned char q=0;
- if(memory_flag==1)
- {
- memory_flag=0;
- SectorErase(0x2000);
- for(q=0;q<11;q++)
- {
- byte_write(0x2000+q,Phone[q]);
- }
- }
- }
- void read_memory() //读取存储函数
- {
- unsigned char q=0;
- for(q=0;q<11;q++)
- {
- Phone[q]=byte_read(0x2000+q);
- }
- }
- void Time0_int() //定时器0
- {
- TMOD= 0x01; //设置定时器模式
- TH0 = 0x4c; //5ms
- TL0 = 0x00;
- ET0=1;
- TR0=1;
- EA =1;
- }
- //使用定时器2用作波特率发生器
- void Timer2_Uart()
- {
- T2CON = 0x34;
- RCAP2H = 0xFF;
- RCAP2L = 0xDC;
- TH2 = 0xFF;
- TL2 = 0xDC;
- TR2 = 1;
- SCON = 0x50;
- ES = 1;
- }
- void main()
- {
- LCD1602_cls();
- display_int();
- Get_Maopi();
- Time0_int(); //初始化
- Timer2_Uart(); //调用定时器 2 初始化波特率
- read_memory(); //调用读取存储函数
- do
- {
- delay(100);
- temp=Temper();
- }
- while (temp==850);
- while(1)
- {
- if(Weight_Shiwu<=3) Weight_Shiwu=0;
-
- display(); //显示函数
- dispose(); //处理函数
- keyscan(); //按键
- police(); //报警函数
- memory();
- if(GSM_Send_Time==0) GSM_Init(); //GSM
- while(zhuan==1)
- {
- if(Stop_time<4096)
- {
- Bjdj_Drive(zz[DJ_Loop]);
- DJ_Loop=(DJ_Loop+1)%8;
- Stop_time++;
- delay(100);
- }
- else
- {
- zhuan = 0;
- Stop_time=0;
- }
- }
- while(zhuan==2)
- {
- if(Stop_time<4096)
- {
- Bjdj_Drive(fz[DJ_Loop]);
- DJ_Loop=(DJ_Loop+1)%8;
- Stop_time++;
- delay(100);
- }
- else
- {
- zhuan=0;
- Stop_time=0;
- }
- }
- }
- }
- void Time0() interrupt 1 //定时器0
- {
- TH0 = 0x4c; //50ms
- TL0 = 0x00;
- ms++;
- time++;
- if(GSM_Send_Time!=0) GSM_Send_Time--; //GSM指令发送间隔
- if(ms%5==0) //250ms
- {
- if(beep1==1) beep=!beep;
- else beep=1;
- }
- if(ms%20==0) //1s
- {
- ms=0;
- Read_Weight=1;
- Read_Temp=1;
- if(count_time!=0) count_time--; //锁车延时5s
- if(delay_time!=0) delay_time--; //检测延时2s
- if(yanshi_time!=0) yanshi_time--;
- }
- }
- //---->Uart1
- void Uart1() interrupt 4 //串口中断回调
- {
- unsigned char i=0;
- if(RI)
- {
- RI=0;
- Uart1_Buff[Uart1_Count] = SBUF;
- Uart1_Count=(Uart1_Count+1)%50;
- Uart1_Buff[Uart1_Count]='\0';
- if(Quest_flag==1) //说明此时在初始化
- {
- if(GSM_Num==0||GSM_Num==1||GSM_Num==2||GSM_Num==3) //这里都是返回的 OK
- {
- if(Uart1_Count>=4&&Uart1_Buff[Uart1_Count-1]=='\n'&&Uart1_Buff[Uart1_Count-2]=='\r'&&Uart1_Buff[Uart1_Count-3]=='K'&&Uart1_Buff[Uart1_Count-4]=='O')
- {
- GSM_Num++;
- GSM_Send_Time=3;
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
防止幼儿误锁车内报警系统.zip
(797.4 KB, 下载次数: 60)
|