资源简介
控制蔬菜大棚的温度在一定的范围内变化,过高或者过低就进行报警
代码片段和文件信息
#include
#include
sbit DQ = P2^5; //定义ds18b20通信端口
unsigned char result_18b20; //ds18b20初始化结果
signed int temKLKHKL1KH1; //温度
sbit sda=P2^7; //串行数据/地址
sbit scl=P2^6; //串行时钟
sbit P2_0=P2^0; //数码管选择
sbit P2_1=P2^1;
sbit P2_2=P2^2;
sbit P2_3=P2^3; //“负号“数码管控制
sbit P2_4=P2^4;
sbit P3_2=P3^2; //控制红色发光二极管
sbit P3_3=P3^3; //控制蓝色发光二极管
unsigned char baishige; //数据的百位 十位 个位
unsigned int z=0; //用于控制那个蓝色按钮按下是偶数次还是奇数次
/***********ds18b20延迟子函数(晶振12MHz)延时时间为n乘以15us****************/
void delay_18B20(unsigned int n)
{
do{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
n--;
}while(n);
}
/***************************ds18b20初始化函数*********************************/
void Init_DS18B20(void)
{
DQ = 0; //单片机将DQ拉低
delay_18B20(36); //延时540us
DQ = 1; //拉高总线
delay_18B20(6); //延时90us
result_18b20=DQ; //稍做延时后如果result_18B20=0则初始化成功result_18B20=1则初始化失败
delay_18B20(18); //延时270us
}
/***************************ds18b20读一个字节**********************************/
unsigned char ReadOneChar(void)
{
unsigned char ij;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
dat>>=1;
DQ = 0; // 拉低总线产生读信号
for(j=2;j>0;j--); //延时4us
DQ = 1; // 释放总线准备读数据
for (j=4;j>0;j--); //延时8微秒读数据
if(DQ==1)
dat|=0x80;
delay_18B20(4);
DQ = 1; //拉高总线准备下一位数据的读取.
}
return(dat); //返回读到的数据
}
/************************ds18b20写一个字节***********************************/
void WriteOneChar(unsigned char dat)
{
unsigned char ij;
for (i=8; i>0; i--)
{
DQ = 0; //拉低总线产生写信号
for (j=2;j>0;j--); //延时4us
DQ = dat&0x01; //发送1位
delay_18B20(5); //延时75us
DQ = 1; //释放总线等待总线恢复
dat>>=1; //准备下一位数据的传送
}
}
/*******************读取ds18b20当前温度,tem中为测得的温度值****************************/
void ReadTemperature(void)
{
unsigned char a=0b=0;
float x;
signed int t=0;
Init_DS18B20(); //初始化
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0x44); //启动温度转换
Init_DS18B20(); //初始化
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等,前两个就是温度
a=ReadOneChar(); //读取温度值低位
b=ReadOneChar(); //读取温度值高位
t=b;
t=t<<8;
t=t+a; //将温度高低位合成
if(t<0) //判断温度t为正还是负
{t=-t;
x=t*0.0625; //当前采集温度值除16得实际温度值
tem=x*10+0.5; //将温度放大十倍,并精确到小数点后一位
- 上一篇:编译原理课程设计+源代码
- 下一篇:Abaqus混凝土本构计算方法
相关资源
- 单片机仿真软件proteus6.7免安装绿色版
- 基于SPCE061A单片机的图形液晶模块的驱
- 基于SPCE061A单片机汇编语实现的流水灯
- 基于SPCE061A单片机的图形液晶模块的驱
- 物联网家居系统中基于单片机的多路
- 基于IAP15F2K61S2单片机的多路温度巡检
- 如何用单片机控制舵机及程序详细
- 单片机控制舵机电路图
- 基于MSP430单片机的实时多任务操作系
- 基于STM32F103C8单片机的晶联讯电子JL
- 广联达6.0写锁包,2020年11月最新
- 基于51单片机的交通信号灯程序
- 14284969_《STM32单片机应用与全案例实践
- GSM监控系统51单片机设计
- 精选单片机设计与制作30例
- 中颖单片机入门与实战
- 51单片机定时器/计数器的结构和原理
- MCS-51单片机定时器和计数器区别的理
- 基于32位单片机MC68HC376的高可靠性系统
- MC68HC08单片机程序设计速成
- PIC单片机人机接口模块4×4行列式
- PIC单片机人机接口模块4×4行列式
- 基于51单片机的多通道数据采集范围控
- ADC0832ADC0809DAC0832三种芯片程序,c程序
- 数据采集系统——ADC0808的应用
- 基于51单片机的直流电机转速控制及显
- 单片机控制步进电机PMW的驱动与放大
- 单片机驱动4相步进电机proteus仿真
- 使用PIC单片机开发的简易数字电压表
- 飞思卡尔单片机.s19文件方法详解
评论
共有 条评论