基于DS18B20的52单片机的温度计设计.docx_第1页
基于DS18B20的52单片机的温度计设计.docx_第2页
基于DS18B20的52单片机的温度计设计.docx_第3页
基于DS18B20的52单片机的温度计设计.docx_第4页
基于DS18B20的52单片机的温度计设计.docx_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于单片机的ds18b20温度计设计/main.c 主程序#include #include #define dataport p0 /定义数据端口 程序中遇到dataport 则用p0 替换sbit latch1=p10;/定义锁存使能端口 段锁存sbit latch2=p11;/ 位锁存bit readtempflag;/定义读时间标志unsigned char code duanma10=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;/ 显示段码值09 共阴数码管 dp-aunsigned char code weima=0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f;/分别对应相应的数码管点亮,即位码unsigned char tempdata4; /存储显示值的全局变量void display(unsigned char firstbit,unsigned char num);/数码管显示函数void init_timer0(void);/定时器初始化void main (void) unsigned int temph,templ,temp;init_timer0();/定时器初始化while (1) /主循环 if(readtempflag=1) readtempflag=0; temp=readtemperature();/读取温度函数 if(temp&0x8000) tempdata0=0x40;/负号标志 temp=temp; / 取反加1 temp +=1; temph=temp4; templ=temp&0x0f; templ=templ*6.25/10;/小数近似处理 if(temph/10=0) tempdata1=0; /十位温度 else tempdata1=duanmatemph/10; tempdata2=duanmatemph%10|0x80; /个位温度,带小数点 tempdata3=duanmatempl; else temph=temp4; templ=temp&0x0f; templ=templ*6.25/10;/小数近似处理 if(temph/100=0) tempdata0=0; else tempdata0=duanmatemph/100; /百位温度 if(temph/100=0)&(temph%100)/10=0)/消隐 tempdata1=0;else tempdata1=duanma(temph%100)/10; /十位温度 tempdata2=duanma(temph%100)%10|0x80; /个位温度,带小数点 tempdata3=duanmatempl; void display(unsigned char firstbit,unsigned char num) static unsigned char i=0; dataport=0; /清空数据 latch1=1; /段锁存 latch1=0; dataport=weimai+firstbit; /取位码 latch2=1; /位锁存 latch2=0; dataport=tempdatai; /取显示数据,段码 latch1=1; /段锁存 latch1=0; i+; if(i=num) i=0;void init_timer0(void) /定时器初始化 tmod |= 0x01; /使用模式1,16位定时器 ea=1; /总中断打开 et0=1; /定时器中断打开 tr0=1; /定时器开关打开void timer0_isr(void) interrupt 1 /定时器中断程序 static unsigned int num; th0=(65536-2000)/256; /重新赋值 2ms tl0=(65536-2000)%256; display(0,4); / 调用数码管扫描 num+; if(num=300) / num=0; readtempflag=1; /读标志位置1/reg52.h#ifndef _reg52_h_#define _reg52_h_sfr p0 = 0x80;sfr p1 = 0x90;sfr p2 = 0xa0;sfr p3 = 0xb0;sfr psw = 0xd0;sfr acc = 0xe0;sfr b = 0xf0;sfr sp = 0x81;sfr dpl = 0x82;sfr dph = 0x83;sfr pcon = 0x87;sfr tcon = 0x88;sfr tmod = 0x89;sfr tl0 = 0x8a;sfr tl1 = 0x8b;sfr th0 = 0x8c;sfr th1 = 0x8d;sfr ie = 0xa8;sfr ip = 0xb8;sfr scon = 0x98;sfr sbuf = 0x99;/* 8052 extensions */sfr t2con = 0xc8;sfr rcap2l = 0xca;sfr rcap2h = 0xcb;sfr tl2 = 0xcc;sfr th2 = 0xcd;/* bit registers */* psw */sbit cy = psw7;sbit ac = psw6;sbit f0 = psw5;sbit rs1 = psw4;sbit rs0 = psw3;sbit ov = psw2;sbit p = psw0; /8052 sbit tf1 = tcon7;sbit tr1 = tcon6;sbit tf0 = tcon5;sbit tr0 = tcon4;sbit ie1 = tcon3;sbit it1 = tcon2;sbit ie0 = tcon1;sbit it0 = tcon0;sbit ea = ie7;sbit et2 = ie5; /8052 sbit es = ie4;sbit et1 = ie3;sbit ex1 = ie2;sbit et0 = ie1;sbit ex0 = ie0;/* ip */sbit pt2 = ip5;sbit ps = ip4;sbit pt1 = ip3;sbit px1 = ip2;sbit pt0 = ip1;sbit px0 = ip0;sbit rd = p37;sbit wr = p36;sbit t1 = p35;sbit t0 = p34;sbit int1 = p33;sbit int0 = p32;sbit txd = p31;sbit rxd = p30;sbit sm0 = scon7;sbit sm1 = scon6;sbit sm2 = scon5;sbit ren = scon4;sbit tb8 = scon3;sbit rb8 = scon2;sbit ti = scon1;sbit ri = scon0;sbit t2ex = p11; / 8052 sbit t2 = p10; / 8052 sbit tf2 = t2con7;sbit exf2 = t2con6;sbit rclk = t2con5;sbit tclk = t2con4;sbit exen2 = t2con3;sbit tr2 = t2con2;sbit c_t2 = t2con1;sbit cp_rl2 = t2con0;#endif/18b20.h#ifndef _ds18b20_h_#define _ds18b20_h_#include #define uchar unsigned char#define uint unsigned int;/*端口定义*/sbit dq=p13;/ds18b20 端口/*函数声明*/unsigned int readtemperature(void); bit init_ds18b20(void); unsigned char readonechar(void);void writeonechar(unsigned char dat);#endif/delay.c#ifndef _delay_h_#define _delay_h_/*微秒延时函数*/void delayus2x(unsigned char t);/*毫秒延时函数*/void delayms(unsigned char t);#endif/18b20.c#include #include /*18b20初始化*/bit init_ds18b20(void) bit dat=0; dq = 1; /dq复位 delayus2x(5); /稍做延时 dq = 0; /单片机将dq拉低 delayus2x(200); /精确延时 大于 480us 小于960us delayus2x(200); dq = 1; /拉高总线 delayus2x(50); /1560us 后 接收60-240us的存在脉冲 dat=dq; /如果dat=0则初始化成功, dat=1则初始化失败 delayus2x(25); /稍作延时返回 return dat;/*读取一个字节*/unsigned char readonechar(void)unsigned char i=0;unsigned char dat = 0;for (i=8;i0;i-) dq = 0; / 给脉冲信号 dat=1; dq = 1; / 给脉冲信号 if(dq) dat|=0x80; delayus2x(25); return(dat);/*写一个字节*/void writeonechar(unsigned char dat) unsigned char i=0; for (i=8; i0; i-) dq = 0; dq = dat&0x01; delayus2x(25); dq = 1; dat=1; delayus2x(25);/*读取温度函数*/unsigned int readtemperature(void)unsigned char a=0;unsigned int b=0;unsigned int t=0;init_ds18b20();/ds18b20初始化writeone

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论