导航:首页 > 操作系统 > 单片机温度报警器

单片机温度报警器

发布时间:2022-09-24 10:50:36

❶ 温度报警器的程序

网上很多搜下ds18b20的例程吧。或者Tbao搜:基于单片机火灾报警器(MQ2+DS18B20)仿真和C程序资料。

❷ 单片机 ds18b20温度报警器问题

if((MSB&0XF8)==X0F8)
应该是if((MSB&0XF8)==0xF8)吧?

❸ 基于AT89C51和DS18B20制作的温度报警器原理图和单片机内部程序

#include <reg52.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
sbit ds=P2^2; //温度传感器信号线
sbit la=P2^6; //数码管段选线
sbit wela=P2^7; //数码管位选线
sbit beep=P2^3; //蜂鸣器

uint temp;
float f_temp;
uint warn_l1=260;
uint warn_l2=250;
uint warn_h1=300;
uint warn_h2=320;

sbit led0=P1^0;
sbit led1=P1^1;
sbit led2=P1^2;
sbit led3=P1^3;

unsigned char code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0xbf,0x86,
0xdb,0xcf,0xe6,0xed,
0xfd,0x87,0xff,0xef}; //不带小数点的编码

void delay(uint z)//延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}

void dsreset(void) //18B20复位,初始化函数
{
uint i;
ds=0;
i=103;
while(i>0)i--;
ds=1;
i=4;
while(i>0)i--;
}

bit tempreadbit(void) //读1位函数
{
uint i;
bit dat;
ds=0;i++; //i++ 起延时作用
ds=1;i++;i++;
dat=ds;
i=8;while(i>0)i--;
return (dat);
}

uchar tempread(void) //读1个字节
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tempreadbit();
dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好一个字节在DAT里
}
return(dat);
}

void tempwritebyte(uchar dat) //向18B20写一个字节数据
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb) //写 1
{
ds=0;
i++;i++;
ds=1;
i=8;while(i>0)i--;
}
else
{
ds=0; //写 0
i=8;while(i>0)i--;
ds=1;
i++;i++;
}

}
}

void tempchange(void) //DS18B20 开始获取温度并转换
{
dsreset();
delay(1);
tempwritebyte(0xcc); // 写跳过读ROM指令
tempwritebyte(0x44); // 写温度转换指令
}

uint get_temp() //读取寄存器中存储的温度数据
{
uchar a,b;

dsreset();
delay(1);
tempwritebyte(0xcc);
tempwritebyte(0xbe);
a=tempread(); //读低8位
b=tempread(); //读高8位
temp=b;
temp<<=8; //两个字节组合为1个字
temp=temp|a;
f_temp=temp*0.0625; //温度在寄存器中为12位 分辨率位0.0625°
temp=f_temp*10+0.5; //乘以10表示小数点后面只取1位,加0.5是四舍五入
f_temp=f_temp+0.05;
return temp; //temp是整型
}

////////////////////显示程序//////////////////////////
void display(uchar num,uchar dat)
{
uchar i;
la=0;
P0=table[dat];
la=1;
la=0;

wela=0;
i=0XFF;
i=i&(~((0X01)<<(num)));
P0=i;
wela=1;
wela=0;
delay(1);
}

void dis_temp(uint t)
{
uchar i;
i=t/100;
display(0,i);
i=t%100/10;
display(1,i+10);
i=t%100%10;
display(2,i);
}
//////////////////////////////////////////////
void warn(uint s,uchar led) //蜂鸣器报警声音 ,s控制音调
{
uchar i;i=s;
la=0;
wela=0;

beep=0;
P1=~(led);
while(i--)
{
dis_temp(get_temp());
}
beep=1;
P1=0XFF;
i=s;
while(i--)
{
dis_temp(get_temp());
}
}
void deal(uint t)
{
uchar i;
if((t>warn_l2)&&(t<=warn_l1)) //大于25度小于27度
{
warn(40,0x01);

}
else if(t<=warn_l2) //小于25度
{
warn(10,0x03);
}
else if((t<warn_h2)&&(t>=warn_h1)) //小于32度大于30度
{
warn(40,0x04);
}
else if(t>=warn_h2) //大于32度
{
warn(10,0x0c);
}
else
{
i=40;
while(i--)
{
dis_temp(get_temp());
}
}
}

