使用温度传感器DS18B20设计一温控系统,当温度超过35度或低于20度时,LED红灯闪烁,蜂鸣器发出报警声。

使用温度传感器DS18B20设计一温控系统,当温度超过35度或低于20度时,LED红灯闪烁,蜂鸣器发出报警声。,第1张

//这是我曾经做的一个温度控制系统,可以调节上下限温度,低于下限温度启动加热,高于上限停止加热。

//温控系统控制程序

//版本号:V10;2015619

//温度传感器:DS18B20

//显示方式:LED

#include <reg51h>

#define uchar unsigned char

sbit keyup=P1^0;

sbit keydn=P1^1;

sbit keymd=P1^2;

sbit out=P3^7; //接控制继电器

sbit DQ = P3^4;   //接温度传感器18B20

uchar t[2],number=0,pt;    //温度值

uchar  TempBuffer1[4]={0,0,0,0};

uchar Tmax=18,Tmin=8;

uchar distab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff,0xfe,0xf7};

uchar dismod=0,xiaodou1=0,xiaodou2=0,currtemp;

bit flag;

void t0isr() interrupt 1

{

 TH0=(65536-5000)/256;

 TL0=(65536-5000)%256;

 switch(number)

 {

  case 0:

       P2=0x08;

        P0=distab[TempBuffer1[0]];

        break;

  case 1:

       P2=0x04;

        P0=distab[TempBuffer1[1]];

        break;

  case 2:

       P2=0x02;

        P0=distab[TempBuffer1[2]]&0x7f;

        break;

  case 3:

       P2=0x01;

        P0=distab[TempBuffer1[3]];

        break;

  default:

       break;

 }

 number++;

 if(number>3)number=0;

}

void delay_18B20(unsigned int i)

{

 while(i--);

}

/ds18b20初始化函数/

void Init_DS18B20(void)

{

  bit x=0;

 do{

  DQ=1;

  delay_18B20(8);

  DQ = 0;          //单片机将DQ拉低

  delay_18B20(90); //精确延时 大于 480us

  DQ = 1;          //拉高总线

  delay_18B20(14);

  x=DQ;            //稍做延时后 如果x=0则初始化成功 x=1则初始化失败,继续初始化

 }while(x);

  delay_18B20(20);

}

/ds18b20读一个字节

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_18B20(4);

  }

  return(dat);

}

/ds18b20写一个字节/ 

void WriteOneChar(unsigned char dat)

{

  unsigned char i=0;

  for (i=8; i>0; i--)

  {

   DQ = 0;

   DQ = dat&0x01;

    delay_18B20(5);

   DQ = 1;

    dat>>=1;

 }

}

/读取ds18b20当前温度/

unsigned char ReadTemperature(unsigned char rs)

{

 unsigned char tt[2];

  delay_18B20(80); 

 Init_DS18B20();

 WriteOneChar(0xCC);   //跳过读序号列号的操作

 WriteOneChar(0x44);  //启动温度转换

  delay_18B20(80); 

 Init_DS18B20();

 WriteOneChar(0xCC);  //跳过读序号列号的操作

 WriteOneChar(0xBE);  //读取温度寄存器等(共可读9个寄存器)前两个就是温度

 tt[0]=ReadOneChar();  //读取温度值低位

 tt[1]=ReadOneChar();  //读取温度值高位

 return(tt);

}

void covert1(void) //将温度转换为LED显示的数据

{

   uchar x=0x00,y=0x00;

   t[0]=pt;

   pt++;

   t[1]=pt;

   if(t[1]&0x080)      //判断正负温度

   {

    TempBuffer1[0]=0x0c;      //c代表负

  t[1]=~t[1];    /下面几句把负数的补码/

  t[0]=~t[0];    /换算成绝对值/

  x=t[0]+1;

  t[0]=x;

  if(x==0x00)t[1]++;

   }

  else TempBuffer1[0]=0; //A代表正

  t[1]<<=4;  //将高字节左移4位

  t[1]=t[1]&0xf0;

  x=t[0];     //将t[0]暂存到X,因为取小数部分还要用到它

  x>>=4;     //右移4位

  x=x&0x0f;     //和前面两句就是取出t[0]的高四位 

  y=t[1]|x;   //将高低字节的有效值的整数部分拼成一个字节

  TempBuffer1[1]=(y%100)/10;

  TempBuffer1[2]=(y%100)%10;

  t[0]=t[0]&0x0f; //小数部分

  TempBuffer1[3]=t[0]10/16;

  //以下程序段消去随机误检查造成的误判,只有连续12次检测到温度超出限制才切换加热装置

 if(currtemp>Tmin)xiaodou1=0;

 if(y<Tmin)

  {

   xiaodou1++;

   currtemp=y;

   xiaodou2=0;

  }

 if(xiaodou1>12)

  {

   out=0;

   flag=1;

   xiaodou1=0;

  }

 if(currtemp<Tmax)xiaodou2=0;

 if(y>Tmax)

  {

   xiaodou2++;

   currtemp=y;

   xiaodou1=0;

  }

 if(xiaodou2>12)

  {

   out=1;

   flag=0;

   xiaodou2=0;

  }

 out=flag;

}

