版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
元件型号元件名称元件标号数量蜂鸣器蜂鸣器B1110uF电容C1120pF电容C2,C32发光二极管发光二极管D2,D32Relay-SPDT继电器K1,K22LCD1602液晶LCD119012三极管Q1,Q2,Q332K电阻R1,R2,R6,R7,R8,R9610K电阻R4,R52SW-PB按键S1,S2,S3,S44sw-灰色电源开关SW11DS18B20温度传感器U11STC89C52单片机U2112M晶振Y11
附录2源代码#include<reg52.h>#include<intrins.h>sfrISP_DATA=0xe2; //数据寄存器sfrISP_ADDRH=0xe3; //地址寄存器高八位sfrISP_ADDRL=0xe4; //地址寄存器低八位sfrISP_CMD=0xe5; //命令寄存器sfrISP_TRIG=0xe6; //命令触发寄存器sfrISP_CONTR=0xe7; //命令寄存器 unsignedintT_baojing=250;//温度下限unsignedintH_baojing=380;//温度上限unsignedcharTB1;//温度下限十位unsignedcharTB2;//温度下限个位unsignedcharTB3;//温度下限小数点后一位unsignedcharHB1;//温度上限十位unsignedcharHB2;//温度上限个位unsignedcharHB3;//温度上限小数点后一位unsignedcharT_buff;//报警缓存unsignedcharH_buff;unsignedcharmoshi=0;sbitshezhi=P3^7;sbitjia=P3^6;sbitjian=P3^5;sbitBUZZER=P3^4;//蜂鸣器报警功能sbitLED_R=P3^3;//红sbitLED_G=P3^2;//绿unsignedcharIntToString(unsignedchar*str,intdat);externbitStart18B20();externbitGet18B20Temp(int*temp);externvoidInitLcd1602();externvoidLcdShowStr(unsignedcharx,unsignedchary,unsignedchar*str);externvoidLcdWriteCmd(unsignedcharcmd);unsignedintwendu;/*定时器初始化子程序*/voidInit_Timer0(void){TMOD|=0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响 TH0=(65536-1000)/256; //重新赋值1msTL0=(65536-1000)%256;EA=1;//总中断打开ET0=1;//定时器中断打开TR0=1;//定时器开关打开PT0=1;//优先级打开}/*****************************************************************************延迟函数/****************************************************************************/voidDelay_Ms(unsignedinta){ unsignedinti; while(a--!=0) { for(i=0;i<600;i++); }}/*********************************************************///单片机内部EEPROM不使能/*********************************************************/voidISP_Disable(){ ISP_CONTR=0; ISP_ADDRH=0; ISP_ADDRL=0;}/*********************************************************///从单片机内部EEPROM读一个字节,从0x2000地址开始/*********************************************************/unsignedcharByte_Read(unsignedintadd){ ISP_DATA=0x00; ISP_CONTR=0x83; ISP_CMD=0x01; ISP_ADDRH=(unsignedchar)(add>>8); ISP_ADDRL=(unsignedchar)(add&0xff); //对STC89C51系列来说,每次要写入0x46,再写入0xB9,ISP/IAP才会生效 ISP_TRIG=0x46; ISP_TRIG=0xB9; _nop_(); ISP_Disable(); return(ISP_DATA);}/*********************************************************///往单片机内部EEPROM写一个字节,从0x2000地址开始/*********************************************************/voidByte_Program(unsignedintadd,unsignedcharch){ ISP_CONTR=0x83; ISP_CMD=0x02; ISP_ADDRH=(unsignedchar)(add>>8); ISP_ADDRL=(unsignedchar)(add&0xff); ISP_DATA=ch; ISP_TRIG=0x46; ISP_TRIG=0xB9; _nop_(); ISP_Disable();}/*********************************************************///擦除单片机内部EEPROM的一个扇区//写8个扇区中随便一个的地址,便擦除该扇区,写入前要先擦除/*********************************************************/voidSector_Erase(unsignedintadd) { ISP_CONTR=0x83; ISP_CMD=0x03; ISP_ADDRH=(unsignedchar)(add>>8); ISP_ADDRL=(unsignedchar)(add&0xff); ISP_TRIG=0x46; ISP_TRIG=0xB9; _nop_(); ISP_Disable();}voidKey_set_scan(){ if(shezhi==0) { Delay_Ms(10); if(shezhi==0) { while(!shezhi); LcdWriteCmd(0x01);//清屏 moshi++; if(moshi>=3)moshi=0; if(moshi==0) { LcdWriteCmd(0x01);//清屏LcdShowStr(2,0,"Temperature");TB1=T_baojing/100;TB2=T_baojing/10%10;TB3=T_baojing%10;HB1=H_baojing/100;HB2=H_baojing/10%10;HB3=H_baojing%10; Sector_Erase(0x2000); //将设置的新上下限值写入到内部的EEPROM中 Byte_Program(0x2000,TB1); Byte_Program(0x2001,TB2); Byte_Program(0x2002,TB3); Byte_Program(0x2003,HB1); Byte_Program(0x2004,HB2); Byte_Program(0x2005,HB3); Byte_Program(0x2007,10); } elseif(moshi==1) { LcdWriteCmd(0x01);//清屏 LcdShowStr(3,0,"Set_Temp_T"); T_buff=T_baojing/100+0x30;T_buff=T_baojing/10%10+0x30;T_buff='.';T_buff=T_baojing%10+0x30;T_buff='\0';LcdShowStr(6,1,T_buff); } elseif(moshi==2) { LcdWriteCmd(0x01);//清屏 LcdShowStr(3,0,"Set_Temp_H"); H_buff=H_baojing/100+0x30;H_buff=H_baojing/10%10+0x30;H_buff='.';H_buff=H_baojing%10+0x30;H_buff='\0';LcdShowStr(6,1,H_buff); } } } if(jia==0) { Delay_Ms(10); if(jia==0) { // while(!jia); if(moshi==1) { T_baojing++; if(T_baojing>=999)T_baojing=999; T_buff=T_baojing/100+0x30;T_buff=T_baojing/10%10+0x30;T_buff='.';T_buff=T_baojing%10+0x30;T_buff='\0';LcdShowStr(6,1,T_buff); } if(moshi==2) { H_baojing++; if(H_baojing>=999)H_baojing=999; H_buff=H_baojing/100+0x30;H_buff=H_baojing/10%10+0x30;H_buff='.';H_buff=H_baojing%10+0x30;H_buff='\0';LcdShowStr(6,1,H_buff); } } } if(jian==0) { Delay_Ms(10); if(jian==0) { //while(!jian); if(moshi==1) { T_baojing--; if(T_baojing<=0)T_baojing=0; T_buff=T_baojing/100+0x30;T_buff=T_baojing/10%10+0x30;T_buff='.';T_buff=T_baojing%10+0x30;T_buff='\0';LcdShowStr(6,1,T_buff); } if(moshi==2) { H_baojing--; if(H_baojing<=0)H_baojing=0; H_buff=H_baojing/100+0x30;H_buff=H_baojing/10%10+0x30;H_buff='.';H_buff=H_baojing%10+0x30;H_buff='\0';LcdShowStr(6,1,H_buff); } } } }voidwendu_chuli(){bitres;inttemp;//读取到的当前温度值floatintT,decT;//温度值的整数和小数部分unsignedcharstr_wd;//温度缓冲区Get18B20Temp(&temp);//读取当前温度res=Get18B20Temp(&temp);//读取当前温度if(res)//读取成功时,刷新当前温度显示{ intT=temp>>4;//分离出温度值整数部分decT=temp&0xF;//分离出温度值小数部分decT=(decT*10)/16;//二进制的小数部分转换为1位十进制位 wendu=intT*10+decT; str_wd=wendu/100+0x30; str_wd=wendu/10%10+0x30; str_wd='.'; str_wd=wendu%10+0x30;str_wd='\0';//添加字符串结束符LcdShowStr(6,1,str_wd);//显示到液晶屏上 } Start18B20();}/******************下载程序后报警值初始化**********************/ voidTH_chushihua(){ unsignedcharvalue; value=Byte_Read(0x2007); if(value!=10) //只有在第一次开机进行初始化 { value=10; Byte_Program(0x2007,10); TB1=T_baojing/100;TB2=T_baojing/10%10;TB3=T_baojing%10;HB1=H_baojing/100;HB2=H_baojing/10%10;HB3=H_baojing%10; Byte_Program(0x2000,TB1); Byte_Program(0x2001,TB2); Byte_Program(0x2002,TB3); Byte_Program(0x2003,HB1);Byte_Program(0x2004,HB2); Byte_Program(0x2005,HB3); }TB1=Byte_Read(0x2000); //读取EEPROM中设置温度上限的报警值,并赋给全局变量TB2=Byte_Read(0x2001); //读取EEPROM中设置温度下限的报警值,并赋给全局变量TB3=Byte_Read(0x2002); //读取EEPROM中设置湿度上限的报警值,并赋给全局变量HB1=Byte_Read(0x2003); //读取EEPROM中设置湿度下限的报警值,并赋给全局变量HB2=Byte_Read(0x2004); //读取EEPROM中设置湿度上限的报警值,并赋给全局变量HB3=Byte_Read(0x2005); //读取EEPROM中设置湿度下限的报警值,并赋给全局变量T_baojing=TB1*100+TB2*10+TB3;H_baojing=HB1*100+HB2*10+HB3; }/************主函数(程序的入口)****************/voidmain(){InitLcd1602();//初始化液晶LcdShowStr(2,0,"Temperature");//显示屏显示:TemperatureStart18B20(); //开始读取温度信号Delay_Ms(100);Init_Timer0(); //定时器初始化TH_chushihua();//温度上下限报警值初始化wendu_chuli();//读取温度并显示 while(1){if(moshi==0) //当在检测模式时{wendu_chuli(); //温度检测并显示if(wendu>=H_baojing) //当温度大于温度上限时{BUZZER=0; //蜂鸣器响LED_R=0; //红灯亮 LED_G=1; //绿灯灭}elseif(wendu>T_baojing&&wendu<H_baojing)//当温度在温度下限和温度上限之间时 { BUZZER=1; //蜂鸣器不响 LED_R=1; //红灯灭 LED_G=1; //绿灯灭 } elseif(wendu<=T_baojing) //当温度小于温度下限时 { BUZZER=0; //蜂鸣器响 LED_R=1; //红灯灭 LED_G=0; //绿灯亮 } }Delay_Ms(50); }}/*定时器中断子程序(定时1ms)*/voidTimer0_isr(void)interrupt1{TH0=(65536-1000)/256; //重新赋值1msTL0=(65536-1000)%256;Key_set_scan();//按键扫描}#include<reg52.h>#include<intrins.h>sbitIO_18B20=P2^7;//DS18B20通信引脚/*软件延时函数,延时时间(t*10)us*/voidDelayX10us(unsignedchart){do{_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}while(--t);}bitGet18B20Ack(){ bitack; EA=0; IO_18B20=0; DelayX10us(50); IO_18B20=1; DelayX10us(6); ack=IO_18B20; while(!IO_18B20); EA=1; returnack;}voidWrite18B20(unsignedchardat){ unsignedcharmask; EA=0; for(mask=0x01;mask!=0;mask<<=1) { IO_18B20=0; _nop_(); _nop_(); if((mask&dat)==0) IO_18B20=0; else IO_18B20=1; DelayX10us(6); IO_18B20=1; } EA=1;}unsignedcharRead18B20(){ unsignedchardat; unsignedcharmask; EA=0; for(mask=0x01;mask!=0;mask<<=1) { IO_18B20=0; _nop_(); _nop_(); IO_18B20=1; _nop_(); _nop_(); if(!IO_18B20) dat&=~mask; else dat|=mask; DelayX10us(6); } EA=1; returndat;}bitStart18B20(){ bitack; ack=Get18B20Ack(); if(ack==0) { Write18B20(0xCC); Write18B20(0x44); } return~ack;}bitGet18B20Temp(int*temp){ bitack; unsignedcharLSB,MSB; ack=Get18B20Ack(); if(ack==0) { Write18B20(0xCC); Write18B20(0xBE); LSB=Read18B20(); MSB=Read18B20(); *temp=((int)MSB<<8)+LSB; } return~ack; }#include<reg52.h>#defineLCD1602_DBP0sbitLCD1602_RS=P1^0;sbitLCD1602_RW=P1^1;sbitLCD1602_E=P1^2;/*等待液晶准备好*/voidLcdWaitReady(){unsignedcharsta;LCD1602_DB=0xFF;LCD1602_RS=0;LCD1602_RW=1;do{LCD1602_E=1;sta=LCD1602_DB;//读取状态字LCD1602_E=0;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 外贸业务员2024年工作计划
- 2024年新学期幼儿园财务工作计划
- 中学科研室教学2024年工作计划范文
- 大学新学期班级工作计划范文参考
- 2024年扶贫资金分配计划
- 重固小学信息学科工作计划
- 疾病预防控制中心某年工作计划
- 幼儿园年度相关工作计划
- 学年度六年级下学期班主任工作计划
- 高一年级组上学期的工作计划
- TD/T 1044-2014 生产项目土地复垦验收规程(正式版)
- 起重(信号、司索工)安全技术交底记录
- 汽车维修厂服务方案(2篇)
- 食用菌栽培学智慧树知到期末考试答案章节答案2024年山东农业工程学院
- 第22章二次函数二次函数与不等式的关系课件人教版数学九年级上册
- 写作进阶之道智慧树知到期末考试答案章节答案2024年内蒙古大学
- 新中国史智慧树知到期末考试答案章节答案2024年大连海事大学
- 电大财务大数据分析编程作业3
- Q∕GDW 1480-2015 分布式电源接入电网技术规定
- 洗衣机采购验收及安装调试方案
- 中华传统文化与人生修养智慧树知到期末考试答案2024年
评论
0/150
提交评论