用ds18b20测试温度并且显示在LCD1602上
2016-09-27 21:07
567 查看
主函数文件:
延时函数文件:
#include <reg52.h> #include <intrins.h> #include <stdio.h> #include "./delay/delay.h" sbit ds = P1^0; bit ack = 0; sbit RS = P2^4; sbit RW = P2^5; sbit E = P2^6; #define LCDPORT P0 #define LCD_WRITE_DATA 1 #define LCD_WRITE_COM 0 void lcd1602_write(unsigned char byte,unsigned char flag) { if(flag) { RS = 1; } else { RS = 0; } RW = 0; E = 1; LCDPORT = byte; delay_us(5); E = 0; } void lcd1602_dis_str(unsigned char x, unsigned char y, unsigned char *str) { if((x > 15) || (y > 1)) { return ; } if(0 == y) { lcd1602_write(0x80 + x,LCD_WRITE_COM); } else { lcd1602_write(0x80 + 0x40 + x,LCD_WRITE_COM); } while(*str != '\0') { lcd1602_write(*str,LCD_WRITE_DATA); str++; } } void lcd_init() { delay_ms(15); lcd1602_write(0x38,LCD_WRITE_COM); delay_ms(5); lcd1602_write(0x38,LCD_WRITE_COM); delay_ms(5); lcd1602_write(0x38,LCD_WRITE_COM); delay_ms(5); lcd1602_write(0x38,LCD_WRITE_COM); delay_ms(5); lcd1602_write(0x08,LCD_WRITE_COM); delay_ms(5); lcd1602_write(0x01,LCD_WRITE_COM); delay_ms(5); lcd1602_write(0x06,LCD_WRITE_COM); delay_ms(5); lcd1602_write(0x0c,LCD_WRITE_COM); delay_ms(5); } void ds_reset() { ds = 1; ds = 0; delay_us(200); delay_us(200); ds = 1; delay_us(30); if(0 == ds) { ack = 1; } else { ack = 0; } delay_us(200); delay_us(100); } void ds_send_byte(unsigned char byte) { unsigned char i; for(i = 0; i < 8; i++) { ds = 0; _nop_(); _nop_(); ds = byte & 0x01; byte >>= 1; delay_us(30); ds = 1; } delay_us(30); } bit ds_read_bit() { bit tmp; ds = 1; ds = 0; _nop_(); _nop_(); ds = 1; tmp = ds; delay_us(30); return tmp; } unsigned char ds_read_byte() { unsigned char i,j,k; for(i = 0; i < 8; i++) { j = ds_read_bit(); k = (j << 7) | (k >> 1); } return k; } void main() { unsigned char a; unsigned int temp; unsigned int b; float wendu; unsigned char disbuf[20]; lcd_init(); while(1) { ds_reset(); ds_send_byte(0xcc); ds_send_byte(0x44); ds_reset(); ds_send_byte(0xcc); ds_send_byte(0xbe); a = ds_read_byte(); b = ds_read_byte(); temp = (b << 8) | a; wendu = (float)temp * 0.0625; sprintf(disbuf,"temp is %7.3f",wendu); lcd1602_dis_str(0,0,disbuf); } }
延时函数文件:
void delay_us(unsigned char t) { while(--t); } void delay_ms(unsigned char t) { while(t--) { delay_us(245); delay_us(245); } } void delay_s(unsigned char t) { while(t--) { delay_ms(200); delay_ms(200); delay_ms(200); delay_ms(200); delay_ms(200); } }
相关文章推荐
- LCD1602显示+ds18b20温度测试+ds1302时钟显示
- 实验六:温度传感DS18B20实验(数码管显示)
- DS18B20温度转换与显示
- STC15F2K60S2读取DS18B20温度串口显示
- DS18B20温度传感器,将实时温度用数码管显示
- 单片机练习 - DS18B20温度转换与显示
- DS18B20 LCD显示当前温度
- DS18B20温度传感器利用LCD显示室内温度
- 测试LCD1602的显示,显示时间,提示语
- S3C2440 温度传感器ds18b20的驱动编写与测试
- S3C2440 温度传感器ds18b20的驱动编写与测试--比较详细的1-wire
- 单片机(八)__ds18b20测试温度
- C#写的温度显示曲线(测试)
- 单片机控制LCD1602显示字符(测试通过)
- ATMEGA16读取DS18B20温度,1602显示,并用proteus仿真,成功。
- 基于51单片机及DS18B20温度传感器数码管显示程序
- 时钟七:在LCD1602上显示时钟,并且用按键修改时间
- arm+linux fl2440 ds18b20 温度传感器驱动编写及测试
- DS18B20温度传感器测温显示在数码管上(29.9℃)
- 单片机练习 - 使用1602LCD显示DS18B20的温度值