单片机编译温度检测系统
Ⅰ 单片机温度采集系统的流程图总编程~~~
sbit DQ=P3^5; //数据传输线接单片机的相应的引脚
unsigned char tempL=0; //设全局变量
unsigned char tempH=0;
bit fg=1; //温度正负标志
//******************延时子程序 *******************************
//这个延时程序的具体延时时间是time="i"*8+10,适用于小于2ms的延时
//************************************************************
void delay(unsigned char i)
{
for(i;i>0;i--);
}
//***********************************************************
// 延时子程序
//************************************************************
/*void delay1ms()
{
unsigned char i;
for(i=124;i>0;i--); //延时124*8+10=1002us
} */
//*****************************初始化程序 *********************************//
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);
}
//**********读一个字节************//
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);
}
//*********************** **写一个字节**************************//
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;)
void Tempcor(void)
{
Init_DS18B20(); //初始化
WriteOneChar(0xcc); //跳过读序列号的操作
WriteOneChar(0x44); //启动温度转换
}
void ReadTemp(void)
{
Init_DS18B20(); //初始化
WriteOneChar(0xcc); //跳过读序列号的操作
WriteOneChar(0xbe); //读温度寄存器(头两个值分别为温度的低位和高位)
tempL=ReadOneChar(); //读出温度的低位LSB
tempH=ReadOneChar(); //读出温度的高位MSB
if(tempH>0x7f) //最高位为1时温度是负
{
tempL=~tempL+1; //补码转换,取反加一
tempH=~tempH;
fg=0; //读取温度为负时fg="0"
}
}
/*ReadTemperature(void)
{
Init_DS18B20(); //初始化
WriteOneChar(0xcc); //跳过读序列号的操作
WriteOneChar(0x44); //启动温度转换
delay(200); //转换需要一点时间,延时
Init_DS18B20(); //初始化
WriteOneChar(0xcc); //跳过读序列号的操作
WriteOneChar(0xbe); //读温度寄存器(头两个值分别为温度的低位和高位)
tempL=ReadOneChar(); //读出温度的低位LSB
tempH=ReadOneChar(); //读出温度的高位MSB
if(tempH>0x7f) //最高位为1时温度是负
{
tempL=~tempL+1; //补码转换,取反加一
tempH=~tempH;
fg=0; //读取温度为负时fg="0"
}
} */
//**************************** //主程序
/*float Temperature()
{
float tvalue;
ReadTemperature();
tvalue=tempL/16+tempH*16+(tempL & 0x0f)*0.0625;
if(!fg) tvalue=-tvalue;
fg=1;
return(tvalue);
} */
float Temperature()
{
float temp;
ReadTemp();
temp=tempL/16+tempH*16+(tempL & 0x0f)*0.0625;
if(fg)
{
return(temp);
}
else
{
fg=1;
return(-temp);
}
}
DS18B20温度采集,通过调用Temperature()函数可得到温度数据。
Ⅱ 基于单片机的温度控制系统的设计
利用温度传感器DS18B20检测环境温度并直接输出数字温度信号给单片机AT89C52进行处理。
在LCD液晶上显示当前环境温度值、预设温度值、使用者设定的温度差以及目前风扇所处的档位。其中预设温度值只能为整数形式,检测到的当前环境温度可精确到小数点后一位。
同时采用PWM脉宽调制方式来改变直流风扇电机的转速。
并通过两个按键改变预设温度值,一个提高预设温度,另一个降低预设温度值。通过另一个按键控制温度差的大小。
设有红外热释传感器检测环境范围内是否有人,如果有人确定出风方向,如果无人,降低转速或一定时间内自动关闭。
回答
正如你所说的,一共用了DS18B20模块,LCD模块,红外传感模块,按键,直流电机模块,程序方面只有一个PWM。现在一一为你分析:
DS18B20模块:
下图是它的原理图,采用单总线来进行开发,不像电赛的哪个温度传感器需要AD转换,它是可以直接传出数字信号的。
Ⅲ 求助编一个51单片机自动温度检测报警系统的程序
;********************************************************************
;DS18B20温度计 *
;采用4位LED共阳显示器显示测温值,显示精度0.1℃,测温范围-55~+125*
;用AT89C2051单片机,12MHZ晶振 *
;********************************************************************
;***************常数定义********************
TIMEL EQU 0E0H ;20ms,定时器0时间常数
TIMEH EQU 0B1H
TEMPHEAD EQU 36H
;********************工作内存定义**********************
BITST DATA 20H
TIME1S0K BIT BITST.1
TEMPONEOK BIT BITST.2
TEMPL DATA 26H
TEMPH DATA 27H
TEMPHC DATA 28H
TEMPLC DATA 29H
SCANLED DATA 2AH
;*****************引脚定义*****************************
TEMPDIN BIT P3.7
;*****************中断向量区***************************
ORG 0000H
LJMP START
ORG 000BH
LJMP T01T
;***************系统初始化****************************
ORG 0030H
START: MOV SP,#60H
CLSMEM: MOV R0,#20H
MOV R1,#60H
CLSMEM1: MOV @R0,#00H
INC R0
DJNZ R1,CLSMEM1
MOV TMOD,#00100001B ;定时器0工作方式1(16位)
MOV TH0,#HIGH(65536-5000)
MOV TL0,#LOW(65536-5000) ;5ms
SJMP INIT
ERROR: NOP
LJMP START
NOP
INIT: NOP
SETB ET0
SETB TR0
SETB EA
MOV PSW,#00H
CLR TEMPONEOK
MOV 50H,#10
MOV 51H,#10
MOV 52H,#10
MOV 53H,#10
LJMP MAIN
;*******************************************************************
;定时器0中断服务程序
;*******************************************************************
T01T: CLR TR0
MOV TH0,#HIGH(65536-5000)
MOV TL0,#LOW(65536-5000) ;5ms
SETB TR0
LEDDIS:
MOV DPTR,#TAB
MOV R1,#50H
MOV A,SCANLED
ADD A,R1
MOV R1,A
MOV A,SCANLED
JNZ LEDDIS1
MOV P3,#08H
SJMP LEDDIS4
LEDDIS1:
DEC A
JNZ LEDDIS2
MOV P3,#04H
SJMP LEDDIS4
LEDDIS2:
DEC A
JNZ LEDDIS3
MOV P3,#02H
SJMP LEDDIS4
LEDDIS3:
MOV P3,#01H
LEDDIS4:
MOV A,@R1
MOVC A,@A+DPTR
MOV P1,A
INC SCANLED
MOV A,SCANLED
CJNE A,#4,T0CNT
MOV SCANLED,#0
T0CNT:
INC R7
CJNE R7,#200,T0IT1
MOV R7,#00H
SETB TIME1S0K ;1s定时到标志
T0IT1: RETI
;********************************************************************
; 主程序
;********************************************************************
MAIN:
JNB TIME1S0K,MAIN
CLR TIME1S0K ;测温每1s一次
LCALL READTEMP ;读出温度值子程序
LCALL CONVTEMP ;温度BCD码计算处理子程序
LCALL DISPBCD ;显示区BCD码温度值刷新子程序
LJMP MAIN
;********************************************************************
; 子程序区
;********************************************************************
;***************复位DS18B20*****************************************
INITDS1820: SETB TEMPDIN
NOP
CLR TEMPDIN
MOV R6,#251 ;延时>480μs
DJNZ R6,$
SETB TEMPDIN
MOV R6,#37 ;
LOOP1820: MOV C,TEMPDIN
JC INITDS1820OUT
DJNZ R6,LOOP1820
SJMP INITDS1820
RET
INITDS1820OUT:
MOV R6,#06BH ;延时200μs
DJNZ R6,$
SETB TEMPDIN
RET
;*******读DS18B20的程序,从DS18B20中读出1字节的数据*****
READDS1820: MOV R7,#08H
READDS1820LOOP: CLR TEMPDIN
NOP
NOP
SETB TEMPDIN
MOV R6,#07 ;延时15μs
DJNZ R6,$
MOV C,TEMPDIN
RRC A
MOV R6,#25
DJNZ R6,$
DJNZ R7,READDS1820LOOP
RET
;******写DS18B20的程序,从DS18B20中写1字节数据*****
WRITEDS1820: MOV R7,#08H
WRITEDS1820LOP: CLR TEMPDIN
MOV R6,#07H ;延时15μs
DJNZ R6,$
RRC A
MOV TEMPDIN,C
MOV R6,#30 ;延时104μs
DJNZ R6,$
SETB TEMPDIN
NOP
DJNZ R7,WRITEDS1820LOP
SETB TEMPDIN
RET
;******************读TEMP******************88
READTEMP: LCALL INITDS1820
MOV A,#0CCH
LCALL WRITEDS1820 ;Skip ROM
MOV A, #44H
LCALL WRITEDS1820 ;开始转换
MOV R6,#250 ;延时
DJNZ R6,$
READTEMP1: LCALL INITDS1820
MOV A,#0CCH
LCALL WRITEDS1820 ;Skip ROM
MOV A,#0BEH
LCALL WRITEDS1820 ;中间结果寄存器
MOV R6,#34H ;延时104μs
DJNZ R6,$
READTEMP2: LCALL READDS1820
MOV TEMPL,A
LCALL READDS1820
MOV TEMPH,A
READTEMPOUT: RET
;**************处理温度BCD码子程序***********
CONVTEMP: MOV A,TEMPH
ANL A,#80H
JZ TEMPC1
CLR C
MOV A,TEMPL
CPL A
ADD A,#01H
MOV TEMPL,A
MOV A,TEMPH ;"-"
CPL A
ADDC A,#00H
MOV TEMPH,A ;TEMPHC HI=符号位
MOV TEMPHC,#0BH
SJMP TEMPC11
TEMPC1: MOV TEMPHC,#0AH ;"+"
TEMPC11:
MOV R6,#4H
TEMPC12:
MOV A,TEMPH
RRC A
MOV TEMPH,A
MOV A,TEMPL
RRC A
MOV TEMPL,A
DJNZ R6,TEMPC12
RET
;*****************小数部分码表*********
TEMPDOTTAB: DB 00H,01H,01H,02H,03H,03H,04H,04H,05H,06H
DB 06H,07H,08H,08H,09H,09H
;************显示区BCD码温度值刷新子程序********
DISPBCD: MOV 53H,TEMPHC
MOV A,TEMPL
MOV B,#10
DIV AB
MOV 50H,B
MOV B,#10
DIV AB
MOV 51H,B
JZ DISPBCD2
MOV 52H,A
RET
DISPBCD2: MOV 52H,#10
RET
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0BFH
;共阳段码表 "0","1","2","3","4","5","6","7","8","9","不亮","-"
END
Ⅳ 基于单片机的温度监测系统设计的总体大概的讲一下测温和无线传输显示的过程
传感器DS18B20具有体积更小、精度更高、适用电压更宽、采用一线总线、可组网等优点,在实际应用中取得了良好的测温效果[7]。
美国Dallas半导体公司的数字化温度传感器DS1820是世界上第一片支持 “一线总线”接口的温度传感器,在其内部使用了在板(ON-B0ARD)专利技术。全部传感元件及转换电路集成在形如一只三极管的集成电路内。“一线总线”独特而且经济的特点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。现在,新一代的DS18B20体积更小、更经济、更灵活。使你可以充分发挥“一线总线”的优点。 同DS1820一样,DS18B20也支持“一线总线”接口,测量温度范围为-55°C~+125°C,在-10~+85°C范围内,精度为±0.5°C。现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。适合于恶劣环境的现场温度测量,如:环境控制、设备或过程控制、测温类消费电子产品等。与前一代产品不同,新的产品支持3V~5.5V的电压范围,使系统设计更灵活、方便。而且新一代产品更便宜,体积更小[8]。
1. DS18B20的特性 [9]
(1)适应电压范围更宽,电压范围:3.0~5.5V,寄生电源方式下可由数据线供。
(2)独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。
(3)DS18B20支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组网多点测温。
(4)DS18B20在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内。
(5)温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃。
(6)可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温。
(7)在9位分辨率时最多在93.75ms内把温度转换为数字,12位分辨率时最多在750ms内把温度值转换为数字,速度更快。
(8)测量结果直接输出数字温度信号,以“一线总线”串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力。
(9)负压特性:电源极性接反时,芯片不会因发热而烧毁,但不能正常工作。
2.DS18B20内部结构及DS18B20的管脚排列
64位光刻ROM是出厂前被光刻好的,它可以看作是该DS18B20的地址序列号。不同的器件地址序列号不同。DS18B20内部结构主要由四部分组成:64位光刻ROM,温度传感器,非挥发的温度报警触发器TH和TL,高速暂存器。
DS18B20的引脚定义:
(1)DQ为数字信号输入/输出端
(2)GND为电源地
(3)VDD为外接供电电源输入端(在寄生电源接线方式时接地)
另外,站长团上有产品团购,便宜有保证
Ⅳ 基于单片机的温度控制系统
加热部件可以在淘宝上买个
usb
5v
加热片,usb供电的电流不会超过
500ma,
控制可以用单片机脚控制一个
c8050三极管控制加热片的通断电。
Ⅵ 基于单片机的温度数据采集系统设计
单片机课程设计任务书
题目:基于单片机的温度数据采集系统设计
一.设计要求
1.被测量温度范围:0~500℃,温度分辨率为0.5℃。
2.被测温度点:4个,每2秒测量一次。
3.显示器要求:通道号1位,温度4位(精度到小数点后一位)。
显示方式为定点显示和轮流显示。
4.键盘要求:
(1)定点显示设定;(2)轮流显示设定;(3)其他功能键。
二.设计内容
1.单片机及电源管理模块设计。
单片机可选用AT89S51及其兼容系列,电源管理模块要实
现高精密稳压输出,为单片机及A/D转换器供电。
2.传感器及放大器设计。
传感器可以选用镍铬—镍硅热电偶(分度号K),放大器要实现热电偶输出的mV级信号到A/D输入V级信号放大。
3.多路转换开关及A/D转换器设计。
多路开关可以选用CD4052,A/D可选用MC14433等。
4.显示器设计。
可以选用LED显示或LCD显示。
5.键盘电路设计。
实现定点显示按键;轮流显示按键;其他功能键。
6.系统软件设计。
系统初始化模块,键盘扫描模块,显示模块,数据采集模块,标度变换模块等。
引言:
在生产和日常生活中,温度的测量及控制十分重要,实时温度检测系统在各个方面应用十分广泛。消防电气的非破坏性温度检测,大型电力、通讯设备过热故障预知检测,各类机械组件的过热预警,医疗相关设备的温度测试等等都离不开温度数据采集控制系统。
随着科学技术的发展,电子学技术也随之迅猛发展,同时带动了大批相关产业的发展,其应用范围也越来越广泛。近年来单片机发展也同样十分迅速,单片机已经渗透到工业、农业、国防等各个领域,单片机以其体积小,可靠性高,造价低,开发周期短的特点被广泛推广与应用。传统的温度采集不仅耗时而且精度低,远不能满足各行业对温度数据高精度,高可靠性的要求。温度的控制及测量对保证产品质量、提高生产效率、节约能源、生产安全、促进国民经济的发展起到重要作用。在单片机温度测量系统中关键是测量温度,控制温度和保持温度。温度测量是工业对象的主要被控参数之一。本此题目的总体功能就是利用单片机和热敏原件实现温度的采集与读数,利用五位LED显示温度读数和所选通道号,实现热电转化,实现温度的精确测量。本设计是以Atmel公司的AT89S51单片机为控制核心,通过MC14433模数转换对所测的温度进行数字量变化,且通过数码管进行相应的温度显示。采用微机进行温度检测,数字显示,信息存储及实时控制,对于提高生产效率和产品质量、节约能源等都有重要作用。
目录:
一、系统总体功能及技术指标的描述........................................ 5
二、各模块电路原理描述............................................................. 5
2.1单片机及电源模块设计...................................................... 5
2.2、AT89S51引脚说明.......................................................... 7
2.3、数据采集模块设计........................................................ 11
2.4、多路开关......................................................................... 12
2.5、放大器............................................................................. 15
2.6、A/D转换器..................................................................... 16
2.7、显示器设计..................................................................... 21
2.8、键盘电路设计................................................................. 22
2.9、电路总体设计图........................................................... 22
三、软件流程图 ...................................................................... 24
四、程序清单.............................................................................. 25
五、设计总结及体会.................................................................... 31
六、参考资料................................................................................ 32
一、系统总体功能及技术指标的描述
1. 系统的总体功能:
温度数据采集系统,实现温度的采集与读书,利用五位LED显示温度读数和所选通道号,实现热电转化的原理过程。
被测量温度范围:0~500℃,温度分辨率为0.5℃。被测温度点4个,每2秒测量一次。显示器要求:通道号1位,温度4位(精度到小数点后一位)。显示方式为定点显示和轮流显示,可以通过按键改变显示方式。
2. 技术指标要求:
1.被测量温度范围:0~500℃,温度分辨率为0.5℃。
2.被测温度点:4个,每2秒测量一次。
3.显示器要求:通道号1位,温度4位(精度到小数点后一位)。
显示方式为定点显示和轮流显示。
4.键盘要求:
(1)定点显示设定;(2)轮流显示设定;(3)其他功能键。
二、各模块电路原理描述
2.1单片机及电源模块设计
如图所示为AT89S51芯片的引脚图。兼容标准MCS-51指令系统的AT89S51单片机是一个低功耗、高性能CHMOS的单片机,片内含4KB在线可编程Flash存储器的单片机。它与通用80C51系列单片机的指令系统和引脚兼容。
AT89S51单片机片内的Flash可允许在线重新编程,也可用通用非易失性存储编程器编程;片内数据存储器内含128字节的RAM;有40个引脚,32个外部双向输入/输出(I/O)端口;具有两个16位可编程定时器;中断系统是具有6个中断源、5个中断矢量、2级中断优先级的中断结构;震荡器频率0到33MHZ,因此我们在此选用12MHZ的晶振是比较合理的;具有片内看门狗定时器;具有断电标志POF等等。AT89S51具有PDIP、TQFP和PLCC三种封装形式[8]。
图5.1-1 AT89S51引脚图
上图就是PDIP封装的引脚排列,下面介绍各引脚的功能。
2.2、AT89S51引脚说明
P0口:8位、开漏级、双向I/O口。P0口可作为通用I/O口,但须外接上拉电阻;作为输出口,每各引脚可吸收8各TTL的灌电流。作为输入时,首先应将引脚置1。P0也可用做访问外部程序存储器和数据存储器时的低8位地址/数据总线的复用线。在该模式下,P0口含有内部上拉电阻。在FLASH编程时,P0口接收代码字节数据;在编程效验时,P0口输出代码字节数据(需要外接上拉电阻)。
P1口:8位、双向I/0口,内部含有上拉电阻。P1口可作普通I/O口。输出缓冲器可驱动四个TTL负载;用作输入时,先将引脚置1,由片内上拉电阻将其抬到高电平。P1口的引脚可由外部负载拉到低电平,通过上拉电阻提供电流。在FLASH并行编程和校验时,P1口可输入低字节地址。在串行编程和效验时,P1.5/MO-SI,P1.6/MISO和P1.7/SCK分别是串行数据输入、输出和移位脉冲引脚。
P2口:具有内部上拉电阻的8位双向I/O口。P2口用做输出口时,可驱动4各TTL负载;用做输入口时,先将引脚置1,由内部上拉电阻将其提高到高电平。若负载为低电平,则通过内部上拉电阻向外部输出电流。CPU访问外部16位地址的存储器时,P2口提供高8位地址。当CPU用8位地址寻址外部存储时,P2口为P2特殊功能寄存器的内容。在FLASH并行编程和校验时,P2口可输入高字节地址和某些控制信号。
P3口:具有内部上拉电阻的8位双向口。P3口用做输出口时,输出缓冲器可吸收4各TTL的灌电流;用做输入口时,首先将引脚置1,由内部上拉电阻抬位高电平。若外部的负载是低电平,则通过内部上拉电阻向输出电流。在与FLASH并行编程和校验时,P3口可输入某些控制信号。P3口除了通用I/O口功能外,还有替代功能,如表5.3-1所示。
表5.3-1 P3口的替代功能
引脚
符号
说明
P3.0
RXD
串行口输入
P3.1
TXD
串行口输出
P3.2
/INT0
外部中断0
P3.3
/INT1
外部中断1
P3.4
T0
T0定时器的外部的计数输入
P3.5
T1
T1定时器的外部的计数输入
P3.6
/WR
外部数据存储器的写选通
P3.7
/RD
外部数据存储器的读选通
RST:复位端。当振荡器工作时,此引脚上出现两个机器周期的高电平将系统复位。
ALE/ :当访问外部存储器时,ALE(允许地址锁存)是一个用于锁存地址的低8位字节的书粗脉冲。在Flash 编程期间,此引脚也可用于输入编程脉冲()。在正常操作情况下,ALE以振荡器频率的1/6的固定速率发出脉冲,它是用作对外输出的时钟,需要注意的是,每当访问外部数据存储器时,将跳过一个ALE脉冲。如果希望禁止ALE操作,可通过将特殊功能寄存器中位地址为8EH那位置的“0”来实现。该位置的“1”后。ALE仅在MOVE或MOVC指令期间激活,否则ALE引脚将被略微拉高。若微控制器在外部执行方式,ALE禁止位无效。
:外部程序存储器读选取通信号。当AT89S51在读取外部程序时, 每个机器周期 将PSEN激活两次。在此期间内,每当访问外部数据存储器时,将跳过两个信号。
/Vpp:访问外部程序存储器允许端。为了能够从外部程序存储器的0000H至FFFFH单元中取指令,必须接地,然而要注意的是,若对加密位1进行编程,则在复位时,的状态在内部被锁存。
执行内部程序应接VCC。不当选择12V编程电源时,在Flash编程期间,这个引脚可接12V编程电压。
XTAL1:振荡器反向放大器输入端和内部时钟发生器的输入端。
XTAL2:振荡器反相放大器输出端[9]。
电源模块设计
在影响单片机系统可靠性的诸多因素中,电源干扰可谓首屈一指,据统计,计算机应用系统的运行故障有90%以上是由电源噪声引起的。为了提高系统供电可靠性,交流供电应采用交流稳压器,防止电源的过压和欠压,直流电源抗干扰措施有采用高质量集成稳压电路单独供电,采用直流开关电源,采用DC-DC变换器。本次设计决定采用MAXim公司的高电压低功耗线性变换器MAX 1616作为电压变换,采用该器件将输入的24V电压变换为5V电压,给外围5V的器件供电。MAX1616具有如下特点:
1.4~28V电压输入范围。
2.最大80uA的静态工作电流。
3.3V/5V电压可选输出。
4.30mA输出电流。
5.2%的电压输出精度。
电源管理模块电路图如下:
本电路采用该器件将输入的24V电压变成5V电压,给外围5V的器件供电,其中二极管D1是保护二极管,防止输入电压接反可能带来的对电路的影响和破坏。
Ⅶ 用单片机做温度检测系统 论文,
用DS18B20做的电子温度计,非常简单。
#include <reg51.h>
#include\"AscLed.h\"
#include <intrins.h>
#include <stdio.h>
//********************************************************
#define Seck (500/TK) //1秒中的主程序的系数
#define OffLed (Seck*5*60) //自动关机的时间5分钟!
//********************************************************
#if (FHz==0)
#define NOP_2uS_nop_()
#else
#define NOP_2uS_nop_();_nop_()
#endif
//**************************************
#define SkipK 0xcc //跳过命令
#define ConvertK 0x44 //转化命令
#define RdDs18b20K 0xbe //读温度命令
//*******************************************
extern LedOut(void);
//*************************************************
sbit PNP1=P3^4;
sbit PNP2=P3^5;
sbit BEEP=P3^2;
//***********************************
#defineDQ PNP2 //原来的PNP2 BEEP
//***********************************
static unsigned char Power=0;
//************************************
union{
unsigned char Temp[2]; //单字节温度
unsigned int Tt; //2字节温度
}T;
//***********************************************
typedef struct{
unsigned char Flag; //正数标志 0;1==》负数
unsigned char WenDu; //温度整数
unsigned int WenDuDot; //温度小数放大了10000
}WENDU;
//***********************************************
WENDU WenDu;
unsigned char LedBuf[3];
//----------------------------------
//功能:10us 级别延时
// n=1===> 6Mhz=14uS 12MHz=7uS
//----------------------------------
void Delay10us(unsigned char n){
do{
#if (FHz==1)
NOP_2uS;NOP_2uS;
#endif
}while(--n);
}
//-----------------------------------
//功能:写18B20
//-----------------------------------
void Write_18B20(unsigned char n){
unsigned char i;
for(i=0;i<8;i++){
DQ=0;
Delay10us(1);//延时13us 左右
DQ=n & 0x01;
n=n>>1;
Delay10us(5);//延时50us 以上
DQ=1;
}
}
//------------------------------------
//功能:读取18B20
//------------------------------------
unsigned char Read_18B20(void){
unsigned char i;
unsigned char temp;
for(i=0;i<8;i++){
temp=temp>>1;
DQ=0;
NOP_2uS;//延时1us
DQ=1;
NOP_2uS;NOP_2uS;//延时5us
if(DQ==0){
temp=temp&0x7F;
}else{
temp=temp|0x80;
}
Delay10us(5);//延时40us
DQ=1;
}
return temp;
}
//-----------------------------------
void Init (void){
DQ=0;
Delay10us(45);//延时500us
DQ=1;
Delay10us(9);//延时90us
if(DQ){ //0001 1111b=1f
Power =0; //失败0
}else{
Power++;
DQ=1;
}
}
//----------------------------------
void Skip(void){
Write_18B20(SkipK);
Power++;
}
//----------------------------------
void Convert (void){
Write_18B20(ConvertK);
Power++;
}
//______________________________________
void Get_Ds18b20L (void){
T.Temp[1]=Read_18B20(); //读低位
Power++;
}
//______________________________________
void Get_Ds18b20H (void){
T.Temp[0]=Read_18B20(); //读高位
Power++;
}
//------------------------------------
//规范化成浮点数
// sssss111;11110000
// sssss111;1111(0.5,0.25,0.125,0.0625)
//------------------------------------
void ReadTemp (void){
unsigned char i;
unsigned intF1=0;
char j=1;
code int Code_F[]={6250,1250,2500,5000};
WenDu.Flag=0;
if (T.Temp[0] >0x80){ //负温度
T.Tt =~T.Tt+1; //取反+1=源吗 +符号S
WenDu.Flag=-1;
}
T.Tt <<= 4; //左移4位
WenDu.WenDu=T.Temp[0]; // 温度整数
//**************************************************
T.Temp[1]>>=4;
//---------------------------
for (i=0;i<4;i++){ //计算小数位
F1 +=(T.Temp[1] & 0x01)*Code_F;
T.Temp[1]>>=1;
}
WenDu.WenDuDot=F1; //温度的小数
Power=0;
}
//----------------------------------
void Delay1S (void){
static unsigned int i=0;
if (++i==Seck) {i=0ower++;}
}
//----------------------------------
void ReadDo (void){
Write_18B20(RdDs18b20K);
Power++;
}
/**********************************
函数指针定义
***********************************/
code void (code *SubTemp[])()={
Init,Skip,Convert,Delay1S,Init,Skip,ReadDo,Get_Ds18b20L,
Get_Ds18b20H,ReadTemp
};
//**************************************
void GetTemp(void){
(*SubTemp[Power])();
}
//---------------------------------------------------
//将温度显示,小数点放大了10000.
void GetBcd(void){
LedBuf[0]=WenDu.WenDu / 10;
LedBuf[1]=WenDu.WenDu % 10 +DotK;
LedBuf[2]=(WenDu.WenDuDot/1000)%10;
if(LedBuf[0]==0)LedBuf[0]=Black;
if(WenDu.Flag==0) return;
if(LedBuf[0] !=Black){
LedBuf[2]=LedBuf[1];
LedBuf[1]=LedBuf[0];
LedBuf[0]=Led_Pol; //'-'
}else{
LedBuf[0]=Led_Pol; //'-'
}
}
/*
//---------------------------------------------------
void JbDelay (void){
static long i;
if (++i>=OffLed){
P1=0xff;
P2=0xff;
PCON=0x02;
}
}
*/
/*****************************************************
主程序开始
1:2002_10_1 设计,采用DS18B20测量
2:采用函数数组读取DS18B20.LED数码管显示正常!
3:改变FHz可以用6,12MHz工作!
******************************************************/
code unsigned char Stop[3] _at_ 0x3b;
void main (void){
P1=0xff;
WenDu.WenDu=0;
while (1){
GetTemp();
GetBcd();
// JbDelay();
LedOut();
}
}
复制代码
20091012_[1].jpg (12 KB)
2009-10-21 23:21 上传
下载次数:0
