51单片机测室温

来源:互联网 发布:sqlserver 字段注释 编辑:程序博客网 时间:2024/04/27 13:21
#include <reg52.h> #include <intrins.h> #include "./delay/delay.h" #include <stdio.h> #include "1602.h"  #define ok 1 #define err 0  sbit LED = P2^4; sbit ds = P2^3; bit ack = 0; void ds18b20_init() { ds = 0;//先复位,将高电平拉低delay_us(200);//经过880usdelay_us(200);ds = 1;//再拉高delay_us(30);//从机等待时间/*if(ds == 0)ack = ok;elseack = err;*/delay_us(200); } void dsl8b20_write_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;//tmp读的越快越好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); //j = j << 7; k = k >> 1; k = k + j;}return k;  } void main() { //ds18b20_init();//dsl8b20_write_byte(0xcc);unsigned int temp,b;unsigned char a;unsigned char buff[20];float temp_t;LCD_Init();LCD_Clear();  while(1){/*if(ack){LED = 0;}else{LED = 1;}*/ds18b20_init();dsl8b20_write_byte(0xcc);//跳过读ROM命令dsl8b20_write_byte(0x44);//启动温度转换delay_ms(20);ds18b20_init();dsl8b20_write_byte(0xcc);dsl8b20_write_byte(0xbe);  //读暂存器a = ds_read_byte();  //先读低八位b = ds_read_byte();  //再读高八位temp = (b << 8) + a;temp_t = (float)temp * (0.0625);sprintf(buff,"Temp is %7.3f",temp_t);LCD_Write_String(0,0,buff);} }
#include "1602.h"#include "./delay/delay.h"#define CHECK_BUSY//是否使用判断忙语句条件,后面使用条件编译sbit RS = P2^4;   //定义端口 sbit RW = P2^5;sbit EN = P2^6;#define RS_CLR RS=0 #define RS_SET RS=1#define RW_CLR RW=0 #define RW_SET RW=1 #define EN_CLR EN=0#define EN_SET EN=1#define DataPort P0/*------------------------------------------------              判忙函数------------------------------------------------*/ bit LCD_Check_Busy(void)  { #ifdef CHECK_BUSY DataPort= 0xFF;  RS_CLR;  RW_SET;  EN_CLR;  _nop_();  EN_SET; return (bit)(DataPort & 0x80);#else return 0;#endif }/*------------------------------------------------              写入命令函数------------------------------------------------*/ void LCD_Write_Com(unsigned char com)  {   while(LCD_Check_Busy()); //忙则等待 RS_CLR;  RW_CLR;  EN_SET;  DataPort= com;  _nop_();  EN_CLR; }/*------------------------------------------------              写入数据函数------------------------------------------------*/ void LCD_Write_Data(unsigned char Data)  {  while(LCD_Check_Busy()); //忙则等待 RS_SET;  RW_CLR;  EN_SET;  DataPort= Data;  _nop_(); EN_CLR; }/*------------------------------------------------                清屏函数------------------------------------------------*/ void LCD_Clear(void)  {  LCD_Write_Com(0x01);  delay_ms(5); }/*------------------------------------------------              写入字符串函数------------------------------------------------*/ void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)  {             while (*s)  {      LCD_Write_Char(x,y,*s);      s ++;  x++;    } }/*------------------------------------------------              写入字符函数------------------------------------------------*/void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)  {      if (y == 0)  {      LCD_Write_Com(0x80 + x);      }     else  {      LCD_Write_Com(0xC0 + x);      }         LCD_Write_Data( Data);   }/*------------------------------------------------              初始化函数------------------------------------------------*/ void LCD_Init(void)  {   LCD_Write_Com(0x38);    /*显示模式设置*/    delay_ms(5);    LCD_Write_Com(0x38);    delay_ms(5);    LCD_Write_Com(0x38);    delay_ms(5);    LCD_Write_Com(0x38);     LCD_Write_Com(0x08);    /*显示关闭*/    LCD_Write_Com(0x01);    /*显示清屏*/    LCD_Write_Com(0x06);    /*显示光标移动设置*/    delay_ms(5);    LCD_Write_Com(0x0C);    /*显示开及光标设置*/}   


0 0
原创粉丝点击