STC89C52单片机数字温度传感器设计 (温度传感器是DS18B20) 寻高手帮在C语言程序中加个报警程序。急需。

因为是期末大作业。所以望在这一周周末前可以搞定!!谢谢。。。谢谢了
答案发邮箱 QQ1904695561@qq.com
STC89C52单片机设计温度传感器(用数码管显示温度) 在如下C语言程序中。加个温度报警程序,温度报警范围是25~30℃

或者你也可以自己设计 适合 STC89C52单片机 的 数字温度传感器 C语言程序 和
Protues仿真。最好有PPT说明和WORD说明
如果答案正确。设置合理。再加20分!!!!!悬赏80。。。总悬赏100分!!万分感谢。。。急急急如意令!!!!!!!!!!!

Protues仿真,C语言程序 所用 软件 见截图

#include <reg51.h>

sbit DQ=P3^2;
sbit BEEP=P1^5;

unsigned char presence;

unsigned char code LEDData[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff};
unsigned char data temp_data[2]={0x00,0x00};
unsigned char data display[5]={0x00,0x00,0x00,0x00,0x00};
unsigned char code ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};

void beep();
sbit DIN=P0^7;
bit flash=0;

void Delay(unsigned int num)
{
while (--num);
}

Init_DS18B20(void)
{
DQ=1;
Delay(8);

DQ=0;
Delay(90);

DQ=1;
Delay(8);

presence=DQ;
Delay(100);
DQ=1;

return(presence);
}

ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat=0;

for (i=8;i>0;i--)
{
DQ=0;
dat>>=1;
DQ=1;

if(DQ)
dat |=0x80;
Delay(4);
}
return(dat);
}

WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
Delay(5);

DQ=1;
dat>>=1;
}
}

Read_Temperature(void)
{
Init_DS18B20();
if(presence==1)
{ beep();flash=1;}
else
{
flash=0;
WriteOneChar(0xCC);
WriteOneChar(0x44);

Init_DS18B20();
WriteOneChar(0xCC);
WriteOneChar(0xBE);

temp_data[0]=ReadOneChar();
temp_data[1]=ReadOneChar();
}
}

Disp_Temperature()
{
unsigned char n=0;

display[4]=temp_data[0]&0x0f;
display[0]=ditab[display[4]];

display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);
display[3]=display[4]/100;
display[1]=display[4]%100;
display[2]=display[1]/10;
display[1]=display[1]%10;

if(!display[3])
{
display[3]=0x0a;
if(!display[2])
display[2]=0x0a;
}

P0=0xc6;
P2=0x7f;
Delay(300);

P0=0x9c;
P2=0xbf;
Delay(300);

P0=LEDData[display[0]];
P2=0xdf;
Delay(300);

P0=LEDData[display[1]];
DIN=0;
P2=0xef;
Delay(300);

P0=LEDData[display[2]];
P2=0xf7;
Delay(300);

P0=LEDData[display[3]];
P2=0xfb;
Delay(300);

P2=0xff;
}

void beep()
{
unsigned char i;
for(i=0;i<100;i++)
{
Delay(60);
BEEP=!BEEP;
}
BEEP=1;
}

void main(void)
{
while(1)
{
Read_Temperature();
if(flash==0)
{
Disp_Temperature();
}
else P2= 0xff;
}
}

第1个回答  2012-05-23
#include<reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define upzero 1
#define downzero 0
uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar code seg[]={0xfe,0xfd,0xfb}; //加了PNP的情况下的段选
sbit DQ=P3^3;
sbit led=P1^1;
sbit DIN=P0^7;//小数点
//sbit LE=P3^0;
uint temperature;
uint wendu,flag=0;

void delay(uchar k)
{
while(--k);
}

void delay1(uint k)
{
uint i,j;
for(i=0;i<k;i++)
for(j=0;j<121;j++);
}

void time0_init()
{
TMOD=0x01;
EA=1;
ET0=1;
TR0=1;
TH0=-30000/256;//定时50毫秒
TL0=-30000%256;
}

/*void init_display()//上电时数码管的显示
{

P2=0xff;
delay(3);
} */

