开云体育app最新版v5.178-IOS/安卓最新版

日期:2016-11-17 13:25:05 人气:1

开云体育app最新版v5.178-IOS/安卓最新版

开云体育游戏介绍,开云体育app下载免费安装,开云体育官方网站下载,开云体育官网手机版入口最新网址这个是自动控制温度的一个例子,温度降低到一定程度就启动加热。 //温度传感器:DS18B20//显示方式:LED#include #define uchar unsigned charsbit keyup=P1^0;sbit keydn=P1^1;sbit keymd=P1^2;sbit out=P3^7; //接控制继电器sbit DQ = P3^4; //接温度传感器18B20uchar t[2],number=0,*pt; &
    A+
热门评论

基于AT89C51和DS18B20制作的温度报警器原理图和单片机内部程序?

  #include   #include   #define uchar unsigned char   #define uint unsigned int   sbit ds=P2^2; //温度传感器信号线   sbit dula=P2^6; //数码管段选线   sbit wela=P2^7; //数码管位选线   sbit beep=P2^3; //蜂鸣器   uint temp;   float f_temp;   uint warn_l1=260;   uint warn_l2=250;   uint warn_h1=300;   uint warn_h2=320;   sbit led0=P1^0;   sbit led1=P1^1;   sbit led2=P1^2;   sbit led3=P1^3;   unsigned char code table[]={   0x3f,0x06,0x5b,0x4f,   0x66,0x6d,0x7d,0x07,   0x7f,0x6f,0xbf,0x86,   0xdb,0xcf,0xe6,0xed,   0xfd,0x87,0xff,0xef}; //不带小数点的编码   void delay(uint z)//延时函数   {   uint x,y;   for(x=z;x>0;x--)   for(y=110;y>0;y--);   }   void dsreset(void) //18B20复位,初始化函数   {   uint i;   ds=0;   i=103;   while(i>0)i--;   ds=1;   i=4;   while(i>0)i--;   }   bit tempreadbit(void) //读1位函数   {   uint i;   bit dat;   ds=0;i++; //i++ 起延时作用   ds=1;i++;i++;   dat=ds;   i=8;while(i>0)i--;   return (dat);   }   uchar tempread(void) //读1个字节   {   uchar i,j,dat;   dat=0;   for(i=1;i<=8;i++)   {   j=tempreadbit();   dat=(j>1); //读出的数据最低位在最前面,这样刚好一个字节在DAT里   }   return(dat);   }   void tempwritebyte(uchar dat) //向18B20写一个字节数据   {   uint i;   uchar j;   bit testb;   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++;   }   }   }   void tempchange(void) //DS18B20 开始获取温度并转换   {   dsreset();   delay(1);   tempwritebyte(0xcc); // 写跳过读ROM指令   tempwritebyte(0x44); // 写温度转换指令   }   uint get_temp() //读取寄存器中存储的温度数据   {   uchar a,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*10+0.5; //乘以10表示小数点后面只取1位,加0.5是四舍五入   f_temp=f_temp+0.05;   return temp; //temp是整型   }   ////////////////////显示程序//////////////////////////   void display(uchar num,uchar dat)   {   uchar i;   dula=0;   P0=table[dat];   dula=1;   dula=0;   wela=0;   i=0XFF;   i=i&(~((0X01)<<(num)));   P0=i;   wela=1;   wela=0;   delay(1);   }   void dis_temp(uint t)   {   uchar i;   i=t/100;   display(0,i);   i=t%100/10;   display(1,i+10);   i=t%100%10;   display(2,i);   }   //////////////////////////////////////////////   void warn(uint s,uchar led) //蜂鸣器报警声音 ,s控制音调   {   uchar i;i=s;   dula=0;   wela=0;   beep=0;   P1=~(led);   while(i--)   {   dis_temp(get_temp());   }   beep=1;   P1=0XFF;   i=s;   while(i--)   {   dis_temp(get_temp());   }   }   void deal(uint t)   {   uchar i;   if((t>warn_l2)&&(t<=warn_l1)) //大于25度小于27度   {   warn(40,0x01);   }   else if(t<=warn_l2) //小于25度   {   warn(10,0x03);   }   else if((t=warn_h1)) //小于32度大于30度   {   warn(40,0x04);   }   else if(t>=warn_h2) //大于32度   {   warn(10,0x0c);   }   else   {   i=40;   while(i--)   {   dis_temp(get_temp());   }   }   }   void init_com(void)   {   TMOD = 0x20;   PCON = 0x00;   SCON = 0x50;   TH1 = 0xFd;   TL1 = 0xFd;   TR1 = 1;   }   void comm(char *parr)   {   do   {   SBUF = *parr++; //发送数据   while(!TI); //等待发送完成标志为1   TI =0; //标志清零   }while(*parr); //保持循环直到字符为'\0'   }   void main()   {   uchar buff[4],i;   dula=0;   wela=0;   init_com();   while(1)   {   tempchange();   for(i=10;i>0;i--)   {   dis_temp(get_temp());}   deal(temp);   sprintf(buff,"%f",f_temp);   for(i=10;i>0;i--)   {   dis_temp(get_temp());}   comm(buff);   for(i=10;i>0;i--)   {   dis_temp(get_temp());}   }   }

阅读全文

用51单片机实现温度报警器的程序,要正确的

