1.介绍
相信很多实验设计都是做温度传感器报警的设计,今天就来讲一下它的整体设计思路,这个设计非常简单,基本学过单片机的再会点数据通信基本就能拿捏的死死的。
2.设计
这个设计主要有四个部分组成,分别是单片机最小系统、显示屏、温度传感器和声光报警器,电路图如下图1所示。
11111.jpg

图1

都是比较常见的模块,所以代码也是非常简单的,一般做设计都是先做好人机交互,也就是图1中的LCD1602显示屏。
void write_1602com(uchar com)//****液晶写入指令函数****
  • {
  •         rs=0;//数据/指令选择置为指令
  •         rw=0; //读写选择置为写
  •         P0=com;//送入数据
  •         delay(1);
  •         en=1;//拉高使能端,为制造有效的下降沿做准备
  •         delay(1);
  •         en=0;//en由高变低,产生下降沿,液晶执行命令
  • }
  • void write_1602dat(uchar dat)//***液晶写入数据函数****
  • {
  •         rs=1;//数据/指令选择置为数据
  •         rw=0; //读写选择置为写
  •         P0=dat;//送入数据
  •         delay(1);
  •         en=1; //en置高电平,为制造下降沿做准备
  •         delay(1);
  •         en=0; //en由高变低,产生下降沿,液晶执行命令
  • }
  • 复制代码
    可以看到驱动代码非常的少,这就是为什么很多基本设计都会用它作为人机交互装置。
    然后就是DS18B20温度传感器了,这个传感器也是非常常用的,教学也会拿这个传感器来讲解,其实这个传感器的时序了解清楚之后,就没有任何难度了。
    void Init_DS18B20_I(void)//初始化ds1820
  • {
  •         unsigned char x=0;
  •         DQ_I = 1;    //DQ复位
  •         Delayns(8);  //稍做延时
  •         DQ_I = 0;    //单片机将DQ拉低
  •         Delayns(80); //精确延时 大于 480us
  •         DQ_I = 1;    //拉高总线
  •         Delayns(14);
  •         x=DQ_I;      //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
  •         Delayns(20);
  • }
  • //******************************************************************************
  • uchar ReadOneChar_I(void)//读一个字节
  • {
  •         unsigned char i=0;
  •         unsigned char dat = 0;
  •         for (i=8;i>0;i--)
  •         {
  •                 DQ_I = 0; // 给脉冲信号
  •                 dat>>=1;
  •                 DQ_I = 1; // 给脉冲信号
  •                 if(DQ_I)
  •                 dat|=0x80;
  •                 Delayns(4);
  •         }
  •         return(dat);
  • }
  • //******************************************************************************
  • void WriteOneChar_I(uchar dat)//写一个字节
  • {
  •         unsigned char i=0;
  •         for (i=8; i>0; i--)
  •         {
  •                 DQ_I = 0;
  •                 DQ_I = dat&0x01;
  •                 Delayns(5);
  •                 DQ_I = 1;
  •                 dat>>=1;
  •         }
  • }
  • //******************************************************************************
  • uint ReadTemperature_I(void)//读取温度
  • {
  •         unsigned char a=0;
  •         unsigned char b=0;
  •         unsigned int t=0;
  •         float tt=0;
  •         Init_DS18B20_I();
  •         WriteOneChar_I(0xCC); // 跳过读序号列号的操作
  •         WriteOneChar_I(0x44); // 启动温度转换
  •         Init_DS18B20_I();
  •         WriteOneChar_I(0xCC); //跳过读序号列号的操作
  •         WriteOneChar_I(0xBE); //读取温度寄存器
  •         a=ReadOneChar_I();  //读低8位
  •         b=ReadOneChar_I(); //读高8位
  •         if((b&0xf8)==0){
  •                 t=b;
  •                 t<<=8; //将b做高八位
  •                 t=t|a; //或上a,a做低八位
  •                 tt=t*0.0625;        //通过固定值算出温度
  •                 t= tt*10+0.5; //放大10倍输出并四舍五入
  •         }
  •         else{ //如果为负数求补码+1
  •                 a=~a;  //补码
  •                 b=~b;
  •                 t=b;
  •                 t<<=8;           //将b做高八位
  •                 t=t|a;           //或上a,a做低八位
  •                 tt=t*0.0625;        //通过固定值算出温度
  •                 t= tt*10+1.5; //放大10倍输出并四舍五入
  •                 t = -t;
  •         }
  •         return(t);
  • }
  • 复制代码
    不过这个传感器有一个通病,就是读写的时候可能会读到85这个值,所以读写的时候尽量不要被中断抢占,让他正常的读温度完成。
    声光报警就不多说了,根据设定值报警即可,最终的效果如下图2所示。
    2222.jpg

    图2

    3.总结
    这个设计虽然基础,但是对于初学者来说,还是有一定的知识量的,可以好好学一学,大佬就当看个小白教学就好了~