#include "reg52.h"
#include "DS18B20.h"
#include <intrins.h>
//sbit DS18B20= P3^6;
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P1^2; //数据传输线接单片机的相应的引脚
unsigned char tempL=0; //设全局变量
unsigned char tempH=0;
unsigned int sdata; //测量到的温度的整数部分
unsigned char xiaoshu1; //小数第一位
unsigned char xiaoshu2; //小数第二位
unsigned char xiaoshu; //两位小数
bit fg=1; //温度正负标志
static void delay(unsigned char i)
{
// TR2=1;
// while((256*TH2+TL2)<i);
// TR2=0;
// TH2=0x00;
// TH2=0x00;
for(i;i>0;i--);
}
void Init_DS18B20(void)
{
unsigned char x=0;
DQ=1; //DQ先置高
delay(8); //稍延时
DQ=0; //发送复位脉冲
delay(80); //延时(>480us)
DQ=1; //拉高数据线
delay(5); //等待(15~60us)
x=DQ; //用X的值来判断初始化有没有成功,18B20存在的话X=0,否则X=1
delay(20);
}
//读一个字节
static ReadOneChar(void) //主机数据线先从高拉至低电平1us以上,再使数据线升为高电平,从而产生读信号
{
unsigned char i=0; //每个读周期最短的持续时间为60us,各个读周期之间必须有1us以上的高电平恢复期
unsigned char dat=0;
for (i=8;i>0;i--) //一个字节有8位
{
DQ=1;
delay(1);
DQ=0;
dat>>=1;
DQ=1;
if(DQ)
dat|=0x80;
delay(4);
}
return(dat);
}
//写一个字节
static void WriteOneChar(unsigned char dat)
{
unsigned char i=0; //数据线从高电平拉至低电平,产生写起始信号。15us之内将所需写的位送到数据线上,
for(i=8;i>0;i--) //在15~60us之间对数据线进行采样,如果是高电平就写1,低写0发生。
{
DQ=0; //在开始另一个写周期前必须有1us以上的高电平恢复期。
DQ=dat&0x01;
delay(5);
DQ=1;
dat>>=1;
}
delay(4);
}
//读温度值(低位放tempL;高位放tempH;)
float ReadTemperature(void)
{
Init_DS18B20(); //初始化
WriteOneChar(0xcc); //跳过读序列号的操作
WriteOneChar(0x44); //启动温度转换
delay(125); //转换需要一点时间,延时
Init_DS18B20(); //初始化
WriteOneChar(0xcc); //跳过读序列号的操作
WriteOneChar(0xbe); //读温度寄存器(头两个值分别为温度的低位和高位)
tempL=ReadOneChar(); //读出温度的低位LSB
tempH=ReadOneChar(); //读出温度的高位MSB
if(tempH>0x7f) //最高位为1时温度是负
{
tempL=~tempL; //补码转换,取反加一
tempH=~tempH+1;
fg=0; //读取温度为负时fg=0
}
sdata = tempL/16+tempH*16; //整数部分
xiaoshu1 = (tempL&0x0f)*10/16; //小数第一位
xiaoshu2 = (tempL&0x0f)*100/16%10; //小数第二位
xiaoshu=xiaoshu1*10+xiaoshu2; //小数两位
return ((float)(sdata)+ (float)(xiaoshu)/100);
}
//typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus;
//typedef unsigned char uint8_t;
//typedef unsigned short int uint16_t;
//typedef unsigned int uint32_t;
//void DS18B20_Delay1us(int t) //误差 0us
//{
// TR2=1;
// while((256*TH2+TL2)<t);
// TR2=0;
// TH2=0x00;
// TH2=0x00;
//}
//static void DS18B20_Rst(void)
//{
// DS18B20=0;
// DS18B20_Delay1us(750);
// DS18B20=1;
// DS18B20_Delay1us(15);
//}
//static uint8_t DS18B20_Presence(void)
//{
// unsigned char pulse_time = 0;
//
// while( DS18B20 && pulse_time<100 )
// {
// pulse_time++;
// DS18B20_Delay1us(1);
// }
// /* 经过100us后,存在脉冲都还没有到来*/
// if( pulse_time >=100 )
// return 1;
// else
// pulse_time = 0;
//
// /* 存在脉冲到来,且存在的时间不能超过240us */
// while( !DS18B20 && pulse_time<240 )
// {
// pulse_time++;
// DS18B20_Delay1us(1);
// }
// if( pulse_time >=240 )
// return 1;
// else
// return 0;
//}
///*
// * 从DS18B20读取一个bit
// */
//static uint8_t DS18B20_Read_Bit(void)
//{
// unsigned char dat;
//
// /* 读0和读1的时间至少要大于60us */
// /* 读时间的起始:必须由主机产生 >1us <15us 的低电平信号 */
// DS18B20=0;
// DS18B20_Delay1us(10);
//
// /* 设置成输入,释放总线,由外部上拉电阻将总线拉高 */
// //Delay_us(2);
//
// if( DS18B20 == SET )
// dat = 1;
// else
// dat = 0;
//
// /* 这个延时参数请参考时序图 */
// DS18B20_Delay1us(45);
//
// return dat;
//}
///*
// * 从DS18B20读一个字节,低位先行
// */
//uint8_t DS18B20_Read_Byte(void)
//{
// unsigned char i, j, dat = 0;
//
// for(i=0; i<8; i++)
// {
// j = DS18B20_Read_Bit();
// dat = (dat) | (j<<i);
// }
//
// return dat;
//}
///*
// * 写一个字节到DS18B20,低位先行
// */
//void DS18B20_Write_Byte(uint8_t dat)
//{
// unsigned char i, testb;
//
// for( i=0; i<8; i++ )
// {
// testb = dat&0x01;
// dat = dat>>1;
// /* 写0和写1的时间至少要大于60us */
// if (testb)
// {
// DS18B20=0;
// /* 1us < 这个延时 < 15us */
// DS18B20_Delay1us(8);
//
// DS18B20=1;
// DS18B20_Delay1us(58);
// }
// else
// {
// DS18B20=0;
// /* 60us < Tx 0 < 120us */
// DS18B20_Delay1us(70);
//
// DS18B20=1;
// /* 1us < Trec(恢复时间) < 无穷大*/
// DS18B20_Delay1us(2);
// }
// }
//}
//void DS18B20_Start(void)
//{
// DS18B20_Rst();
// DS18B20_Presence();
// DS18B20_Write_Byte(0XCC); /* 跳过 ROM */
// DS18B20_Write_Byte(0X44); /* 开始转换 */
//}
//uint8_t DS18B20_Init(void)
//{
// //DS18B20_GPIO_Config();
// DS18B20=1;
// DS18B20_Rst();
// return DS18B20_Presence();
//}
///*
// * 存储的温度是16 位的带符号扩展的二进制补码形式
// * 当工作在12位分辨率时,其中5个符号位,7个整数位,4个小数位
// *
// * |---------整数----------|-----小数 分辨率 1/(2^4)=0.0625----|
// * 低字节 | 2^3 | 2^2 | 2^1 | 2^0 | 2^(-1) | 2^(-2) | 2^(-3) | 2^(-4) |
// *
// *
// * |-----符号位:0->正 1->负-------|-----------整数-----------|
// * 高字节 | s | s | s | s | s | 2^6 | 2^5 | 2^4 |
// *
// *
// * 温度 = 符号位 + 整数 + 小数*0.0625
// */
//float DS18B20_Get_Temp(void)
//{
// uint8_t tpmsb, tplsb;
// short s_tem;
// float f_tem;
//
// DS18B20_Rst();
// DS18B20_Presence();
// DS18B20_Write_Byte(0XCC); /* 跳过 ROM */
// DS18B20_Write_Byte(0X44); /* 开始转换 */
//
// DS18B20_Rst();
// DS18B20_Presence();
// DS18B20_Write_Byte(0XCC); /* 跳过 ROM */
// DS18B20_Write_Byte(0XBE); /* 读温度值 */
//
// tplsb = DS18B20_Read_Byte();
// tpmsb = DS18B20_Read_Byte();
//
// s_tem = tpmsb<<8;
// s_tem = s_tem | tplsb;
//
// if( s_tem < 0 ) /* 负温度 */
// f_tem = (~s_tem+1) * 0.0625;
// else
// f_tem = s_tem * 0.0625;
//
// return f_tem;
//}
//#define uchar unsigned char
// #define uint unsigned int
// sbit DQ = P3^6; //???define interface
// uint temp; //??? variable of temperature
///*************??????*****************/
// void delay(unsigned char i)
// {
// while(--i);
// }
// /******************************************
// ?????????12Mhz???
// delay(0):??518us ??:518-2*256=6
// delay(1):??7us (???"5us"???)
// delay(10):??25us ??:25-20=5
// delay(20):??45us ??:45-40=5
// delay(100):??205us ??:205-200=5
// delay(200):??405us ??:405-400=5
// *******************************************/
// /*****************DS18B20******************/
// void Init_Ds18b20(void) //DS18B20???send reset and initialization command
// {
// DQ = 1; //DQ??,??????
// delay(1); //????
// DQ = 0; //???????
// delay(250); //????,????480us
// DQ = 1; //????,??????
// delay(100); //???????,????DS18B20???????
// }
// uchar Read_One_Byte() //?????????read a byte date
// //????,?????????????????
// {
// uchar i = 0;
// uchar dat = 0;
// for(i=8;i>0;i--)
// {
// DQ = 0; //?????,??1us??????
// //???????????15us?????????
// _nop_(); //?????1us,???????
// dat >>= 1; //???????????,???????????
// DQ = 1; //????,??DS18B20?????,?????????
// delay(1);
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
本设计仿真了电炉丝的温度控制,采用51单片机控制继电器的开或者关控制电炉丝的加热,采用pt100温度传感器采集电炉丝的温度,系统可按键设置电炉丝的温度大小,通过温度传感器进行温度反馈后控制继电器的开和关的时间来控制电炉丝的温度,使电炉丝温度工作在设定的温度值,达到稳定控制效果,本设计仅供参考,请勿他用
资源推荐
资源详情
资源评论
收起资源包目录
电炉丝控制.zip (37个子文件)
电炉丝控制
project
lcd.OBJ 8KB
DHT111.OBJ 10KB
SHT11TEST.uvproj 13KB
DHT111.LST 11KB
SHT11TEST 20KB
DS18B20.h 218B
lcd.LST 8KB
SHT11.PWI 792B
SHT11TEST.M51 18KB
lcd.c 4KB
DHT111.h 280B
SHT11TEST.lnp 62B
SHT11TEST.LST 6KB
SHT11TEST.hex 12KB
lcd.__i 42B
SHT11.DSN 76KB
SHT11TEST_uvopt.bak 55KB
STARTUP.OBJ 749B
SHT11TEST.C 3KB
Last Loaded SHT11.DBK 76KB
SHT11TEST.uvopt 6KB
ADC0832.h 1KB
SHT11TEST.OBJ 11KB
SHT11TEST_uvproj.bak 13KB
SHT11TEST.uvgui_lifu.bak 72KB
STARTUP.A51 6KB
DHT111.c 6KB
DS18B20.LST 17KB
DS18B20.c 10KB
SHT11TEST.plg 17KB
STARTUP.LST 14KB
lcd.h 1KB
SHT11TEST.uvgui.lifu 73KB
DS18B20.OBJ 5KB
pd.DSN 128KB
Last Loaded pd.DBK 125KB
pd.PWI 1KB
共 37 条
- 1
资源评论
- Midsummer@yiyi2021-04-02程序与原理图对不上,运行中根本实现不了,程序代码两张图都不实用,坑!
qq_20499427
- 粉丝: 32
- 资源: 29
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功