#include<reg52.h> //头函数 #include<intrins.h> typedef unsigned char u8; typedef unsigned int u16; sbit DQ = P2^3; //温度传送数据IO口 int temp_value; //温度值 static u8 min = 0; static u8 sec = 0; static u8 spot = 0; static u8 ss=0; sbit pinDIN=P2^0; //串行数据输入端 sbit pinLOAD=P2^1; //数据锁存端 sbit pinCLK=P2^2; //时钟输入端

u8 code LEDcode[] = { 0x7e, 0x30, 0x6d, 0x79, 0x33, 0x5b, 0x5f, 0x70, 0x7f, 0x7b, 0x00 }; /*******************************************************************************

  • 函 数 名 : Delay1ms
  • 函数功能 : 延时函数
  • 输 入 : 无
  • 输 出 : 无 *******************************************************************************/

void Delay1ms(u16 y) { u16 x; for( ; y>0; y--) { for(x=110; x>0; x--); } }

void delay(u16 i) { while(i--); } /**************************************************

  •     向MAX7219写入字节(8位)函数                      *
    

*/ void sendbyte (u8 dat) { u8 i,temp; nop(); for (i=0; i<8; i++) { temp=dat&0x80; dat=dat<<1; if(temp) pinDIN=1; else pinDIN=0; pinCLK=0; nop(); pinCLK=1; } } /

  •    向MAX7219写入地址和控制字(16位)                  *
    

***************************************************/ void sendword (u8 addr,u8 dat) { pinLOAD = 0; nop(); sendbyte( addr ); nop(); sendbyte( dat ); nop(); pinLOAD = 1; //第16个上升沿之后,第17个上升沿之前必须把pinCLK置高,否则数据丢失 delay(1000);

} /**************************************************

  •            MAX7219初始化                                          *
    

*/ void init7219 (void) { sendword (0x0c,0x01); / 设置电源工作模式 / sendword (0x0a,0x09); / 设置亮度 19/32 / sendword (0x0b,0x07); / 设置扫描界限 / sendword (0x09,0x00); / 设置译码模式 / sendword (0x0f,0x00); /显示测试 00为正常工作状态/ } /

  •            MAX7219清除显示                                  *
    

*************************************/ void clear7219(void) { u8 i; for(i=8; i>0; i--) { sendword(i,0x00); } } void display( ) { sendword(0x08,LEDcode[temp_value%10]); sendword(0x07,LEDcode[temp_value/10%10]); sendword(0x06,LEDcode[temp_value/100%10]); delay(1000); } /ds18b20子程序/

/***********ds18b20延迟子函数(晶振12MHz )*******/

void delay_18B20(unsigned int i) { while(i--); }

/ds18b20初始化函数************/

void Init_DS18B20(void) { unsigned char x=0; DQ = 1; //DQ复位 delay_18B20(8); //稍做延时 DQ = 0; //单片机将DQ拉低 delay_18B20(80); //精确延时 大于 480us DQ = 1; //拉高总线 delay_18B20(14); x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败 delay_18B20(20); }

/ds18b20读一个字节***/

unsigned char ReadOneChar(void) { u8 i=0; u8 dat = 0; for (i=8;i>0;i--) { DQ = 0; // 给脉冲信号 dat>>=1; DQ = 1; // 给脉冲信号 if(DQ) dat|=0x80; delay_18B20(4); } return(dat); }

/ds18b20写一个字节***/

void WriteOneChar(u8 dat) { unsigned char i=0; for (i=8; i>0; i--) { DQ = 0; DQ = dat&0x01; delay_18B20(5); DQ = 1; dat>>=1; } }

/**读取ds18b20当前温度/

void ReadTemp(void) { unsigned char a=0; unsigned char b=0; unsigned char t=0;

Init_DS18B20();
WriteOneChar(0xCC);    	// 跳过读序号列号的操作
WriteOneChar(0x44); 	// 启动温度转换

delay_18B20(100);       // this message is wery important

Init_DS18B20();
WriteOneChar(0xCC); 	//跳过读序号列号的操作
WriteOneChar(0xBE); 	//读取温度寄存器等(共可读9个寄存器) 前两个就是温度

delay_18B20(100);

a=ReadOneChar();    	//读取温度值低位
b=ReadOneChar();   		//读取温度值高位
temp_value=b<<4;
temp_value+=(a&0xf0)>>4;               

}

void main() { u8 i;//变量 init7219 (); clear7219(); display( ); for(i=0;i<80;i++)//循环检测100次温度 { ReadTemp(); //防止出现85 Delay1ms(20); } while(1) { for(i=0;i<5;i++)//循环检测100次温度 { ReadTemp(); //防止出现85 Delay1ms(10); } display();

}

} 详细介绍一下功能内容:本程序实现了使用DS18B20温度传感器获取当前温度,并将温度值通过MAX7219数码管模块显示出来。程序采用了延时函数实现了简单的时间控制,每隔一段时间(本程序中为10ms)读取一次温度并显示。同时,程序还使用了清屏函数和写入字节函数等操作MAX7219模块的函数,实现了数码管显示的功能。

基于DS18B20和MAX7219的温度显示系统

原文地址: https://www.cveoy.top/t/topic/nZj7 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录