void convert(char tmp)

{

 uchar a;

 if(tmp<0)

 {

  TempBuffer1[0]=0x0c;

  a=~tmp+1;

 }

 else

 {

  TempBuffer1[0]=0;

  a=tmp;

 }

  TempBuffer1[1]=(a%100)/10;

  TempBuffer1[2]=(a%100)%10;

}

void keyscan( )

{

uchar keyin;

 keyin=P1&0x07;

 if(keyin==0x07)return;

 else if(keymd==0)

  {

   dismod++;

   dismod%=3;

   while(keymd==0);

   switch(dismod)

   {

    case 1:

         convert(Tmax);

          TempBuffer1[3]=0x11;

          break;

    case 2:

         convert(Tmin);

          TempBuffer1[3]=0x12;

          break;

    default:

         break;

   }

  }

 else if((keyup==0)&&(dismod==1))

  {

   Tmax++;

   convert(Tmax);

   while(keyup==0);

  }

 else if((keydn==0)&&(dismod==1))

  {

   Tmax--;

   convert(Tmax);

   while(keydn==0);

  }

 else if((keyup==0)&&(dismod==2))

  {

   Tmin++;

   convert(Tmin);

   while(keyup==0);

  }

 else if((keydn==0)&&(dismod==2))

  {

   Tmin--;

   convert(Tmin);

   while(keydn==0);

  }

 xiaodou1=0;

 xiaodou2=0;

}

main()

{

 TMOD=0x01;

 TH0=(65536-5000)/256;

 TL0=(65536-5000)%256;

 TR0=1;

 ET0=1;

 EA=1;

 out=1;

 flag=0;

 ReadTemperature(0x3f);

  delay_18B20(50000); //延时等待18B20数据稳定 

 while(1)

 {

  pt=ReadTemperature(0x7f); //读取温度,温度值存放在一个两个字节的数组中

  if(dismod==0)covert1();

  keyscan();

  delay_18B20(30000);

 }

}

歌名叫My Country' Tis of Thee也成为America,是一首美国爱国歌曲,歌词是由山谬·弗朗西斯(Samuel Francis Smith)所作,而歌曲则与英国国歌天佑吾王相同,是美国在十九世纪的国歌。

歌词连接:http://musicsinacomcn/yueku/miphpid=644193

My country,' tis of thee, sweet land of liberty, of thee I sing; land where my fathers died, land of the pilgrims' pride, from every mountainside let freedom ring! My native country, thee, land of the noble free, thy name I love; I love thy rocks and rills, thy woods and templed hills; my heart with rapture thrills, like that above Let music swell the breeze, and ring from all the trees sweet freedom's song; let mortal tongues awake; let all that breathe partake; let rocks their silence break, the sound prolong Our fathers' God, to thee, author of liberty, to thee we sing; long may our land be bright with freedom's holy light; protect us by thy might, great God, our King

话说我也看过小屁孩日记呢,真的很好看呀,^_^

/

模拟PWM输出控制灯的10个亮度级别

将定时器2溢出定为1/1200秒。每10次脉冲输出一个120HZ频率。

这每10次脉冲再用来控制高低电平的10个比值。

这样,在每个1/120秒的方波周期中,我们都可以改变方波的输出占空比,从而控制LED灯的10个级别的亮度。

/

#define uchar unsigned char

#define uint unsigned int

#define ulong unsigned long

#include <reg52h> //包括一个52标准内核的头文件

sbit P10 = P1^0; //要控制的LED灯

sbit K1= P3^2; //按键K1

uchar scale;//用于保存占空比的输出0的时间份额,总共10份

char code dx516[3] _at_ 0x003b;//这是为了仿真设置的

//模拟PWM输出控制灯的10个亮度级别

