0.png (37.42 KB, 下載次數: 95)
下載附件
2016-6-3 13:54 上傳
yw01.png (24.91 KB, 下載次數: 85)
下載附件
2016-6-3 13:56 上傳
yw02.png (14.81 KB, 下載次數: 79)
下載附件
2016-6-3 13:56 上傳
yw03.png (17.25 KB, 下載次數: 88)
下載附件
2016-6-3 13:56 上傳
yw04.png (11.41 KB, 下載次數: 98)
下載附件
2016-6-3 13:56 上傳
煙霧及溫度報警器無火焰傳感器仿真圖
0.png (357.14 KB, 下載次數: 86)
下載附件
2016-6-3 13:57 上傳
0.png (285.22 KB, 下載次數: 94)
下載附件
2016-6-3 13:57 上傳
0.png (472.11 KB, 下載次數: 71)
下載附件
2016-6-3 13:57 上傳
LSR16041使用說明
說明:K1設置按鍵,用來設置設定報警溫度和煙霧濃度。
K2增加,K3減少。K4確定,只有確定后設置的報警值才有用。
設定報警數值后,當溫度或者煙霧濃度達到設定值就會報警。
煙霧及溫度報警器無火焰傳感器的程序(部分預覽)完整版請下載附件:
- #include <reg52.h>
- #include <stdio.h>
- #include <intrins.h>
- #include <absacc.h>
- #include <ctype.h>
- #include <math.h>
- #include <string.h>
- //#include "I2C.h"
- #include "lcd1602.h"
- #include "adc0832.h"
- sbit K1= P1^2;
- sbit K2= P1^3;
- sbit K3= P1^4;
- sbit K4= P1^5;
- sbit K5= P1^6;
- sbit K6= P1^7;
- sbit DQ= P2^7;
- sbit BUZZ= P2^6;
-
- uchar tmpdisplay[8]; //定義顯示緩存數組
- bit read_flag=0; //定義讀時鐘標志位
- bit mode=0; //顯示模式0正常1設定
- uchar set_position=0;
- uchar set_tempure=0; //設定溫度
- uchar set_smokescope=0; //設定濃度
- int real_tempure=0; //實際溫度
- uchar real_smokescope=0; //實際煙霧濃度
- uchar cursor_position=0;//光標位置
-
- uchar time_counter_50ms=0;
- uchar smokescope=0;
- uchar first_read_tempe=0;//第一次讀取溫度數值
- unsigned char t[2],*pt; //用來存放溫度值,測溫程序就是通過這個數組與主函數通信的
- unsigned char TempBuffer1[10]={0x2b,0x30,0x30,0x30,0x2e,0x30,0x30,0xdf,0x43,'\0'};//{0x2b,0x31,0x32,0x32,0x2e,0x30,0x30,0xdf,0x43,'\0'};
- //顯示實時溫度,上電時顯示+122.00C
- /*
- unsigned char TempBuffer0[16]={0x54,0x48,0x3a,0x2b,0x31,0x32,0x35,0x20,
- 0x54,0x4c,0x3a,0x2b,0x31,0x32,0x34,'\0'}; */
- //顯示溫度上下限,上電時顯示TH:+125 TL:+124C
- unsigned char code dotcode[4]={0,25,50,75};
- /***因顯示分辨率為0.25,但小數運算比較麻煩,故采用查表的方法*******
- 再將表值分離出十位和個位后送到十分位和百分位********************/
- void covert1(void) //將溫度轉換為LCD顯示的數據
- {
-
- unsigned char x=0x00,y=0x00;
- t[0]=*pt;
- pt++;
- t[1]=*pt;
- if(t[1]>0x07) //判斷正負溫度
- {
- TempBuffer1[0]=0x2d; //0x2d為"-"的ASCII碼
- t[1]=~t[1]; /*下面幾句把負數的補碼*/
- t[0]=~t[0]; /* 換算成絕對值*********/
- x=t[0]+1; /***********************/
- t[0]=x; /***********************/
- if(x>255) /**********************/
- t[1]++; /*********************/
- }
- else TempBuffer1[0]=0x2b; //0xfe為變"+"的ASCII碼
- t[1]<<=4; //將高字節左移4位
- t[1]=t[1]&0x70; //取出高字節的3個有效數字位
- x=t[0]; //將t[0]暫存到X,因為取小數部分還要用到它
- x>>=4; //右移4位
- x=x&0x0f; //和前面兩句就是取出t[0]的高四位
- t[1]=t[1]|x; //將高低字節的有效值的整數部分拼成一個字節
- TempBuffer1[1]=t[1]/100+0x30; //+0x30 為變 0~9 ASCII碼
- if( TempBuffer1[1]==0x30) TempBuffer1[1]=0xfe; //百位數消隱
- TempBuffer1[2]=(t[1]%100)/10+0x30; //分離出十位
- TempBuffer1[3]=(t[1]%100)%10+0x30; //分離出個位
- t[0]=t[0]&0x0c; //取有效的兩位小數
- t[0]>>=2; //左移兩位,以便查表
- x=t[0];
- y=dotcode[x]; //查表換算成實際的小數
- TempBuffer1[5]=y/10+0x30; //分離出十分位
- TempBuffer1[6]=y%10+0x30; //分離出百分位
- }
- //十進制轉為十六 ,比如把10轉為0x10,注意區分
- uchar data_to_hex(uchar temp_data)
- {
- return (temp_data/10*16+temp_data%10);
- }
- /********************************************************************
- * 名稱 : Delay_1ms()
- * 功能 : 延時子程序,延時時間為 1ms * x
- * 輸入 : x (延時一毫秒的個數)
- * 輸出 : 無
- ***********************************************************************/
- void Delay_1ms(uint i)//1ms延時
- {
- uchar x,j;
- for(j=0;j<i;j++)
- for(x=0;x<=148;x++);
- }
- //*********************************
- //按鍵掃描程序
- //mode:0,不支持連續按;1,支持連續按;
- //*********************************
- uchar KEY_Scan(uchar mode)
- {
- static uchar key_up=1;//按鍵按松開標志
- if(mode)key_up=1; //支持連按
- if(key_up&&(K1==0||K2==0||K3==0||K4==0||K5==0||K6==0))
- {
- Delay_1ms(5);//去抖動
- key_up=0;
- if(K1==0)return 1;
- else if(K2==0)return 2;
- else if(K3==0)return 3;
- else if(K4==0)return 4;
- else if(K5==0)return 5;
- }else if(K1==1&&K2==1&&K3==1&&K4==1&&K5==1&&K6==1)key_up=1;
- return 0;// 無按鍵按下
- }
- void delay_18B20(unsigned int i)
- {
- while(i--);
- }
- /**********ds18b20初始化函數**********************/
- void Init_DS18B20(void)
- {
- unsigned char x=0;
- DQ = 1; //DQ復位
- delay_18B20(8); //稍做延時
- DQ = 0; //單片機將DQ拉低
- delay_18B20(80); //精確延時 大于 480us
- DQ = 1; //拉高總線
- delay_18B20(14);
- x=DQ; //稍做延時后 如果x=0則初始化成功 x=1則初始化失敗
- delay_18B20(20);
- }
- /***********ds18b20讀一個字節**************/
- unsigned char ReadOneChar(void)
- {
- unsigned char i=0;
- unsigned char dat = 0;
- for (i=8;i>0;i--)
- {
- DQ = 0; // 給脈沖信號
- dat>>=1;
- DQ = 1; // 給脈沖信號
- if(DQ)
- dat|=0x80;
- delay_18B20(4);
- }
- return(dat);
- }
- /*************ds18b20寫一個字節****************/
- void WriteOneChar(unsigned char dat)
- {
- unsigned char i=0;
- for (i=8; i>0; i--)
- {
- DQ = 0;
- DQ = dat&0x01;
- delay_18B20(5);
- DQ = 1;
- dat>>=1;
- }
- }
- /**************讀取ds18b20當前溫度************/
- unsigned char *ReadTemperature(char TH,char TL,unsigned char RS)
- { unsigned char tt[2];
- Init_DS18B20();
- WriteOneChar(0xCC); // 跳過讀序號列號的操作
- WriteOneChar(0x4E); // //寫入"寫暫存器"命令,修改TH和TL和分辯率配置寄存器
- //先寫TH,再寫TL,最后寫配置寄存器
- WriteOneChar(TH); //寫入想設定的溫度報警上限
- WriteOneChar(TL); //寫入想設定的溫度報警下限
- WriteOneChar(RS); //寫配置寄存器,格式為0 R1 R0 1,1 1 1 1
- //R1R0=00分辨率婁9位,R1R0=11分辨率為12位
- delay_18B20(80); // this message is wery important
- Init_DS18B20();
- WriteOneChar(0xCC); // 跳過讀序號列號的操作
- WriteOneChar(0x44); // 啟動溫度轉換
- delay_18B20(80); // this message is wery important
- Init_DS18B20();
- WriteOneChar(0xCC); //跳過讀序號列號的操作
- WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度
- delay_18B20(80);
- tt[0]=ReadOneChar(); //讀取溫度值低位
- tt[1]=ReadOneChar(); //讀取溫度值高位
- return(tt);
- }
- void Time0_init()
- {
- TMOD |= 0x01; //使用模式1,16位定時器
- TH0 = (65536-50000)/256; //定時器裝入初始值10ms
- TL0 = (65536-50000)%256;
- EA = 1; //總中斷
- ET0 = 1;//定時器0初始化
- TR0 = 1;
- }
- //************************************
- //定時器初始化
- //初始化為10MS定時器
- //************************************
- void Time1_init()
- {
- TMOD |= 0x10; //使用模式1,16位定時器
- TH1 = (65536-10000)/256; //定時器裝入初始值10ms
- TL1 = (65536-10000)%256;
- EA = 1; //總中斷
- ET1 = 1;//定時器1初始化
- TR1 = 1;
- }
- //換算采集的煙霧濃度AD值,轉換為百分制
- void covert_scope_data(uchar temp_data)
- {
- uchar temp=0;
- temp=(temp_data<<1)/5;
- if(temp_data>127)temp+=50;
- if(temp==100)
- {
- LCD_Print(12,1,"100");
- }
- else
- {
- LCD_Print(12,1," ");
- write_secondline(13, data_to_hex(temp));
- }
- real_smokescope=temp;
- }
- void main()
- {
- uchar tem=0;
- BUZZ=1;
- init_lcd1602();
- Time0_init();
- Time1_init();
-
- while(1)
- {
- switch(KEY_Scan(0)) //掃描按鍵
- {
- case 1://K1
- mode=1;
- set_position++;
- if(set_position>2)set_position=1;
- if(set_position==1)
- {
- cursor_position=6;
- }
- else if(set_position==2)
- {
- cursor_position=12;
- }
- break;
- case 2://K2
- if(set_position==1)
- {
- set_tempure++;
-
- }
- else if(set_position==2)
- {
- set_smokescope++;
- }
- break;
- case 3://K3
- if(set_position==1)
- {
- set_tempure--;
- }
- else if(set_position==2)
- {
- set_smokescope--;
- }
- break;
- case 4://K4
- set_position=0;
- cursor_position=0;
- mode=0;
- break;
- }
- if(set_tempure>120)set_tempure=30; //限幅
- else if(set_tempure<30)set_tempure=120;
- if(set_smokescope>100) set_smokescope = 20;
- else if(set_smokescope<20) set_smokescope=100;
- write_com(0x0c); //關閉光標閃爍
- if(set_tempure>=100)
- {
- LCD_Print(4,0,"1");
- tem=set_tempure-100;
- }
- else
- {
- LCD_Print(4,0," ");
- tem=set_tempure;
- }
- write_firstline(5,data_to_hex(tem));
- if(set_smokescope>=100)
- {
- LCD_Print(10,0,"1");
- tem=set_smokescope-100;
- }
- else
- {
- LCD_Print(10,0," ");
- tem=set_smokescope;
- }
- write_firstline(11,data_to_hex(tem));
- if((mode==0)&&(first_read_tempe)) //正常情況下進行比較報警
- {
- if((real_smokescope>=set_smokescope)||(real_tempure>=set_tempure))
- {
- BUZZ=0; //打開報警
- }
- else
- {
- BUZZ=1; //關閉報警
- }
- }
- covert_scope_data(smokescope); //***顯示煙霧的濃度
- LCD_Print(2,1,TempBuffer1); //顯示溫度
- //write_firstline(11,data_to_hex(real_tempure));
- if(cursor_position) //打開閃爍
- {
- write_com(0x80+cursor_position);
- write_com(0x0e);
- }
- }
- }
-
- void time0(void)interrupt 1
- {
- static temp_time_counter0=0;
- unsigned char TH=110,TL=-20; //下一步擴展時可能通過這兩個變量,調節上下限
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- temp_time_counter0++;
- time_counter_50ms++;
- if(time_counter_50ms>200)time_counter_50ms=200;
- if(temp_time_counter0>3)
- {
- temp_time_counter0=0;
- if(first_read_tempe==0) //首次上電多次讀取溫度再進行顯示
- {
- pt=ReadTemperature(TH,TL,0x3f); //上限溫度-22,下限-24,分辨率10位,也就是0.25C,TM R1 R0 1 1 1 1 1 //讀取溫度,溫度值存放在一個兩個字節的數組中,
- first_read_tempe=1; //置一表示讀取到了溫度
- }
- else
- {
- pt=ReadTemperature(TH,TL,0x3f); //上限溫度-22,下限-24,分辨率10位,也就是0.25C,TM R1 R0 1 1 1 1 1 //讀取溫度,溫度值存放在一個兩個字節的數組中,
- covert1();
- if(TempBuffer1[5]||TempBuffer1[6]) //有小數就進1.
- real_tempure = (TempBuffer1[2]-0x30)*10+TempBuffer1[3]-0x30+1;
- else
- real_tempure = (TempBuffer1[2]-0x30)*10+TempBuffer1[3]-0x30;
- if(TempBuffer1[1]==0x31) //說明此時有百位
- {
- real_tempure+=100;
- }
- if(TempBuffer1[0]==0x2d) //負溫度
- {
- real_tempure*=-1;
- }
- }
- }
- }
- void time1(void)interrupt 3
- {
- TH1=(65536-10000)/256;
- TL1=(65536-10000)%256;
- smokescope = choiceADC(0); //讀取ADC數值
- }
復制代碼
0.png (71.93 KB, 下載次數: 81)
下載附件
2016-6-3 13:54 上傳
注:如果解壓后kile工程打不開,請下高版本,或者打開“TXT代碼”文件夾里的TXT文件,復
制里面的代碼到自己新建的工程里。
關于kile和proteus的學習這里就不贅述了,相信大家有能力搞定的。
所有資料下載:
煙霧及溫度報警器無火焰傳感器LSR160416.rar
(529.41 KB, 下載次數: 281)
2016-5-30 15:20 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|