void init_com(void)
{
TMOD = 0x20;
PCON = 0x00;
SCON = 0x50;
TH1 = 0xFd;
TL1 = 0xFd;
TR1 = 1;
}

void comm(char *parr)
{
do
{
SBUF = *parr++; //发送数据
while(!TI); //等待发送完成标志为1
TI =0; //标志清零
}while(*parr); //保持循环直到字符为'\0'
}

void main()
{
uchar buff[4],i;
la=0;
wela=0;
init_com();
while(1)
{
tempchange();
for(i=10;i>0;i--)
{
dis_temp(get_temp());}
deal(temp);

sprintf(buff,"%f",f_temp);

for(i=10;i>0;i--)
{
dis_temp(get_temp());}

comm(buff);

for(i=10;i>0;i--)
{
dis_temp(get_temp());}

}
}

❹ 51单片机温度报警器,为什么我用串口设置的门限温度无论是多少,都会报警是哪个地方没有设置好吗

有没有代码,贴上来看看

❺ 单片机温度报警器的温度上下限按键调控的C语言程序怎么编

温度报警器就是需要温度传感器不停地对监控的对象进行检测,例如pt100温度传感器,pt100传感器是不同温度下,阻值会不同,在同一温度下,阻值是相同的。根据这个原理通过电路转换成电压,然后模拟量转换成数字量输入到单片机,单片机根据读取到的电压值判断实际温度值,然后根据设定的报警值比较,如果超过 就进行报警动作。
在实际设计过程中那个报警温度的设定,可以直接对那个变量进行加减的,例如
void actfuntion(unsigned char temp)
{
temp++;
}
然后在检测到按键有电平跳变的时候,就调用这个含参子函数对定义的温度设定值进行加操作,减操作也是一样,还可以在调用的后面进行最大值或者最小值的判断。
如果觉得这样一下一下的按太麻烦了,可以对按键进行长按连续触发进行判断,就是在定时器里进行判断按下时间,然后不停的调用这个子函数。
当然这个设定值是需要考虑掉电保存的,或者是按键保存。可以在设定好温度值之后,在按下其他的按键,进行把温度设定值 保存到单片机内部eeprom就可以了,不需要保存太多数据的情况下,现在市面上很多单片机都有的内部eeprom就够用的了,不需要进行外部扩展。
然后在单片机上电,也就是主函数的开头进行读取eeprom中保存的设定值。

❻ STC89C52单片机,用C语言编温度报警器的程序

我们可以给你提供。 //初始化DS18B20
//让DS18B20一段相对长时间低电平, 然后一段相对非常短时间高电平, 即可启动
void dsInit()
{
//对于11.0592MHz时钟, unsigned int型的i, 作一个i++操作的时间大于8us
unsigned int i;
ds = 0;
i = 100; //拉低约800us, 符合协议要求的480us以上
while(i>0) i--;
ds = 1; //产生一个上升沿, 进入等待应答状态
i = 4;
while(i>0) i--;
}

void dsWait()
{
unsigned int i;
while(ds);
while(~ds); //检测到应答脉冲
i = 4;
while(i > 0) i--;
}

//向DS18B20读取一位数据
//读一位, 让DS18B20一小周期低电平, 然后两小周期高电平,
//之后DS18B20则会输出持续一段时间的一位数据
bit readBit()
{
unsigned int i;
bit b;
ds = 0;
i++; //延时约8us, 符合协议要求至少保持1us
ds = 1;
i++; i++; //延时约16us, 符合协议要求的至少延时15us以上
b = ds;
i = 8;
while(i>0) i--; //延时约64us, 符合读时隙不低于60us要求
return b;
}

