ds18b20.zip

  • yesning
    了解作者
  • C/C++
    开发工具
  • 6KB
    文件大小
  • zip
    文件格式
  • 0
    收藏次数
  • 1 积分
    下载积分
  • 1
    下载次数
  • 2017-12-11 08:36
    上传日期
ds18b20+lcd1602 显示温度 好不容易调试通过,按照本人的程序风格
ds18b20.zip
  • smgd.c
    4.2KB
  • smgd.uvproj
    13.7KB
  • STARTUP.A51
    6.2KB
内容介绍
#include "math.h" #include <reg52.h> #include <intrins.h> #include <stdio.h> #define uchar unsigned char #define uint unsigned int /*********************delay********************/ void delay_us(uchar t) { while(--t); //t*2+5 us } void delay_ms(uchar t) { while(t--) { delay_us(245); delay_us(245); //1ms } } void delay_s(uchar t) { while(t--) { delay_ms(200); delay_ms(200); delay_ms(200); delay_ms(200); delay_ms(200); } } /***************************lcd*********************/ sbit RS=P2^0; //定义数据命令选择端 sbit RW=P2^1; //定义读写选择端 sbit E=P2^2; //定义使能端 #define lcd_D P0 uchar lcd_readbusy() //判断lcd是否处于忙的状态,即读忙 { uchar temp; RS=0; RW=1; _nop_(); P0=0xff; //读某IO口数据前,先将该口置为1 _nop_(); E=1; _nop_(); temp=P0; //读取此时lcd的状态字 _nop_(); E=0; return (temp&0x80); //如果忙 } void lcd_wcom(unsigned char a)//写指令,用于功能启动 { lcd_readbusy(); E = 0; RS = 0; RW = 0; lcd_D = a; delay_us(50); E = 1; delay_ms(5); E = 0; } void lcd_wdata(unsigned char dat) //写数据操作 { lcd_readbusy(); E = 0; RS = 1; RW = 0; lcd_D = dat; delay_us(50); E = 1; delay_ms(5); E = 0; } void lcd_init()//初始化操作,各种设置 { delay_ms(15); lcd_wcom(0x38); delay_ms(6); lcd_wcom(0x38); delay_ms(6); lcd_wcom(0x38); lcd_wcom(0x38); lcd_wcom(0x0c); lcd_wcom(0x06); lcd_wcom(0x01); } void lcd_setwei(unsigned char x ,unsigned char y)//显示位置 { unsigned char add; if(y == 0) add = 0x00 + x ; else add = 0x40 + x ; lcd_wcom(add | 0x80); } void lcd_disp_str(unsigned char x, unsigned char y, unsigned char *datae) //显示操作 { lcd_setwei(x , y);//设置显示位置 //delay_us(50); while(*datae != '\0')//字符串终止 { lcd_wdata(*datae++); } } void lcd_disp_char(unsigned char x, unsigned char y, unsigned char datae) //显示操作 { lcd_setwei(x , y);//设置显示位置 //delay_us(10); lcd_wdata(datae); } /******************************DS18B20************************************/ sbit DQ = P2^3; //DS18B20 通信引脚 uchar temp,temp1; uchar ds_init() { uchar n; DQ=1; delay_us(30); DQ=0; delay_us(250);//600us DQ=1; delay_us(40);//15us~60us n=DQ; delay_us(40); return 0; } void write_byte(uchar dat) { uchar i; for(i=0;i<8;i++) { DQ=0; DQ=dat&0x01; delay_us(40); DQ=1; dat=dat>>1; } delay_us(40); } uchar read_byte(void) { uchar i,value; for(i=0;i<8;i++) { DQ=0; value>>=1; DQ=1; // if(DQ) value|=0x80; delay_us(40); } return value; } uchar read_tem(void) { uchar a,b,temp0; ds_init(); write_byte(0xcc); write_byte(0x44); delay_ms(3); ds_init(); write_byte(0xcc); write_byte(0xbe); a=read_byte(); b=read_byte(); b<<=4; temp1=(a&0x0f); temp1=temp1*0.625+0.5; a>>=4; temp0=b|a; return temp0; } void main() { uchar n; lcd_init(); while(1) { temp=read_tem(); //温度值的整数部分 n=ds_init(); //lcd_disp_char(10,0,0x30+temp1); if(n) delay_ms(5); lcd_disp_str(0,0,"Temp:"); lcd_disp_char(5,0,0x30+temp/10); lcd_disp_char(6,0,0x30+temp%10); lcd_disp_char(7,0,'.'); lcd_disp_char(8,0,0x30+temp1); lcd_disp_char(9,0,0xdf); lcd_disp_char(10,0,0x43); } } /* void main() { uchar a; float temp; unsigned int b; float wendu; uchar disbuf[20]; lcd_init(); lcd_disp_char(0,0,'c'); while(1) { tmpchange(); temp = temp_get(); sprintf(disbuf,"temps %.1f",temp); lcd_disp_str(0,1,disbuf); } } /* void main() { lcd_init(); while(1) { lcd_disp_str(8, 0, "error!"); } } */
评论
    相关推荐