/*使用举例:数码管 scan() { char k; for(k=0;k<4;k++) //4位LED扫描控制 { discan=0x00; Disdata=dis_7[_1820display[k]]; //数据显示 if (k==1){DIN=0;} //小数点显示 discan=scan_con[k]; //位选 _18B20_delay(100); } } main() _18B20_init();//18B20初始化 while(1) { EA=0;//在利用18B20测试温度时,要严格遵循时序,禁止一切中断 _18B20_work(_18B20_read()); //处理温度数据 EA=1;//测试完毕,恢复系统中断 scan(); //显示温度值 } */ #include "intrins.h" //_nop_();延时函数用 //*****************// //以下是DS18B20驱动程序 //*****************// /************************************************** ** 功能描述: DS18B20驱动程序,使用12M晶体 ** DQ占用引脚资源P1^7 ****************************************************/sbit DQ=P1^7; //温度输入口unsigned char data temp_data[2]={0x00,0x00}; //读出温度暂放 unsigned char data _1820display[5]={0x00,0x00,0x00,0x00,0x00}; //显示单元数据,共4个数据和一个运算暂用 unsigned int temp; //**************温度小数部分用查表法***********// unsigned char code ditab[16]= { 0x00,0x01,0x01,0x02, 0x03,0x03,0x04,0x04, 0x05,0x06,0x06,0x07, 0x08,0x08,0x09,0x09 };/*****************11us延时函数*************************/ // void _18B20_delay(unsigned int t) { for (;t>0;t--); }/****************DS18B20复位函数************************/ _18B20_reset(void) { char presence=1; while(presence) { while(presence) { DQ=1; _nop_();_nop_();//从高拉倒低 DQ=0; _18B20_delay(50); //550 us DQ=1; _18B20_delay(6); //66 us presence=DQ; //presence=0 复位成功,继续下一步 } _18B20_delay(45); //延时500 us presence=~DQ; } DQ=1; //拉高电平 }/****************DS18B20写命令函数************************/ //向1-WIRE 总线上写1个字节 void _18B20_write(unsigned char val) { unsigned char i; for(i=8;i>0;i--) { DQ=1; _nop_();_nop_(); //从高拉倒低 DQ=0; _nop_();_nop_();_nop_();_nop_(); //5 us DQ=val&0x01; //最低位移出 _18B20_delay(6); //66 us val=val/2; //右移1位 } DQ=1; _18B20_delay(1); }/****************DS18B20读1字节函数************************/ //从总线上取1个字节 unsigned char _18B20read_byte(void) { unsigned char i; unsigned char value=0; for(i=8;i>0;i--) { DQ=1; _nop_();_nop_(); //从高拉倒低 value>>=1; DQ=0; _nop_();_nop_();_nop_();_nop_(); //4 us DQ=1; _nop_();_nop_();_nop_();_nop_(); //4 us if(DQ)value|=0x80; _18B20_delay(6); //66 us } DQ=1; return(value); } _18B20_read() //读出温度函数 { _18B20_reset(); //总线复位 _18B20_delay(200); _18B20_write(0xcc); //发命令 _18B20_write(0x44); //发转换命令 _18B20_reset(); _18B20_delay(1); _18B20_write(0xcc); //发命令 _18B20_write(0xbe); temp_data[0]=_18B20read_byte(); //读温度值的低字节 temp_data[1]=_18B20read_byte(); //读温度值的高字节 temp=temp_data[1]; temp<<=8; temp=temp|temp_data[0]; // 两字节合成一个整型变量。 return temp; //返回温度值 }/****************温度数据处理函数************************///二进制高字节的低半字节和低字节的高半字节组成一字节,这个 //字节的二进制转换为十进制后,就是温度值的百、十、个位值,而剩 //下的低字节的低半字节转化成十进制后,就是温度值的小数部分/********************************************************/ _18B20_work(unsigned int tem) { unsigned char n=0; if(tem>6348) // 温度值正负判断 { tem=65536-tem; n=1; } // 负温度求补码,标志位置1 _1820display[4]=tem&0x0f; // 取小数部分的值 _1820display[0]=ditab[_1820display[4]]; // 存入小数部分显示值 _1820display[4]=tem>>4; // 取中间八位,即整数部分的值 _1820display[3]=_1820display[4]/100; // 取百位数据暂存 _1820display[1]=_1820display[4]%100; // 取后两位数据暂存 _1820display[2]=_1820display[1]/10; // 取十位数据暂存 _1820display[1]=_1820display[1]%10; /******************数码管符号位显示判断**************************/ if(!_1820display[3]) { _1820display[3]=0x0a; //最高位为0时不显示 if(!_1820display[2]) _1820display[2]=0x0a; //次高位为0时不显示 } if(n) _1820display[3]=0x0b; //负温度时最高位显示"-" } /******************1602液晶符号位显示判断**************************/ if(!_1820display[3]) { _1820display[3]=' '-'0'; //最高位为0时不显示 if(!_1820display[2]) _1820display[2]=' '-'0'; //次高位为0时不显示 } if(n) _1820display[3]='-'-'0'; //负温度时最高位显示"-" } _18B20_init()//18B20初始化 { _18B20_reset(); //开机先转换一次 _18B20_write(0xcc); //Skip ROM _18B20_write(0x44); //发转换命令 }

阅读全文