历史上的今天
返回首页

历史上的今天

今天是:2025年01月14日(星期二)

正在发生

2018年01月14日 | 51单片机ADC0809+AD590温度检测、报警程序

2018-01-14 来源:eefocus

#include "reg52.h"//头文件
#include "intrins.h"
#define uchar unsigned char//宏定义
#define uint unsigned int//宏定义 
sbit RS=P1^0;//LCD1602定义I/O的硬件接口
sbit RW=P1^1;//LCD1602定义I/O的硬件接口
sbit E=P1^2;//LCD1602定义I/O的硬件接口

sbit key_1=P1^3;//按键1定义I/O的硬件接口////Alarm_Value;//温度报警值+1度
sbit key_2=P1^4;//按键2定义I/O的硬件接口////Alarm_Value;//温度报警值-1度
sbit key_3=P1^5;//按键3定义I/O的硬件接口
sbit key_4=P1^6;//按键4定义I/O的硬件接口
sbit AD590_2=P1^7;//A定义I/O的硬件接口,通道选择//C、D接地
sbit key_6=P3^7;//按键6定义I/O的硬件接口//控制 温度报警标志位

//

sbit ST=P3^0; //ST和ALE接在一起
sbit OE=P3^1; 
sbit EOC=P3^2; 
sbit CLK=P3^3; 
sbit SPK=P3^4; //喇叭,蜂鸣器报警
sbit LED1=P3^5; //LED报警
sbit LED2=P3^6;


#define DPDR P2//LCD1602并行数据输出接口定义
#define DPDR_1 P0//ADC0809并行数据输入接口定义

uchar temp;//最终温度值

unsigned long temp2;//平均温度 
unsigned long temp1;//温度1,,AD590_1接IN0
unsigned long temp2;//温度2,,AD590_2接IN1

uchar Alarm_Value;//温度报警值
bit Alarm_Value_bit;//温度报警标志位


uchar code DispTab_1[]={'0','1','2','3','4','5','6','7','8','9'};//1602:0-9 数字
uchar code DispTab_2[]={0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00};//温度符号
uchar DispBuf[6]; //6字节的显示缓冲区
char char_char_1[]={" Temperature: "};//定义字符串


void delay(uint z)//1ms延时

uchar x,x1;
for(;z>0;z--)
{
for(x=0;x<114;x++)
{
for(x1=0;x1<1;x1++);
}
}
}


void write_Directive(uchar a)//写LCD指令
{
RS=0;
RW=0;
delay(5);
E=0;
DPDR=a;
delay(5);
E=1;
delay(5);
E=0;
delay(5);
}

void write_Data(uchar a)//写LCD数据
{
RS=1;
RW=0;
delay(5);
E=0;
DPDR=a;
delay(5);
E=1;
delay(5);
E=0;
delay(5);

}

void LCD_init()//LCD初始化
{ uchar i;
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 "
}
}

void write_Data_String()//显示温度函数

uchar i;
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);//第二行,第五个位置显示温度符号

}

void ADC0809_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; 
}

void t0(void) interrupt 1 using 0 

CLK=~CLK; 
}

void t1(void) interrupt 3 using 0 

TH1=(65536-40000)/256; 
TL1=(65536-40000)%256; 
SPK=~SPK;
LED1=~LED1;
}

void temp1_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; 
}

void temp2_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; 
}

void temp1_Calculated()//温度1 计算
{
temp1=(temp1*2350/128)-2732;
}

void temp2_Calculated()//温度2 计算
{
temp2=(temp2*2350/128)-2732;
}

void Temperature_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;
}
}

void key_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;
}
}
}

