实验任务十温度检测系统设计(DS18B20) 熟悉用KeilC51、PROTEUS软件进行电路及控制系统的仿真。学会利用温度传感器DS18B20检测温度,利用单片机显示温度。 二、实训内容: 1、实训任务: 1)任务描述: 设计一个数字式温度计,要求使用温度传感器(可以采用DS18B20测量温度,再经单片机处理后,LED数码管显示测量的温度值。测温范围为-10~85℃,精度误差在0.5℃以内。 2)任务分析: 如上图所示,系统以51单片机为控制核心,加上温度检测传感器DS18B20。利用DS18B20集成温度传感器检测温度,然后通过串口送到单片机中进行数据处理变换,最后将温度值显示在LED显示器上。 3)任务实施: 1)在PROTEUS软件中按图搭接好电路; 2)在Keil软件中编辑程序,进行编译,得到.HEX格式文件; 3)将所得的HEX格式文件在PROTEUS中指定到MCU芯片中; 4)运行仿真,观察仿真结果; 5)PROTEUS中结果正常后,用实际硬件搭接并调试电路,通过编程器将.HEX格式文件下载到AT89C51中,通电验证实验结果。 汇编程序如下所示:(C程序请参考教材)
- #include <reg52.h>
- //#include <intrins.h>
- sbit IO_18B20 =P2^0;
- unsigned char wei[]={0x1,0x2,0x4,0x8};
- char temp_data,temp_data1;
- unsigned char duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf};
- unsigned char disp[]={5,0,0,0};
- //void delayx10us(unsigned char t);
- void delay_ms( int x);
- void write18b20(unsigned char dat);
- void tempchange(void);
- void display();
- void display1();
- bit read_bit();
- bit Init_Ds18b20();
- unsigned char read18b20();
- int get18b20temp();
- void main()
- {
- P0=0Xff;
- P3=0Xff;
- while(1)
- {
- tempchange();
- temp_data=get18b20temp()/16; // 取整数部分
- if(temp_data<0&&temp_data>=(-10)) //如果读取到的值大于负10小于 0,显示负号且将值转换为正数
- {
- disp[0]= 16;
- temp_data=0-temp_data; //将负数转换为正数
- }
- else
- {disp[0]=temp_data/100;}
- temp_data1=temp_data%100;
- disp[1]=temp_data1/10;
- disp[2]=temp_data1%10;
- disp[3]=12; //显示温度单位C
- if((temp_data>=(-10))&&(temp_data<=(85))) //如果读取到的数值的范围在-10~85之间,就显示出来
- {
- display();
- }
- }
- }
- bit Init_Ds18b20() //初始化DS18B20
- {
- unsigned int i;
- bit ack;
- IO_18B20=0;
- for(i=0;i<100;i++);
- IO_18B20=1;
- for(i=0;i<4;i++);
- for(i=0;i<20;i++)
- {ack=IO_18B20;if(ack==1)break;}
- for(i=0;i<80;i++);
- return (ack);
- }
- //bit Init_Ds18b20()
- //{
- // bit ack;
- // IO_18B20 = 0;
- // delayx10us(50);
- // IO_18B20 = 1;
- // delayx10us(6);
- // ack = IO_18B20;
- // while(!IO_18B20);
- // return ack;
- //}
- void write18b20(unsigned char dat) //向DS18B20写一个字节,dat为待写入字节
- {
- unsigned int i;
- unsigned char j;
- bit test;
- for(j=0;j<8;j++)
- {
- test=dat&0x01;
- dat=dat>>1;
- if(test)
- {
- IO_18B20=0;
- i++;i++;
- IO_18B20=1;
- for(i=0;i<8;i++);
- }
- else
- {
- IO_18B20=0;
- for(i=0;i<8;i++);
- IO_18B20=1;
- i++;i++;
- }
- }
- }
- //void write18b20(unsigned char dat) //向DS18B20写一个字节,dat为待写入字节
- //{
- // unsigned char i;
- // for(i=0;i<8;i++)
- // {
- // IO_18B20 = 0;
- // _nop_();
- // _nop_();
- // IO_18B20 = 1;
- // _nop_();
- // _nop_();
- // IO_18B20 = dat & 0x01;
- // delayx10us(6);
- // IO_18B20 = 1;
- // dat >>= 1;
- // }
- //}
- bit read_bit() //从DS18B20读取一位数据
- {
- unsigned int i;
- bit dat;
- IO_18B20=0;
- i++;
- IO_18B20=1;
- i++;i++;
- dat=IO_18B20;
- for(i=0;i<8;i++);
- return (dat);
- }
- unsigned char read18b20() //从DS18B20读取一个字节,dat为读到的字节
- {
- unsigned char j,h,dat;
- dat=0;
- for(h=0;h<8;h++)
- {
- j=read_bit();
- dat=(j<<7)|(dat>>1);
- }
- return (dat);
- }
- //unsigned char read18b20() //从DS18B20读取一个字节,dat为读到的字节
- //{
- // unsigned char i;
- // unsigned char dat=0;
- // for(i=0 ; i<8 ; i++)
- // {
- // IO_18B20 = 0;
- // _nop_();
- // _nop_();
- // IO_18B20 = 1;
- // dat >>= 1;
- // if(!IO_18B20)
- // dat |= 0x80;
- // delayx10us(6);
- // IO_18B20 = 1;
- // _nop_();
- // }
- // return dat;
- //}
- int get18b20temp() //读取DS18B20转换的温度值
- {
- int temp;
- unsigned char a,b;
- Init_Ds18b20();
- delay_ms(1);
- write18b20(0xcc);
- write18b20(0xbe); //写读温度命令
- a=read18b20();
- b=read18b20();
- temp=b;
- temp<<=8;
- temp=temp|a;
- return temp;
- }
- void tempchange(void) //向DS18B20发送转换指令
- {
- Init_Ds18b20();
- delay_ms(1);
- write18b20(0xcc); //跳过ROM
- write18b20(0x44); //启动温度转换
- }
- void display() //显示函数
- {
- P3=wei[0];
- P0=duan[disp[0]];
- delay_ms(1);
- P3=wei[1];
- P0=duan[disp[1]];
- delay_ms(1);
- P3=wei[2];
- P0=duan[disp[2]]&0X7F; //第三位显示小数点
- delay_ms(1);
- P3=wei[3];
- P0=duan[disp[3]];
- delay_ms(1);
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
全部资料51hei下载地址: |