切换到宽版
  • 3296阅读
  • 9回复

[C51]自己写的DS18B20-温度液晶显示 程序,分享一下 [复制链接]

上一主题 下一主题
 

发帖
135
M币
631
专家
1
粉丝
9
只看楼主 倒序阅读 我要置顶 楼主  发表于: 2013-11-25

#include<reg52.h>   //分享一下自己的学习成果,给自己加把劲!!!
#define uint unsigned int                  //路漫漫其修远兮   吾将上下而求索
#define uchar unsigned char
sbit lcde=P2^7;
sbit lcdrs=P2^6;
sbit lcdrw=P2^5;
sbit IO=P3^7;
uchar temp,num;
void init_DS18B20();
void init_1602();
void write_byte(uchar dat);
uchar read_byte(void);
uchar readtemperature();
void write_com(uchar com);
void write_data(uchar date);
void delay(uint z);
void delay2(uint t);
void display();
uchar code table[]={"Temperature"};
uchar code table1[]={"The value:  C"};
void main()
{
    
    delay(10);
    init_1602();
    init_DS18B20();

    write_com(0x80+0x10);
    for(num=0;num<11;num++)         //写第一行
    {
        write_data(table[num]);
        delay(2);
    }
    write_com(0x80+0x50);        //设置第二行地址
    for(num=0;num<13;num++)        //写第二行
    {
        write_data(table1[num]);
        delay(2);
    }
    delay(10);
    for(num=0;num<16;num++)       //写完整屏左移16位
        {
              write_com(0x18);
            delay(2);
        }                                  

    while(1)
    {
        display();
    }
}
void delay(uint z)
{
    uint x,y;
    for(x=z;x>0;x--)
        for(y=110;y>0;y--);
}
void write_com(uchar com)    //液晶写命令
{
    lcdrs=0;
    lcde=0;

    P0=com;
    delay(5);

    lcde=1;
    delay(5);
    lcde=0;

    P0=com<<4;
    delay(5);

    lcde=1;
    delay(5);
    lcde=0;
}
void write_data(uchar date)     //液晶写数据
{
    lcdrs=1;
    lcde=0;

    P0=date;
    delay(5);

    lcde=1;
    delay(5);
    lcde=0;

    P0=date<<4;
    delay(5);

    lcde=1;
    delay(5);
    lcde=0;
}
void delay2(uint t)
{
    while(t--);
}
void init_DS18B20()      //初始化ds18b20
{
    uchar n;      //初始化DS18B200
    IO=1;
    delay2(8);
    IO=0;
    delay(80);
    IO=1;
    delay(8);
    n=IO;         //n这里不用返回,若需要,可改为带返回值的函数,n=0,则线上没有DS18B20,n=1,则有
    delay2(4);
}
void init_1602()
{
    lcdrw=0;
    write_com(0x32); //初始化4pin
    write_com(0x28); //初始化两行显示
    write_com(0x0f);
    write_com(0x06);
    write_com(0x01);
    write_com(0x02);
    write_com(0x80+0x10); //初始化地址
}
void write_byte(uchar dat)
{
    uchar i;
    for(i=0;i<8;i++)
    {
        IO=0;
        IO=dat&0x01;
        delay2(4);
        IO=1;
        dat>>=1;
    }
    delay(4);    
}
uchar read_byte(void)
{
    uchar i,value;
    for(i=0;i<8;i++)
    {
        IO=0;              //拉低
        value>>=1;         //延时
        IO=1;              //释放

        if(IO)             //采样
        value|=0x80;
        delay2(4);

    }
    return value;
}
uchar readtemperature()
{
    uchar a,b;           //温度有2个字节一个高8位,一个低8位
    init_DS18B20();
    write_byte(0xcc);  //跳过rom
    write_byte(0x44);  //启动温度测量
    delay2(300);

    init_DS18B20();
    write_byte(0xcc);
    write_byte(0xbe);
    a=read_byte();        //读低8位
    b=read_byte();
    b<<=4;        //读高8位
    b+=(a&0xf0)>>4;

    return(b);
}
void display()
{
    uint shi,ge;
    temp=readtemperature();    
    shi=temp/10;
    ge=temp%10;

    write_com(0x80+0x50+0x0A);
    if(shi>9)
        shi=shi+0x37;
    else
        shi=shi+0x30;
    write_data(shi);
    
    if(ge>9)
        ge=ge+0x37;
    else
        ge=ge+0x30;
    write_data(ge);
}
本帖最近打赏记录:共1条打赏 ,M币+3
离线pzscd

发帖
73715
M币
6486
专家
5
粉丝
50
只看该作者 1楼 发表于: 2013-11-25
请登录后查看
离线say260

发帖
32609
M币
13580
专家
269
粉丝
12547
只看该作者 2楼 发表于: 2013-11-25
请登录后查看
离线sodohe

发帖
649
M币
114
专家
1
粉丝
59
只看该作者 3楼 发表于: 2013-11-25
请登录后查看
离线snake43165

发帖
2537
M币
11176
专家
0
粉丝
24
只看该作者 4楼 发表于: 2014-01-18
请登录后查看
离线chenwqq
发帖
5
M币
201
专家
0
粉丝
0
只看该作者 5楼 发表于: 2014-06-12
请登录后查看
离线sis620

发帖
77
M币
3081
专家
0
粉丝
14
只看该作者 6楼 发表于: 2014-06-13
请登录后查看
离线whpll
发帖
5
M币
-497
专家
0
粉丝
0
只看该作者 7楼 发表于: 2018-03-21
请登录后查看
离线cqhejian

发帖
1335
M币
4128
专家
12
粉丝
19
只看该作者 8楼 发表于: 2018-03-21
请登录后查看
离线健康2016
发帖
16
M币
679
专家
0
粉丝
2
只看该作者 9楼 发表于: 2018-03-22
请登录后查看
快速回复
限80 字节
“新手上路”发帖需审核后才能显示(请认真发帖),达到数码9级后取消此限制
 
上一个 下一个