使用温度传感器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
    48600
  • 真的黑绷带在哪里买,多少钱能买到

    在挪里买真的黑绷带的价格不一定。因为它的价格需要根据具体购买地点和供需关系等因素综合考虑。一些商家在官方网站或其他平台上进行售卖,提供多样尺寸和价格以供选择。建议您在购买时多询问多比较,在确认质量的前提下寻找更优惠的价格。也可以建议您淘宝等

    2024-04-15
    45500
  • 鱼子精华的价格?

    是LA PRAIRIE的吗?那个对于去除皱纹,太管用了!鱼子精华琼贵面霜(RMB320050ml)、鱼子精华紧致乳液(RMB110030ml)、鱼子精华活肤修护精华液(RMB52006pairs)、鱼子精华眼部紧致啫哩(RMB950

    2024-04-15
    34900
  • 我国的著名小吃(五个)?

    中国105个城市必吃菜!  1台北:鸳鸯火锅   很多香港艺人都为之疯狂,据闻郭富城在离开时就把火锅材料打包回去再过瘾。火锅最重要的是汤底,有多少店就有多少种汤底,但没有人知道汤底的材料和制作方法。跟吃川菜一样,火锅的麻辣程度是分等级的,鸳

    2024-04-15
    33700
  • 白云山巧依依美白淡斑菁华乳好用吗

    好用。巧依依美白淡斑菁华乳的祛斑效果是很不错的,在它里面的成分可以帮助肌肤达到美白的效果,也有帮助淡化斑点的效果。如果想要让存在的斑点问题能够更好得到改善,建议在使用的时候就要坚持使用,否则就会因为自己没有坚持使用依露美美白精华霜而导致美白

    2024-04-15
    29500
  • 长安和伊思特瓷砖哪个相对比较好,都是佛山产的吗?

    长安瓷砖还是比较有名,具体哪里产的就不要听销售人员给你讲解的了,最好看他们的包装上面的资料。还有就是需要选大厂,大品牌的瓷砖,你想一想你装房子管得最久的是什么?肯定是瓷砖、涂料、门窗那些硬装。像蒙娜丽莎、马可波罗、威尼斯商人瓷砖、冠珠这些都

    2024-04-15
    28700
  • 小黄瓜水有什么作用

    美白保湿、细致毛孔、细滑爽肤。。。小黄瓜萃取精华富含矿物质、氨基酸、糖蛋白、单宁酸等人体极易吸收的养分,可以使肤色靓丽、红润、洁净、白皙;与此同时,可有效的清热解毒,促进血液循环,对青春痘、粉刺、皱纹、雀斑等问题可以起到修复作用,对发言的皮

    2024-04-15
    39800

发表评论

登录后才能评论
保存