wryp 发表于 2023-9-3 09:47:59

单片机学习之二:做一个温度计

本帖最后由 wryp 于 2023-9-3 09:50 编辑

首先说明,这些都是学习单片机的最基础的东西,离专业人士还差很远。

我们仅仅为了好玩,低矮歪。

DS18B20,这个东东也是大名鼎鼎。先贴点他的资料。DS18B20数据手册-中文版 - 知乎 (zhihu.com)
自己用面包板手工搭了一个板子,主芯片还是89S52,这回要去买了,没有天天能捡得到的东西。
一入低矮歪深似海,从此金银如流水。
编程,编译,刷进去,运行正常。



18B20的温度显示范围是-55℃至+125℃。所以,设了5个数码管,前三位显示百位,十位,个位,零下时,百位为负号。十分位留一个数码管,日常温度显示精确到0.1足够了。最后一位显示℃
显示℃,要把数码管反过来使用。图中最后一个数码管和前面的方向不一样。

wryp 发表于 2023-9-3 12:28:04

//         *****************************************************************************************************************************************
//         *程序名称:《大气温度计》
//         *硬件设计:
//         *软件设计:
//         *开始日期:
//         *定型日期:
//         *接口定义:P10(与18B20通讯口)
//         *            P2 (段控)
//         *            P0 (位控)
//         *****************************************************************************************************************************************

#include<reg52.h>
#include<intrins.h>

#define jump_ROM 0xCC
#define start 0x44
#define read_EEROM 0xBE

sbit DQ = P1^0;            //DS18B20数据口

unsigned char TMPH,TMPL;

unsigned char code table = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};
unsigned char code tabld = {0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};






//         *****************************************************************************************************************************************
//         * 名称 : delay()
//         * 功能 : 延时,延时时间大概为140US。
//         * 输入 : 无
//         * 输出 : 无
//         *****************************************************************************************************************************************

void delay_1()
{
        int i,j;
        for(i=0; i<=10; i++)
        for(j=0; j<=2; j++);
}




//         *****************************************************************************************************************************************
//         * 名称 : delay()
//         * 功能 : 延时函数
//         * 输入 : 无
//         * 输出 : 无
//         *****************************************************************************************************************************************

void delay(unsigned int N)
{
        int i;
        for(i=0; i<N; i++)        ;
}






//         *****************************************************************************************************************************************
//         * 名称 : Delay_1ms()
//         * 功能 : 延时子程序,延时时间为 1ms * x
//         * 输入 : x (延时一毫秒的个数)
//         * 输出 : 无
//         *****************************************************************************************************************************************

void Delay_1ms(unsigned int i)//1ms延时
{
        unsigned char x,j;
        for(j=0;j<i;j++)
        for(x=0;x<=50;x++);       
}






//         *****************************************************************************************************************************************
//         * 名称 : Reset()
//         * 功能 : 复位DS18B20
//         * 输入 : 无
//         * 输出 : 无
//         *****************************************************************************************************************************************

unsigned char Reset(void)
{
        unsigned char deceive_ready;
        DQ = 0;
        delay(29);
        DQ = 1;
        delay(3);
        deceive_ready = DQ;
        delay(25);
        return(deceive_ready);
}





//         *****************************************************************************************************************************************
//         * 名称 : read_bit()
//         * 功能 : 从DS18B20读一个位值
//         * 输入 : 无
//         * 输出 : 从DS18B20读出的一个位值
//         *****************************************************************************************************************************************

unsigned char read_bit(void)
{
        unsigned char i;
        DQ = 0;
        DQ = 1;
        for(i=0; i<3; i++);
        return(DQ);
}

//         *****************************************************************************************************************************************
//         * 名称 : write_bit()
//         * 功能 : 向DS18B20写一位
//         * 输入 : bitval(要对DS18B20写入的位值)
//         * 输出 : 无
//         *****************************************************************************************************************************************

void write_bit(unsigned char bitval)
{
        DQ=0;
        if(bitval==1) DQ=1;
        delay(5);
        DQ=1;
}





//         *****************************************************************************************************************************************
//         * 名称 : read_byte()
//         * 功能 : 从DS18B20读一个字节
//         * 输入 : 无
//         * 输出 : 从DS18B20读到的值
//         *****************************************************************************************************************************************

