找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1411|回复: 1
收起左侧

关于单片机温度传感器程序的一些问题,如何触发按键储存温度上下限

[复制链接]
ID:615910 发表于 2019-9-28 18:07 | 显示全部楼层 |阅读模式
现在可以把数码管检测示数但不懂如何触发报警和按键储存温度上下限,多天无解,还望解惑。
#include<reg52.h>
#include<intrins.h>
typedef  unsigned char uchar;
typedef  unsigned int uint;
#define MAIN_Fosc 11059200UL
sbit DS = P3^7;
sbit we1=P2^0;
sbit we2=P2^1;
sbit we3=P2^2;
sbit we4=P2^3;
sbit deep=P3^6;
sbit key=P3^5;
sbit key2=P3^4;
sbit key3=P3^3;
sbit key4=P3^2;
uchar temp;
uchar num;
uchar settemp=35;
uchar settemp2=10;
bit DS18B20;
uchar msec, sec;
unsigned char code leddata[]={

                0xC0,  //"0"
                0xF9,  //"1"
                0xA4,  //"2"
                0xB0,  //"3"
                0x99,  //"4"
                0x92,  //"5"
                0x82,  //"6"
                0xF8,  //"7"
                0x80,  //"8"
                0x90,  //"9"
                0x88,  //"A"
                0x83,  //"B"
                0xC6,  //"C"
                0xA1,  //"D"
                0x86,  //"E"
                0x8E,  //"F"
                0x89,  //"H"
                0xC7,  //"L"
                0xC8,  //"n"
                0xC1,  //"u"
                0x8C,  //"P"
                0xA3,  //"o"
                0xBF,  //"-"
                0xFF,  //???
                0xFF  //?????

                         };

void delay (uint z)
{
  uint x,y;
  for(x=z;x>0;x--)
  for(y=84;y>0;y--);
}
  void us(uchar us)//us???????
{
while(us--);
}
void display( uint value)
{
  we1=1;  
  we1=0;
   P0=0xff;
  P0=leddata[value/1000];
delay(1);
  we1=1;


  
  we2=0;
  P0&=0x7f;
  P0=leddata[value%1000/100];  
  delay(1);
  we2=1;
   we3=0;
  P0=0xff;
  P0=leddata[value%100/10];
  delay(1);
  we3=1;
  
  P0=0xff;
  P0=leddata[value%10];
  we4=0;
  delay(1);
  we4=1;
  
}
void display3( uint value)
{

  we1=1;  
  we1=0;
   P0=0xff;
  P0=leddata[value/1000];
delay(1);
  we1=1;


  
  we2=0;
  P0&=0x7f;
  P0=leddata[value%1000/100];  
  delay(1);
  we2=1;
   we3=0;
  P0=0xff;
  P0=leddata[value%100/10];
  delay(1);
  we3=1;
  
  P0=0xff;
  P0=leddata[value%10];
  we4=0;
  delay(1);
  we4=1;
  
}
void beep1()
{
temp=0xfe;
P1=temp;
delay(100);
while(1)
{
  temp=_crol_(temp,1);
  P1=temp;
  deep=~deep;
  delay(100);
}
}
void display2()
{

if(key == 0)
{
     delay(5);
if(key == 0)
{
   while(!key);
   settemp++;
   delay(50);
   if(settemp==99)
   settemp=0;
   delay(50);  
}
}
if(key2 == 0)
{     
     delay(5);
if(key2 == 0)
{
   while(!key2);
   if(settemp!=0)
   settemp--;
   delay(50);
}
}
if(key3 == 0)
{     
     delay(5);
if(key3 == 0)
{
   while(!key3);
   settemp2++;
   delay(50);
   if(settemp2==99)
   settemp2=0;
   delay(50);
   }
}
if(key4 == 0)
{     
     delay(5);
if(key4 == 0)
{
   while(!key4);
   if(settemp2!=0)
   settemp2--;
   delay(50);
}
}
   
}

void duan ()
{

  EA=1;
  ET0=1;
  TR0=1;
  TMOD=0x01;
  TH0=0x4b;
  TL0=0xfd;

}
void  timer0() interrupt 1
{
  TH0=0x4b;
  TL0=0xfd;
  msec++;
  if(msec==20)
  {
   msec=0;
  }
}  

//?????????????
bit init()
{
   bit i;                        
DS = 1;//??????
_nop_();
DS = 0;
us(75); //????????75*6.5+11.95=499.45us ????????????18B20???????????
DS=1;
us(4);//???
i = DS;
us(20); //141.95us ???????
DS = 1;
_nop_();
return (i);
}
void write (uchar dat)//д ???
{
uchar i;
for(i=0;i<8;i++)
{
  DS = 0;
  _nop_();//????д???
  DS = dat & 0x01;//?????????
  us(10);//76.95us
  DS = 1; //???????????????????д??
  _nop_();
  dat >>= 1;//??????
}
}
uchar read_byte()
{
uchar i, j, dat;
for(i=0;i<8;i++)
{
  DS = 0;
  _nop_();//?????????
  DS = 1;
  _nop_();//???????
  j = DS;
  us(10);//76.95us
  DS = 1;
  _nop_();
  dat = (j<<7)|(dat>>1);//????
}
return (dat);
}
void main()
{
  uint i;
  uchar L, M;
  init();//?????DS18B20        
  write(0xcc);//???????ROM???
  write(0x4e);//????д????????
  write(0x18);
  write(0x10);
  write(0x7f);
  init();
  write(0xcc);
  write(0x48);
      while(1)
{  
  init();//?????DS18B20        
  write(0xcc);//???????ROM???
  write(0x44);//?????????????
        init();     //?????DS18B20
  write(0xcc);//???????ROM???
  write(0xbe);//???DS18B20??????
  L = read_byte();
  M = read_byte();
  i = M;
  i <<= 8;
  i |= L;     
  i = i * 0.0625 * 100 + 0.05;
      display(i);
   duan();
  if(key==0|key2==0|key3==0|key4==0)
  { if(key==0)
   {
   settemp=settemp*100;   
    while(!key);
    while(1)
{
    display3(settemp);}
     if(key2==0)
   { settemp=settemp*100;   
    while(!key2);
    display3(settemp);}
     if(key3==0)
   { settemp2=settemp2*100;   
    while(!key3);
    display3(settemp2);}
     if(key4==0)
    {settemp2=settemp2*100;   
    while(!key4);
    display3(settemp2);}
          }  
   
   }

原理图QX-mini51.pdf

154.08 KB, 下载次数: 20

原理图

回复

使用道具 举报

ID:278006 发表于 2020-2-23 18:57 | 显示全部楼层
发个源码试试!

DS18b20 温度检测液晶显示-温度可调上下限1602显示.zip

58.11 KB, 下载次数: 19

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表