查看: 110|回复: 1
打印 上一主题 下一主题

单片机 ds18b20单线多点测量温度在已经知道rom号后那么匹配???

[复制链接] qrcode

1

主题

1

帖子

5

积分

新手上路

Rank: 1

积分
5
楼主
跳转到指定楼层
发表于 2013-6-29 05:15 AM | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机 ds18b20单线多点测量温度在已经知道rom号后那么匹配???如果有这单片机 ds18b20单线多点测量温度的代码可不可以给小弟下。学习学习。。。。。。。谢谢~~~~~350631096@qq.com #include #include #include #define uchar unsigned char #define uint unsigned int uchar table[] = " temperature: "; unsigned char str; sbit ds = P2^2; sbit rw = P1^1; sbit RS = P1^0; sbit LCDEN = P2^5; sbit beep = P2^3; void delayUs() //delay 2微秒 { _nop_(); } void delayMs(uint a) //delay a*221微秒 { uint i, j; for(i = a; i > 0; i--) for(j = 100; j > 0; j--); } //-------------------------------------LCD1602------------ void writeComm(uchar comm) { RS = 0; //输入指令 P0 = comm; LCDEN = 1; delayUs(); LCDEN = 0; delayMs(1); } //写数据:RS=1, RW=0; void writeData(uchar dat) { RS = 1; //输入数据 P0 = dat; LCDEN = 1; delayUs(); LCDEN = 0; delayMs(1); } void init() { rw = 0;//写操作 writeComm(0x38);//功能设置:0000DLXREXX DL=1为8位MPU控制方式;RE=0为基本指令集; writeComm(0x0c);//显示开关设置:00001DCB D=1整体显示打开;C=1游标显示关闭;B=0游标反白关闭 writeComm(0x06); //输入方式设置:000001I/DS I/D=1游标右移;S=0画面不整体移位 writeComm(0x01); //清屏:DDRAM填满20H(0)并且DDRAM-AC到00H } void writeString(uchar * str, uchar length) { uchar i; for(i = 0; i < length; i++) { writeData(str[i]); } } //----------------------------------------------------------------- /**//*****************************DS18B20*******************************/ /*产生复位脉冲初始化DS18B20*/ void dsInit() { unsigned int i; ds = 0; i = 100; /*拉低约900us*/ while(i>0) i--; ds = 1; //产生上升沿 i = 4; while(i>0) i--; } /*等待应答脉冲*/ void dsWait() { unsigned int i; while(ds); while(~ds);//检测到应答脉冲 i = 4; while(i > 0) i--; } /*读取数据的一位,满足读时隙要求*/ bit readBit() { unsigned int i; bit b; ds = 0; i++; ds = 1; i++; i++; //延时15us以上,读时隙下降沿后15us,DS18B20输出数据才有效 b = ds; i = 8; while(i>0) i--; return b; } /*读取数据的一个字节*/ unsigned char readByte() { unsigned int i; unsigned char j, dat; dat = 0; for(i=0; i<8; i++) { j = readBit(); dat = (j << 7) | (dat >> 1); } return dat; } /*写数据的一个字节,满足写1和写0的时隙要求*/ void writeByte(unsigned char dat) { unsigned int i; unsigned char j; bit b; for(j = 0; j < 8; j++) { b = dat & 0x01; dat >>= 1; //取下一位(由低位向高位) if(b) { /*写1*/ ds = 0; i++; i++; //延时,使得15us以内拉高 ds = 1; i = 8; while(i>0) i--; //整个写1时隙不低于60us } else { /*写0*/ ds = 0; i = 8; while(i>0) i--; //保持低在60us到120us之间 ds = 1; i++; i++; } } } /*启动温度转换*/ void sendChangeCmd() { dsInit(); //产生复位脉冲,初始化DS18B20 dsWait(); //等待DS18B20给出应答脉冲 delayMs(1); //延时 writeByte(0xcc); //跳过ROM指令 writeByte(0x44); //开始转换温度转换好的温度放到暂存器字节0 1 } /*读取暂存器数据*/ void sendReadCmd() { dsInit(); dsWait(); delayMs(1); writeByte(0xcc); //跳过ROM指令 writeByte(0xbe);//读取暂存器命令 } /*得到ds18b20中的16位温度*/ int getTmpValue() { unsigned int tmpvalue; int value; float t; unsigned char low, high; sendReadCmd(); low = readByte(); high = readByte(); tmpvalue = high; tmpvalue <<= 8; tmpvalue |= low; value = tmpvalue; t = value * 0.0625; value = t * 100 + (value > 0 ? 0.5 : -0.5); //大于0加0.5, 小于0减0.5 return value; } void display(int v,uchar add) { unsigned char count; unsigned char datas[] = {0, 0, 0, 0, 0}; unsigned int tmp = abs(v); datas[0] = tmp / 10000; datas[1] = tmp % 10000 / 1000; datas[2] = tmp % 1000 / 100; datas[3] = tmp % 100 / 10; datas[4] = tmp % 10; writeComm(0xc0+add); if(v < 0) { writeString("- ", 2); } else { writeString("+ ", 2); } if(datas[0] != 0) { writeData('0'+datas[0]); } for(count = 1; count != 5; count++) { writeData('0'+datas[count]); if(count == 2) { writeData('.'); } } } /**//*****************************DS18B20*******************************/ void beepp(int tmp) { if(tmp>=3300)//当温度超过33度,蜂鸣器便会报警。 { beep=0; } else { beep=1; } } void matchROM1(void) { dsInit(); delayMs(1); writeByte(0x55); // match rom delayMs(1); writeByte(0x6D); //28 2F 49 2E 04 00 00 6D (匹配的顺序是不是反了应该先28????) writeByte(0x00); writeByte(0x00); writeByte(0x04); writeByte(0x2E); writeByte(0x49); writeByte(0x2F); writeByte(0x28); display(getTmpValue(),0); } void matchROM2(void) { dsInit(); delayMs(1); writeByte(0x55); // match rom delayMs(1); writeByte(0x08); //28 90 AF 2E 04 00 00 08 writeByte(0x00); writeByte(0x00); writeByte(0x04); writeByte(0x2E); writeByte(0xAF); writeByte(0x90); writeByte(0x28); display(getTmpValue(),8); } void main() { sendChangeCmd(); init(); writeComm(0x80);/*数据写入位置第一行一列 */ writeString(table, 16); while(1) { delayMs(1000); //温度转换时间需要750ms以上 writeComm(0xc0); /*数据写入位置第二行*/ matchROM1(); matchROM2(); sendChangeCmd(); beepp(getTmpValue()); } }
回复

使用道具 举报

0

主题

2

帖子

6

积分

新手上路

Rank: 1

积分
6
沙发
发表于 2013-7-7 10:33 AM | 只看该作者
这个程序调试好的吗,我也想知道。                                                                                                                                                                       
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表