Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
51hei.png (92.93 KB, 下載次數: 42)
下載附件
2020-6-28 17:11 上傳
51hei.png (27.89 KB, 下載次數: 48)
下載附件
2020-6-28 17:11 上傳
51hei.png (7.67 KB, 下載次數: 30)
下載附件
2020-6-28 17:12 上傳
單片機源程序如下:
- #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)
2020-6-28 15:05 上傳
點擊文件名下載附件
c52單片機 下載積分: 黑幣 -5
|