//读取一字节数据, 通过调用readBit()来实现
unsigned char readByte()
{
unsigned int i;
unsigned char j, dat;
dat = 0;
for(i=0; i<8; i++)
{
j = readBit();
//最先读出的是最低位数据
dat = (j << 7) | (dat >> 1);
}
return dat;
}

}

//向DS18B20发送温度转换命令
void sendChangeCmd()
{
dsInit(); //初始化DS18B20, 无论什么命令, 首先都要发起初始化
dsWait(); //等待DS18B20应答
delay(1); //延时1ms, 因为DS18B20会拉低DQ 60~240us作为应答信号
writeByte(0xcc); //写入跳过序列号命令字 Skip Rom
writeByte(0x44); //写入温度转换命令字 Convert T
}

//向DS18B20发送读取数据命令
void sendReadCmd()
{
dsInit();
dsWait();
delay(1);
writeByte(0xcc); //写入跳过序列号命令字 Skip Rom
writeByte(0xbe); //写入读取数据令字 Read Scratchpad
}

//获取当前温度值
int getTmpValue()
{

int value; //存放温度数值
float t;
unsigned char low, high;
sendReadCmd();
//连续读取两个字节数据
low = readByte();
high = readByte();
tmpvalue = high;
tmpvalue <<= 8;
tmpvalue |= low;
value = tmpvalue;

//使用DS18B20的默认分辨率12位, 精确度为0.0625度, 即读回数据的最低位代表0.0625度
t = value * 0.0625;
value = t * 100 + (value > 0 ? 0.5 : -0.5); //大于0加0.5, 小于0减0.5
return value;
}

unsigned char const timeCount = 3; //动态扫描的时间间隔
//显示当前温度值, 精确到小数点后一位
//若先位选再段选, 由于IO口默认输出高电平, 所以当先位选会使数码管出现乱码
/*void display()
{
unsigned int tmp = abs(tempValue);

switch(sum)
{
case 1: PA8255=table[tmp % 10]; PB8255=0xfe; delay(1);
PA8255=table[ tmp % 100 / 10]; PB8255=0xfd; delay(1);
PA8255=tableWidthDot[ tmp % 1000 / 100]; PB8255=0xfb; delay(1);
PA8255=table[tmp % 10000 / 1000]; PB8255=0xf7; delay(1); PB8255=0xff;break; //显示温度

case 2: PA8255=table[0]; PB8255=0xfe; delay(1);
PA8255=tableWidthDot[high%10]; PB8255=0xfd; delay(1);
PA8255=table[high/10]; PB8255=0xfb; delay(1); PB8255=0xff; break; //显示上限温度

case 3: PA8255=table[0]; PB8255=0xfe; delay(1);
PA8255=tableWidthDot[low%10]; PB8255=0xfd; delay(1);
PA8255=table[low/10]; PB8255=0xfb; delay(1); PB8255=0xff; break; //显示下限温度

default: break;
}

} */

Into() interrupt 0
{ sum++;
if(sum==4)
sum=1;
}

uchar keyscan() //键盘扫描,调整温度上下限
{
PC8255=0xfc;
if((PC8255&0xc0)!=0xc0)
{
delay(40);
if((PC8255&0xc0)!=0xc0)
PC8255=0xfe;
if((PC8255&0xc0)==0x80)
high++;
if((PC8255&0xc0)==0x40)
high--;
PC8255=0xfd;
if((PC8255&0xc0)==0x80)
low++;
if((PC8255&0xc0)==0x40)
low--;
}
}