void display(uint k)//显示温度
{
uchar ge,shi,bai;
ge=k%10;
shi=k/10%10; //shiwei
bai=k/100;

if(!flag)//温度为负数
{
P2=seg[0];
P0=0xbf;//负号 显示"-"
delay1(4);
P2=0xff;

P2=seg[1];
P0=tab[k/10%10];
delay1(4);
P2=0xff;

P2=seg[2];
P0=tab[k%10];
//DIN=0;
delay1(4);
P2=0xff;

/*P2=seg[3];
P0=tab[0];
delay1(4);
P2=0xff;
*/
}
if(flag)//温度为正数 由于实际的焊的板子只有三个数码管 所以,没加“+” 了。如 45.0度
{
//DIN=1;
P2=0xff;
P2=seg[0];
P0=tab[0];
delay1(4);
P2=0xff;

P2=seg[1];
P0=tab[ge];
DIN=0; // 问题问什么 加小数点要在P2口上加才能正常显示。
delay1(4);

DIN=1;
P2=0xff;
P2=seg[2];
P0=tab[shi];
delay1(4);
P2=0xff;

}
}
/*
每次读写前对DS18B20进行复位初始化。复位要求主CPU将数据线下拉500μ
,然后释放,DS18B20收到信号后等待16 - 60us然后60-240us的存在低脉冲
脉冲,主CPU收到此信号后表示复位成功。
*/
initial_ds18b20()//返回为0表示初始化成功
{
uchar j=0;
DQ=1;//这两条语句用不用不关紧要
delay(4);
DQ=0;
delay(180);//精确延时 730us 检测总线上是否有480-960微秒的低电平出现
delay(200);
DQ=1;
delay(15);//35us 如果有总线转为高电平后等待15-60微秒自动将总线电平拉低60-240微秒做出响应存在脉冲
j=DQ;
delay(50);//105us 至少要100秒以上
//return(j);
}

uchar read_byte(void)
{
uchar i=0,dat;
for(i=0;i<8;i++)
{
DQ=0;
delay(5);//15us
DQ=1;
if(DQ)
dat=(dat>>1)|0x80;//读1
else
dat=((dat>>1))|0x00;//读0
delay(25);
}
return(dat);
}

void write_byte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
DQ=0;
delay(5);//15us
DQ=dat&0x01;//从低位到高位 一位一位的写入DS18B20,即控制它的工作方式
delay(10);//写所需时间
DQ=1;
dat>>=1;
delay(2);
}
delay(1);
}

uchar readwendu(void)
{

//float tt;
uint j=200;
uchar templ=0,temph=0;

initial_ds18b20();
write_byte(0xcc);//跳过ROM
write_byte(0x44);
while(--j);
initial_ds18b20();
write_byte(0xcc);
write_byte(0xbe);
templ=read_byte();//低位
temph=read_byte();//高位

if(temph>0x7f)//处理数据 负数
{
temph=~temph;
templ=~templ+1;
flag=downzero;
temph<<=4; //
temph+=(templ&0xf0)>>4;//
wendu=temph;//
delay(10);
}
else //正数
{
flag=upzero;
temph<<=4; // 左移四位 留一位符号位 因为高五位为符号位
temph+=(templ&0xf0)>>4;//低八位的高四位 即低八位的整数部分 再与temph相加得到一个新的八位
wendu=temph;
delay(10);
}
return(wendu);
}

void main()
{
time0_init();
//init_display();
while(1)
{

temperature=readwendu();
display(temperature);
TR0=1;

}
}

void time0() interrupt 2 //50毫秒判断 温度
{

TR0=0;
TH0=-30000/256;
TL0=-30000%256;

if(temperature>25 || temperature<30)
led=~led;
delay(10);

}
这是我做的 能用。 用LED报警 你也可以添加个声音报警,温度都读出来了,加个报警那是很容易的事,真心怀疑这个程序是不是你自己写的追问

程序不是我写的..对报警一窍不通....我弄的那个单片机板子是4个数码管..

追答

不好意思,我只给提示:用定时器隔50ms 检测温度是否超出自己设定的值,若是则启动报警

第2个回答  2012-05-22
好像已经有报警的功能了吧追问

说真的、、没有。可以帮设计一个吗??谢谢。。。

追答

对不起 没学过

第3个回答  2012-05-23
太简单 没意思追问

我对你的回答保留怀疑态度。。。。。。。

追答

对你很无语,不过看你写的文字这么有激情,给你个思路吧:DS18B20这个程序很多书上都有介绍,你们图书馆可以去找本看看,至于你要的报警就更简单了,在温度范围自己设置个边界,至于具体的要求,就要自己想算法,不过你也应该就在PROTES上弄弄,不会自己搭个电路板

追问

我们实验是用自己焊的单片机STC52板子。其实单片机 我没学到多少。因为C语言程序底子根本没打好。不然我也不会这么煞费苦心的求助了。。真真是书到用时方很少( ⊙ o ⊙ )啊!。。哎

