标题:
ds18b20温度检测程序带电路图和pcb文件
[打印本页]
作者:
hanyubo
时间:
2016-4-24 09:39
标题:
ds18b20温度检测程序带电路图和pcb文件
ds18b20电路图和pcb文件:
0.png
(80.58 KB, 下载次数: 151)
下载附件
2016-4-24 20:05 上传
温度检测的所有资料:
0.png
(63.19 KB, 下载次数: 113)
下载附件
2016-4-24 20:04 上传
全部资料(压缩包)下载:
温度检测程序带电路图仿真.rar
(741.23 KB, 下载次数: 99)
2016-4-24 09:39 上传
点击文件名下载附件
PCB
下载积分: 黑币 -5
#include <STC15F2K60S2.H>
#include "intrins.h"
#define FOSC 18432000L
#define BAUD 9600
typedef unsigned char BYTE;
typedef unsigned int WORD;
#define URMD 0 //0:使用定时器2作为波特率发生器
//1:使用定时器1的模式0(16位自动重载模式)作为波特率发生器
//2:使用定时器1的模式2(8位自动重载模式)作为波特率发生器
sfr ADC_LOW2 = 0xBE; //ADC低2位结果
#define SDAT P00 //595数据口
#define SHCP P01 //595时钟口
#define STCP P02 //595数据输出脉冲口
#define K1 P33
#define K2 P34
#define K3 P35
#define K4 P36
#define delay1 P07 //继电器1
#define delay2 P06 //继电器2
#define DPL 14 //显示L时数据下标
#define DPH 12 //显示H时数据下标
#define DPt 15 //显示t时数据下标
#define ADC_POWER 0x80 //ADC电源控制位
#define ADC_FLAG 0x10 //ADC完成标志
#define ADC_START 0x08 //ADC起始控制位
#define ADC_SPEEDLL 0x00 //540个时钟
#define ADC_SPEEDL 0x20 //360个时钟
#define ADC_SPEEDH 0x40 //180个时钟
#define ADC_SPEEDHH 0x60 //90个时钟
unsigned char code dispTab[]={
//0 1 2 3 4 5 6 7 8 9 - 灭 H h L t
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xbf,0xff,0x89,0x8b,0xc7,0x87};
unsigned int ad_value[11]={0};
unsigned char testflag=0,testnumber=0;
//按键检测标志位
bit flag1,flag2,flag3,flag4;
//按键值 0 1 2 3 4
unsigned char key_value=0;
BYTE ch= 7; //ADC通道号
unsigned char data dispBuf[4]={1,2,3,4};
// 0:等待运行状态 1:设定下限报警 2:设定工作温度 3:设定上限报警 4:工作状态
unsigned char system_status=0;
//定义变量 下限报警 上限报警 工作温度 当前温度
unsigned int l_limit_alarm=0,h_limit_alarm=3000,working_temperature=2200,current_temperature=0;
//下限报警标志 上限报警标志
bit LL_flag,HH_flag;
void InitUart();
void SendData(BYTE dat);
void Delay(WORD n);
void InitADC();
void disp(unsigned char data * dispBuf,unsigned char n);
void key_processing()
{
static unsigned int set_value=0;
if(system_status==0)
{
if(key_value==1){system_status=1;set_value=l_limit_alarm/10;}
if(key_value==4){system_status=4;}
key_value=0;
disp(dispBuf, 4);
}
if(system_status==1)
{
if(key_value==1)
{
system_status=2;
l_limit_alarm=set_value*10;
set_value=working_temperature/10;
}
if(key_value==2){if(set_value<300)set_value++;}
if(key_value==3){if(set_value>0) set_value--;}
// if(system_status!=2)
// {
dispBuf[0]=DPL;
dispBuf[1]=set_value/100;
dispBuf[2]=set_value%100/10;
dispBuf[3]=set_value%10;
// }
key_value=0;
}
if(system_status==2)
{
if(key_value==1)
{
system_status=3;
working_temperature=set_value*10;
set_value=h_limit_alarm/10;
}
if(key_value==2){if(set_value<300)set_value++;}
if(key_value==3){if(set_value>0) set_value--;}
// if(system_status!=3)
// {
dispBuf[0]=DPt;
dispBuf[1]=set_value/100;
dispBuf[2]=set_value%100/10;
dispBuf[3]=set_value%10;
// }
key_value=0;
}
if(system_status==3)
{
if(key_value==1)
{
system_status=0;
h_limit_alarm=set_value*10;
}
if(key_value==2){if(set_value<300)set_value++;}
if(key_value==3){if(set_value>0) set_value--;}
// if(system_status!=0)
// {
dispBuf[0]=DPH;
dispBuf[1]=set_value/100;
dispBuf[2]=set_value%100/10;
dispBuf[3]=set_value%10;
// }
key_value=0;
}
if(system_status==4)
{
if(key_value==4)system_status=0;
}
key_value=0;
}
void key_test()
{
if(K1==0)flag1=1;
if(K2==0)flag2=1;
if(K3==0)flag3=1;
if(K4==0)flag4=1;
if((K1==1)&&(flag1==1)){key_value=1;flag1=0;}
if((K2==1)&&(flag2==1)){key_value=2;flag1=0;}
if((K3==1)&&(flag3==1)){key_value=3;flag1=0;}
if((K4==1)&&(flag4==1)){key_value=4;flag1=0;}
}
void calculate_temperature()
{
unsigned char i=0;
ad_value[10]=0;
for(i=0;i<10;i++)ad_value[10]+=ad_value[i];
ad_value[10]/=10;
current_temperature=ad_value[10]=ad_value[10]*3.0435;
if(system_status==0||system_status==4)
{
dispBuf[0]=ad_value[10]/100;
dispBuf[1]=ad_value[10]%1000/100;
dispBuf[2]=ad_value[10]%100/10;
dispBuf[3]=ad_value[10]%10;
}
}
void Timer0Init(void)
{
AUXR |= 0x80;
TMOD &= 0xF0;
TL0 = 0x00;
TH0 = 0x28;
TF0 = 0;
TR0 = 1;
ET0=1;
}
void tm0_isr() interrupt 1 using 1
{
static unsigned char f=0;
f++;
if(f%10==0)ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
if(f==200)
{
if(LL_flag)P25^=1;
else P25=1;
if(HH_flag)P26^=1;
else P26=1;
f=0;
}
}
void sendData_595(unsigned char sendDat)
{ unsigned char i;
for(i=0;i<8;i++)
{ if((sendDat&0x01)==0) SDAT=0;
else SDAT=1;
_nop_();
SHCP=0;
_nop_();
SHCP=1;
sendDat=sendDat>>1;
}
}
void disp(unsigned char data * dispBuf,unsigned char n)
{ unsigned char c,i;
for(i=0;i<n;i++)
{c=dispBuf[i];
if(i!=2)
sendData_595(dispTab[c]);
else sendData_595(dispTab[c]&0x7f);
}
STCP=0;
STCP=1;
}
/*----------------------------
ADC中断服务程序
----------------------------*/
void adc_isr() interrupt 5 using 2
{
ADC_CONTR &= !ADC_FLAG; //清除ADC中断标志
SendData(ch); //显示通道号
SendData(ADC_RES); //读取高8位结果并发送到串口
SendData(ADC_LOW2); //显示低2位结果
ad_value[testnumber]=ADC_RES;
ad_value[testnumber]<<=2;
ad_value[testnumber]+=ADC_LOW2;
testnumber++;
if(testnumber>=10) testnumber=0;
testflag=1;
}
/*----------------------------
初始化ADC
----------------------------*/
void InitADC()
{
P1ASF = 0xff; //设置P1口为AD口
ADC_RES = 0; //清除结果寄存器
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
Delay(2); //ADC上电并延时
}
/*----------------------------
初始化串口
----------------------------*/
void InitUart()
{
SCON = 0x5a; //设置串口为8位可变波特率
#if URMD == 0
T2L = 0xd8; //设置波特率重装值
T2H = 0xff; //115200 bps(65536-18432000/4/115200)
AUXR = 0x14; //T2为1T模式, 并启动定时器2
AUXR |= 0x01; //选择定时器2为串口1的波特率发生器
#elif URMD == 1
AUXR = 0x40; //定时器1为1T模式
TMOD = 0x00; //定时器1为模式0(16位自动重载)
TL1 = 0xd8; //设置波特率重装值
TH1 = 0xff; //115200 bps(65536-18432000/4/115200)
TR1 = 1; //定时器1开始启动
#else
TMOD = 0x20; //设置定时器1为8位自动重装载模式
AUXR = 0x40; //定时器1为1T模式
TH1 = TL1 = 0xfb; //115200 bps(256 - 18432000/32/115200)
TR1 = 1;
#endif
}
/*----------------------------
发送串口数据
----------------------------*/
void SendData(BYTE dat)
{
while (!TI); //等待前一个数据发送完成
TI = 0; //清除发送标志
SBUF = dat; //发送当前数据
}
/*----------------------------
软件延时
----------------------------*/
void Delay(WORD n)
{
WORD x;
while (n--)
{
x = 5000;
while (x--);
}
}
/*-----------------------------------------
主函数
------------------------------------------*/
void main()
{
unsigned char i=0;
InitUart(); //初始化串口
InitADC(); //初始化ADC
Timer0Init();
IE |=0xa0; //使能ADC中断 开始AD转换
disp(dispBuf,4);
while(1)
{
key_test();
if(key_value!=0){key_processing();}
if(testflag==1)
{
testflag=0;
calculate_temperature();
disp(dispBuf, 4);
if(system_status==4)
{
if(current_temperature<l_limit_alarm)
{LL_flag=1;delay1=1;} //下限报警标志位 下限报警继电器吸合
else {LL_flag=0;delay1=0;} //清除报警标志位 释放继电器
if(current_temperature>h_limit_alarm)
{HH_flag=1;delay2=1;} //上限报警标志位 上限报警继电器吸合
else {HH_flag=0;delay2=0;} //清除报警标志位 释放继电器
}
}
}
}
复制代码
作者:
raymondau
时间:
2017-5-17 11:38
楼主有制作过实物吗?带继电器开关的吗?
作者:
大侠来也
时间:
2018-4-17 11:03
学习学习
作者:
withyou496236
时间:
2018-10-18 16:47
感谢楼主分享
作者:
jifengjianwu
时间:
2018-11-3 19:56
挺好的资料,下载看看,感谢楼主
作者:
xhiu
时间:
2018-11-24 14:08
感谢楼主分享!!
作者:
xhiu
时间:
2018-11-24 14:09
谢谢楼主的分享!
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1