void main()
{

unsigned int tmp ;

COM8255=0x88;
IT0=1; //外部中断0,采用外部中断0进行实时温度,上限温度和下限温度之间的显示切换
EX0=1;
EA=1;
P1_0=0x1;
sum=1;
high=22; //初始温度上下限设定
low=10;
while(1)
{
//启动温度转换
sendChangeCmd();
tempValue = getTmpValue();
keyscan();// 读取键值
tmp = abs(tempValue); //读取温度
switch(sum)
{
case 1: PA8255=table[tmp % 10]; PB8255=0xfe; delay(1);
PA8255=table[ tmp % 100 / 10]; PB8255=0xfd; delay(1);
PA8255=tableWidthDot[ tmp % 1000 / 100]; PB8255=0xfb; delay(1);
PA8255=table[tmp % 10000 / 1000]; PB8255=0xf7; delay(1); PB8255=0xff;break; //显示温度

case 2: PA8255=table[0]; PB8255=0xfe; delay(1);
PA8255=tableWidthDot[high%10]; PB8255=0xfd; delay(1);
PA8255=table[high/10]; PB8255=0xfb; delay(1); PB8255=0xff; break; //显示上限温度

case 3: PA8255=table[0]; PB8255=0xfe; delay(1);
PA8255=tableWidthDot[low%10]; PB8255=0xfd; delay(1);
PA8255=table[low/10]; PB8255=0xfb; delay(1); PB8255=0xff; break; //显示下限温度

default: break;
}

if(tmp>(high*100)|tmp<(low*100) ) //&&tempValue>low) //超过温度设定范围,系统自动报警
{
P1_0=0;
}
else
P1_0=1; }

}

❼ 温度报警器的原理

【1】温度自动报警器工作原理是根据单片机语音数字联网火灾报警器设计的。

【2】主要是使用AT89C51单片机,选用集成温度传感器AD590和气体传感器TGS202作为敏感元件,利用多传感器信息融合技术,开发了可用于小型单位火灾报警的语音数字联网报警器。 关键词:单片机;传感器;信号处理;火灾报警器 1 引 言 我国的火灾自动报警控制。如下图所示:

❽ 温度自动报警器的报警原理

基于单片机语音数字联网火灾报警器设计

