基于炜煌单片机的温度感应模块源代码,芯片类型STC12c5a60s2

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_41006598/article/details/90170514

 /* 本程序采用lcd12864显示,接入温度感应模块后会在第一行显示温度*/  

//硬件连接:  用1位杜邦线将J11_7与J17_1820连接,将12864液晶接口对应插接到接口。

#include"reg51.h"

#include"intrins.h"     //_nop_();延时函数用

#define uchar unsigned char

#define uint unsigned int

sbit DQ=P2^7;    //温度控制口

sbit RS=P2^5;    //命令/数据选择

sbit RW=P2^4;    //读写口

sbit  E=P2^3;    //锁存控制

sbit RES = P2^0; //复位

sbit PSB = P2^2; //串并选择

void delay1(uint t)

{

 while(--t);

}

//**************************************************************************************************

//传感器初始化

//**************************************************************************************************

//**************************************************************************************************

//延时函数

//**************************************************************************************************

delay(uint time)         //int型数据为16位,所以最大值为65535            

 {

  uint  i,j;             //定义变量i,j,用于循环语句

  for(i=0;i<time;i++)    //for循环,循环50*time次

     for(j=0;j<100;j++); //for循环,循环50次

 }

//**************************************************************************************************

//查忙

//**************************************************************************************************

checkbusy()           

{

   RS=0;                   //命令/数据选择,为0时选择命令    

   RW=1;                   //读/写选择,为1时选择读

   E=1;                    //使能

   while((P0&0x80)==0x80); //查忙标志位,等待标志位为0,即表示写入完毕

   E=0;                    //关闭读写

}

//**************************************************************************************************

//向LCD写一命令

//**************************************************************************************************

wcode(uchar cmdcode)

{

   checkbusy();            //查忙

   RS=0;                   //命令/数据选择,为0时选择命令

   RW=0;                   //读/写选择,为0时选择写

   E=1;                    //使能

   P0=cmdcode;             //送入命令

   delay(10);              //等待写入

   E=0;                    //关闭读写

}

//**************************************************************************************************

//向LCD写一数据

//**************************************************************************************************

wdata(uchar dispdata)

{

   checkbusy();            //查忙

   RS=1;                   //命令/数据选择,为1时选择数据

   RW=0;                   //读/写选择,为0时选择写

   E=1;                    //使能

   P0=dispdata;            //送入数据

   delay(10);              //等待写入

   E=0;                    //关闭读写

}

//**************************************************************************************************

//LCD 初始化

//**************************************************************************************************

InitLCD()

   {

   PSB=1;             //设置为8BIT并口工作模式

   RES=0;             //复位

   delay(10);         //延时

   RES=1;             //关复位

   wcode(0x30);       //选择基本指令集

   wcode(0x0c);       //开显示(无游标、不反白)

   wcode(0x01);       //清除显示,并且设定地址指针为00H

   wcode(0x06);       //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位

   }  

//**************************************************************************************************

//任意位置显示字符串

//**************************************************************************************************

void dis(uchar x,uchar y,uchar code *s)   

{                                     //x为横坐标,y位纵坐标,*s表示指针,为数据的首地址

 switch(y)                            //选择纵坐标            

     {

  case 0: wcode(0x80+x);break;    //第1行

  case 1: wcode(0x90+x);break;    //第2行

  case 2: wcode(0x88+x);break;    //第3行

  case 3: wcode(0x98+x);break;    //第4行

      default:break;

 }

   while(*s>0)                        //写入数据,直到数据为空

     {  

      wdata(*s);                      //写数据

      delay(10);                      //等待写入

      s++;                            //下一字符

     }

}

init_18b20()

{

        uchar flag;

        DQ=1;

        delay1(10);  //延时

        DQ=0;

        delay1(500); //*延时,要求精度,要求大于480us*

        DQ=1;

        delay1(200); //*延时,要求精度,要求大于15us*

        flag=DQ;    //DQ管脚送出60-240us的0脉冲,以示初始化成功

        delay1(10);  //延时

}

//**************************************************************************************************

//写一个字节函数

//**************************************************************************************************

write_byte(uchar t)

{

 uchar i;

 for(i=0;i<8;i++)   //循环8次写入1字节

  {

    DQ=0;           //数据线置低

    delay1(10);      //延时

    DQ=t&0x01;      //发送1位数据,最低位开始

    delay1(50);      //*延时,要求精度*

    DQ=1;           //数据线置高

    t=t>>1;         //右移1位

  }

}

//**************************************************************************************************

//读一个字节函数

//**************************************************************************************************

uchar read_byte()

{

 uchar i,value=0;;

 for(i=0;i<8;i++)   //循环8次读取1字节

  {

    value=value>>1; //右移1位

    DQ=0;           //数据线置低

    delay1(10);      //延时

    DQ=1;           //数据线置高

    delay1(10);      //延时

    if(DQ==1)value=value|0x80;//判断接收的1位数据是否为1

    delay1(50);      //*延时,要求精度*

  }

 return(value);

}

//**************************************************************************************************

//数据处理子函数

//**************************************************************************************************

/*

chuli(uint temperature)

{

 float t;

 if(temperature&0x8000)         //判断是否为负数

   {

     temperature=~temperature+1;//取反加1

     dis[3]=0xb0;               //显示负号

   }

 else

   {

     dis[3]=0x2b;               //显示正号

   }

 t=temperature*0.0625+0.05;     //计算出温度值,百分位四舍五入

 

 temperature=t*10;              //本实验显示到小数点后1位,所以乘10,以便分离得到十分位

 

 dis[7]=temperature%10+0x30;    //除10取余得温度十分位,1602只识别ASCII码,+0x30目的就是把16进制转ASCII

 dis[4]=temperature/100+0x30;   //除100取整得温度十位

 dis[5]=temperature%100/10+0x30;//除100取余得十位和个位,然后除10取整得温度个位

}  */

//**************************************************************************************************

//温度采集函数

//**************************************************************************************************

//**************************************************************************************************

//数据处理子函数

//**************************************************************************************************

chuli(uint temperature)

{

 float t;

 if(temperature&0x8000)         //判断是否为负数

   {

     temperature=~temperature+1;//取反加1

     wcode(0x80);

 wdata('-');              //显示负号

   }

 else

   {

     wcode(0x80);

 wdata('+');                 //显示正号

   }

 t=temperature*0.0625+0.05;     //计算出温度值,百分位四舍五入

 

 temperature=t*10;              //本实验显示到小数点后1位,所以乘10,以便分离得到十分位

}

uint get_temp()

{

    uint dat;

    uchar wenl,wenh;

    init_18b20();         //复位

    write_byte(0xcc);     //不进行编号匹配

    write_byte(0x44);     //进行温度转换

    init_18b20();         //复位   

    write_byte(0xcc);     //不进行编号匹配

    write_byte(0xbe);     //发读命令

    wenl=read_byte();     //温度低八位

    wenh=read_byte();     //温度高八位

    dat=(wenh<<8)+wenl;   //数据高低8位合并

    return(dat);          //返回测量结果

}

void main()

{

  uint k;

  InitLCD();

   while(1)

   {    

         k=get_temp();

     k=chuli(k);

 wcode(0x80+0x01);

 wdata(k/100+0x30);

             wdata(k%100/10+0x30);

   }

}

猜你喜欢

转载自blog.csdn.net/qq_41006598/article/details/90170514
今日推荐