温度传感器18B20(串口显示)
扫描二维码
随时随地手机看文章
- /*温度传感器18B20--串口显示温度*/
- #include<reg52.h>
- #include <intrins.h>
- typedef unsigned char uint8;
- typedef unsigned int uint16;
- typedef char int8;
- typedef int int16;
- sbit DQ=P3^2; //温度输入口
- void nops()
- {
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- }
- void delay(uint16 n)
- {
- while(n--);
- }
- void delay_ms(uint16 n)
- {
- uint8 m=120;
- while (n--)
- while (m--);
- }
- void DS18b20_reset(void)
- {
- bit flag=1;
- while (flag)
- {
- DQ = 1;
- delay(1); //7.5us
- DQ = 0;
- delay(50); //139.8us
- DQ = 1;
- delay(6); // 21us
- flag = DQ;
- }
- delay(45); //延时500us
- DQ=1;
- }
- /*
- * 18B20写1个字节函数
- * 向1-WIRE总线上写一个字节
- */
- void write_byte(uint8 val)
- {
- uint8 i;
- for (i=0; i<8; i++)
- {
- DQ = 1;
- _nop_(); //两次传送间隔大于1us
- DQ = 0;
- nops(); //4us
- DQ = val & 0x01; //最低位移出
- delay(6); //66us (30US)
- val >>= 1; //右移一位
- }
- DQ = 1;
- delay(1);
- }
- /*
- * 18B20读1个字节函数
- * 从1-WIRE总线上读取一个字节
- */
- uint8 read_byte(void)
- {
- uint8 i, value=0;
- for (i=0; i<8; i++)
- {
- value >>= 1;
- DQ=1;
- _nop_();
- DQ = 0;
- nops(); //4us
- DQ = 1;
- nops(); //4us
- if (DQ)
- value|=0x80;
- delay(6); //66us
- }
- DQ=1;
- return value;
- }
- /*
- * 启动温度转换
- */
- void start_temp_sensor(void)
- {
- DS18b20_reset();
- write_byte(0xCC); // 发Skip ROM命令
- write_byte(0x44);// 发转换命令
- }
- /*
- * 读出温度
- */
- int16 read_temp(void)
- {
- uint8 temp_data[2]; // 读出温度暂放
- int16 temp;
- DS18b20_reset(); // 复位
- write_byte(0xCC); // 发Skip ROM命令
- write_byte(0xBE); // 发读命令
- temp_data[0]=read_byte(); //温度低8位
- temp_data[1]=read_byte(); //温度高8位
- temp = temp_data[1];
- temp <<= 8;
- temp |= temp_data[0];
- temp >>= 4; //注意是移动四位
- return temp;
- }
- /**
- * UART初始化
- * 波特率:9600
- */
- void uart_init(void)
- {
- TMOD = 0x21; // 定时器1工作在方式2(自动重装)
- SCON = 0x50; // 10位uart,允许串行接受
- TH1 = 0xFD;
- TL1 = 0xFD;
- TR1 = 1;
- }
- /**
- * UART发送一字节
- */
- void UART_Send_Byte(uint8 dat)
- {
- SBUF = dat;
- while (TI == 0);
- TI = 0;
- }
- /**
- * 将数据转换成ASC码并通过UART发送出去
- */
- void UART_Send_Dat(uint8 dat) //100度以下温度可用
- {
- UART_Send_Byte(dat/10%10 + '0');
- UART_Send_Byte(dat%10 + '0');
- }
- main()
- {
- int16 ans;
- uart_init();
- start_temp_sensor();
- while (1)
- {
- delay_ms (1000); // 延时1秒
- ans=read_temp();
- if (ans < 0)
- {
- UART_Send_Byte('-');
- ans = -ans;
- }
- UART_Send_Dat(ans);
- UART_Send_Byte('r');
- UART_Send_Byte('n');
- }
- }