|
51单片机DS18B20温度上下限报警的仿真原理图,用74ls245驱动数码管显示(proteus仿真工程文件可到本帖附件下载):
51单片机DS18B20温度上下限报警源代码:
- #include<reg51.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit DIO=P1^7;
- uchar data dis_buf[6]; //显示缓冲区
- uchar code table[18]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, //显示的代码表
- 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0x00};
- void dl_1ms( ) //延时1ms
- { data unsigned int d;
- for(d=0;d<120;d++);
- }
- void display( ) //显示函数
- { data uchar bitcode, i;
- bitcode=0xfe;
- for(i=0;i<6;i++)
- { P2=table[dis_buf[i]];
- P3=bitcode;
- dl_1ms( );
- P3=0xff;
- bitcode=bitcode<<1;
- bitcode=bitcode|0x01;
- }
- }
- void delay_5us(uchar y) //(2.17*y+5)微妙延时
- { while(--y);
- }
- void delay() //延时1000ms
- { uchar i;
- for(i=0;i<140;i++)
- { display();
- }
- }
- void OneWireWByte(uchar x) //向总线写一个字节x
- { uchar i;
- for(i=0;i<8;i++)
- { DIO=0; //拉低总线
- _nop_(); //要求大于1微妙,但不超过15微妙
- _nop_();
- if(0x01&x)
- { DIO=1; //如果最低位为1,则将总线拉高
- }
- delay_5us(30); //延时60--120微妙
- DIO=1; //释放总线
- _nop_(); //要求大于1微妙
- x=x>>1; //移位,准备发送下一位
- }
- }
- uchar OneWireRByte(void) //从一总线上读一个字节,返回读到的内容
- { uchar i,j;
- j=0;
- for(i=0;i<8;i++)
- { j=j>>1;
- DIO=0; //拉低总线
- _nop_(); //要求大于1微妙,但不超过15微妙
- _nop_();
- DIO=1; //释放总线
- _nop_();
- _nop_();
- if(DIO==1) //如果搞电平
- { j=j|0X80;
- }
- delay_5us(30); //延时60--120微妙
- DIO=1; //释放总线
- _nop_(); //要求大于1微妙
- }
- return j;
- }
- void DS18B20_int(void) //初始化DS18B20
- { DIO=0;
- delay_5us(255); // 延时480--960微妙
- DIO=1; //释放总线
- delay_5us(30); //延时60--120微妙
- if(DIO==0)
- { delay_5us(200); //要求释放总线后480微妙内结束复位
- DIO=1; //释放总线
- OneWireWByte(0xcc); //发送Skip ROM命令
- OneWireWByte(0x4e); //发送写暂存RAM命令
- OneWireWByte(0x00); //温度报警上限设为0
- OneWireWByte(0x00); //温度报警下限设为0
- OneWireWByte(0x7f); //将DS18B20设为12位,精度为0.25
- DIO=0;
- delay_5us(255); // 延时480--960微妙
- DIO=1; //释放总线
- delay_5us(240); //要求释放总线后480微妙内结束复位
- DIO=1; //释放总线
- }
- }
- uint DS18B20_readtemp() //读DS18B20的温度值
- { uint temp;
- uchar DS18B20_temp[2]; //温度数据
- DIO=0;
- delay_5us(255); // 延时480--960微妙
- DIO=1; //释放总线
- delay_5us(30); //延时60--120微妙
- if(DIO==0)
- { delay_5us(200); //要求释放总线后480微妙内结束复位
- DIO=1;
- OneWireWByte(0xcc); //发送Skip ROM命令
- OneWireWByte(0x44); //发送温度转换命令
- DIO=1;
- delay( ); //延时1000ms
- DIO=0;
- delay_5us(255); // 延时480--960微妙
- DIO=1;
- delay_5us(30); //延时60--120微妙
- if(DIO==0)
- { delay_5us(200); //要求释放总线后480微妙内结束复位
- DIO=1;
- OneWireWByte(0xcc); //发送Skip ROM命令
- OneWireWByte(0xbe); //发送读暂存RAM命令
- DS18B20_temp[0]=OneWireRByte(); //读温度的低字节
- DS18B20_temp[1]=OneWireRByte(); //读温度的高字节
- temp=256*DS18B20_temp[1]+DS18B20_temp[0];
- temp=temp/16;
- DIO=0;
- delay_5us(255); //// 延时480--960微妙
- DIO=1;
- delay_5us(240); //要求释放总线后480微妙内结束复位
- DIO=1;
- }
- return temp;
- }
- }
-
- void main( ) //主函数
- { uint temp;
- DS18B20_int();
- dis_buf[0]=16; dis_buf[1]=16;
- dis_buf[2]=0; dis_buf[3]=0;
- dis_buf[4]=0; dis_buf[5]=0;
- display( );
- while(1)
- { temp=DS18B20_readtemp();
- dis_buf[2]=temp/1000;
- dis_buf[3]=(temp%1000)/100;
复制代码
该系列源码包含有很多非常经典,代码风格十分规范,而且注释详细的单片机例程,还带仿真,对于MCU学习特别是初学者是很有帮助的,全部源码下载(共几十个项目):http://www.51hei.com/bbs/dpj-80575-1.html
本例程下载(含proteus仿真工程文件与源码):
单片机DS18B20温度上下限报警.rar
(54.79 KB, 下载次数: 62)
|
|