《通过DS18B20测试环境温度.doc》由会员分享,可在线阅读,更多相关《通过DS18B20测试环境温度.doc(13页珍藏版)》请在金锄头文库上搜索。
1、/通过DS18B20测试当前环境温度, 并通过数码管显示当前温度值, 目前显示范围: 0.0 +99.9度#include#include #define uchar unsigned char#define uint unsigned int#define DATAPORT P0 /定义P0口为Led数据口/#define SETTEMP P1 /定义P1口为设定温度#define SELECT P2 /定义P2口为选择信号sbit L1 = P11; /灯作为电机sbit L2 = P12;sbit L3 = P13;sbit DQ = P34; /定义ds18b20通信端口 char N
2、um10=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;/09int temp1,temp2,ID=0,set=0,blink;int temp1=27,xs=5; /定义整数和小数unsigned int max,mid,min,flag;/下面是小板的地址/大板对应为0xc700,0xc600,0xc500/#define led_data XBYTE0xe000 /显示数据端口#define led_sel XBYTE0xc000 /显示器选择端#define key_addr XBYTE0xa000 /按键端口 /uchar d10
3、=0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0x0F8,0x80,0x90;/仿真时用到/*延时K*1ms,*/*12.000mhz11.0596有误差*/void delayms(int ms) uchar i;while(ms-) for(i=250;i0;i-);/*ds18b20延迟子函数(晶振11.0596MHz )*/void delay_18B20(unsigned int i)while(i-);/*ds18b20初始化函数*/void Init_DS18B20(void) unsigned char x=0;DQ = 1; /DQ复位 ds18b2
4、0通信端口 delay_18B20(8); /稍做延时DQ = 0; /单片机将DQ拉低delay_18B20(80); /精确延时 大于 480usDQ = 1; /拉高总线delay_18B20(4);x=DQ; /稍做延时后 如果x=0则初始化成功 x=1则初始化失败delay_18B20(20);/*ds18b20读一个字节*/unsigned char ReadOneChar(void)uchar i=0;uchar dat = 0;for (i=8;i0;i-) DQ = 0; / 高电平拉成低电平时读周期开始 dat=1; DQ = 1; / 给脉冲信号 if(DQ) dat|=
5、0x80; / | * delay_18B20(4); return(dat);/*ds18b20写一个字节*/void WriteOneChar(uchar dat) unsigned char i=0; for (i=8; i0; i-) DQ = 0; /从高电平拉至低电平时,写周期的开始 DQ = dat&0x01; /数据的最低位先写入 delay_18B20(5); /60us到120us延时 DQ = 1; dat=1; /从最低位到最高位传入/*读取ds18b20当前温度*/void ReadTemperature(void)unsigned char a=0;unsigned
6、 char b=0;unsigned char t=0;Init_DS18B20();WriteOneChar(0xCC); / 跳过读序号列号的操作WriteOneChar(0x44); / 启动温度转换delay_18B20(100); / this message is wery importantInit_DS18B20();WriteOneChar(0xCC); /跳过读序号列号的操作WriteOneChar(0xBE); /读取温度寄存器等(共可读9个寄存器) 前两个就是温度delay_18B20(100);a=ReadOneChar(); /读取温度值低位b=ReadOneCha
7、r(); /读取温度值高位temp1=b4; /低8位中的高4位值加上高8位中后三位数的值 temp1室温整数值temp2=a&0x0f; /小数的值/ temp=(b*256+a)4); /当前采集温度值除16得 实际温度值 xs=temp2*0.0625*10; /小数位,若为0.5则算为5来显示 xs小数/上、下限温度值可自动保存,掉电不会丢失。?/写暂存存储器 写暂存存储器 复制暂存存储器 ?/显示/void display(int T) led_sel=0xef; /选通LED4 1 led_data=0x01; delayms(1); led_sel=0xf7; /3 灯 c le
8、d_data=0x39; delayms(1); led_sel=0xfb; /2 灯 /小数位 led_data=0x3f; delayms(1); led_sel=0xfd; /1 灯 led_data=NumT%10+128; delayms(1); led_sel=0xfe; /0 灯 led_data=NumT/10; delayms(1); led_sel=0xef; /选通LED4 1 led_data=0x00; delayms(1);/* for(i=12;i0;i-) led_sel=0x00; / led_data=0x00; delayms(1);*/*void dis
9、playmax(void) int i;for(i=12;i0;i-) led_sel=0xef; /选通LED4 1 led_data=0x01; delayms(1); led_sel=0xf7; /3 灯 c led_data=0x39; delayms(1); led_sel=0xfb; /2 灯 /小数位 led_data=0x3f; delayms(1); led_sel=0xfd; /1 灯 led_data=Nummax%10+128; delayms(1); led_sel=0xfe; /0 灯 led_data=Nummax/10; delayms(1);for(i=12;
10、i0;i-) led_sel=0x00; / led_data=0x00; delayms(1);void displaymid(void) int i;for(i=12;i0;i-) led_sel=0xef; /选通LED4 2 led_data=0x40; delayms(1); led_sel=0xf7; /3 灯 c led_data=0x39; delayms(1); led_sel=0xfb; /2 灯 /小数位 led_data=0x3f; delayms(1); led_sel=0xfd; /1 灯 led_data=Nummid%10+128; delayms(1); le
11、d_sel=0xfe; /0 灯 led_data=Nummid/10; delayms(1);for(i=12;i0;i-) led_sel=0x00; / led_data=0x00; delayms(1);void displaymin(void) int i;for(i=12;i0;i-) led_sel=0xef; /选通LED4 3 led_data=0x08; delayms(1); led_sel=0xf7; /3 灯 c led_data=0x39; delayms(1); led_sel=0xfb; /2 灯 /小数位 led_data=0x3f; delayms(1); led_sel=0xfd; /1 灯