简易数字温度计的设计_第1页
简易数字温度计的设计_第2页
简易数字温度计的设计_第3页
简易数字温度计的设计_第4页
简易数字温度计的设计_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

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

文档简介

1、下面是我本次课程设计的内容,报告还没有写,暂时上传仿真和程序啦!简易数字温度计的设计利用数字温度传感器与单片机结合来测量温度。利用数字温度传感器测量温度信号,计算后在LED数码管上显示相应的温度值。要求数字温度计所测量的温度采用数字显示,控制器采用单片机,测温传感器使用DS18B20,用3位共阳极LED数码管以串口传送数据,实现温度显示。图一仿真时,数码管会出现闪烁,修改程序没有作用。猜测是软件问题,换用图二数码管,正常程序仿真通过,下面是程序:#include reg52.h#define uint unsigned int#define uchar unsigned charuchar c

2、ode tab=0x81,0xcf,0x92,0x86,0xcc,0xa4,0xa0,0x8f,0x80,0x84,0xff;/0-9,正值uchar Tem3=0; /存储温度 uchar tempL,tempH;uchar Neg;/负值标志sbit DQ = P23; /DS18B20数据口unsigned int temp;void Delay_50ms(unsigned int t);void Delay(uint t);void Reset(void);void WriteByte(uchar dat);uint ReadByte(void);uint ReadTemp(void)

3、;void Display(void);/* 延时50ms,精确*/void Delay_50ms(unsigned int t)unsigned int j; for(;t0;t-) for(j=6245;j0;j-);/* 延时函数 约位10us*/void Delay(unsigned int i) while(i-);/*定时器初始化*/void timer_init(void) TMOD = 0x01; /定时器0工作在模式1,16Bit定时器模式 TH0 = (65536-50000) / 256; TL0 = (65536-50000) % 256; TR0 =1; /开定时器

4、ET0 =1;/开启定时器和中断/* DS18B20复位函数*/void Reset(void) DQ=1; /DQ先置高Delay(4); /延时sec=0.00047400DQ=0; /发送复位脉冲 sec=0.00052600Delay(60); /精确延时大于480ussec=0.00052700DQ=1; /拉高数据线 sec=0.00108300Delay(30); /等待(1560us)这里是等待DS18B20做出回应,如果回应DQ将变低,/MCU是在DQ拉高后开始监视DQ的值的。 /* DS18B20写一个字节函数*/void WriteByte(uchar dat) uint

5、 i; for(i=8;i0;i-) DQ=0; /先将DQ拉低,我们这里先不延时15us先,在下面的 delay(5)一起延了, /因为时序图它是一直保持低电平的 DQ=dat&0x01;/去数据的最低位,应为DS18B20是从低到高读的 Delay(8);/延时在60-120us之间 DQ=1; /将DQ拉高 dat=1;/右移一位 Delay(1);/这里延时1us以上/* DS18B20读一个字节函数*/uint ReadByte(void)uchar i,dat=0;/这里要付初值 for (i=8;i0;i-) DQ=1; /DQ稍微拉高,这不可有可无 Delay(1);/延时小会

6、,这里延时不严格 DQ=0; /按照时序图,将DQ拉低,先不延时,在下面delay(4)在一起延! dat=1;/右移一位 DQ=1; /释放一下总线,等待检查DQ值! if(DQ)/当DQ为1是执行下面,如果DQ为0,值不变。 dat=dat|0x80;/把低位先放在高位,然后右移8次,高位的数据就移到了低位,因为先写低位的! Delay(6);/延时60-120us return(dat);/返回dat值 /* DS18B20读温度程序*/uint ReadTemp(void) uint temperature; Reset(); /初始化 WriteByte(0xcc); /写SKIP

7、ROM(跳过检查ROM序列,当需要级联时需要检查) WriteByte(0x44); /写启动温度转换 Delay(60); /转换需要一点时间,延时大一点,应该大于500us Reset(); /初始化 WriteByte(0xcc); /写SKIP ROM(跳过检查ROM序列) WriteByte(0xbe); /读温度寄存器RAM(头两个值分别为温度的低位和高位) tempL=ReadByte(); /读出温度的低位LSB tempH=ReadByte(); /读出温度的高位MSB /温度转换,把高低位做相应的运算转化为实际温度 temperature=(tempH*256)+tempL

8、; /temperature=(tempH*256)+tempL)*0.625;/tempH*256的意思是tempH向左移8位0.0625扩大十倍,增加小数位 /Delay(200);/两次间隔转换的间隔要延时一下 return(temperature); /*发送数据、显示子函数*/void Display(void)uchar Num;Num=0;while(Num0x0fff) temp=temp+1; Neg=1; /判断温度正负 else Neg=0; temp=temp*0.625; */*显示部分也可以采用一般模式,定时器中断部分去掉,加上上面部分即可*/ Tem2=temp/100; /十位 Tem1=temp/10%10;/个位 Tem0=temp%10;/小数位 Display(); Delay_50ms(5);/*定时器0中断*/void timer0_int(void) interrupt 1 TR0=0; TH0 =(65536-50000) / 2

温馨提示

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

评论

0/150

提交评论