基于89c51单片机数字温度计设计图和c语言程序,用DS18B20温度传感器和数码管。qq:609347745

作者&投稿:戈阀 (若有异议请与网页底部的电邮联系)
基于mcs51单片机数字温度计设计图和c语言程序,用DS18B20温度传感器和数码管。QQ834831800~

#include
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P3^7;//ds18b20与单片机连接口
sbit RS=P2^6;
sbit RW=P2^5;
sbit EN=P2^7;
uchar code str1[]={"temperature: "};
uchar data disdata[5];
uint tvalue;//温度值
uchar tflag;//温度正负标志
/*************************lcd1602程序**************************/
void delay1ms(uchar ms)//延时1毫秒(不够精确的)
{
uchar i;
uchar j;
for(i=0;i<ms;i++)
for(j=0;j<100;j++);
}

void wr_com(uchar com)//写指令//
{
delay1ms(1);
RS=0;
RW=0;
EN=0;
P0=com;
delay1ms(1);
EN=1;
delay1ms(1);
EN=0;
}

void wr_dat(uchar dat)//写数据//
{
delay1ms(1);
RS=1;
RW=0;
EN=0;
P0=dat;
delay1ms(1);
EN=1;
delay1ms(1);
EN=0;
}

void lcd_init()//初始化设置//
{
delay1ms(15);
wr_com(0x38);
delay1ms(5);
wr_com(0x08);
delay1ms(5);
wr_com(0x01);
delay1ms(5);
wr_com(0x06);
delay1ms(5);
wr_com(0x0c);
delay1ms(5);
}

void display(uchar *p)//显示//
{
while(*p!='\0')
{
wr_dat(*p);
p++;
delay1ms(1);
}
}
void init_play()//初始化显示
{
lcd_init();
wr_com(0x80);
display(str1);

}

/******************************ds1820程序***************************************/
void delay_18B20(uint i)//延时1微秒
{
while(i--);
}
void ds1820rst()/*ds1820复位*/
{
uchar x=0;
DQ = 1;//DQ复位
delay_18B20(4); //延时
DQ = 0;//DQ拉低
delay_18B20(100); //精确延时大于480us
DQ = 1;//拉高
delay_18B20(40);
}
/****************************************************
18b20读数据
*****************************************************/
uchar ds1820rd()/*读数据*/
{
uchar i = 0;
uchar dat = 0;
for (i=8 ; i>0 ; i--)
{
DQ = 0; //给脉冲信号
dat>>=1;
DQ = 1; //给脉冲信号
if(DQ)
dat|=0x80;
delay_18B20(10);
}
return(dat);
}
/**************************************************
18b20写数据
**************************************************/
void ds1820wr(uchar wdata)/*写数据*/
{
uchar i = 0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = wdata&0x01;
delay_18B20(10);
DQ = 1;
wdata>>=1;
}
}
/*****************************************************
读温度并转换
******************************************************/
uint read_temp()/*读取温度值并转换*/
{
uchar a,b;
ds1820rst();
ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0x44);//*启动温度转换*/
ds1820rst();
ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0xbe);//*读取温度*/
a=ds1820rd();
b=ds1820rd();
tvalue=b;
tvalue<<=8;
tvalue=tvalue|a;
if(tvalue<0x0fff)
tflag=0;
else
{
tvalue=~tvalue+1;
tflag=1;
}
tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数
return(tvalue);
}

/*******************************************************************
显示温度
********************************************************************/
void ds1820disp()//温度值显示
{
uchar flagdat;
disdata[0]=tvalue/1000+0x30; //百位数
disdata[1]=tvalue%1000/100+0x30;//十位数
disdata[2]=tvalue%100/10+0x30;//个位数
disdata[3]=tvalue%10+0x30;//小数位
if(tflag==0)
flagdat=0x20;//正温度不显示符号
else
flagdat=0x2d;//负温度显示负号:-
if(disdata[0]==0x30)
{
disdata[0]=0x20;//如果百位为0,不显示
if(disdata[1]==0x30)
{
disdata[1]=0x20;//如果百位为0,十位为0也不显示
}
}
wr_com(0xc0);
wr_dat(flagdat);//显示符号位
wr_com(0xc1);
wr_dat(disdata[0]);//显示百位
wr_com(0xc2);
wr_dat(disdata[1]);//显示十位
wr_com(0xc3);
wr_dat(disdata[2]);//显示个位
wr_com(0xc4);
wr_dat(0x2e);//显示小数点
wr_com(0xc5);
wr_dat(disdata[3]);//显示小数位
}