摘 要:使用AT89C51单片机,选用集成温度传感器AD590和气体传感器TGS202作为敏感元件,利用多传感器信息融合技术,开发了可用于小型单位火灾报警的语音数字联网报警器。 关键词:单片机;传感器;信号处理;火灾报警器 1 引 言 我国的火灾自动报警控制系统经历了从无到有、从简单到复杂的发展过程,其智能化程度也越来越高。目前国内厂家多偏重用于大型仓库、商场、高级写字楼、宾馆等场所大型火灾报警系统的研发,他们采用集中区域报警控制方式,其系统复杂、成本较高。而在居民住宅区、机房、办公室等小型防火单位,需要设置一种单一或区域联网、廉价实用的火灾自动探测报警装置,因此,研制一种结构简单、价格低廉的语音数字联网火灾报警器是非常必要的。 一般小型防火单位火灾报警系统如图1所示。现场火灾报警器通过对传感器火情信息的检测,使用智能识别算法实现对火灾的监测。当报警器监测到火情信息后,直接通过Modem经公用电话交换网迅速向消防指挥中心报告火情信息(包括火灾单位编码、单位名称、火情级别以及报警时间等),同时产生声光报警信号,并按事先预留的电话号码自动拨号通知单位有关负责人。消防指挥中心根据接收到的火警信息,立即在消防信息数据库中查询单位位置、周围道路、交通、水源情况等基本信息,根据所获得的信息迅速确定最佳救火方案,通过网络将出警命令直接下达各消防中队。本文将详细介绍小型防火单位语音数字联网报警器的设计与实现。 2 报警器硬件设计 2.1 硬件组成 如图2所示,报警器硬件由温度烟雾信号采集模块、声光报警模块以及单片机与Modem通信模块组成。图中1,2,3组成数据采集模块,4,5组成声光报警模块,5,6,7组成与Modem通信模块。其中,1为传感器(包括烟感和温感),将现场温度、烟雾等非电信号转化为电信号;2为信号调理电路,将传感器输出的电信号进行调理(放大、滤波等),使之满足A/D转换的要求;3为A/D转换电路,完成将温度传感器和烟雾传感器输出的模拟信号到数字信号的转换。声光报警模块由单片机和报警电路组成,由单片机控制实现不同的声光报警(异常报警、故障报警、火灾报警)功能。单片机与Modem通信模块由单片机、GM16C550串行端口扩展芯片和RS232电平转换电路组成,实现报警器经Modem与消防指挥中心的通信。下面对上述各模块进行简要介绍。 2.2 温度烟雾信号采集模块 要准确地进行火灾报警,选择合适的温度和烟雾传感器是准确报警的前提。综合考虑各因素,本文选择集成温度传感器AD590和气体传感器TGS202用作采集系统的敏感元件。 AD590是美国Analog Devices公司生产的一种电流型二端温度传感器。电路如图3所示。由于AD590是电流型温度传感器,他的输出同绝对温度成正比,即1μA/k,而数模转换芯片ADC0809的输入要求是电压量,所以在AD590的负极接出一个10 kΩ的电阻R1和一个100Ω的可调电阻W,将电流量变为电压量送入ADC0809。通过调节可调电阻,便可在输出端VT获得与绝对温度成正比的电压量,即10 mV/K。 火灾中气体烟雾主要是CO2和CO。TGS202气体传感器能探测CO2,CO,甲烷、煤气等多种气体,他灵敏度高,稳定性好,适合于火灾中气体的探测。如图4所示,当TGS202探测到CO2或CO时,传感器的内阻变小,VA迅速上升。选择适当的电阻阻值,使得当气体浓度达到一定程度(如CO浓度达到0.06%)时,VA端获得适当的电压(设为3 V)。 A/D转换电路采用了常用的8位8通道数模转换专用芯片ADC0809,电路如图5所示。温度、烟雾传感器的输出分别接到ADC0809的IN0和IN1。ADC0809的通道选择地址A,B,C分别由89C51的P0.0~P0.2经地址锁存器74LS373输出提供。当P2.7=0时,与写信号WR共同选通ADC0809。图中ALE信号与ST信号连在一起,在WR信 号的前沿写入地址信号,在其后沿启动转换。例如,输出地址7FF8H可选通通道IN0,实现对温度传感器输出的模拟量进行转换;输出地址7FF9H可选通通道IN1,实现对烟雾传感器输出的模拟量进行转换。图中ADC0809的转换结束状态信号EOC接到89C51的INT1引脚,当A/D转换完成后,EOC变为高电平,表示转换结束,产生中断。在中断服务程序中,将转换好的数据送到指定的存储单元。 2.3 声光报警模块 声光报警电路在单片机P1口的控制下,可以根据不同情况(火灾、异常、故障)发出不同的声光报警信号。声音信号由专用语音芯片提供。通过给语音芯片的S1和S2端输入不同的逻辑电平(00,01,10,11),便可以获得4种不同的声音信号。由单片机的P1.0和P1.1控制。另外该芯片还需要一个选通信号,由P1.3提供。只有当该信号为高电平时,芯片才会根据S1和S2端的控制信号发出不同的报警声,否则不会发声报警。 由P1口的P1.4~P1.7分别控制4个发光二极管,予以光报警,如图6所示。P1.4~P1.7控制的灯依次为绿色(正常信号灯)、黄色(故障信号灯)、红色(异常信号灯)和红色(火灾信号灯)。当这些输出端输出低电平时,对应的信号灯便会发光报警。 2.4 单片机与Modem通信模块 当报警器监测到火灾信息后,除了在火灾现场产生声光报警信号外,还需要将火灾信息按事先预留的电话号码自动拨号通知单位有关人员,并迅速上报消防指挥中心,为此,系统设计了单片机与Modem通讯模块,该模块由单片机、GM16C550串行端口扩展芯片和RS232电平转换电路组成。限于篇幅,对通讯模块的硬件电路及编程不做详细论述。 3 报警器监控程序设计 监控程序流程图如图7所示。系统复位后,首先要进行初始化,包括对各个控制用寄存器的初始化、设置中断服务程序的入口地址、设置堆栈等。 为了便于系统维护和功能扩充,采用了模块化程序设计方法,系统各个模块的具体功能都是通过子程序调用实现的。本系统主要包括数据采集子程序、火灾判断与报警子程序以及Modem通讯子程序等。 3.1 数据采集子程序 数据采集部分的程序设计包括:驱动ADC0809的IN0和IN1进行A/D转换,分别由子程序ADC1(温度转换)和ADC2(烟雾浓度转换)完成;单片机接收转换好的数据,存入指定内存单元,由INT1中断服务程序完成。每次驱动A/D转换后等待外部中断1,中断到来说明A/D转换已经完成,通过中断服务程序读取转换得到的数据。 3.2 火灾判断与报警程序 为了降低误报率,系统采用了多次采集、多次判断的方法。每次数据采集后根据得到的数据对现场情况进行判断:00H表示正常、01H表示异常、02H表示火灾;然后综合多次判断结果做出最终的火情判断。数据在内部RAM存储单元中的存放情况如表1所示。具体判断方法如下: (1)对温度和烟雾进行了两次数据采集与判断 温度≥100℃,温度异常,置标志位为1,否则为0;烟雾(CO,CO2)浓度≥0.06%,烟雾浓度异常,置标志位为1,否则为0。 (2)根据温度和烟雾的异常标志位判断现场情况 2个标志位均为0,表示情况正常,给53H或56H单元送00H;2个中仅有1个为1,表示情况异常,送01H;2个均为1,表示有火灾发生,送02H。 (3)综合两次情况做最后判断,并予以报警 若53H和56H中数据不相同,说明是误报,调故障报警子程序;否则按该单元中的数据调相应的报警子程序。 00H为情况正常,返回。 01H为情况异常,调异常报警子程序。 02H为现场有火灾,调火灾报警子程序,并向消防中心报告火情。 4 结 语 本文研制的用于小型防火单位的语音数字联网火灾报警器具有以下特点: (1)能对室内烟雾(CO2,CO)及温度突变进行报警(声光报警)。 (2)如果出现硬件故障(如传感器遗落、内部元器件损坏等),能发出故障报警。 (3)如果只有一种参数出现异常(如烟雾浓度过大或是温度较高),能发出异常报警信号,令值班人员到现场处理。 (4)如果烟雾和温度同时出现异常,则说明有火灾,发出火灾警报,并及时将火灾信息上报消防指挥中心。 现场模拟实验表明,本系统安全可靠,误报率低。且由于其体积小、操作维护方便、成本低廉等,具有广阔的应用前景。
http://..com/question/4525751.html

