微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 51+lcd1602+ds18b20程序(已验证,能测温)

51+lcd1602+ds18b20程序(已验证,能测温)

时间:10-02 整理:3721RD 点击:
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
#define Data P0
sbit lcdrs=P2^4;
sbit lcdrw=P2^5;
sbit lcden=P2^6;
sbit DQ=P1^3;
uint value;
uchar code table3[17]="  Temperature:  ";
bit fg=0;
void delay(uint n)
{  uint x,y;
   for(x=n;x>0;x--)
       for(y=110;y>0;y--);
}
void write_com(uchar com)
{       
    delay(5);
    lcden=0;
        lcdrs=0;
        lcdrw=0;                        //rs=0时输入指令
        delay(5);
        lcden=1;                        //en=1时读取信息
        Data=com;
        lcden=0;                        //1 -> 0 执行指令
}

void write_dat(uchar dat)
{
    delay(5);
        lcden=0;
        lcdrs=1;
        lcdrw=0;                         //rs=1时输入数据
        delay(5);
        lcden=1;
        Data=dat;
        lcden=0;
        lcdrs=0;
}
void init_lcd()
{
        lcden=0;
        lcdrw=0;
        write_com(0x38);          //8位数据,双列,5*7字形
        write_com(0x0c);         //开启显示屏,关光标,光标不闪烁
        write_com(0x06);         //显示地址递增,即写一个数据后,显示位置右移一位
        write_com(0x01);
}
void delay_us(uchar t)//微妙延时
{
        while(t--);
}
void init_ds18b20()        //数据初始化
{
        DQ=1;
        delay_us(4);
        DQ=0;
        delay_us(80);
        DQ=1;
        delay_us(200);
}
void write_ds18b20(uchar dat) //写数据
{
        uchar i;
        for(i=0;i<8;i++)
        {
                DQ=0;               
                DQ=dat&0x01;
                delay_us(15);
                DQ=1;
                dat=dat>>1;
        }
        delay_us(10);
}
uchar read_ds18b20()  //读数据
{
        uchar i=0,readat=0;
        for(i=0;i<8;i++)
        {
                DQ=0;
                readat=readat>>1;      //八位全部都是0,向右移一位后,仍然全是0
                DQ=1;
                if(DQ)                //如果DQ为1,readat进行或运算,如果为0,则子语句不执行,直接for循环此时采集的数据是0
                        readat=readat|0x80;//此时最高位为1         ,然后再进行for循环 最高位成为第七位,依次往复
                delay_us(10);
        }
        return readat;
}
uchar change_ds18b20()
{
        uchar tl,th;
        init_ds18b20();
        write_ds18b20(0xcc);
        write_ds18b20(0x44);
        delay_us(200);
        init_ds18b20();
        write_ds18b20(0xcc);
        write_ds18b20(0xbe);
        tl=read_ds18b20();
        th=read_ds18b20();
        value=th;
        value=value<<8;
        value=value|tl;
        if(th < 0x80)
        {        fg=0;  }
       
        if(th>= 0x80)
        {        fg=1;
                
                value=~value+1;
        }
                value=value*(0.0625*10);
            return value;
       
}
void display_lcd1602()
{         
         uchar i;
                 write_com(0x80);
                 for(i=0;i<16;i++)
                 {
                         write_dat(table3[i]);
                        delay(3);
                 }
                 write_com(0xc0);
                 if(fg==1)
                 {
                         write_dat(0xb0);
                 }
                 if(fg==0)
                 {
                         write_dat(0x20);
                 }
                 write_dat(value/100+0x30);
                 write_dat(value%100/10+0x30);
                 write_dat(0x2e);
                 write_dat(value%10+0x30);
                 write_dat(0xdf);
                 write_dat(0x43);
}
void main()
{
        init_lcd();
        while(1)
        {
                change_ds18b20();
                display_lcd1602();
                                       
        }
}

前几天刚做过,马克

已验证,好用

小编你好,有电路原理图吗

经验啊,谢谢,

感謝大大的分享.....Orz

谢谢分享。

谢谢啊            

为什么我的出现错误,好像是哪个要定义?

没图

谢谢分享。                        

可能是引脚定义的问题

请问你有DS18b20和HS1101用51显示的程序吗?

没有耶~,。,。,。,

求stm8的程序

有程序,但没有原理图啊!

小编,在你这个程序下,在加一个步进电机,怎么用温度段控制步进电机的速度啊

您好,有没有原理流程图呢?看不太懂,谢谢

那个采集温度后的延时~感觉短了点啊  我的读出来就是85度

我验证过没问题,ds18b20刚上电就是显示85度,之后就正常显示。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top