/********************主程序***********************************/
void main()
{
init_play();//初始化显示
while(1)
{
read_temp();//读取温度
ds1820disp();//显示
}
}

请参考《单片机原理与应用-基于汇编、C51及混合编程》一书的第327-339页的案例,案例分析的相当细致,容易明白。该书以STC12C5A60S2为主线介绍,这一款单片机内部功能多,适合于竞赛和产品设计,该书的特点:各个例题的原理图与实际电路图一致,标出了各器件的参数,给出了汇编、C51两种编程的详解,该书例题的程序编写思路符合于产品设计,最后一章给出了两个完整的实例,可指导初学者入门。

sbit DQ=P1^6; //采集温度数据线

unsigned char tflag;

unsigned int tive;

float temper;

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

函数功能:短暂延时

入口参数:num

出口参数:

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

void delay(unsigned int num)

{

while(num--);

}

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

函数功能:DS18B20初始化

入口参数:

出口参数:

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

void init_DS18B20(void)

{

//主机发送复位脉冲

DQ=1;

DQ=0;

delay(600); //x

DQ=1;

//等待DS18B20发送应答信号

delay(60); //防止DS18B20本身问题而读不出数据采用确认法

while(!DQ);

// delay(480); //DS18B20本身没有问题,可以延时将应答过程忽略

}

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

函数功能:读一个字节

入口参数:

出口参数:

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

readchar(void) //从低位开始读

{

unsigned char i=0;

unsigned char dat=0;

for(i=0;i<8;i++)

{

DQ=1;

DQ=0;

delay(10);  //CPU缓冲时间  采样时间 

dat>>=1; //从高到低先存放一位数据

   DQ=1;

if(DQ) //如果是1,将数据存放

dat|=0x80;

DQ=1;

delay(9); //数据读取时间,下一次数据读取前需要延时

}

return(dat);

}

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

函数功能:写一个字节

入口参数:

出口参数:

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

writechar(unsigned char dat)

{

unsigned char i=0;

for(i=0;i<8;i++)

{

DQ=1;

DQ=0; //等待接收缓冲区的来临,整个过程的时间为60~120us

delay(15); //

DQ=dat&0x01; //第一次写最低位,将字节变为位

delay(15); // 

dat>>=1;    //准备写入下一位数据。

}

}

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

函数功能:读取温度

入口参数:

出口参数:

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

read_temperature(void)

{

unsigned int a,b;

init_DS18B20(); //初始化子程序

writechar(0xcc); //写入指令

writechar(0x44);

init_DS18B20();

writechar(0xcc);

writechar(0xbe);

a=readchar(); //低八位

b=readchar(); //高八位

tive=b;

tive<<=8;

tive=tive|a;

if(tive>0x0800)   //温度为负温度第13位到15为为1,温度为正温度   //第13位到15为为0,所以值小于0x800说明为正温度

tive=~tive+1;  

else

tive=tive;

temper=tive*0.0625;  //采用12位分辨率所以每次的增量是0.0625

temper=temper*10; //保留小数点后面一位

return(temper);  

}



汇编语言行么?这是我大三的课程设计。图是protel的。

已加你Q


89c51单片机外中断两种触发方式的区别,各适用于何种情况
0’。三、适用性不同 1、电平触发方式:适合于外部中断以低电平输入而且中断服务程序能清除外部中断请求源(即外部中断输入电平又变为高电平)的情况。2、跳沿触发方式:适合于以负脉冲形式输入的外部中断请求。参考资料来源:百度百科-外部中断 参考资料来源:百度百科-中断处理 ...

89C51单片机的P0~P3端口进行输入时为什么要设置为1?
89C51单片机的P0~P3口不是标准意义的双向口 ,他只是准双向口 你可以对照着P0口的结构图看这段话,向端口写1,就是向锁存器写1,也就是让其口输出FF,为什么,是这样的,给锁存器写1,那么锁存器 的反向端就输出0,那么和它相接的MOS管也就在截止状态,也就是呈高 阻态,这样P0口上数据...