void main(void) // 主程序

{

uint n;

RCAP2H =0xF3; //赋T2的预置值,溢出1次是1/1200秒钟

RCAP2L =0x98;

TR2=1; //启动定时器

ET2=1; //打开定时器2中断

EA=1; //打开总中断

while(1) //程序循环

{ ;//主程序在这里就不断自循环,实际应用中,这里是做主要工作

for(n=0;n<50000;n++); //每过一会儿就自动加一个档次的亮度

scale++;

if(scale==10)scale=0;

}

}

//1/1200秒定时器2中断

timer2() interrupt 5

{

static uchar tt; //tt用来保存当前时间在一秒中的比例位置

TF2=0;

tt++;

if(tt==10) //每1/120秒整开始输出低电平

{

tt=0;

if(scale!=0) //这里加这一句是为了消除灭灯状态产生的鬼影

P10=0;

}

if(scale==tt) //按照当前占空比切换输出高电平

P10=1;

}

――――――――――――――――――

在主程序中,每延时一段时间,就自动换一个占空比,以使亮度自动变化,方便观察。

编译,运行,看结果。

可以看到,LED的亮度以每种亮度1秒左右不断变化,共有10个级别。

欢迎分享,转载请注明来源:品搜搜测评网

原文地址:https://pinsoso.cn/meirong/2295146.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-11-23
下一篇2023-11-23

随机推荐

  • 怎样鉴别我买的妮维雅是不是真的呀

    妮维雅是一款非常受欢迎的护肤品牌,市场上也存在一些假冒伪劣产品。为了确保你购买到的妮维雅是真正的正品,请你多角度进行鉴别。我们可以从包装上入手。正品妮维雅的包装通常具有高质感,印刷清晰,无模糊或拼写错误。包装盒上会有具体的产品信息,如成分、

    2024-04-15
    70000
  • 妮维雅润肤霜能涂脸吗

    通过了解就会发现,妮维雅是可以涂脸的,由于质地比较厚重,为此可以混合精华一起使用,而且能够更好的被面部所吸收,才能够更好的达到美白的效果。妮维雅润肤霜能涂脸吗的问题之所以被人们所重视,主要是更好的让肌肤保持水分,让肌肤的状态变得更加轻盈透亮

    2024-04-15
    68000
  • 28days化妆品效果如何

    28days化妆品效果不错伊思芙护肤品是是一家来自广州伊思芙生物科技有限公司生产的护肤品,属于作为国产护肤品牌,品牌知名度不高,但也凭其效果赢得大家一致好评,伊思芙护肤品主打酵母臻萃清润神仙水,护肤品质地很水润清爽,上脸不黏腻好吸收,纯天然

    2024-04-15
    64800
  • 超补水保湿的护肤品

    超补水保湿的护肤品  超补水保湿的护肤品,想拥有好的肤色,好的皮肤,找到一款好用的适合自己的护肤品是至关重要的,有些护肤品如果不适合自己可能会导致过敏,所以在选择的时候我们要很慎重,下面会大家推荐超补水

    2024-04-15
    55300
  • 国产天气丹几个系列什么功效

    天气丹的五个系列拱辰享系列,津率享系列,美白系列,水妍系列,天气丹系列。功效如下,天气丹拱辰享系列,适合25至30岁的人使用,对皮肤干燥,发黄有着显著的效果,它里面含有的黄精和拱辰丹成分,能快速被皮肤吸收,有效促进细胞再生,保持肌肤的弹性,

    2024-04-15
    54500
  • 鹊本化妆品怎么样

    鹊本化妆品是一个优质的化妆品品牌,使用现代科技精粹专利成分融合古老配方,实现东方智慧与草本原力的完美结合,满足肌肤养护需求。鹊本化妆品使用全新科技,化妆时不卡粉,并且在市场上价格大众化效果很好,因此性价比很高,在市场上销售很好。总的来说,鹊

    2024-04-15
    56300
  • 妮维雅和欧莱雅哪个好?两者有什么不同吗?

    个人觉得欧莱雅好用,两者区别在于妮维雅只具有基本的保湿功效。妮维雅基本只有保湿功效,对每个人都适用。卡尼尔偏属年轻人品牌。而欧莱雅是历史悠久的知名专业化妆品品牌,对女性肌肤研究更细化,因此才能研发出针对不同年龄段的产品。毕竟小年轻依仗年龄优

    2024-04-15
    58400

发表评论

登录后才能评论
保存