❾ 求哪位高人给我写个程序吧,写一个设计电路的程序,电路我有,是单片机的。温度报警器

发个电路的图片吧我想好多人会帮你的忙。

#include<at89x51.h>//用AT89C51时就用这个头文件

//#include<reg52.h>//用华邦W78E58B时必须用这个头文件

#include<absacc.h>

#include<ctype.h>

#include<math.h>

#include<stdio.h>

#include<string.h>

#include<DS18B20.h>

#include"LCD1602.h" ////液晶显示头文件

//sbitDQ=P3^4; //定义DQ引脚为P3.4

unsignedchart[2],*pt; //用来存放温度值,测温程序就是通过这个数组与主函数通信的

unsignedcharTempBuffer1[9]={0x2b,0x31,0x32,0x32,0x2e,0x30,0x30,0x43,''};

//显示实时温度,上电时显示+125.00C

unsignedcharTempBuffer0[17]={0x54,0x48,0x3a,0x2b,0x31,0x32,0x35,0x20,

0x54,0x4c,0x3a,0x2b,0x31,0x32,0x34,0x43,''};

//显示温度上下限,上电时显示TH:+125TL:+124C

unsignedcharcodedotcode[4]={0,25,50,75};

/***因显示分辨率为0.25,但小数运算比较麻烦,故采用查表的方法*******

再将表值分离出十位和个位后送到十分位和百分位********************/

voidcovert0(unsignedcharTH,unsignedcharTL) //将温度上下限转换为LCD显示的数据