unsigned char read_byte(void)
{
        unsigned char i,m,receive_data;
        m = 1;
        receive_data = 0;
        for(i=0; i<8; i++)
        {
                if(read_bit())
                {
                        receive_data = receive_data + (m << i);
                }
                delay(6);
        }
        return(receive_data);
}





//         *****************************************************************************************************************************************
//         * 名称 : write_byte()
//         * 功能 : 向DS18B20写一个字节
//         * 输入 : val(要对DS18B20写入的命令值)
//         * 输出 : 无
//         *****************************************************************************************************************************************

void write_byte(unsigned char val)
{
        unsigned char i,temp;
        for(i=0; i<8; i++)
        {
                temp = val >> i;
                temp = temp & 0x01;
                write_bit(temp);
                delay(5);
        }
}


//         *****************************************************************************************************************************************
//         * 名称 : Main()
//         * 功能 : 主函数
//         * 输入 : 无
//         * 输出 : 无
//         *****************************************************************************************************************************************

void main()
{
//        float tt;
        unsigned char w,k;
        unsigned int temp, x, y;
        P1 = 0x00;
        P2 = 0x00;
        P0 = 0x00;

        while(1)
        {
                Reset();
                write_byte(jump_ROM);
                write_byte(start);
                Reset();
                write_byte(jump_ROM);
                write_byte(read_EEROM);
                TMPL = read_byte();
                TMPH = read_byte();

                for (k=0;k<220;k++)
                {
                        temp = TMPL + TMPH * 256;

                        if(temp >= 32768)
                        {
                                temp = 65535-temp;
                                temp = temp + 1;
                                w = 11;
                        }
                        else
                        w = 10;

                        temp = temp * 10 / 16;


                        x = temp/100;
                        y = temp%100;

                        if(temp < 100)
                        {
                                if(w == 11)
                                {
                                        x = 11;
                                        w = 10;
                                }
                                else
                                x = 10;
                        }

                        P2 = table;
                        P0 = 0x02;
                        Delay_1ms(10);
                        P0 = 0x00;

                        x = temp%100/10;
                        y = y%10;

                        P2 = tabld;
                        P0 = 0x04;
                        Delay_1ms(10);
                        P0 = 0x00;


                        P2 = table;
                        P0 = 0x08;
                        Delay_1ms(10);
                        P0 = 0x00;

                        P2 = table;
                        P0 = 0x01;
                        Delay_1ms(10);
                        P0 = 0x00;
                }
        }
}

喂我袋盐 发表于 2023-9-3 13:51:02

#define jump_ROM 0xCC
#define start 0x44
#define read_EEROM 0xBE


大佬,建议全大写

喂我袋盐 发表于 2023-9-3 13:55:24

unsigned char code table = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};
unsigned char code tabld = {0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};

P2 = table;
P2 = tabld;

code是什么类型?

喂我袋盐 发表于 2023-9-3 14:06:16

显示℃,要把数码管反过来使用。图中最后一个数码管和前面的方向不一样。

直接显示c就ok了

wryp 发表于 2023-9-3 14:25:00

喂我袋盐 发表于 2023-9-3 13:51
大佬,建议全大写

你才是大佬

wryp 发表于 2023-9-3 14:29:19

喂我袋盐 发表于 2023-9-3 13:55
P2 = table;
P2 = tabld;



这是做了一个表
0x3f      显示    0
0x06      显示1
.。。。。。。。

喂我袋盐 发表于 2023-9-3 15:53:16

wryp 发表于 2023-9-3 14:29
这是做了一个表
0x3f      显示    0
0x06      显示1


我是想说,定义时,code是啥类型?

wryp 发表于 2023-9-3 16:13:59

喂我袋盐 发表于 2023-9-3 15:53
我是想说,定义时,code是啥类型?

code table    连在一起,代码表

喂我袋盐 发表于 2023-9-3 16:16:12

wryp 发表于 2023-9-3 16:13
code table    连在一起,代码表

P2 = table;
P2 = tabld;

调用时没看到code:)
页: [1] 2
查看完整版本: 单片机学习之二:做一个温度计