DS18B20与数码管的电子温度计C语言编程

版权申诉
0 下载量 2 浏览量 更新于2024-10-20 收藏 1KB RAR 举报
资源摘要信息:"本资源是关于使用C语言编写的电子温度计程序代码,主要涉及DS18B20温度传感器的初始化、读写时序以及数码管显示程序的实现。DS18B20是一款常用的数字温度传感器,能够输出数字信号,无需外部元件即可实现温度的测量。数码管作为一种显示器件,能够将测量到的温度数据显示出来,为用户提供直观的温度信息。本资源中的代码文件为tem.c,包含DS18B20的初始化和读写操作,以及如何将测量到的温度值显示在数码管上。" 知识点详细说明: 1. DS18B20数字温度传感器: DS18B20是由美国Dallas半导体公司生产的一种数字温度传感器,它能够提供9位到12位摄氏度温度测量值。DS18B20具有数字信号输出、无需外部元件、可实现多点网络化等优点。在本资源中,DS18B20的使用涉及到其初始化和读写时序的控制。初始化主要确保传感器能够正确响应主机的命令,而读写时序则涉及温度数据的准确读取。DS18B20与微控制器之间的通信通常采用一种称为“一线总线”(One-Wire)的通信协议,该协议允许多个DS18B20设备通过单个数据线与微控制器相连。 2. 数码管显示程序: 数码管通常是一种七段显示器件,可以显示数字和一些字符。在电子温度计中,数码管用来将温度值转换为可视化的信息。实现数码管显示功能,需要编写控制代码来驱动数码管的每一个段(segment),以及可能的多个位(digit)。编写此类程序通常需要考虑数码管的类型(共阴或共阳)、段码(用于表示不同字符的编码)以及动态扫描或多路复用(以减少所需的I/O引脚数量)等技术细节。 3. C语言程序代码: 本资源中的tem.c文件是使用C语言编写的,C语言是编程领域广泛使用的一种高级编程语言,非常适合用于嵌入式系统和硬件级编程。C语言提供了丰富的库函数和对硬件的直接访问能力,这使得它成为开发此类温度计的理想选择。在编写涉及硬件交互的程序时,了解如何使用指针、位操作以及硬件寄存器访问是至关重要的。 4. 一线总线通信协议: 在DS18B20的使用中,一线总线(One-Wire)通信协议是关键部分。这种通信协议允许通过单个数据线实现数据的发送和接收。要实现一线总线通信,需要遵循特定的时序规则,包括初始化脉冲、读时序和写时序。初始化脉冲用于启动通信,读时序和写时序用于实际的数据传输。在C语言程序中,这些时序通常需要精确控制,以确保数据传输的准确性。 5. 电子温度计的应用场景: 电子温度计可以应用在许多场景中,比如工业过程控制、家庭温度监测、食品加工、医疗设备、农业监控等领域。DS18B20由于其数字输出和简单的一线接口,在嵌入式系统设计中尤其受到青睐,因此,本资源中的代码和知识点对于希望设计和实现各种温度监测系统的开发者来说是非常有价值的。

#include<reg51.h> #include<intrins.h> #define dm P0 #define uchar unsigned char #define uint unsigned int sbit DQ=P1^6; sbit w0=P2^0; sbit w1=P2^1; sbit w2=P2^2; sbit w3=P2^3; sbit beep=P3^7; int temp1=0; uint h; uint temp; uchar r; uchar code ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09}; uchar code table_dm[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40}; uchar code table_dml[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; uchar data temp_data[2]={0x00,0x00}; uchar data display[5]={0x00,0x00,0x00,0x00,0x00}; void delay(uint t) { for(;t>0;t--); } void xianshi() { int j; for(j=0;j<4;j++) { switch(j) { case 0: dm=table_dm[display[0]]; w0=0; delay(300); w0=1; case 1: dm=table_dml[display[1]]; w1=0; delay(300); w1=1; case 2: dm=table_dm[display[2]]; w2=0; delay(300); w2=1; case 3: dm=table_dm[display[3]]; w3=0; delay(300); w3=1; } } } ow_reset(void) { char presence=1; while(presence) { while(presence) { DQ=1;_nop_();_nop_(); DQ=0; delay(50); DQ=1; delay(6); presence=~DQ; } delay(45); presence=~DQ; } DQ=1; return presence; } void write_byte(uchar val) { uchar i; for(i=8;i>0;i--) { DQ=1;_nop_();_nop_(); DQ=0;_nop_();_nop_();_nop_();_nop_(); DQ=val&0x01; delay(6); val=val>>1; } DQ=1; delay(1); } uchar read_byte(void) { uchar i; uchar value=0; for(i=8;i>0;i--) { DQ=1;_nop_();_nop_(); value>>=1; DQ=0;_nop_();_nop_();_nop_();_nop_(); DQ=1;_nop_();_nop_();_nop_();_nop_(); if(DQ)value|=0x80; delay(6); } DQ=1; return value; } read_temp() { ow_reset(); delay(200); write_byte(0xcc); write_byte(0x44); ow_reset(); delay(1); write_byte(0xcc); write_byte(0xbe); temp_data[0]=read_byte(); temp_data[1]=read_byte(); temp=temp_data[1]; temp<<=8; temp=temp|temp_data[0]; return temp; } work_temp(uint tem) { uchar n=0; if(tem>6348) { tem=65536-tem; n=1; } display[4]=tem&0x0f; display[0]=ditab[display[4]]; display[4]=tem>>4; display[3]=display[4]/100; display[1]=display[4]%100; display[2]=display[1]/10; display[1]=display[1]%10; r=display[1]+display[2]*10+display[3]*100; if(!display[3]) { display[3]=0x0a; if(!display[2]) { display[2]=0x0a; } } if(n) { display[3]=0x0b; } return n; } void BEEP() { if((r>30)) { beep=!beep; } else { beep=0; } } void main() { beep=0; dm=0x00; w0=0; w1=0; w2=0; w3=0; for(h=0;h<4;h++) { display[h]=0; } ow_reset(); write_byte(0xcc); write_byte(0x44); for(h=0;h<50;h++) { xianshi(); } while(1) { if(temp1==0) { work_temp(read_temp()); xianshi(); BEEP(); } } }

2023-07-20 上传