{

if(TH>0x7F)//判断正负,如果为负温,将其转化为其绝对值

{

TempBuffer0[3]=0x2d; //0x2d为"-"的ASCII码

TH=~TH;

TH++;

}

elseTempBuffer0[3]=0x2b; //0x2B为"+"的ASCII码

if(TL>0x7f)

{

TempBuffer0[11]=0x2d; //0x2d为"-"的ASCII码

TL=~TL+1;

}

elseTempBuffer0[11]=0x2b; //0x2B为"+"的ASCII码

TempBuffer0[4]=TH/100+0x30; //分离出TH的百十个位

if(TempBuffer0[4]==0x30)TempBuffer0[4]=0xfe;//百位数消隐

TempBuffer0[5]=(TH%100)/10+0x30; //分离出十位

TempBuffer0[6]=(TH%100)%10+0x30; //分离出个位

TempBuffer0[12]=TL/100+0x30; //分离出TL的百十个位

if(TempBuffer0[12]==0x30)TempBuffer0[12]=0xfe;//百位数消隐

TempBuffer0[13]=(TL%100)/10+0x30; //分离出十位

TempBuffer0[14]=(TL%100)%10+0x30; //分离出个位

}

voidcovert1(void) //将温度转换为LCD显示的数据

{

unsignedcharx=0x00,y=0x00;

t[0]=*pt;

pt++;

t[1]=*pt;

if(t[1]>0x07)//判断正负温度

{

TempBuffer1[0]=0x2d; //0x2d为"-"的ASCII码

t[1]=~t[1]; /*下面几句把负数的补码*/

t[0]=~t[0]; /*换算成绝对值*********/

x=t[0]+1; /***********************/

t[0]=x; /***********************/

if(x>255)/**********************/

t[1]++; /*********************/

}

elseTempBuffer1[0]=0x2b; //0xfe为变"+"的ASCII码

t[1]<<=4; //将高字节左移4位

t[1]=t[1]&0x70; //取出高字节的3个有效数字位

x=t[0]; //将t[0]暂存到X,因为取小数部分还要用到它

x>>=4; //右移4位

x=x&0x0f; //和前面两句就是取出t[0]的高四位

t[1]=t[1]|x; //将高低字节的有效值的整数部分拼成一个字节

TempBuffer1[1]=t[1]/100+0x30; //+0x30为变0~9ASCII码

if(TempBuffer1[1]==0x30)TempBuffer1[1]=0xfe;//百位数消隐

TempBuffer1[2]=(t[1]%100)/10+0x30; //分离出十位

TempBuffer1[3]=(t[1]%100)%10+0x30; //分离出个位

t[0]=t[0]&0x0c; //取有效的两位小数

t[0]>>=2; //左移两位,以便查表

x=t[0];

y=dotcode[x]; //查表换算成实际的小数

TempBuffer1[5]=y/10+0x30; //分离出十分位

TempBuffer1[6]=y%10+0x30; //分离出百分位

}

voiddelay(unsignedchari)

{

while(i--);

}

main()

{

unsignedcharTH=110,TL=-20; //下一步扩展时可能通过这两个变量,调节上下限

//测温函数返回这个数组的头地址

while(1)

{

pt=ReadTemperature(TH,TL,0x3f); //上限温度-22,下限-24,分辨率10位,也就是0.25C

//读取温度,温度值存放在一个两个字节的数组中,

delay(100);

covert1();

covert0(TH,TL);

LCD_Initial(); //第一个参数列号,第二个为行号,为0表示第一行

//为1表示第二行,第三个参数为显示数据的首地址

LCD_Print(0,0,TempBuffer0);

LCD_Print(0,1,TempBuffer1);

}

}

//一下是液晶代码模块

////////////////////////////////////////////////////////////////////////

#include<at89x51.h>//用AT89C51时就用这个头文件

//#include<reg52.h>//用华邦W78E58B时必须用这个头文件

#include<intrins.h>

//注意那个LCD_Wait()函数,它是判"忙"标志的,在实际硬件要把注掉的那种打开

