基于89c51单片机的单线多路DS18B20测温_第1页
基于89c51单片机的单线多路DS18B20测温_第2页
基于89c51单片机的单线多路DS18B20测温_第3页
基于89c51单片机的单线多路DS18B20测温_第4页
基于89c51单片机的单线多路DS18B20测温_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

1、基于 89C51 单片机的单线多路 DS18B20 多点测温Keil 文档 + Protuse 仿真这是写的第一篇文档,可能有些地方有点啰嗦,请多多交流。 关于 DS18B20的详细介绍我就不啰嗦了 本人所使用软件为 ISIS, keil4先看 Protuse 仿真图中使用了 1 个 89c51 单片机,两个 DS18B20 ,1个 74HC573寄存器,一排 8 个共阳数码 管,以及按键按键 1,2 用于两个温度之间切换按键一按下显示第一个 DS18B20温度以及其上下限按键二按下显示第二个 DS18B20温度以及其上下限其余四个按键用于调控温度上下限设置使用;附加 读取 DS18B20 的

2、序列号功能(使用不同的显示函数) 首先要在 Protuse 中设置 DS18B20的序列号 右键点击 DS18B20B8C534其中的序列号 4 以更改 更改后可以用软件 CRC计算器 其对应序列号 计算方式如图所示28 为其家族序列号 固定使用在 HEX 中输入 编码 点击 Calculate 记得到数值 52所以其完整序列号为: ROM1 = 0x28,0x34,0xC5,0xB8,0x00,0x00,0x00,0x52; 更改 protuse 中 ds18B20 的末位数字即可得到不同的序列号 在使用 Protuse 仿真之前应先设置 DS18B20de 序列号DS18B20驱动程序如下

3、/*DS18B20子函数#define uint unsigned int #define uchar unsigned char code unsigned char ROM1 = 0x28,0x34,0xC5,0xB8,0x00,0x00,0x00,0x52; code unsigned char ROM2 = 0x28,0x31,0xC5,0xB8,0x00,0x00,0x00,0xB9; /sbit DQ = P31;/ 单片机的 P3.1 与 ds18b20 数据端口连接在一起void delay(uint x)while(x-);void Init_DS18B20(void)uns

4、igned char x = 255;/ 先让 DQ = 1;/ 单片机将 DQ 拉低/ 延时 480960s/ 释放总线/ 等待返回的低电平响应,如果没有响应,/ 则做适量延时自动往下执行DQ = 1;DQ = 0; delay(80);DQ = 1; while(DQ & x-); delay(20);/ 读取温度unsigned char Read_OneChar(void) uchar i = 0; uchar dat = 0; for(i = 0;i 1;DQ = 1;if(DQ)/ 判断总线是否为高电平dat =dat | 0x80; / 如果是高电平则把 j 的最高位置 1,如果

5、不是置 0; delay(10); return(dat);/ 向 DS18b20 中写入一个字节 void Write_OneChar(unsigned char dat) uchar i = 0;for(i = 0;i 1; delay(8);void PP_SZ1()uchar i;Write_OneChar(0x55);for(i=0;i8;i+) / 发送序列号 Write_OneChar(ROM1i);void PP_SZ2()uchar i;Write_OneChar(0x55);for(i=0;i 4;b = b 4;dec = dec + x * 10;return(dec)

6、;读取 DS18B20的 ROM 值*/*uchar ID10;ID110;void Read_DS18B20_rom() uchar k; Init_DS18B20(); Write_OneChar(0x33);for(k= 0;k = 99)temp_up = 99;if(key4 = 0) delay(300); if(key4 = 0) key4_s = 1;if(key4 = 1)&(key4_s = 1) key4_s = 0; temp_up-;write_temprom(temp_up,temp_down); delay(20);if(temp_up = 98)temp_dow

7、n = 98;if(key6 = 0)delay(300);if(key6 = 0)key6_s = 1;if(key6 = 1)&(key6_s = 1) key6_s = 0; temp_down-;write_temprom(temp_up,temp_down);delay(20);if(temp_down = 8)cp2 = 0;void display1(void)P0 = 0xff; / 消隐 switch(cp2) / 显示case 0:P1_0 = 0;P0 = 0x01;P1_0 = 1;P1_0 = 0;P0 = seven_segtemp_num1 % 10%10;bre

8、ak;/ 显示个位并加上小数点 case 1:if(temp_num 0x80) & ( temp_num1 10)/ P1_0 = 0;P0 = 0x02;P1_0 = 1;P1_0 = 0;/ P0 = 0xbf; break; / 如果温度小于 10 度,且为负值,十位 0 不 显示,只显示 -/ P1_0 = 0;P0 = 0x02;P1_0 = 1;P1_0 = 0;P0 = seven_segtemp_num1 / 10 % 10;break; / 如果温度 大于 10 度,10 位正常显示case 2: P1_0 = 0;P0 = 0x04;P1_0 = 1;P1_0 = 0;P

