机械必威体育网址

找回密码
注册会员

QQ登录

只需一步,快速开始

搜索
查看: 1540 | 回复: 12
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
1#
发表于 2023-9-3 09:47:59 | 只看该作者 | 只看大图 回帖奖励 | 倒序浏览 | 阅读模式
本帖最后由 wryp 于 2023-9-3 09:50 编辑

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

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

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



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

评分

参与人数1 威望+100 收起理由
老鹰 + 100

查看全部评分

2#
楼主 | 发表于 2023-9-3 12:28:04 | 只看该作者
// *****************************************************************************************************************************************
// * 程序名称:《大气温度计》
// * 硬件设计:
// * 软件设计:
// * 开始日期:
// * 定型日期:
// * 接口定义:P10(与18B20通讯口)
// * P2 (段控)
// * P0 (位控)
// *****************************************************************************************************************************************

#include
#include

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

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

unsigned char TMPH,TMPL;

unsigned char code table[12] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};
unsigned char code tabld[10] = {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}






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

void Delay_1ms(unsigned int i)//1ms延时
{
unsigned char x,j;
for(j=0;jfor(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[x];
P0 = 0x02;
Delay_1ms(10);
P0 = 0x00;

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

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


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

P2 = table[w];
P0 = 0x01;
Delay_1ms(10);
P0 = 0x00;
}
}
}
3#
发表于 2023-9-3 13:51:02 | 只看该作者
#define jump_ROM 0xCC
#define start 0x44
#define read_EEROM 0xBE



大佬,建议全大写
4#
发表于 2023-9-3 13:55:24 | 只看该作者
unsigned char code table[12] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};
unsigned char code tabld[10] = {0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};


P2 = table[x];
P2 = tabld[x];

code是什么类型?
5#
发表于 2023-9-3 14:06:16 | 只看该作者
显示℃,要把数码管反过来使用。图中最后一个数码管和前面的方向不一样。


直接显示c就ok了
6#
楼主 | 发表于 2023-9-3 14:25:00 | 只看该作者
喂我袋盐 发表于 2023-9-3 13:51
大佬,建议全大写

你才是大佬
7#
楼主 | 发表于 2023-9-3 14:29:19 | 只看该作者
喂我袋盐 发表于 2023-9-3 13:55
P2 = table[x];
P2 = tabld[x];

这是做了一个表
0x3f 显示 0
0x06 显示1
.。。。。。。。
8#
发表于 2023-9-3 15:53:16 | 只看该作者
wryp 发表于 2023-9-3 14:29
这是做了一个表
0x3f 显示 0
0x06 显示1

我是想说,定义时,code是啥类型?
9#
楼主 | 发表于 2023-9-3 16:13:59 | 只看该作者
喂我袋盐 发表于 2023-9-3 15:53
我是想说,定义时,code是啥类型?

code table 连在一起,代码表
10#
发表于 2023-9-3 16:16:12 | 只看该作者
wryp 发表于 2023-9-3 16:13
code table 连在一起,代码表

P2 = table[x];
P2 = tabld[x];

调用时没看到code
您需要登录后才可以回帖 登录| 注册会员

本版积分规则

小黑屋|手机版|Archiver|机械必威体育网址(京ICP备10217105号-1,京ICP证050210号,浙公网安备33038202004372号)

GMT+8, 2024-5-11 11:04, Processed in 0.069384 second(s), 20 queries , Gzip On.

Powered byDiscuz!X3.4Licensed

? 2001-2017Comsenz Inc.

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