//PortDefinitions**********************************************************

sbitLcdRs =P2^0;

sbitLcdRw =P2^1;

sbitLcdEn =P2^2;

sfrDBPort =0x80; //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口

//内部等待函数**************************************************************************

unsignedcharLCD_Wait(void)

{

LcdRs=0;

LcdRw=1; _nop_();

LcdEn=1; _nop_();

//while(DBPort&0x80);//在用Proteus仿真时,注意用屏蔽此语句,在调用GotoXY()时,会进入死循环,

//可能在写该控制字时,该模块没有返回写入完备命令,即DBPort&0x80==0x80

//实际硬件时打开此语句

LcdEn=0;

returnDBPort;

}

//向LCD写入命令或数据************************************************************

#defineLCD_COMMAND 0//Command

#defineLCD_DATA 1//Data

#defineLCD_CLEAR_SCREEN 0x01//清屏

#defineLCD_HOMING 0x02//光标返回原点

voidLCD_Write(bitstyle,unsignedcharinput)

{

LcdEn=0;

LcdRs=style;

LcdRw=0; _nop_();

DBPort=input; _nop_();//注意顺序

LcdEn=1; _nop_();//注意顺序

LcdEn=0; _nop_();

LCD_Wait();

}

//设置显示模式************************************************************

#defineLCD_SHOW 0x04//显示开

#defineLCD_HIDE 0x00//显示关

#defineLCD_CURSOR 0x02 //显示光标

#defineLCD_NO_CURSOR 0x00//无光标

#defineLCD_FLASH 0x01//光标闪动

#defineLCD_NO_FLASH 0x00//光标不闪动

voidLCD_SetDisplay(unsignedcharDisplayMode)

{

LCD_Write(LCD_COMMAND,0x08|DisplayMode);

}

//设置输入模式************************************************************

#defineLCD_AC_UP 0x02

#defineLCD_AC_DOWN 0x00//default

#defineLCD_MOVE 0x01//画面可平移

#defineLCD_NO_MOVE 0x00//default

voidLCD_SetInput(unsignedcharInputMode)

{

LCD_Write(LCD_COMMAND,0x04|InputMode);

}

//初始化LCD************************************************************

voidLCD_Initial()

{

LcdEn=0;

LCD_Write(LCD_COMMAND,0x38);//8位数据端口,2行显示,5*7点阵

LCD_Write(LCD_COMMAND,0x38);

LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);//开启显示,无光标

LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);//清屏

LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE);//AC递增,画面不动

}

//************************************************************************

voidGotoXY(unsignedcharx,unsignedchary)

{

if(y==0)

LCD_Write(LCD_COMMAND,0x80|x);

if(y==1)

LCD_Write(LCD_COMMAND,0x80|(x-0x40));

}

voidPrint(unsignedchar*str)

{

while(*str!='')

{

LCD_Write(LCD_DATA,*str);

str++;

}

}

voidLCD_Print(unsignedcharx,unsignedchary,unsignedchar*str)

{

GotoXY(x,y);

Print(str);

}

阅读全文

与单片机温度报警器相关的资料

热点内容
华为笔记本电脑怎么安装抖音app 浏览:410
阿里云国际版试用的服务器怎么搞 浏览:893
java正则表达式工具 浏览:158
oa服务器怎么设置ftp 浏览:8
安卓如何安装obb 浏览:440
QQ聊天记录journal文件夹 浏览:118
苹果公司云服务器地址 浏览:85
加密记事本手机 浏览:437
汽车压缩机变频阀 浏览:95
域外服务器是什么意思 浏览:639
大众点评服务器怎么老卡顿 浏览:556
javavector与list的区别 浏览:316
java初始化类数组 浏览:303
java字符串转换成json对象 浏览:648
android非阻塞socket 浏览:358
编译系统概念 浏览:452
天眼通app能做什么 浏览:557
魅族手机怎么加密图库 浏览:8
rpa编译器 浏览:572
车载云服务器记录 浏览:740