9、0 = 0xbf|flash;break;case 3: P1_0 = 0;P0 = 0x08;P1_0 = 1;P1_0 = 0;P0 = seven_segtemp_down%10;break;case 4: P1_0 = 0;P0 = 0x10;P1_0 = 1;P1_0 = 0;P0 = seven_segtemp_down/10;break;case 5:P1_0 =0;P0 =0x20;P1_0 = 1;P1_0 = 0;P0 = 0xbf|flash;break;case 6:P1_0 =0;P0 =0x40;P1_0 = 1;P1_0 = 0;P0 = seven_segtem

10、p_up%10;break;case 7:P1_0 =0;P0 =0x80;P1_0 = 1;P1_0 = 0;P0 = seven_segtemp_up/10;break; void display2(void)P0 = 0xff;/ 消隐switch(cp2) / 显示 case 0:P1_0 = 0;P0 =0x01;P1_0 = 1;P1_0 = 0;P0 = seven_segID17%10;break;case 1:P1_0 =0;P0 =0x02;P1_0 = 1;P1_0 = 0;P0 = seven_segID17/10;break;case 2:P1_0 =0;P0 =0x

11、04;P1_0 = 1;P1_0 = 0;P0 = seven_segID16%10; ;break;case 3:P1_0 =0;P0 =0x08;P1_0 = 1;P1_0 = 0;P0 = seven_segID16/10;break;case 4:P1_0 =0;P0 =0x10;P1_0 = 1;P1_0 = 0;P0 = seven_segID15%10;break;case 5:P1_0 =0;P0 =0x20;P1_0 = 1;P1_0 = 0;P0 = seven_segID15/10;break;case 6:P1_0 =0;P0 =0x40;P1_0 = 1;P1_0 =

12、 0;P0 = seven_segID14%10;break;case 7:P1_0 =0;P0 =0x80;P1_0 = 1;P1_0 = 0;P0 = seven_segID14/10;break; void display3(void)P0 = 0xff;/ 消隐switch(cp2)/ 显示case 0:P1_0 = 0;P0 =0x01;P1_0 = 1;P1_0 = 0;P0 = seven_segID13%10;break;case 1:P1_0 = 0;P0 =0x02;P1_0 = 1;P1_0 = 0;P0 = seven_segID13/10;break;case 2:P

13、1_0 = 0;P0 =0x04;P1_0 = 1;P1_0 = 0;P0 = seven_segID12%10; ;break;case 3:P1_0 = 0;P0 =0x08;P1_0 = 1;P1_0 = 0;P0 = seven_segID12/10;break;case 4:P1_0 =0;P0 =0x10;P1_0 = 1;P1_0 = 0;P0 = seven_segID11%10;break;case 5:P1_0 =0;P0 =0x20;P1_0 = 1;P1_0 = 0;P0 = seven_segID11/10;break;case 6:P1_0 =0;P0 =0x40;

14、P1_0 = 1;P1_0 = 0;P0 = seven_segID10%10;break;case 7:P1_0 =0;P0 =0x80;P1_0 = 1;P1_0 = 0;P0 = seven_segID10/10;break;主函数 *#includereg51.hbit key_flag1 = 0,key_flag2 = 0; / 用于打开对应的 DS18B20 #include #include#include uchar cp,cp1,conv;中断服务函数 */调用 ds18b20 子函数 传参 / 得到温度小数/ 如果温度为负值/ 补码转换原码,小数处理/ 补码转换原码,整数处

15、理/ 小数转换为十进制void timer0_isr(void)interrupt 1TH0 = (65535 - 2000) / 255;TL0 = (65535 - 2000) % 255;cp+;if(cp = 250)cp1+;cp = 0;flash = flash;Read_DS18B20_rom(); read_temprom();temp_num= get_temp(); temp_dot = c * 0.625; if(temp_num & 0x80) = 0x80) temp_dot = (0x0f - c) * 0.625; temp_num1 = 0xff - temp_num;else temp_num1 = temp_num; if(cp1 = 5)cp1 = 0;conv+;if(conv = 2)conv = 0;key(); display0();/ 下面两个显示功能不同,使用时二者选其一 / if(key_flag1 = 1)|(key_flag2 = 1) / /if(conv = 0)display3();/else display2();/ 显示 ds18B20 序列号/ if(key_fla

温馨提示

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

评论

0/150

提交评论