找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1691|回复: 2
打印 上一主题 下一主题
收起左侧

怎么样将使用独立键盘前三个按键去调整 ds18b20的TH,TL,并且使用LCD1602 去显示...

[复制链接]
跳转到指定楼层
楼主
怎么样用代   使用独立键盘前三个按键去调整
ds18b20的TH,TL,并且使用LCD1602
去显示每次按键的变化
以下代码只实现了测出温度
代码:#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 = P3^6;
sbit RS = P3^5;  
sbit LCDEN = P3^4;

void delayUs()           //us级延时
{
    _nop_();  //汇编语句  空语句,用来产生短暂的延时效果,
                            //对于延时很短的,要求在us级的,采用“_nop_”函数,对于12M晶振,延时1uS。
}

void delayMs(uint a)  //ms级延时
{
    uint i, j;
    for(i = a; i > 0; i--)
        for(j = 100; j > 0; j--);
}


void writeComm(uchar comm)         //写LCD1602指令
{
     RS = 0;   
    P0 = comm;
    LCDEN = 1;
     delayUs();
    LCDEN = 0;
    delayMs(1);
}

//写数据:RS=1, RW=0;   可以选择想要写入的数据
void writeData(uchar dat)        //从 writeString()函数中逐一写入数据
{
     RS = 1;
     P0 = dat;
     LCDEN = 1;           //读取数据并写入1602内
    delayUs();
    LCDEN = 0;          //释放总线
    delayMs(1);
}


void init()           //初始化函数
{
     rw = 0;
     dula = wela = 0;
    writeComm(0x38); //        显示模式设置指令码00111000           16*2显示
   writeComm(0x0c);  //显示开/关及光标设置          00001DCB  D=1 开显示   C=1显示光标  B=1光标闪烁
    writeComm(0x06); //显示指针指向000001NS         N=1 当读或写一个字符后地址指针加一,且光标加一
    writeComm(0x01); //显示清屏:1.数据指针清零,2.所有显示清零
}

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--;   //猜测是为了使传感器复位,即拉低单总线480us以上
    ds = 1;                      //释放总线
    i = 4;                          
     while(i>0) i--;   //拉低总线15-60us,即可读取18B20的存在信号
}

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);//把字节每次移动一位,直到移动8次,数据写入dat中
    }
    return dat;
}


void writeByte(unsigned char dat)  //写时序
{
    unsigned int i;
    unsigned char j;
    bit b;
    for(j = 0; j < 8; j++)        //每次写入一个字节,写入8次
    {
        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); //发送温度转换指令
/*        设置EEPROM中的TH  TL   及精度程序
        writeByte(0x4e); //发送写暂存器指令
        writeByte(0x依据需要); //设置TH指令
        writeByte(0x依据需要); //设置TL指令
        writeByte(0x依据需要); //配置工作在哪一位的模式下  如0 R1 R2 1 1 1 1 1 R1=R2=0 为9位精度
        writeByte(0x48); //把高速暂存器的值拷贝到EEPROM中
        PS:每次使用时都需要初始化
        dsInit();   
    dsWait();
        writeByte(0xcc); //发送跳跃ROM指令        
        */
}

void sendReadCmd()
{
    dsInit();
    dsWait();
    delayMs(1);
    writeByte(0xcc); //发送跳跃ROM指令
    writeByte(0xbe); //读取高速暂存器中的内容
}


int getTmpValue()
{
    unsigned int tmpvalue;
    int value;
    float t;
    unsigned char low, high;
    sendReadCmd();

    low = readByte();  //读取高速暂存器中的第一个字节 ,即LSB
    high = readByte(); //读取高速暂存器中的第2个字节 ,即MSB

    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('.');
        }
    }
}
/**//*****************************DS18B20*******************************/

void main()
{
    uchar table[] = "  xianzaiwendu: ";
    sendChangeCmd();
    init();
    writeComm(0x80);
    writeString(table, 16);
    while(1)
    {
        delayMs(1000); //温度转换时间需要750ms以上
        writeComm(0xc0);//第二行地址 显示温度
        display(getTmpValue());
        sendChangeCmd(); //再次初始化DS总线
    }
}


无标题.png (79.24 KB, 下载次数: 51)

无标题.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:452950 发表于 2020-5-1 09:59 | 只看该作者
TH、TL是温度报警的上下限吗,设置两个变量,一个·按键选择调节上限或下限、一个按键加、一个按键减就好了。
回复

使用道具 举报

板凳
ID:282850 发表于 2020-5-1 13:52 | 只看该作者
设三个按键,+ -  S,S时可以选TH、TL,并闪烁,+时选中++,-时选中--,最后按S时保存。OK。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表