追答

C语言无非就3种 语句,多理解就通。先把电路搭好,测试通过了再编程

...温度传感器是DS18B20) 寻高手帮在C语言程序中加个报警程序。急需...
DIN=0; \/\/ 问题问什么 加小数点要在P2口上加才能正常显示。delay1(4);DIN=1;P2=0xff;P2=seg[2];

求STC89C52单片机与DS18B20传感器用Keil c语言设计程序
str[1]=tab[temp%10]; \/\/个位温度 if(flag_get==1) \/\/定时读取当前温度 { temp=ReadTemperature();flag_get=0;} } } void tim(void) interrupt 1 using 1\/\/中断,用于数码管扫描和温度检测间隔 { TH0=0xef;\/\/定时器重装值 TL0=0xf0;num++;if (num==50){num=0;flag_get=1;\/...

求STC89C52单片机和DS18B20温度传感器的程序代码,用四位共阴数码管显示...
\/\/温度传感器18B20汇编程序,采用器件默认的12位转化 \/\/ \/\/最大转化时间750微秒,显示温度-55到+125度,显示精度 \/\/ \/\/为0.1度,显示采用4位LED共阳显示测温值 \/\/ \/\/P0口为段码输入,P34~P37为位选 \/\/ \/***\/ include "reg51.h"include "intrins.h" \/\/_nop_();延时函数用 ...

我需要stc89c52单片机ds18b20温度控制的c语言程序,要求可显示当前温度...
DQ=dat&0x01;\/\/从字节的最低位开始传输 \/\/指令dat的最低位赋予给总线,必须在拉低总线后的15us内,\/\/因为15us后DS18B20会对总线采样。delay(10);\/\/必须让写时序持续至少60us 65us DQ=1;\/\/释放总线 dat>>=1;delay(1);} } void read_rom(){ unsigned char i=0;while(resetds());w...

51单片机温度传感器ds18b20、lcd1602液晶C程序
必要操作:连接传感器DS18B20到U6 \/ pragma db code include<AT89X52.H> include "INTRINS.H"define BUSY1 (DQ1==0) \/\/定义busy信号 sbit LED_0=P1^0;\/\/定义数码管控制脚为P1口的0-3脚 sbit LED_1=P1^1;sbit LED_2=P1^2;sbit LED_3=P1^3;sbit DQ1=P3^5;\/\/定义18B20单总...

...用到的是STC89C52和DS18B20,请问有软件程序和论文吗?
DS18B20的测温电路很简单,它只有3个脚,一个是VCC,一个是接地,还有一个就是数据口了,数据口一般要接一个上拉电阻,然后接到单片机的一个I\/O口就行了,至于获取温度的程序,你百度下就能找到了。先自己找找吧,这样你也能学到点东西。

关于《基于STC89C52单片机的智能温控系统》,求大神帮忙写一下代码...
write_data(0x30+shi);write_data(0x30+ge);} 给你贴一个LCD的控制程序,其余的还是自己做吧,没用过你那个温度传感器,你看一下它给的时序图,再查一下资料,写一个读温度传感器串口数据的程序就行了,把数据直接赋给我程序中的num,就可以显示了。至于温度报警,你自己写个if之类的就行了 ...

智能型即热式热水器的控制主程序设计
本设计运用80C51单片机系统为主控制芯片。其外围电路主要由水温检测和A\/D转换,晶闸管控制、水温和状态显示、按键输入以及稳压电源等部分组成该热水器的工作原理为:温度传感器及有关电路将电热水器出口温度转化为电压,单片机利用本身具有的AD转换器将测得的模拟量转换为数字量,再转化为与之对应的温度值。...

求STC89C52单片机的详细资料?包括引脚功能,存储器等等的详细介绍,越...
1、STC89C52单片机,支持USB口或者是串口两种下载程序方式 不用另买烧写器 编程器等产品 可以方便的烧写程序到单片机里.2、USB供电系统,直接插接到电脑USB口即可提供电源,不需另接直流电源 。3、8位LED发光二极管(做 跑马灯实验 交通灯实验 )。4、8位数码管(可做数码管的静态和动态扫描显示实验 如...

怎么用单片机来设计温度传感器?
DS18B20是最简单的测温元件,像三极管一样,直接接单片机,网上多得是程序。有材料的半小时就能写出基本像样的程序。LM35测量温度也不错,不过这需要ADC才行。

相似回答