单片机89c51、89 c52、89s51之间的最大区别是什么?
89C51和89C52的区别是51的FLASH为4K,52和8K;89C51\/89C52和89S51的区别是:C系列需要强电擦写程序,需要把电压提到十几伏(还是多少来着,忘记了。反正我当时做的下载器需要MC34063升压才行)才能下载程序。S系列则不需要,买个USB ASP就可以下载了。电脑有并口的话更加简单,用一片74芯片就可以了 ...

AT89C51与AT89S51的区别
MHZ和33 MHZ的最大工作频率。)因此它具有更快的计算速度。5.更宽的功率范围 AT89S51工作电压范围,高达4-5.5V,而AT89C51底部4.8V,高于5.3V时正常运行。6.更强的抗干扰性 AT89S51内部集成看门狗定时器,而AT89C51需要外部看门狗定时器电路,或使用单片机内部定时器组成软件看门狗,实现软件抗干扰。

89C51单片机输出电流是多少?
51单片机的IO口每个引脚的电流驱动能力比较弱:①拉电流:即单片机引脚置高电平时对外输出的电流,不超过1毫安。②灌电流:即单片机引脚置低电平时对外吸收的电流,不超过10毫安。这些都是教科书上那个单片机的驱动电流,现在增强型51推挽输出能达到20ma,具体还是看数据手册。89C51是一种带4K字节闪烁可编程...

89C51单片机的最小系统的构成?
单片机最小系统,或者称为最小应用系统,是指用最少的元件组成的单片机可以工作的系统. 对51系列单片机来说,最小系统一般应该包括:单片机、电源、晶振电路、复位电路。单片机89C51单片机一片。电源5V直流电源1个。晶振电路包括12MHz晶振1只、30pF瓷片电容2只。复位电路10uF电解电容1只,4k7电阻1只。

89c51单片机的功能是什么
1、89C51是单芯片微型计算机。具备计算机的基本四要素。(裸机,没有系统的电脑,没用)2、并且提供了足够的接口,允许硬件上进一步扩展。 (有USB等接口,可连接其他设备)3、但还构不成计算机系统。需要编写软件来完善软件系统。(装操作系统,和应用软件,可用且丰富)89C51单片机真正强大的地方就表现...

51单片机80c5和89c51的区别?
但80C51是intel公司的产品,是第一代标准的51单片机,内部有4KB的掩膜ROM,出厂时就固化了程序,现在早就没有了。而89C51,有AT89C51,是ATMEL的产品,还有国产的STC89C51。这两个也完全兼容,内部有4KB的FLASH程序存储器ROM。AT89C51也早停产了,目前只有国产的STC89C51在市场上销售,并多为初学者使用。

单片机89C51中断源有哪些?
否能任意设定?INT0:0003H T0:000BH INT1:0013H T1:001BH 串口:0023H 地址是固定的,不能任意设定。简述单片机89C51中断的自然优先级顺序,如何提高某一中断源的优先级别。自然优先级顺序由高到底是:INT0-T0-INT1-T1-串口 提高优先级别只要设定相应的中断优先级寄存器,将对应位置1.

单片机命名问题:89C51
MCS-51是51单片机核心构架的代号。80C51是之所有的带ROM的单片机,同样80C31是指片内没有ROM的单片机 80C51中87C51是指单片机ROM是紫外擦除、12V编程的单片机;89C51是Atmel先改进的,使用5V就能擦写编程的单片机,并且89系列命名方法被其他单片机生产厂采用,比如SM89C51,SST89C58等等。

通辽市13525626316: 急求基于单片机AT89C51的数字温度报警器,具有上下限的在 - 20度到70度之间的汇编程序或C语言程序!拜托 -
尉侨米可: ;单片机DS18B20温度计C语言程序 #include<reg51.h>#include<intrins.h>#include <math.H> //要用到取绝对值函数abs() //通过DS18B20测试当前环境温度, 并通过数码管显示当前温度值, 目前显示范围: -55~ +125度sbit wela = P2^7...

