#include <reg52.h>
#include "lcd.h"
#include "delay.h"
#include "commondef.h"
#include "onewire.h"
unsigned char flag=1;
void Timer0Init(void); //10毫秒@11.0592MHz
void main()
{
unsigned char ack;
int temp; //保存接收溫度數據
int intTemp,decTemp; //分離溫度數據的整數部分和小數部分
unsigned char str[12]; //保存數據轉換成的字符串ASCII
unsigned char len;
lcdinit();
Timer0Init();
start18b20();
delay(10);
while(1)
{
if(flag)
{
flag=0;
ack = read18b20(&temp);
if(ack)
{
intTemp = temp >> 4; //保留整數部分
decTemp = temp & 0x0f;
len = integertostr(intTemp,str);
str[len++]='.';
decTemp = (decTemp*100)/16; //*0.0625
str[len++] = decTemp/10+'0';
str[len++] = decTemp%10+'0';
while(len<6)
{
str[len++]=' ';
}
str[len] = '\0';
lcdshowstr(0,0,str);
}
start18b20();
}
}
}
void Timer0Init(void) //10毫秒@11.0592MHz
{
TMOD &= 0xF0; //設置定時器模式
TMOD |= 0x01; //設置定時器模式
TL0 = 0x00; //設置定時初值
TH0 = 0xDC; //設置定時初值
ET0 = 0;
EA = 1;
TF0 = 0; //清除TF0標誌
TR0 = 1; //定時器0開始計時
}
void Timer0_ISR() interrupt 1
{
static unsigned char timer0Cnt=0;
TR0=0;
TL0 = 0x00; //設置定時初值
TH0 = 0xDC; //設置定時初值
timer0Cnt++;
if(timer0Cnt>=100)
{
timer0Cnt=0;
flag=1;
}
TR0=1;
}
#include <reg52.h>
#include "lcd.h"
#include "delay.h"
#include "commondef.h"
#include "onewire.h"
#define lcd_mode_pin8 0x38 //8????,??,5*8??
#define lcd_mode_pin4 0x28 //4????,??,5*8??
#define lcd_screen_clr 0x01 //???
#define lcd_cursor_rst 0x02 //????
#define lcd_dis_cur_blk_on 0x0F //???,???,????
#define lcd_dis_cur_on 0x0E //???,???,?????
#define lcd_dis_on 0x0C //???,???,?????
#define lcd_dis_off 0x08 //???,???,?????
# define lcd_cursor_right 0x06 //????,?????
# define lcd_cursor_left 0x04 //????,?????
# define lcd_dis_mode_left 0x07 //???,AC??,????,
# define lcd_dis_mode_right 0x05 //???,AC??,????,
#define lcd_cur_move_left 0x10 //????
#define lcd_cur_move_right 0x14 //????
#define lcd_dis_move_left 0x18 //????
#define lcd_dis_move_right 0x1C //????
void lcdreadbf()
{
unsigned char state;
unsigned char i;
lcd1602_db=0xff;//i0??1 ???
lcd1602_rs=0;
lcd1602_rw=1;
do
{
lcd1602_en=1;
state=lcd1602_db;
lcd1602_en=0;
i++;
if(i>50)
break;
}
while(state&0x80);
}
void lcdwritecmd(unsigned char cmd)
{
lcdreadbf();//????? ,?????
lcd1602_rs=0;
lcd1602_rw=0;
lcd1602_db=cmd;
lcd1602_en=1;
lcd1602_en=0;
}
void lcdwritedata(unsigned char dat)
{
lcdreadbf(); //????? ,?????
lcd1602_rs=1;
lcd1602_rw=0;
lcd1602_db=dat;
lcd1602_en=1;
lcd1602_en=0;
}
void lcdinit()
{
lcdwritecmd(lcd_mode_pin8); //?????? 2?,5*8??
lcdwritecmd(lcd_dis_on); //??? ???
lcdwritecmd(lcd_cursor_right); //????
lcdwritecmd(lcd_screen_clr); //??
}
void lcdsetposition(unsigned char x,unsigned char y)
{
if(0==y)
{
lcdwritecmd(0x80|x); //??? 0X80 +0X40 =0XC0
}
else
{
lcdwritecmd (0xC0+x); //???
}
}
void lcdshowstr(unsigned char x,unsigned char y, unsigned char *str)
{
lcdsetposition(x,y);
while(*str!='\0')
{
lcdwritedata(*str++);
}
}
unsigned char integertostr(int dat,unsigned char *str)
{
unsigned char i;
unsigned char len;
unsigned char buf[11];
if(dat<0)
{
dat= -dat;//如果是負數,取絕對值
*str = '-';
str++;
len++;
}
do
{
buf[i++]=dat%10+'0'; //dat%10+0x30;buf[0]='8' buf[1]='7'
dat/=10;
}
while(dat>0);
len += i;
while(i-- > 0)
{
*str++=buf[i];
}
*str='\0';
return len;
}
/*
void lcdsetchar(unsigned char x,unsigned char y,unsigned char pos,unsigned char *str )
{
unsigned char i;
for(i=0;i<8;i++);
{
lcdwritecmd(0x40+pos*8+i);
lcdwritedata(*(str+i));
}
lcdsetposition(x,y);
lcdwritedata(0x00+pos);
}
*/
#include <reg52.h>
#include "lcd.h"
#include "delay.h"
#include "commondef.h"
#include "onewire.h"
bit onewirerest()
{
bit ack;
EA=0;
ds18b20 = 0;
Delay600us();
ds18b20 = 1;
Delay60us();
ack = ds18b20;
while(!ds18b20);
EA=1;
return ack;
}
void writeonewire(unsigned char dat)
{
unsigned char temp;
EA=0;
for(temp=0x01; temp!=0; temp << 1)
{
ds18b20=0;
_nop_();
_nop_();
if((dat & temp)==0)
ds18b20=0;
else
ds18b20=1;
Delay60us();
ds18b20=1;
}
EA=1;
}
bit readyonewire()
{
unsigned char dat;
unsigned char temp;
EA=0;
for(temp=0x01; temp!=0; temp<<1)
{
ds18b20=0;
_nop_();
_nop_();
ds18b20=1;
_nop_();
_nop_();
if(!ds18b20)
dat&=~temp;
else
dat|=temp;
Delay60us();
}
EA=1;
return dat;
}
//////////////////////////////
bit start18b20()
{
bit ack;
//1 初始化
ack=onewirerest();
if(ack == 0)
{
//2ROM指令
writeonewire(SKIP_ROM);
//3功能指令,啟動溫度轉換
writeonewire(CONVERT_T);
}
return ~ack;
}
bit read18b20(int*temp)
{
bit ack;
unsigned char msb,lsb;
//1初始化
ack=onewirerest();
if(ack==0)
{
//2ROM指令
writeonewire(SKIP_ROM);
//3功能指令,啟動溫度轉換
writeonewire(READ_REGISTER);
//4 讀轉換結果 根據功能指令來確實
lsb=readyonewire();
msb=readyonewire();
*temp =((int)msb<<8)+lsb;
}
return ~ack;
}
#ifndef __ONEWIRE_H__
#define __ONEWIRE_H__
//#include "reg52.h"
sbit ds18b20 = P2^2;
bit onewirerest();
bit read18b20(int*temp);
bit start18b20();
bit readyonewire();
void writeonewire(unsigned char dat);
//ROM
#define SEARCH_ROM 0xf0 //搜索ROM指令
#define READ_ROM 0X33 //讀取ROM指令
#define MATH_ROM 0X55 //匹配ROM指令
#define SKIP_ROM 0XCC //跳過ROM指令
#define ALARM_SEARCH 0XEC //報警搜索指令
// 暫存器指令
#define CONVERT_T 0X44 //溫度轉換指令
#define WRITE_REGISTER 0X4E //寫暫存器指令
#define READ_REGISTER 0XBE //讀取暫存器指令
#define COPY_REGISTER 0X48 //拷貝暫存器指令
#define RECALL_E2 0XB8 //召回EEPROM指令
#define READ_POWER_SUPPLY 0XB4 //讀取電源模式指令
#endif
#include <reg52.h>
#include "lcd.h"
#include "delay.h"
#include "commondef.h"
#include "onewire.h"
void Delay600us() //@11.0592MHz
{
uchar i,j;
_nop_();
i = 2;
j = 15;
do
{
while (--j);
} while (--i);
}
void Delay60us() //@11.0592MHz
{
uchar i;
i = 25;
while (--i);
}
void delay(uint16 x_ms) //延遲 x_ms*1 毫秒
{
uint16 i,j;
for(i=x_ms;i>2;i--)
for(j=1;j>2;j--);
}
/*----
REG52.H
Header file for generic 80C52 and 80C32 microcontroller.
Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.
All rights reserved.
----*/
#ifndef __DELAY_H__
#define __DELAY_H__
#include "delay.h"
#include "intrins.h"
#define uint16 unsigned int
#define uchar unsigned char
void Delay600us(); //@11.0592MHz
void Delay60us(); //@11.0592MHz
void delay(uint16 x_ms);
#endif
/*----
REG52.H
Header file for generic 80C52 and 80C32 microcontroller.
Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.
All rights reserved.
----*/
#ifndef __LCD_H__
#define __LCD_H__
#include <reg52.h>
#include "lcd.h"
#include "delay.h"
#include "commondef.h"
#include "onewire.h"
#define lcd1602_db P0
sbit lcd1602_en=P2^4;
sbit lcd1602_rs=P2^5;
sbit lcd1602_rw=P2^6;
void lcdshowstr(unsigned char x,unsigned char y, unsigned char *str);
void lcdsetposition(unsigned char x,unsigned char y);
void lcdwritecgram();
void lcdinit();
void lcdwritecgram();
void lcdwritedata(unsigned char dat);
unsigned char integertostr(int dat,unsigned char *str);
#endif