找回密码
 立即注册

QQ登录

只需一步,快速开始

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

高中生,研究了大半个月的成果,51单片机lcd显示温度计

[复制链接]
跳转到指定楼层
楼主
ID:577690 发表于 2019-7-4 10:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include"reg52.h"
#include "temp.h"
#include"xianshi.h"
#include "fmq.h"

typedef unsigned int u16;
typedef unsigned char u8;

u8 DisPlayDate[8];

void datapros(int temp)
{
        float tp;
        if(temp<0)
        {
                DisPlayDate[0] = '-';
                 
                temp = temp-1;
                temp=~temp;
                tp =temp;
                temp = tp*0.0625*100+0.5;//100为了保留两位小数                 
        }
        else
        {
                DisPlayDate[0] = '+';
                tp = temp;
                temp = tp*0.0625*100+0.5;//100为了保留两位小数                 
        }

        DisPlayDate[1] = temp/10000;
        DisPlayDate[2] = temp%10000/1000;
        DisPlayDate[3] = temp%1000/100;
        DisPlayDate[4] = temp%100/10;
        DisPlayDate[5] = temp%10;
        if(temp/100>32)
        {
                beep();
        }
               
        lcd_w_cmd(0x82);
        lcd_w_dat('0'+DisPlayDate[1]);

        lcd_w_cmd(0x83);
        lcd_w_dat('0'+DisPlayDate[2]);
       
        lcd_w_cmd(0x84);
        lcd_w_dat('0'+DisPlayDate[3]);


        lcd_w_cmd(0x85);
        lcd_w_dat('.');

        lcd_w_cmd(0x86);
        lcd_w_dat('0'+DisPlayDate[4]);

        lcd_w_cmd(0x87);
        lcd_w_dat('0'+DisPlayDate[5]);
}                                                          

void main()
{
        init();
        lcd_w_cmd(0x88);
        lcd_w_dat('c');
        while(1)
        {
                datapros(ds18b20readtemp());
               
        }

}




#include "temp.h"

void delay1ms(uint y)
{
        uint x;
        for(;y>0;y--)
        {
                for(x=100;x>0;x--);
        }
}

uchar DS18B20init()
{
        uchar i=0;
        DSPORT = 0;
        i=70;
        while(i--);//642us        480~960之间
        DSPORT = 1;
        i = 0;
        while(DSPORT)
        {
                delay1ms(1);
                i++;
                if(i>5)
                {
                        return 0;
                }               
        }
        return 1;//1为初始化成功,0为初始化失败
}

void ds18b20_write(uchar dat)        //写字节函数
{
        uchar i,j;
        for(j=0;j<8;j++)
        {
                DSPORT = 0;
                i++;
                DSPORT = dat&0x01;
                i=6;
                while(i--);//大约68us
                DSPORT = 1;
                dat>>=1;                               
        }
}

uchar ds18b20_read()
{
        uint i,j;
        uchar bi,byte;
        for(j=8;j>0;j--)
        {
                DSPORT = 0;
                i++;
                DSPORT = 1;
                i++;
                i++;
                bi = DSPORT;
                byte = (byte>>1)|(bi<<7);
                i = 4;
                while(i--);
        }
        return byte;
}

void ds18b20change()
{
        DS18B20init();
        delay1ms(1);
        ds18b20_write(0xcc);
        ds18b20_write(0x44);               
}

void ds18b20ReadTempCom()//发送温度转化
{
        DS18B20init();
        delay1ms(1);
        ds18b20_write(0xcc);
        ds18b20_write(0xbe);
}

int ds18b20readtemp()
{
        int temp=0;
        uchar tmh,tml;
        ds18b20change();
        ds18b20ReadTempCom();
        tml = ds18b20_read();
        tmh        = ds18b20_read();
        temp = tmh;
        temp<<=8;
        temp |=        tml;
        return temp;
}


#ifndef _TEMP_H
#define _TEMP_H

#include<reg52.h>

#ifndef uchar
#define uchar unsigned char
#endif

#ifndef uint
#define uint unsigned char
#endif

sbit DSPORT = P3^7;

int ds18b20readtemp();


#endif




#include"xianshi.h"

void delay(unsigned int k)
{
        while(k--);
}

unsigned char lcd_r_start()
{
        unsigned char s;
        RW = 1;
        delay(2);
        RS = 0;
        delay(2);
        EN = 1;
        delay(2);
        s = P0;
        delay(2);
        EN = 0;
        delay(2);
        return s;
}

void lcd_w_cmd(unsigned char com)
{
        unsigned char i;
        do
        {
                i=lcd_r_start();
                i&=0x80;
                delay(2);
        }while(i!=0);
        RW = 0;
        delay(2);
        RS = 0;
        delay(2);
        EN = 1;
        delay(2);
        P0 = com;
        delay(2);
        EN = 0;
        delay(2);
}

void lcd_w_dat(unsigned char dat)
{
        unsigned char i;
        do
        {
                i=lcd_r_start();
                i&=0x80;
                delay(2);
        }while(i!=0);
        RW = 0;
        delay(2);
        RS = 1;
        delay(2);
        EN = 1;
        delay(2);
        P0 = dat;
        delay(2);
        EN = 0;
        delay(2);
}

void init()
{
        lcd_w_cmd(0x38);
        lcd_w_cmd(0x0c);
        lcd_w_cmd(0x01);
        lcd_w_cmd(0x06);
        lcd_w_cmd(0x80);               
}





#ifndef _XIANSHI_H
#define _XIANSHI_H

#include"reg52.h"
sbit RS=P2^6;
sbit RW=P2^5;
sbit EN=P2^7;

void init();
unsigned char lcd_r_start();
void lcd_w_cmd(unsigned char com);
void lcd_w_dat(unsigned char dat);
void delay(unsigned int k);


#endif




#include"fmq.h"

void delayws(unsigned int k)
{
        while(k--);
}

void beep()
{
        unsigned int i,j;
        for(i=0;i<250;i++)
        {
                bp=0;
                delayws(150);
                bp=1;
                delayws(150);
        }
        for(j=0;j<100;j++)
        {
                bp=0;
                delayws(300);
                bp=1;
                delayws(300);
        }
}




#ifndef _FMQ_H
#define _FMQ_H

#include"reg52.h"
sbit bp=P1^5;

void beep();
void delay(unsigned int k);

#endif




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

使用道具 举报

沙发
ID:677168 发表于 2019-12-31 15:00 来自手机 | 只看该作者
没有图呀
回复

使用道具 举报

板凳
ID:325624 发表于 2020-3-9 15:13 | 只看该作者
同是高中生,为何你如此突出
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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