📄 temperature.c
字号:
#include <reg52.h>
#include <INTRINS.H>
#include<absacc.h>
#define tempint DBYTE[0x30]
#define tempdf DBYTE[0x32]
#define uchar unsigned char
#define uint unsigned int
/**************************
数组定义
*************************/
uchar bdata m100[6];
uchar idata tempvalue[2];
uchar bdata dacbuf[3]; //dac发送缓冲区
/*************************************************************************
8255端口地址定义
*************************************************************************/
uchar xdata pa8255 _at_ 0xf8ff;
uchar xdata pb8255 _at_ 0xf9ff;
uchar xdata pc8255 _at_ 0xfaff;
uchar xdata cmd8255 _at_ 0xfbff;
/******************************
输入端口内存地址定义
******************************/
sbit time0=P3^4;
sbit sw2=P3^5;
/******************************
输出端口内存地址定义
******************************/
sbit y0=m100[2]^0;sbit y1=m100[2]^1;sbit y2=m100[2]^2;sbit y3=m100[2]^3;
sbit y4=m100[2]^4;sbit y5=m100[2]^5;sbit y6=m100[2]^6;sbit y7=m100[2]^7;
/******************************
中间继电器内存地址定义
******************************/
bit s0=0,s1=0,s2=0;
uint ini=0;
/******************************
dac芯片max512芯片
******************************/
sbit dac_cs=P1^4; //max512片选
sbit dac_din=P1^6; //max512输入
sbit dac_sclk=P1^7; //max512时钟
/********子程序目录*********/
void ioinit();
void set_ds18b20();
void get_temperature();
void read_ds18b20();
void write_ds18b20(uchar);
void delay(uchar);
void writemax512(uint);
/***************************************************
名称:main
功能:主执行程序
***************************************************/
void main()
{
EA=0; /*********禁止中断*************/
ioinit();/*********IO口初始化***********/
while(1)
{
set_ds18b20();//初始化ds18b20
write_ds18b20(0xcc);//发送 跳过rom匹配命令
write_ds18b20(0x44);//发送 温度转换命令
delay(60); //延时等待转换结束600us
set_ds18b20(); //初始化ds18b20
write_ds18b20(0xcc); //发跳过ROM匹配命令
write_ds18b20(0xbe); //发出读温度命令
read_ds18b20(); //读温度转换值
dacbuf[0]= tempint<<3;
dacbuf[1]= tempdf;
writemax512(0);
writemax512(1);
}
}
/***************************************************
名称:ioioit
功能:IO输入输出刷新
***************************************************/
void ioinit(void)
{
cmd8255=0x92;
pc8255=0x00;
}
/**************************************
名称:delay
功能:延时模块
输入参数:n要延时的周期数
输出参数:无
*************************************/
void delay(uchar n)
{
uchar i;
for(i=0;i<n;i++)
{
_nop_();
}
}
/**************************************
名称:set_ds18b20
功能:初始化ds18b20
输入参数:无
输出参数:无
*************************************/
void set_ds18b20()
{
while(1)
{
uchar flag;
flag=0;
time0=0; //数据线置低电平
delay(50); //低电平保持550us
time0=1; //数据线置高电平
delay(3); //低电平保持60us
while(time0==0) //判断DS18B20是否发出低电平信号
{
delay(24); //DS18B20响应,延时240us
if(time0) //DS18B20发出高电平初始化成功,返回
{
flag=1; //DS18B20初始化成功标志
break;
}
}
if(flag) //初始化成功,再延时480us
{
delay(48);
break;
}
}
}
void read_ds18b20()
{
uchar i,j,temp,temph,templ;
j=2; //读2位字节数据
do
{
for(i=8;i>0;i--) //一个字节分8位读取
{
temp>>=1; //读取1位右移1位
time0=0; //数据线置低电平
_nop_();
_nop_();
time0=4; //数据线置高电平
_nop_(); //延时4us
_nop_();
_nop_();
_nop_();
if(time0) //读取1位数据
temp|=0x80;
delay(2); //读取以为数据后延时20us
}
if(j==2) //读取的第一字节存templ
templ=temp;
else
temph=temp; //读取的第二字节存temph
}while(--j);
tempdf=templ&0x0f; //将读取的数据转换成温度值,整数部分存tempint,小数部分存tempdf
templ>>=4;
temph<<=4;
tempint=temph|templ;
}
void write_ds18b20(uchar command)
{
uchar delay1,i;
for(i=8;i>0;i--) //将一字节数据一位一位写入
{
time0=0; //数据线置低电平
delay1=8; //延时16us
while(--delay1);
time0=command&0x01; //将数据放置在数据线上
delay(3); //延时40us
command=command>>1; //准备发送下一位数据
time0=1; //发送完一位数据,数据线置高电平
_nop_(); //延时1us
}
}
/**************************************
名称:writemax512
功能:max512驱动模块
输入参数:通道号dacport
输出参数:da转换值
*************************************/
void writemax512(uint dacport)
{ uint dac_val,i;
uint daccon=0x0100<<dacport; //选定通道
uint dac;
dac_val=(uint)dacbuf[dacport]; //低8位为数据
dac=(daccon|(dac_val&0x00ff)); //组成完整的发送数据 控制字+数据
dac_cs=0;
dac_sclk=0;
for(i=0;i<16;i++)
{
dac_din=(bit)(dac&0x8000); //从高位开始发送
dac_sclk=1;
delay(3);
dac_sclk=0;
delay(3);
dac<<=1;
}
dac_cs=1; //禁止片选
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -