程序.docx
- 文档编号:24118829
- 上传时间:2023-05-24
- 格式:DOCX
- 页数:19
- 大小:17.40KB
程序.docx
《程序.docx》由会员分享,可在线阅读,更多相关《程序.docx(19页珍藏版)》请在冰豆网上搜索。
程序
#include
#include
#include"LCD1602.h"
#defineucharunsignedchar
#defineuintunsignedint
//K_MG_MV和K_ZERO为传感器校准系数,要根据每个MQ-2模块校准
#defineK_MG_MV120/66
//sbitds=P3^7;//温度传感器信号线
sbitds=P2^3;//温度传感器信号线
uinttemp;
uintq;
uintdegree;
floatf_temp;
sbitsensor=P2^4;//火焰传感器端口
//sbitsensor=P2^4;//火焰传感器端口
sbitset=P1^4;
sbitup=P1^5;
sbitdown=P1^6;
sbitkey_manual=P1^7;//模拟手动报警和解除报警按键
sbitbADcs=P1^2;
sbitbADcl=P1^0;
sbitbADda=P1^1;
sbitalarm=P3^4;
sbitred=P3^2;
sbitIGT=P3^6;//GSM模块启动信号
ucharkey_manual_num=0;
unsignedchardata1;
longValue,num=0;
bitset_manual=0;
bitset_temp_up=0;
bitset_temp_down=0;
bitset_degree_flag=0;
longAlarm_temp_up=40,Alarm_temp_low=5,Alarm_degree=3,selectnum=0;
unsignedcharcodedispdop[]={0xfb};
unsignedcharcodedispc[]={0xc6};
unsignedcharcodedispf[]={0xbf};
unsignedcharcodedispcode0[]={0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90};//共阳极数码管
//////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////
voiddelay1ms()
{
unsignedchari,j;
for(i=0;i<10;i++)
for(j=0;j<33;j++)
;
}
voiddelaynms(intn)
{
unsignedchari;
for(i=0;i delay1ms(); } /***************************************************** 函数名称: delay(uintz) 函数功能: 延时函数 ****************************************************/ voiddelay(uintz) { uintx,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } /***************************************************** 函数名称: dsreset(void) 函数功能: 18B20复位,初始化函数 ****************************************************/ voiddsreset(void) { uinti; ds=0; i=103; while(i>0)i--; ds=1; i=4; while(i>0)i--; } /***************************************************** 函数名称: tempreadbit(void) 函数功能: 读1位函数 ****************************************************/ bittempreadbit(void) { uinti; bitdat; ds=0;i++;//i++起延时作用 ds=1;i++;i++; dat=ds; i=8;while(i>0)i--; return(dat); } /***************************************************** 函数名称: tempread(void) 函数功能: 读1个字节 ****************************************************/ uchartempread(void) { uchari,j,dat; dat=0; for(i=1;i<=8;i++) { j=tempreadbit(); dat=(j<<7)|(dat>>1);//读出的数据最低位在最前面,这样刚好一个字节在DAT里 } return(dat); } /***************************************************** 函数名称: tempwritebyte(uchardat) 函数功能: 向18B20写一个字节数据 ****************************************************/ voidtempwritebyte(uchardat) { uinti; ucharj; bittestb; for(j=1;j<=8;j++) { testb=dat&0x01; dat=dat>>1; if(testb)//写1 { ds=0; i++;i++; ds=1; i=8;while(i>0)i--; } else { ds=0;//写0 i=8;while(i>0)i--; ds=1; i++;i++; } } } /***************************************************** 函数名称: tempchange(void) 函数功能: DS18B20开始获取温度并转换 ****************************************************/ voidtempchange(void) { dsreset(); delay (1); tempwritebyte(0xcc);//写跳过读ROM指令 tempwritebyte(0x44);//写温度转换指令 } uintget_temp()//读取寄存器中存储的温度数据 { uchara,b; dsreset(); delay (1); tempwritebyte(0xcc); tempwritebyte(0xbe); a=tempread();//读低8位 b=tempread();//读高8位 temp=b; temp<<=8;//两个字节组合为1个字 temp=temp|a; f_temp=temp*0.0625;//温度在寄存器中为12位分辨率位0.0625° temp=f_temp; //temp=f_temp*10+0.5;//如f_temp乘以10表示小数点后面只取1位,加0.5是四舍五入 //f_temp=f_temp+0.05; returntemp;//temp是整型 } /***************************************************** 函数名称: display_temp(inttemp,intAlarmValue) 函数功能: 显示函数分别显示浓度等级和温度值 ****************************************************/ voiddisplay_temp(inttemp) { uchara,b; a=temp/10;//求百位 b=temp%10;//求十位 //////////////////////////////////// LCDDispNum(7,2,a); LCDDispNum(8,2,b); } voiddisplay_set_temp(inttemp) { uchard,e; d=temp/10;//求百位 e=temp%10;//求十位 LCDDispNum(7,2,d); LCDDispNum(8,2,e); } voiddisplay_set_degree(intdegree) { LCDDispNum(7,2,degree); } /***************************************************** 函数名称: Key_set_scan() 函数功能: 调整报警值范围数字键+数字键- ****************************************************/ voidKey_set_scan() { if(set==0) { delay(10); if(set==0) { selectnum++; if(selectnum==1) { LCDClear(); set_temp_up=1;//设置温度上限位 set_temp_down=0; set_degree_flag=0; LCDDispString(0,1,"Set_Alarm_up"); LCDDispString(0,1,"Set_Alarm_up"); display_set_temp(Alarm_temp_up); } //if(selectnum==2) //{ //LCDClear(); //set_degree_flag=0; //set_temp_down=1;//设置温度下限位 //set_temp_up=0; //LCDDispString(0,1,"Set_Alarm_down"); //LCDDispString(0,1,"Set_Alarm_down"); //display_set_temp(Alarm_temp_low); //} if(selectnum==2) { LCDClear(); set_degree_flag=1;//设置等级浓度 set_temp_down=0; set_temp_up=0; LCDDispString(0,1,"Set_Degree_Alarm"); LCDDispString(0,1,"Set_Degree_Alarm"); display_set_degree(Alarm_degree); } if(selectnum==3) { LCDClear(); LCDDispString(0,1,"Degree: "); LCDDispString(0,1,"Degree: "); LCDDispString(0,2,"Temper: "); LCDDispChar(9,2,0xdf); LCDDispString(10,2,"C"); LCDDispString(11,2,""); set_degree_flag=0; set_temp_down=0; set_temp_up=0; selectnum=0; } while(! set);//等待按键释放 } } /////////////////////////// if(up==0) { delay(10); if(up==0) { if(set_temp_up==1) { Alarm_temp_up=Alarm_temp_up+1; if(Alarm_temp_up>99)Alarm_temp_up=0; display_set_temp(Alarm_temp_up); } if(set_temp_down==1) { Alarm_temp_low=Alarm_temp_low+1; if(Alarm_temp_low>99)Alarm_temp_low=0; display_set_temp(Alarm_temp_low); } if(set_degree_flag==1) { Alarm_degree++; if(Alarm_degree==7)Alarm_degree=0; display_set_degree(Alarm_degree); } while(! up);//等待按键释放 } } //////////////////// if(down==0) { delay(10); if(down==0) { if(set_temp_up==1) { Alarm_temp_up=Alarm_temp_up-1; if(Alarm_temp_up<0)Alarm_temp_up=99; display_set_temp(Alarm_temp_up); } if(set_temp_down==1) { Alarm_temp_low=Alarm_temp_low-1; if(Alarm_temp_low<0)Alarm_temp_low=99; display_set_temp(Alarm_temp_low); } if(set_degree_flag==1) { Alarm_degree--; if(Alarm_degree==-1)Alarm_degree=6; display_set_degree(Alarm_degree); } while(! down);//等待按键释放 } } } longad()//采样烟雾传感器的信号函数 { uchari; //data1=0; bADcs=0;//当ADC0832未工作时其CS输入端应为高电平,此时芯片禁用. bADcl=0; bADda=1; bADcl=1; bADcl=0;//idown bADda=1; bADcl=1; bADcl=0;//2down bADda=0; bADcl=1; bADcl=0;//3down bADda=1; bADcl=1; bADcl=0;//4down 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; returnValue; } voidSelectDengJi()//烟雾传感器信号转换成等级浓度函数 { if(Value<20) { degree=0; LCDDispNum(7,1,0); } elseif(Value>=20&&Value<80) { degree=1; LCDDispNum(7,1,1); } elseif(Value>=80&&Value<160) { degree=2; LCDDispNum(7,1,2); } elseif(Value>=160&&Value<240) { degree=3; LCDDispNum(7,1,3); } elseif(Value>=240&&Value<300) { degree=4; LCDDispNum(7,1,4); } elseif(Value>=300&&Value<380) { degree=5; LCDDispNum(7,1,5); } elseif(Value>=380&&Value<480) { degree=6; LCDDispNum(7,1,6); } else { degree=7; LCDDispNum(7,1,7); } } voidmanual_simulate() { if(key_manual==0) { delay(10); if(key_manual==0) { key_manual_num++; set_manual=1; alarm=0; red=0; if(key_manual_num==2) { alarm=1; red=1; set_manual=0; key_manual_num=0; } while(! key_manual);//等待按键释放 } } } voidSystemAlarm() { if(degree>=Alarm_degree||temp>=Alarm_temp_up||sensor==0) { alarm=0; red=0; delay(20); } else { alarm=1; red=1; delay(50); } } voidmain() { LCDInit(); LCDDispString(0,1,"Degree: "); LCDDispString(0,1,"Degree: "); LCDDispString(0,2,"Temper: "); LCDDispChar(9,2,0xdf); LCDDispString(10,2,"C"); LCDDispString(11,2,""); alarm=1; while (1) { if(set_temp_up==1) { display_set_temp(Alarm_temp_up); } //elseif(set_temp_down==1) //{ //display_set_temp(Alarm_temp_low); //} elseif(set_degree_flag==1) { display_set_degree(Alarm_degree); } else { ad();//调用采样烟雾传感器的信号函数 SelectDengJi();//调用烟雾传感器信号转换成等级浓度函数 tempchange();//调用开始获取温度并转换函数 get_temp();//调用获取实际温度值函数 display_temp(temp);//调用显示等级浓度和温度值函数 if(set_manual==0)SystemAlarm();//调用报警函数 delay(120); } manual_simulate(); Key_set_scan();//按键扫描还是 } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序