使用温度传感器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
    763100
  • 妮维雅晶纯焕亮和晶纯皙白区别

    妮维雅晶纯焕亮和晶纯皙白系列在功效上有以下区别: 晶纯焕亮系列。主要功效是去黄提亮,它适用于肌肤暗沉,肤色不均,以及熬夜疲劳的肌肤,因此,如果你是因为经常熬夜导致的肌肤暗沉,使用妮维雅晶纯焕亮系列可能会有很好的效果。 晶纯皙白系列。主要功效

    2024-04-15
    23000
  • 化妆品公司有哪几家

    国际知名化妆品品牌前十名有:兰蔻、雅诗兰黛、迪奥、资生堂、倩碧、海蓝之谜、SK2、香奈儿、赫莲娜、伊丽莎白雅顿。一、兰蔻兰蔻1935年诞生于法国,是由Armand Petitjean(阿曼达·珀蒂让)创办的品牌。作为全球知名的高端化妆品品牌

    2024-04-15
    24800
  • 孕妇可以用的水乳牌子

    孕妇可以用的水乳牌子  孕妇可以用的水乳牌子,很多人都知道,怀孕后是有很多的禁忌需要注意的,特别是护肤品方面,有些成分用了是对胎儿有影响的,所以一定要注意,下面是孕妇可以用的水乳牌子。孕妇可以用的水乳牌

    2024-04-15
    19400
  • 妮维雅防晒喷雾和妮维雅防晒紧肤精华有什么区别?哪个防晒效果更好?

    两者相比当然是妮维雅防晒喷雾防晒好,但以专业美容来看的话选择防晒最好是防晒霜对皮肤伤害小些,防晒喷雾防晒是物理防晒最好不要直接接触皮肤,因为防晒霜本身就添加防水剂还有化学成分,所以一般我们都建议在擦防晒霜之前要擦霜这样对皮肤的伤害到最低又能

    2024-04-15
    16000
  • 护肤品哪个牌子补水效果最好 让你的肌肤时刻充盈水润

    护肤品是我们日常护理肌肤最常使用到的一种产品,现在市面上的护肤品品牌众多,很多人都挑花了眼,一般情况下,选取补水的护肤品比较好,那么护肤品哪个牌子补水效果最好?让你的肌肤时刻充盈水润。护肤品哪个牌子补水效果最好别人推荐的好的护肤品不

    2024-04-15
    19100
  • 你觉得妮维雅这个牌子怎么样?

    妮维雅是德国的品牌,众所周知,德国的品牌一直以高品质著称。妮维雅的产品是好产品,其品牌的广告较少,更加注重产品的品质。一、品牌介绍妮维雅产品在身体保养,脸部保养,防晒,唇部保养,个人清洁,男士护肤等品类已稳居欧洲市场排名第一。二、品牌价值高

    2024-04-15
    17200

发表评论

登录后才能评论
保存