900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > 基于51单片机的智能家居防盗系统人体红外热释电 proteus仿真原理图程序设计

基于51单片机的智能家居防盗系统人体红外热释电 proteus仿真原理图程序设计

时间:2019-11-08 17:34:33

相关推荐

基于51单片机的智能家居防盗系统人体红外热释电 proteus仿真原理图程序设计

硬件设计

原理图:

仿真图:

程序设计

//程序头函数#include <reg52.h>//宏定义#define uint unsigned int #define uchar unsigned char//管脚声明//输出sbit LED_wenduH= P1^2; //温度上限sbit LED_wenduL= P1^3; //温度下限sbit LED_yanwu = P1^4; //烟雾sbit LED_LED = P1^1; //开灯sbit baojing= P2^3; //报警//输入sbit DQ = P2^0; //18b20sbit door=P1^6; //霍尔传感器sbit hongwai=P1^7; //热释电sbit light=P1^5; //光线传感器//1602_245sbit CE_1602=P1^0; //245的CE//ADC0809sbit ST=P2^7;sbit EOC=P2^6;sbit OE=P2^5;//按键sbit owner=P3^4; //主人是否在家切换sbit Key1=P3^5; //设置sbit Key2=P3^6; //加sbit Key3=P3^7; //减//LCD管脚声明sbit LCDRS = P3^2;sbit LCDEN= P3^3;//LCD数组uchar code Init1[] ="T:C E: "; //第一行固定显示uchar code Init2[] =" Stay at home "; //第二行主人在家时显示 uchar code tab0[] ="TH: C TL: C "; //第二行设置温度上下限时显示uchar code tab1[] ="EH: "; //第二行设置烟雾上限是显示uchar code tab2[] ="Someone to enter"; //第二行有人进入触发报警时显示uchar code tab3[] ="Master go out "; //主人外出时显示bit bdata flag_owner,BJ,shanshuo;uchar Mode=0,m;signed char w;//温度值全局变量uint c; //温度值全局变量bit bdata flag=0,flag_BJ,flag_set;//酒精含量变量uchar temp; //酒精值uchar wendu_H=28; //温度值上限uchar wendu_L=15; //温度值下限uchar yanwu_H=50; //烟雾上限 //函数声明extern uchar ADC0809();extern void Key();//LCD延时void LCDdelay(uint z){uint x,y;for(x=z;x>0;x--)for(y=10;y>0;y--);}//写命令void write_com(uchar com){P0=0xff;CE_1602=0; //液晶工作时,CE置0,245向液晶传输数据LCDRS=0;P0=com;LCDdelay(5);LCDEN=1;LCDdelay(5);LCDEN=0;CE_1602=1; //传输完后置高电平P0=0xff;}//写数据void write_data(uchar date){P0=0xff;CE_1602=0;LCDRS=1;P0=date;LCDdelay(5);LCDEN=1;LCDdelay(5);LCDEN=0; CE_1602=1;P0=0xff;}//1602初始化// 显示屏幕void Init1602(){uchar i=0;write_com(0x38);//屏幕初始化write_com(0x0c);//打开显示 无光标 无光标闪烁write_com(0x06);//当读或写一个字符是指针后一一位write_com(0x01);//清屏write_com(0x80);//设置位置for(i=0;i<16;i++){write_data(Init1[i]);}write_com(0x80+0x40);//设置位置for(i=0;i<16;i++){write_data(Init2[i]);}}//配合写程序实现显示温度和烟雾在屏幕上,分模式void Display_1602(){ uchar i;//时时温度write_com(0x80+2); //指定第一行第二列write_data(0x30+c/100); //开始显示温度值的百位,。例如温度值时123,123除以100的商是1,显示的就是1,+0x30的目的是得到液晶中数字的显示码write_data(0x30+c%100/10); //123除以100的余数是23,23再除以10得到的商是2,这里显示的就是2write_data('.'); //显示小数点write_data(0x30+c%10); //23除以10的余数是3,这里显示的就是3write_data(0xdf); //显示°//时时烟雾write_com(0x80+13);write_data(0x30+temp/100);write_data(0x30+temp%100/10);write_data(0x30+temp%10);if(flag_owner==0) //主人在家时{write_com(0x80+0x40);//设置位置if (Mode==0) //不是设置状态时 0for(i=0;i<16;i++) //正常显示write_data(Init2[i]);else if(Mode==1||Mode==2)//设置状态时 1,2{for(i=0;i<3;i++) //显示上限值write_data(tab0[i]);if(shanshuo==0||Mode==2){write_data(0x30+wendu_H/10);write_data(0x30+wendu_H%10);}else if(shanshuo==1&&Mode==1) //shanshuo控制字符闪烁 1{write_data(' ');write_data(' ');}write_data(0xdf);//显示°for(i=6;i<11;i++)write_data(tab0[i]);//显示下限if(shanshuo==0||Mode==1){write_data(0x30+wendu_L/10);write_data(0x30+wendu_L%10);}else if(shanshuo==1&&Mode==2){write_data(' ');write_data(' ');}write_data(0xdf); //显示°write_data('C'); //显示字母Cwrite_data(' '); //空格}else if(Mode==3) //设置烟雾报警值{write_com(0x80+0x40); //设置位置for(i=0;i<3;i++)write_data(tab1[i]);if(shanshuo==0){write_data(0x30+yanwu_H/100);write_data(0x30+yanwu_H%100/10);write_data(0x30+yanwu_H%10);}else if(shanshuo==1&&Mode==3){write_data(' ');write_data(' ');write_data(' ');}for(i=6;i<16;i++)write_data(tab1[i]);}}else if(flag_owner==1)//主人外出{write_com(0x80+0x40);//设置位置if(flag_BJ==0)for(i=0;i<16;i++)write_data(tab3[i]);if(flag_BJ==1)for(i=0;i<16;i++)write_data(tab2[i]);}}//1ms延时程序void delay(uint z){uint i,j;for(i=0;i<z;i++)for(j=0;j<121;j++);}/*****18b20延时子程序*****///void Delay_DS18B20(int num){while(num--) ;}/*****初始化DS18B20*****///void Init_DS18B20(void){unsigned char x=0;DQ = 1; //DQ复位Delay_DS18B20(8); //稍做延时DQ = 0; //单片机将DQ拉低Delay_DS18B20(80); //精确延时,大于480usDQ = 1; //拉高总线Delay_DS18B20(14);x = DQ; //稍做延时后,如果x=0则初始化成功,x=1则初始化失败Delay_DS18B20(20);}/*****读一个字节*****///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_DS18B20(4);}return(dat);}/*****写一个字节*****/void WriteOneChar(unsigned char dat){unsigned char i=0;for (i=8; i>0; i--){DQ = 0;DQ = dat&0x01;Delay_DS18B20(5);DQ = 1;dat>>=1;}}

附:http://www.jh-/archives/7646

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。