void main()
{ uchar i;

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.2 uA  2.732V  
10℃  283.2 uA  2.832 V  
20℃  293.2 uA  2.932 V  
30℃  303.2 uA  3.032 V  
40℃  313.2 uA  3.132 V  
50℃  323.2 uA  3.232 V  
60℃  333.2 uA  3.332 V  
100℃  373.2 uA  3.732 V 


实验任务 
   利用AD590温度传感器完成温度的测量,把转换的温度值的模拟量送入ADC0809的其中一个通道进行A/D转换,将转换的结果进行温度值变换之后进行监控。

由于AD590的温度变化范围在-55℃-+150℃之间,经过10KΩ之后采样到的电压变化在2.182V-4.232V之间,不超过5V电压所表示的范围,因此参考电压取电源电压VCC,(实测VCC=4.70V)。由此可计算出经过A/D转换之后的摄氏温度显示的数据为: 
   如果(D*2350/128)<2732,则显示的温度值为-(2732-(D*2350/128)) 
   如果(D*2350/128)≥2732,则显示的温度值为+((D*2350/128)-2732)


推荐阅读

史海拾趣

Alpha Wire公司的发展小趣事

Alpha Wire公司是一家在电子行业中知名的制造商,专注于生产高性能电线、电缆和线束。虽然我无法提供准确的发展故事,但我可以向你介绍一些关于Alpha Wire公司的背景和其在行业中的重要性。

  1. 公司成立:Alpha Wire公司成立于1922年,总部位于美国新泽西州。创始人是一位名叫韦尔纳·布雷德的工程师,他创立了Alpha Wire公司,旨在为不同领域的电子设备提供高质量的电线和电缆。

  2. 技术创新:Alpha Wire公司在其发展历程中一直致力于技术创新和产品质量的提升。公司不断投资于研发,并采用最新的材料和生产工艺,以确保其产品在性能和可靠性方面处于行业领先地位。

  3. 产品线扩展:随着时间的推移,Alpha Wire公司不断扩展其产品线,以满足不断变化的市场需求。除了标准的电线和电缆产品外,公司还开发了各种特种电线和线束,如耐高温、耐化学腐蚀、防火等特性的产品,以满足不同行业和应用的需求。

  4. 全球市场拓展:Alpha Wire公司在其发展过程中不断拓展其市场份额,通过建立全球分销网络和合作伙伴关系,将其产品销往世界各地。公司不仅在北美市场占据重要地位,还在欧洲、亚洲和其他地区建立了业务和生产基地,以更好地服务全球客户。

  5. 质量和可靠性:作为一家具有悠久历史的公司,Alpha Wire始终将质量和可靠性视为其产品的核心竞争力。公司严格遵循国际标准和质量管理体系,对原材料进行严格筛选和检验,并采用先进的生产工艺和严格的质量控制程序,以确保产品的稳定性和一致性。

以上是关于Alpha Wire公司的一些基本信息,虽然我无法提供具体的发展故事,但希望这些信息能够帮助你了解该公司在电子行业中的重要性和影响力。

3M公司的发展小趣事
  1. 起源和早期发展: 3M公司(Minnesota Mining and Manufacturing Company)创立于1902年,在美国明尼苏达州成立。最初,公司主要从事矿石开采和研磨业务,以及生产砂纸和磨粉。在早期几十年里,3M致力于技术创新和产品开发,包括防水砂纸、透明胶带等产品,为公司奠定了良好的发展基础。

  2. 科技创新和产品多样化: 20世纪中叶,3M公司持续推动科技创新,不断扩展产品线。其中,最著名的是1950年代推出的可粘贴便签纸(Post-it)和1960年代推出的微型胶带(Scotch-Brite),这些产品成为公司的标志性产品,极大地推动了其业务的发展。

  3. 国际化战略和全球扩张: 20世纪后半叶,3M公司加速了国际化战略,并在全球范围内扩张业务。通过收购和合作,公司进入了新的市场和领域,如医疗保健、电子、汽车、能源等。3M在全球建立了广泛的生产基地和研发中心,成为一家跨国企业。

  4. 持续创新和技术领导: 3M公司一直致力于持续创新和技术领导,投入大量资金用于研发和技术创新。公司不断推出新产品和解决方案,满足市场需求并保持竞争优势。特别是在电子领域,3M推出了许多创新产品,如电子材料、封装材料、导热材料等,为电子行业提供了关键的解决方案。

  5. 可持续发展和社会责任: 3M公司致力于可持续发展和社会责任,在全球范围内推动环保和社会公益事业。公司制定了一系列环保政策和计划,努力降低能源消耗、减少废物排放,并积极参与社区建设和公益活动,为社会做出积极贡献。

谷峰(GOFORD)公司的发展小趣事

在电子产品日益追求轻薄化、高效能的大背景下,GStek不断加大研发投入,致力于技术创新和产品研发。公司拥有一支由行业资深专家和年轻技术骨干组成的研发团队,他们紧密跟踪国际前沿技术动态,结合市场需求,不断推出具有自主知识产权的新产品。这些新产品不仅性能优异,而且成本效益显著,深受市场欢迎。通过持续的技术创新和产品升级,GStek在电源管理领域树立了良好的品牌形象。

BEI Sensors公司的发展小趣事

随着公司业务的不断发展,Beckhoff开始积极拓展全球市场。经过数十年的努力,公司的分支机构已经遍布世界各地,业务覆盖全球60多个国家。通过与全球合作伙伴的紧密合作,Beckhoff成功地将其自动化产品和解决方案推向全球市场,为全球客户提供优质的服务。

Anvo-Systems公司的发展小趣事

Anvo-Systems在发展过程中始终注重企业文化建设和社会责任履行。公司倡导创新、协作、诚信的企业精神,为员工创造了一个积极向上的工作环境。同时,Anvo-Systems还积极参与社会公益活动,关注环保和可持续发展等问题。通过这些举措,Anvo-Systems不仅提升了企业的社会形象,也为社会的和谐发展做出了积极贡献。


请注意,以上故事纯属虚构,不代表现实中任何公司或行业的真实情况。在实际应用中,应根据具体公司的历史和发展情况进行调整和完善。

Dean Technology公司的发展小趣事

随着产品技术的不断成熟,Dean Technology公司开始注重品牌建设和市场推广。他们积极参加各类电子展会,展示公司的最新产品和技术,与行业内外的客户建立联系。同时,公司还通过广告宣传、合作伙伴关系等方式,提高品牌知名度和美誉度。这些努力使得Dean Technology的高压二极管产品逐渐在市场上获得了认可。

问答坊 | AI 解惑

超声波测距系统的电路设计

一、引言 由于超声波指向性强,能量消耗缓慢,在介质中传播的距离较远,... …

查看全部问答>

关于NK.NB0下载的问题

我们通常都是通过eboot进入菜单选择U,然后通过dnw下载nk.bin的,其实,NK.NB0也可以直接下载到内存里面运行的,至少我用nor起来下载过NK.NB0运行的,这样有个好处,不用每次都烧写nand,效率高速度快。 但我手头的开发板没有nor,USB又不好使,我 ...…

查看全部问答>

想做智能小车 谁有好点的车模啊?~~

想做智能小车  谁有好点的车模啊?~~…

查看全部问答>

地址复用总线,内存和cpu的连接关系或特点

这个是我的面试题(软件方向),由于我硬件知识薄弱,面试官允许我搜集资料后再回答。 应该是入门或者典型的概念 (老式的)数据地址和指令地址共用同一条总线时,cpu和内存的连接关系或者要注意什么特点? 也许是问如何区分开数据和指令的 公 ...…

查看全部问答>

请教读串口的问题

我在Linux下用read()读串口时,若串口的数据中有0x0D时,发现无法读到0x0D后的数据,请教大家应该如何解决??? 串口设置如下,其他的数据位、校验等未设置 tcgetattr(spfd,&oldtio); cfmakeraw(&oldtio); cfsetispeed(&oldtio,B9600); cfs ...…

查看全部问答>

platform builder4.2 如何调试驱动程序??

platform builder4.2 如何调试驱动程序?? 我想让设备运行debug版wince,然后在串口驱动设置断点,之后单步调试,请问步骤如何,能否说得具体点.我编译时候选择kitl了,可是通过网口下载到设备后怎么设置断点啊??????? 搞了半个月了,晕倒了.大家帮忙看 ...…

查看全部问答>

protel 99 SE元件加载问题!!!

protel 99 se 里面的元件库大部分都不能加载(Add),加载时提示说“files not recognized!”,只能是Sch文件夹里的前面一些.DDB才能加进去,是不是要重新装载呀!!!请教各位大侠了。 问题算是简单,本人积分少,请谅解,还要问其他问题,呵呵…

查看全部问答>

100分紧急求助:USB HID类设备开发中用CreateFile无法得到设备句柄,如何解决?

利用开发板的资源做了一个USB接口的鼠标,就是用开发板上的一个摇杆作为鼠标方向的移动,另外用两个按键分别模拟鼠标的左键和右键。 现在想写上位机程序(VC6.0)对它进行读写,在得到了设备路径名之后,调用CreateFile总是失败,用GetLastError看 ...…

查看全部问答>