长沙网站公司品牌wordpress 盒模型大学
web/
2025/10/6 21:23:56/
文章来源:
长沙网站公司品牌,wordpress 盒模型大学,合肥 电子商务 网站推广,微信微网站开发价格目录
一、主要功能
二、硬件资源
三、程序编程
四、实现现象 一、主要功能
基于51单片机#xff0c;通过DS18B20检测温度#xff0c;滑动变阻器连接数模转换器模拟电流、电压#xff0c;通过LCD1602显示#xff0c;程序里设置温度阈值为40#xff0c;电流阈值为60通过DS18B20检测温度滑动变阻器连接数模转换器模拟电流、电压通过LCD1602显示程序里设置温度阈值为40电流阈值为60电压阈值为100如果超于阈值则蜂鸣器报警。
二、硬件资源
基于KEIL5编写C代码PROTEUS8.15进行仿真全部资源在页尾提供安装包。
编辑
三、程序编程
#include REGX52.H#includeintrins.h#includestdio.h#include Delay.h#include LCD1602.h#define uchar unsigned char#define uint unsigned intsbit beep P2^5; //蜂鸣器引脚sbit DSP2^4; //DS18B20温度传感器sbit DS1P2^3; //DS18B20温度传感器sbit CSP1^0; //adc0832引脚sbit CLKP1^1;
sbit DIOP1^2;
sbit CS1P1^3; //adc0832引脚sbit CLK1P1^4;
sbit DIO1P1^5;
sbit CS2 P1^6; //ADC0832引脚定义sbit CLK2 P1^7;
sbit DIO2 P2^6;unsigned char count;typedef unsigned char u8;typedef unsigned int u16;static uint temp;static float ftemp 0.0f;//温度转变uint temp;static uint temp1;static float ftemp1 0.0f;//温度转变uint temp1;static unsigned char num;static int wdyz40,dymax100,dlmax60; //wd38static uchar u,U,R ,u1,U1,R1,u2,U2,R2; //定义变量void tmpchange();uint tmp();void tmpchange1();uint tmp1();void beep\_warning();void Time0\_Init() //定时器初始化{
TMOD 0x01; //定时器0工作在方式1 IE 0x82;
TH0 0xfe;
TL0 0x33; //11.0592MZ晶振0.5msTR01; //定时器开始EA1;
}void Time0_Int() interrupt 1 //中断程序{TH0 0xfe; //重新赋值TL0 0x33;num; if(num200){ tmpchange(); //让18b20开始转换温度temp tmp(); //读取温度ftemp temp/10.0f; //转换温度tmpchange1(); //让18b20开始转换温度temp1 tmp1(); //读取温度ftemp1 temp1/10.0f; //转换温度num0;}
}uchar get\_AD\_Res() //ADC0832启动读取函数 有害气体{uchar i, data10, data20;CS0;CLK0;DIO1;\_nop\_();CLK1;\_nop\_();CLK0;DIO1;\_nop\_(); CLK1;\_nop\_();CLK0;DIO0;\_nop\_();CLK1;\_nop\_();CLK0;DIO1;\_nop\_(); for(i0; i8; i){CLK1;\_nop\_();CLK0;\_nop\_();data1(data11)|(uchar)DIO; } for(i0; i8; i){data2data2|(uchar)DIOi;CLK1;\_nop\_();CLK0;\_nop\_();}CS1; return(data1 data2)?data1:0;
}uchar get\_AD\_Res1() //ADC0832启动读取函数 颗粒物{uchar i, data10, data20;CS10;CLK10;DIO11;\_nop\_();CLK11;\_nop\_();CLK10;DIO11;\_nop\_(); CLK11;\_nop\_();CLK10;DIO10;\_nop\_();CLK11;\_nop\_();CLK10;DIO11;\_nop\_(); for(i0; i8; i){CLK11;\_nop\_();CLK10;\_nop\_();data1(data11)|(uchar)DIO1; } for(i0; i8; i){data2data2|(uchar)DIO1i;CLK11;\_nop\_();CLK10;\_nop\_();}CS11; return(data1 data2)?data1:0;
}uchar get\_AD\_Res2() //ADC0832启动读取函数 有害气体{uchar i, data10, data20;CS20;CLK20;DIO21;\_nop\_();CLK21;\_nop\_();CLK20;DIO21;\_nop\_(); CLK21;\_nop\_();CLK20;DIO20;\_nop\_();CLK21;\_nop\_();CLK20;DIO21;\_nop\_(); for(i0; i8; i){CLK21;\_nop\_();CLK20;\_nop\_();data1(data11)|(uchar)DIO2; } for(i0; i8; i){data2data2|(uchar)DIO2i;CLK21;\_nop\_();CLK20;\_nop\_();}CS21; return(data1 data2)?data1:0;
}void dsreset(void) //发出命令{uint i;DS0; i103; //将总线拉低480us~960uswhile(i0)i--;DS1; //然后拉高总线若DS18B20做出反应会将在15us~60us后将总线拉低i4; //15us~60us等待while(i0)i--; //while(DS);}bit tmpreadbit(void) //读取数据{uint i;bit dat;DS0;i; //i for delayDS1;i;i;datDS;i8;while(i0)i--; return (dat);
}uchar tmpread(void) //读取数据{uchar i,j,dat;dat0; for(i1;i8;i){jtmpreadbit();dat(j7)|(dat1); //读出的数据最低位在最前面这样刚好一个字节在DAT里} return(dat);
}void tmpwritebyte(uchar dat) //传输数据给DS18B20{uint i;uchar j;bit testb; for(j1;j8;j){testbdat0x01;datdat1; if(testb) //write 1{DS0;i;i;DS1;i8;while(i0)i--;} else{DS0; //write 0i8;while(i0)i--;DS1;i;i;}}
}void tmpchange(void) //DS18B20开始工作{ dsreset(); Delay(1); tmpwritebyte(0xcc); tmpwritebyte(0x44);
}
uint tmp() //获得温度{ float tt;uchar a,b; dsreset(); Delay(1); tmpwritebyte(0xcc); tmpwritebyte(0xbe);atmpread();//低八位btmpread();//高八位tempb;temp8; //two byte compose a int variabletemptemp|a;tttemp*0.0625; //算出来的是测到的温度数值可到小数点后两位temptt*100.5; //为了显示温度后的小数点后一位并作出四舍五入因为取值运算不能取小数点后的数return temp;
}void dsreset1(void) //发出命令{uint i;DS10; i103; //将总线拉低480us~960uswhile(i0)i--;DS11; //然后拉高总线若DS18B20做出反应会将在15us~60us后将总线拉低i4; //15us~60us等待while(i0)i--; //while(DS);}bit tmpreadbit1(void) //读取数据{uint i;bit dat;DS10;i; //i for delayDS11;i;i;datDS1;i8;while(i0)i--; return (dat);
}uchar tmpread1(void) //读取数据{uchar i,j,dat;dat0; for(i1;i8;i){jtmpreadbit1();dat(j7)|(dat1); //读出的数据最低位在最前面这样刚好一个字节在DAT里} return(dat);
}void tmpwritebyte1(uchar dat) //传输数据给DS18B20{uint i;uchar j;bit testb; for(j1;j8;j){testbdat0x01;datdat1; if(testb) //write 1{DS10;i;i;DS11;i8;while(i0)i--;} else{DS10; //write 0i8;while(i0)i--;DS11;i;i;}}
}void tmpchange1(void) //DS18B20开始工作{ dsreset1(); Delay(1); tmpwritebyte1(0xcc); tmpwritebyte1(0x44);
}
uint tmp1() //获得温度{ float tt1;uchar a,b; dsreset1(); Delay(1); tmpwritebyte1(0xcc); tmpwritebyte1(0xbe);atmpread1();//低八位btmpread1();//高八位temp1b;temp18; //two byte compose a int variabletemp1temp1|a;tt1temp1*0.0625; //算出来的是测到的温度数值可到小数点后两位temp1tt1*100.5; //为了显示温度后的小数点后一位并作出四舍五入因为取值运算不能取小数点后的数return temp1;
}void beep_warning() //温度传感器蜂鸣器警报并且电机转动{ if(ftempwdyz){beep1; //蜂鸣器报警} if(Rdymax){beep1; //蜂鸣器报警} if(R1dlmax){beep1; //蜂鸣器报警} if(R240){beep1; //蜂鸣器报警} if(R1dlmax){beep1; //蜂鸣器报警} if(ftemp1 80){beep1;} if(ftempwdyz Rdymax R1dlmax R240 ftemp180){beep0; //蜂鸣器报警}
}void main() //主函数{ beep0; //蜂鸣器关掉LCD_Init(); //显示屏初始化Time0\_Init(); LCD\_ShowString(1,1,wendu:); LCD\_ShowString(1,9,scp:); LCD\_ShowString(2,1,dy:); LCD_ShowString(2,7,dl:); while(1){uget\_AD\_Res();U(250*u)/128; //此处将数字信号转化为模拟信号要根据上拉电阻阻值来确定R200*U/250; //电压u1get\_AD\_Res1();U1(250*u1)/128; //此处将数字信号转化为模拟信号要根据上拉电阻阻值来确定R1200*U1/250; //电流u2get\_AD\_Res2();U2(250*u2)/128; //此处将数字信号转化为模拟信号要根据上拉电阻阻值来确定R2200*U2/250; //气压LCD_ShowNum(1,7,ftemp,2); //第一行显示温度LCD_ShowNum(1,13,ftemp1,2); //第一行显示温度LCD\_ShowNum(2,4,R,3); LCD\_ShowNum(2,10,R1,3); LCD\_ShowNum(2,14,R2,3); beep\_warning(); //温度、电压、电流超出报警}
}四、实现现象
具体动态效果看B站演示视频 基于51单片机的温度电流电压检测系统压力、电压、温度、电流、LCD1602
全部资料源程序、仿真文件、安装包、演示视频 链接https://pan.baidu.com/s/1AUrubgakYaqnGDA-KKIVqA?pwdw4w9 提取码w4w9
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/88115.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!