标题:
DS18B20测温度MAX7219数码管显示程序与仿真
[打印本页]
作者:
145454
时间:
2017-11-18 13:32
标题:
DS18B20测温度MAX7219数码管显示程序与仿真
使用DS18B20测温度,8个LED数码管显示,前两个数码管显示当前温度,,后两个数码管显示设定温度
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png
(14.59 KB, 下载次数: 45)
下载附件
2017-11-19 06:06 上传
0.png
(15.78 KB, 下载次数: 38)
下载附件
2017-11-19 06:06 上传
单片机源程序如下:
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit din=P1^0; //MAX7219数据串行输入端
sbit cs=P1^1; //MAX7219数据输入允许端
sbit clk=P1^2; //MAX7219时钟信号
sbit DQ=P1^5; //DS18B20端口DQ
sbit sb=P0^0;
sbit sq=P0^1;
sbit led=P2^0;
uchar dig;
sbit DIN=P0^7; //小数点
bit list_flag=0; //显示开关标志
uchar code tab[]={0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,
0x70,0x7f,0x7b,0x4E,0x63,0x01,0x00}; //表示不译方式0~9;0x4E为C;0x63为.;0x01为—;0x00不显示
uchar data temp_data[2]={0x00,0x00};
unsigned char data display[]={0x00,0x00,0x00,0x00,0x00,0x00};
unsigned char code ditab[]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
unsigned char x=56;
void Delay(uint ms) //延时函数
{
while(ms--);
}
uchar Init_DS18B20(void) //初始化DS18B20
{
uchar status;
DQ=1; //DQ复位
Delay(8); //延时片刻
DQ=0; //单片机将DQ拉低
Delay(90); //精确延时,大于480us
DQ=1; //拉低总线
Delay(8);
status=DQ; //如果为0,则初始化成功;为1,则初始化失败
Delay(100);
DQ=1;
return(status);
}
uchar ReadOneByte(void) //读一个字节
{
uchar i=0;
uchar dat=0;
for(i=8;i>0;i--)
{
DQ=0; //给脉冲信号
dat>>= 1;
DQ=1; //给脉冲信号
_nop_();
_nop_();
if(DQ)
{
dat|=0x80;
}
Delay(4);
DQ=1;
}
return(dat);
}
void WriteOneByte(uchar dat) //写一个字节
{
uchar i=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
Delay(5);
DQ=1;
dat>>=1;
}
}
void Read_Temperature(void) //读取温度
{
if(Init_DS18B20()==1)
{
list_flag=1; //DS18B20不正常
}
else
{
list_flag=0;
WriteOneByte(0xCC); //跳过读序号列号的操作
WriteOneByte(0x44); //启动温度转换
Init_DS18B20();
WriteOneByte(0xCC); //跳过读序号列号的操作
WriteOneByte(0xBE); //读取温度寄存器
temp_data[0]=ReadOneByte(); //温度低8位
temp_data[1]=ReadOneByte(); //温度高8位
}
}
void Temperature_trans() //温度处理
{
uchar ng=0;
if((temp_data[1]&0xF8)==0xF8)
{
temp_data[1]=~temp_data[1];
temp_data[0]=~temp_data[0]+1;
if( temp_data[0]==0x00)
{
temp_data[1]++;
}
ng=1;
}
display[4]=temp_data[0]&0x0f;
display[0]=ditab[display[4]]; //查表得小数位的值
display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);
display[3]=display[4]/100;
display[1]=display[4]%100;
display[2]=display[1]/10;
display[1]=display[1]%10;
display[4]=temp_data[0]&0x0f;
if(ng==1) //温度为0度以下时
{
display[5]=12; //显示-
}
else
{
display[5]=13; //不显示-
}
if(!display[3]) //高位为0,不显示
{
display[3]=13;
if(!display[2]) //次高位为0,不显示
display[2]=13;
}
}
void write_7219(uchar add,uchar date) //add为接受MA7219;date为要写的数据
{
uchar i;
cs=0;
for(i=0;i<8;i++)
{
clk=0;
din=add&0x80; //按照高位在前,低位在后的顺序发送
add<<=1; //先发送地址
clk=1;
}
for (i=0;i<8;i++) //时钟上升沿写入一位
{
clk=0;
din=date&0x80;
date<<=1; //再发送数据
clk=1;
}
cs=1;
}
void init_7219()
{
write_7219(0x0c,0x01); //0x0c为关断模式寄存器;0x01表示显示器处于工作状态
write_7219(0x0a,0x0f); //0x0a为亮度调节寄存器;0x0f表示使数码管显示亮度为最亮
write_7219(0x09,0x00); //0x09为译码模式选择寄存器;0x00表示非译码方式
write_7219(0x0b,0x07); //0x0b为扫描限制寄存器;0x07表示8个LED数码管
}
void disp_Max7219(uchar dig, uchar date) //指定位,显示某一数
{
write_7219(dig,date);
}
void main()
{ EA=1;ET0=1;
TMOD=0X01;
TH0=0X3C;
TL0=0XB0;
TR0=1;
init_7219();
while(1)
{
Temperature_trans();
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
温度.zip
(108.47 KB, 下载次数: 84)
2017-11-18 13:28 上传
点击文件名下载附件
DS18B20
下载积分: 黑币 -5
作者:
TXWS01
时间:
2017-12-27 07:53
学习了!谢谢分享
作者:
h@li
时间:
2019-4-13 11:27
感谢分享
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1