通辽市13525626316: 求单片机 基于AT89C51单片机的温度采集显示系统设计
尉侨米可: 推荐:01 基于单片机的数字报警温度计( http://ishare.iask.sina.com.cn/f/11655563.html ); 实时显示温度 ; 高于高限,低于低限,进行声光报警 ; 温度高低限可自由设定 ; 上电显示 543210 ; 读出温度后实时显示温度 ; 温度高于上限温度时,显示"HH****", 并进行声光报警 ; 温度低于下限温度时,显示"LL****", 并进行声光报警 ; 设定键 进行高低限设定 循环为 "实时温度" “L ***” “H ***” ; 可用+ -键进行修改报警值

通辽市13525626316: 单片机at89c51编写温湿度监控程序 -
尉侨米可: 找到温湿度探测器,了解探测器的输出指标,连接到C51的中断脚,编程,不断查询中断,根据探测器的输出,编码成8段码,输出.并设置一个告警值,达到告警值,输出全8.闪耀.

通辽市13525626316: 数字温度计的设计开题报告及设计啊 -
尉侨米可: 传统的温度计有反应速度慢、读数麻烦、测量精度不高、误差大等缺点而下面利用集成温度传感器AD590设计并制作了一款基于AT89C51的4位数码管显示的数字温度计,其电路简单,软硬件结构模块化,易于实现. 该数字温度计利用AD590集成温度传感器及其接口电路完成温度的测量并转换成模拟电压信号,经由模数转换器ADC0804转换成单片机能够处理的数字信号,然后送到单片机AT89C51中进行处理变换,最后将温度值显示在D4、D3、D2、D1共4位七段码LED显示器上. 系统以AT89C51单片机为控制核心,加上AD590测温电路、ADC模数转换电路、4位温度数据显示电路以及外围电源、时钟电路等组成.

通辽市13525626316: 关于制作简易数字温度计 -
尉侨米可: 单片机89C51,ADC0832,铂电阻测温PT1000,外接的稳压电源TL431,一些外围的器件电阻电容晶振,LED显示的话需要LED驱动IC,或者用IO口控制三极管来驱动LED,温度上限下限设定在程序中,到了限制就用IO口点亮发光二极管或者驱动小蜂鸣器,这些都是典型的,网上有不少例程

通辽市13525626316: 基于数字温度传感器的数字温度计的汇编语言程序. -
尉侨米可: 用c很简单 ,/******************************** FILE NAME: DS18B20.c CHIP TYPE: ATMEGA16 CLOCK FREQUENCY: 8MHZ IDE: VSMStudio COMPILER: AVR-GCC TIME: September 2010********************************/#include #include #define ...

通辽市13525626316: 如何用ad89c51单片机制作温度控制器 -
尉侨米可: 一个温度传感器+单片机+输出,输出看你控制什么,如电器工作就一个继电器,电热丝就用可控硅吧

通辽市13525626316: 基于AT89C51单片机和DS18B20温度传感器实现温度监控系统和预警功能 附上原理图和程序 -
尉侨米可: 你好:带温度上下限设置、温度报警、温度检测、时间的时分秒设置、时间显示的仿真和程序,你要的功能单一了,我找不到以前的程序了,就这个可以么?需要的话回复我,我给你DSN和程序.希望我的回答能帮助到你.

通辽市13525626316: 基于单片机的数字温度计设计 -
尉侨米可: 按你的要求设计了程序并且通过ProteUS仿真 无偿提供原理图,ProteUS仿真工程(可运行),供参考运行效果,及原理图的设计. 推荐:01 基于单片机的数字报警温度计( http://ishare.iask.sina.com.cn/f/11655563.html ); 源程序为汇编 ; ...

通辽市13525626316: 求单片机(AT89c51和DS18B20)做数字温度计程序和仿真硬件截图!!!! -
尉侨米可: 18B20数字温度显示系统 综合实验:用18B20(数字温度采集)74LS47(数码管译码)74LS138(三八译码) DS18B20是DALLAS公司生产的一线式数字温度传感器,具有3引脚TO-92小体积封装形式;温度测量范围为-55℃~+125℃,可编程...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网