温度传感器在LCD上显示代码

——

温度传感器在LCD上显示代码:

#include <reg52.H>  //头文件

#include <intrins.H>

#include <math.H>   //数学公式头文件

#define uchar unsigned char

#define uint unsigned int

 sbit dula = P2^6;   //定义液晶显示屏的功能引脚

 sbit wela = P2^7;

 sbit rw = P1^1; 

 sbit RS = P1^0;  

 sbit LCDEN = P2^5;   //液晶数据显示

void delayUs()

{

    _nop_();        //延时

}

 void delayMs(uint a)         //毫秒级延时程序

{

    uint i, j;

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

        for(j = 100; j > 0; j--);

 }

/*****************************1602*******************************/

void writeComm(uchar comm)        //1602写指令程序

{

     RS = 0;    

    P0 = comm;

    LCDEN = 1;

     delayUs();

    LCDEN = 0;

    delayMs(1);

}

void writeData(uchar dat)//写数据:RS=1, RW=0;

{

     RS = 1;

     P0 = dat;        //P0口输出数据

     LCDEN = 1;

    delayUs();        //延时

    LCDEN = 0;

    delayMs(1);       //延时

 }

 void init()      //数据显示程序

 {

     rw = 0; 

     dula = wela = 0;

    writeComm(0x38);         //写入指令

   writeComm(0x0c); 

    writeComm(0x06);

    writeComm(0x01); 

}

void writeString(uchar * str, uchar length)   //字符串显示程序

{

     uchar i;

    for(i = 0; i < length; i++)

    {

         writeData(str[i]);    //写入字符串

     } }

/*****************************DS18B20*******************************/

 sbit ds = P2^2;          //定义温度传感器数据接口

void dsInit()           //读取温度传感器序列号

 {

    unsigned int i;  

    ds = 0;

    i = 100;  

     while(i>0) i--;

    ds = 1;   

    i = 4;

     while(i>0) i--;

 }

void dsWait()             //数据等待程序

 {

      unsigned int i;

      while(ds);  

      while(~ds);

      i = 4;

      while(i > 0) i--;

}

bit readBit()       //读取数据程序

{

    unsigned int i;

    bit b;

    ds = 0;

    i++;   

    ds = 1; 

   i++; i++;  

    b = ds;

    i = 8; 

    while(i>0) i--;

    return b;

}

unsigned char readByte()            //读取字节程序

{

    unsigned int i;

    unsigned char j, dat;

   dat = 0;

    for(i=0; i<8; i++)

    {

        j = readBit();

      

        dat = (j << 7) | (dat >> 1);

    }

    return dat;

}

void writeByte(unsigned char dat)              //写入字节数据

{

    unsigned int i;

    unsigned char j;

    bit b;

    for(j = 0; j < 8; j++)

    {

        b = dat & 0x01;

        dat >>= 1;

        if(b)   

        {

           ds = 0;          i++; i++;  

            ds = 1;    

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

        }

        else  

        {

            ds = 0;

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

            ds = 1;

           i++; i++;

        }}}

void sendChangeCmd()        //发送转换模式指令

{

    dsInit();    

    dsWait();   

    delayMs(1);    

    writeByte(0xcc);

    writeByte(0x44);

}

void sendReadCmd()

{

    dsInit();

    dsWait();

    delayMs(1);

    writeByte(0xcc); 

    writeByte(0xbe); 

}

int getTmpValue()

{

    unsigned int tmpvalue;

    int value; 

    float t;

    unsigned char low, high;

    sendReadCmd();

    low = readByte(); 

    high = readByte();

    tmpvalue = high;

    tmpvalue <<= 8;

    tmpvalue |= low;

    value = tmpvalue;

    /

    t = value * 0.0625;

    /

    value = t * 100 + (value > 0 ? 0.5 : -0.5); //大于0加0.5, 小于0减0.5

    return value;

}

void display(int v) 

{

    unsigned char count;

    unsigned char datas[] = {0, 0, 0, 0, 0};

    unsigned int tmp = abs(v);

    datas[0] = tmp / 10000;

    datas[1] = tmp % 10000 / 1000;

    datas[2] = tmp % 1000 / 100;

    datas[3] = tmp % 100 / 10;

    datas[4] = tmp % 10;

    writeComm(0xc0+3);

    if(v < 0)

    {

        writeString("- ", 2);

   }

    else

    {

       writeString("+ ", 2);

    }

    if(datas[0] != 0)

    {

        writeData('0'+datas[0]);

    }

    for(count = 1; count != 5; count++)

    {

        writeData('0'+datas[count]);

        if(count == 2)

        {

            writeData('.');

        }}}

/*****************************主函数*******************************/

void main()

{

    uchar table[] = " temputure: ";

    sendChangeCmd();

    init();

    writeComm(0x80);

    writeString(table, 4);

    while(1)

    {

        delayMs(1000); //温度转换时间需要750ms以上

        writeComm(0xc0);

        display(getTmpValue());

        sendChangeCmd();

    }}



下一篇比尔·盖茨24年一轮回的游戏! 开源去中心化项目ION能否颠覆世界?
上一篇识别苹果Apple是否为原装机

产业列表

——

分享到: