51单片机ADC0809+AD590温度检测、报警程序.docx
- 文档编号:2486316
- 上传时间:2022-10-30
- 格式:DOCX
- 页数:8
- 大小:18.59KB
51单片机ADC0809+AD590温度检测、报警程序.docx
《51单片机ADC0809+AD590温度检测、报警程序.docx》由会员分享,可在线阅读,更多相关《51单片机ADC0809+AD590温度检测、报警程序.docx(8页珍藏版)》请在冰豆网上搜索。
51单片机ADC0809+AD590温度检测、报警程序
[日期:
2009-06-11][来源:
net作者:
佚名][字体:
大中小](投递新闻)
#include"reg52.h"//头文件
#include"intrins.h"
#defineucharunsignedchar//宏定义
#defineuintunsignedint//宏定义
sbitRS=P1^0;//LCD1602定义I/O的硬件接口
sbitRW=P1^1;//LCD1602定义I/O的硬件接口
sbitE=P1^2;//LCD1602定义I/O的硬件接口
sbitkey_1=P1^3;//按键1定义I/O的硬件接口////Alarm_Value;//温度报警值+1度
sbitkey_2=P1^4;//按键2定义I/O的硬件接口////Alarm_Value;//温度报警值-1度
sbitkey_3=P1^5;//按键3定义I/O的硬件接口
sbitkey_4=P1^6;//按键4定义I/O的硬件接口
sbitAD590_2=P1^7;//A定义I/O的硬件接口,通道选择//C、D接地
sbitkey_6=P3^7;//按键6定义I/O的硬件接口//控制温度报警标志位
//
sbitST=P3^0;//ST和ALE接在一起
sbitOE=P3^1;
sbitEOC=P3^2;
sbitCLK=P3^3;
sbitSPK=P3^4;//喇叭,蜂鸣器报警
sbitLED1=P3^5;//LED报警
sbitLED2=P3^6;
#defineDPDRP2//LCD1602并行数据输出接口定义
#defineDPDR_1P0//ADC0809并行数据输入接口定义
uchartemp;//最终温度值
unsignedlongtemp2;//平均温度
unsignedlongtemp1;//温度1,,AD590_1接IN0
unsignedlongtemp2;//温度2,,AD590_2接IN1
ucharAlarm_Value;//温度报警值
bitAlarm_Value_bit;//温度报警标志位
ucharcodeDispTab_1[]={'0','1','2','3','4','5','6','7','8','9'};//1602:
0-9数字
ucharcodeDispTab_2[]={0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00};//温度符号
ucharDispBuf[6];//6字节的显示缓冲区
charchar_char_1[]={"Temperature:
"};//定义字符串
voiddelay(uintz)//1ms延时
{
ucharx,x1;
for(;z>0;z--)
{
for(x=0;x<114;x++)
{
for(x1=0;x1<1;x1++);
}
}
}
voidwrite_Directive(uchara)//写LCD指令
{
RS=0;
RW=0;
delay(5);
E=0;
DPDR=a;
delay(5);
E=1;
delay(5);
E=0;
delay(5);
}
voidwrite_Data(uchara)//写LCD数据
{
RS=1;
RW=0;
delay(5);
E=0;
DPDR=a;
delay(5);
E=1;
delay(5);
E=0;
delay(5);
}
voidLCD_init()//LCD初始化
{uchari;
delay(15);
write_Directive(0x38);
delay(5);
write_Directive(0x38);
delay(5);
write_Directive(0x38);
write_Directive(0x01);
write_Directive(0x02);//初始化后数据地址为0x80;即第一行,第一个位置
write_Directive(0x0c);//不显示光标
//write_Directive(0x0f);//显示光标
write_Directive(0x80+0x00);//第一行第一位地址
for(i=0;i<16;i++)
{
write_Data(char_char_1[i]);//显示字符串"Temperature"
}
}
voidwrite_Data_String()//显示温度函数
{
uchari;
DispBuf[0]=temp/100;//显示十位
temp=temp%100;
DispBuf[1]=temp/10;//显示个位
temp=temp%10;
DispBuf[2]=temp%10;//显示小数点后一位:
0.0
DispBuf[0]=DispTab_1[i];//查表,取字符
i=DispBuf[1];
DispBuf[1]=DispTab_1[i];
i=DispBuf[2];
DispBuf[2]=DispTab_1[i];
write_Directive(0x80+0x40);//第二行,第一个位置地址
write_Data(DispBuf[0]);//第二行,第一个位置
write_Data(DispBuf[1]);//第二行,第二个位置
write_Data('.');//第二行,第三个位置
write_Data(DispBuf[2]);//第二行,第四个位置
write_Data(0x00);//第二行,第五个位置显示温度符号
}
voidADC0809_init()//ADC0809复位
{
ST=0;
OE=0;
SPK=1;
LED1=1;
TMOD=0x12;
TH0=0x216;
TL0=0x216;
TH1=(65536-40000)/256;
TL1=(65536-40000)%256;
TR1=0;
TR0=1;
ET0=1;
ET1=1;
EA=1;
}
voidt0(void)interrupt1using0
{
CLK=~CLK;
}
voidt1(void)interrupt3using0
{
TH1=(65536-40000)/256;
TL1=(65536-40000)%256;
SPK=~SPK;
LED1=~LED1;
}
voidtemp1_start()//启动温度1转换
{
AD590_2=0;//通道选择
ST=1;
delay
(1);//延时1ms
ST=0;
delay
(1);//延时1ms
ST=1;
delay
(1);//延时1ms
ST=0;
while(!
EOC);//查询转换结束否
_nop_();
_nop_();
OE=1;//OE=0,输出数据线呈高阻;OE=1,输出转换得到的数据。
delay
(1);//延时1ms
temp1=DPDR_1;
}
voidtemp2_start()//启动温度2转换
{
AD590_2=1;//通道选择
ST=1;
delay
(1);//延时1ms
ST=0;
delay
(1);//延时1ms
ST=1;
delay
(1);//延时1ms
ST=0;
while(!
EOC);//查询转换结束否
_nop_();
_nop_();
OE=1;//OE=0,输出数据线呈高阻;OE=1,输出转换得到的数据。
delay
(1);//延时1ms
temp2=DPDR_1;
}
voidtemp1_Calculated()//温度1计算
{
temp1=(temp1*2350/128)-2732;
}
voidtemp2_Calculated()//温度2计算
{
temp2=(temp2*2350/128)-2732;
}
voidTemperature_Alarm()//温度报警
{
if(Alarm_Value_bit==1)
{
if(Alarm_Value==temp)
TR1=1;//启动定时器1
else
{
SPK=1;
LED1=1;
TR1=0;
}
}
else
{
SPK=1;
LED1=1;
TR1=0;
}
}
voidkey_Detection()//按键检测
{
if(key_6==0)
{
delay(20);//延时20ms
while(!
key_6);
delay(20);//延时20ms
Alarm_Value=~Alarm_Value;
//break;
}
///////////////////////////////////////////
if(key_1==0)
{
delay(20);//延时20ms
while(!
key_1);
delay(20);//延时20ms
if(Alarm_Value>=100)
{
temp=99;
return;
}
else
{
Alarm_Value++;
return;
}
}
///////////////////////////////////////////
if(key_2==0)
{
delay(20);//延时20ms
while(!
key_2);
delay(20);//延时20ms
if(Alarm_Value<=0)
{
Alarm_Value=0;
return;
}
else
{
Alarm_Value--;
return;
}
}
}
voidmain()
{uchari;
ADC0809_init();//ADC0809复位
LCD_init();//LCD复位
delay(5);//延时
for(i=0;i<8;i++)
{
write_Directive(0x40+i);//写入温度符号
write_Data(DispTab_2[i]);
}
while
(1)
{
key_Detection();//按键检测
temp1_start();//启动温度1转换
temp2_start();//启动温度2转换
temp1_Calculated();//温度1计算
temp2_Calculated();//温度2计算
temp=(temp1+temp2)/2;//取温度1和温度2的平均值
Alarm_Value=temp;
Temperature_Alarm();//温度报警条件查询
write_Data_String();//显示温度
}
}
1.温度传感器AD590基本知识
AD590产生的电流与绝对温度成正比,它可接收的工作电压为4V-30V,检测的温度范围为-55℃-+150℃,它有非常好的线性输出性能,温度每增加1℃,其电流增加1uA。
AD590温度与电流的关系如下表所示
摄氏温度AD590电流经10KΩ电压
0℃273.2uA2.732V
10℃283.2uA
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 51 单片机 ADC0809 AD590 温度 检测 报警 程序
![提示](https://static.bdocx.com/images/bang_tan.gif)