||
搜索
復制
源程序清單如下:
//ds18b20 drive program
//for 51 mcu with lcd1602 display
#include "reg52.h"
#include <intrins.h>
/*******************************************************************/
#define HIGH 1 //高電平
#define LOW 0 //低電平
#define TRUE 1 //真
#define ZERO 0 //假
#define MSB 0x80
//ds18b20 part
#define SkipRom 0xcc
#define ConvertTemperature 0x44
#define Read Scratchpad 0xbe
sbit One_Wire_Bus=P1^6;
void One_ Wire_ Delay (unsigned char delay_ time);
void One_Wire_Write_Byte (unsigned char oww_dat);
unsigned char One_Wire_Read_Byte(void);
void Read_18B20(void);
void Initize_One_Wire_Bus(void);
void delay(void);
/********************************************************************/
data unsigned char GetScratchpad[2];
code unsignedchardecimalH[16]={00,06,12,18,25,31,37,43,50,56,62,68,75,81,87,93};
code unsigned char decimalL[16]={00,25,50,75,00,25,50,75,00,25,50,75,00,25,50,75};
unsigned char Result Temperature H;//經過處理后的溫度整數部分
unsigned char Result Temperature L H, Result Temperature LL;//經過處理后的溫度的小數部分
data unsigned char ResultSignal;//溫度為負數標志位
/********************************************************************/
void Initize_One_Wire_Bus(void)
{One_Wire_Bus=0;
One_Wire_Delay (80); / /Bus master pulling low 488us
One_Wire_Bus=1;
One_Wire_Delay (25);//Resister pull up 158us;}
/********************************************************************/
/******************* ds18b20 **********************************/
void One_Wire_Delay (unsigned char delay_time)
{
While (delay_time) delay_time--;//Delay time us :=(8+delay_time*6)us;
}
/********************************************************************/
unsigned char One_Wire_Read_Byte (void)
{
bit temp_bit;
unsigned char i,result=0;
for (i=0; i<8;i++)
{
One_Wire_Bus=0;
One_Wire_Bus=1;
temp_bit=One_Wire_Bus;
One_Wire_Delay (9); //delay 62 us
If (temp_bit)
result|=0x01<<i;
}
Return (result);
}
/********************************************************************/
void One_Wire_Write_Byte(unsigned char oww_dat)
{
unsigned char i;
for (i=0;i<8;i++)
{
One_Wire_Bus=0;
if(oww_dat&0x01)One_Wire_Bus=1;
One_Wire_Delay (20); //delay 128 us
One_Wire_Bus=1;
oww_dat>>=1;
}
One_Wire_Delay (10);
}
/********************************************************************/
void Read_18B20 (void)
{
unsigned char tempH,tempL;
Initize_One_Wire_Bus ();
One_Wire_Write_Byte (SkipRom);
_nop_();
One_Wire_Write_Byte (ConvertTemperature);
One_Wire_Delay (5);
Initize_One_Wire_Bus ();
One_Wire_Write_Byte (SkipRom);
_nop_();
One_Wire_Write_Byte (ReadScratchpad);
GetScratchpad[0]=One_Wire_Read_Byte(); //從DS18B20讀出的低8位溫度值
GetScratchpad[1]=One_Wire_Read_Byte(); //從DS18B20讀出的高8位溫度值
One_Wire_Delay (120);
tempH=(GetScratchpad[1]<<4)|(GetScratchpad[0]>>4); //溫度的整數部分
tempL=(GetScratchpad[0]&0x0f); //溫度的小數部分
Initize_One_Wire_Bus();
if(tempH&0x80) //判斷溫度的正負值
{
tempH=~tempH;
tempL=~tempL+1;
ResultSignal=1;//溫度為負數標志位
}
Result Temperature H=tempH; //經過處理后的溫度的整數部分
Result Temperature L=decimalL[tempL]; //經過處理的溫度的小數部分十分位
Result Temperature LH=decimalH[tempL];//經過處理的溫度的小數部分的百分位
}
/********************************************************************/
/*******************************************************************/
//lcd part
#define LINE1 0
#define LINE2 1
#define LINE1_HEAD 0x80
#define LINE2_HEAD 0xC0
#define LCD_DELAY_TIME 40
#define DATA_MODE 0x38
#define OPEN_SCREEN 0x0C
#define DISPLAY_ADDRESS 0x80
#define CLEARSCREEN LCD_en_command(0x01)
#define COMMAND_SLOT
LCD1602_RS=LOW; LCD1602_RW=LOW;LCD1602_EN=LOW
#define DATA_SLOT
LCD1602_RS=HIGH;LCD1602_RW=LOW;LCD1602_EN=LOW
//common part
#define HIGH 1 //高電平
#define LOW 0 //低電平
#define TRUE 1 //真
#define ZERO 0 //假
#define MSB 0x80
//change this part at different board
#define LCDIO P0
sbit LCD1602_RS=P1^0; //數據命令選擇 1 data 0 command
sbit LCD1602_RW=P1^1; //讀寫選擇 1 read 0 write
sbit LCD1602_EN=P1^2; //LCD使能信號
//function define
/********************************************************************/
void LCD_delay(void);//lcd 延時函數
void LCD_en_command(unsigned char command);//寫命令
void LCD_en_dat(unsigned char temp);//寫數據
void LCD_set_xy( unsigned char x, unsigned char y );//設置顯示地址
void LCD_write_char( unsigned x,unsigned char y,unsigned char dat);//write lcd a character function
void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s);//write lcd string function
void LCD_init(void);//lcd 初始化.
//unsigned char code mytab[8] = {0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00};//自定義字符
/********************************************************************/
/* 自定義字符寫入CGRAM */
/*******************************************************************/
void writetab()
{ unsigned char i;
LCD_en_command(0x40);
for(i=0;i<8;i++)
LCD_en_dat(mytab[i]); }
/********************************************************************/
/******************** LCD PART *************************************/
void LCD_delay(void)
{ unsigned char i;
for(i=LCD_DELAY_TIME;i>ZERO;i--);//be sure lcd reset
}
/********************************************************************/
void LCD_en_command(unsigned char command)
{
LCDIO=command;
COMMAND_SLOT;
LCD_delay();
LCD1602_EN=HIGH;
}
/********************************************************************/
void LCD_en_dat(unsigned char dat)
{
LCDIO=dat;
DATA_SLOT;
LCD_delay();
LCD1602_EN=HIGH;
}
/********************************************************************/
void LCD_set_xy( unsigned char x, unsigned char y )
{
unsigned char address;
if (y == LINE1)
address = LINE1_HEAD + x;
else address = LINE2_HEAD + x;
LCD_en_command(address);
}
/********************************************************************/
void LCD_write_char( unsigned x,unsigned char y,unsigned char dat)
{ LCD_set_xy( x, y );
LCD_en_dat(dat); }
/********************************************************************/
void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s)
{ LCD_set_xy( X, Y ); //set address
while (*s) // write character
{ LCDIO=*s; LCD_en_dat(*s);
s ++;}
}
/********************************************************************/
void LCD_init(void)
{
unsigned char i;
CLEARSCREEN;//clear screen
LCD_en_command(DATA_MODE);//set 8 bit data transmission mode
LCD_en_command(OPEN_SCREEN);//open display (enable lcd display)
LCD_en_command(DISPLAY_ADDRESS);//set lcd first display address
CLEARSCREEN;//clear screen
for(i=0;i<15;i++)
LCD_delay();
}
#define uint unsigned int
#define uchar unsigned char
void delay(void)
{
uint x;
for(x=0;x<1000;x++);
}
uchar key()
{
uchar count,cmd,key;
key=0;
while(key==0)
{ P2=0x0f;
if(P2!=0x0f)
{ delay();
if(P2!=0x0f)
{ cmd=0xef;
for(count=0;count<2;count++)
{ P2=cmd;
if((P2&0x0f)!=0x0f)
{ key=(cmd&0xf0)+(P2&0x0f);
key=~key;
break;}
else
cmd=(cmd<<1)+1;
}
}
// else return 0x00;
}
// else return 0x00;
}
P2=0x0f;
while(P2!=0x0f);
return(key);
}
int keyscan()
{
uchar i,keycode;
i=keybd();
switch(i)
{ case 0x11:{keycode=1;}break;
case 0x12:{keycode=2;}break;
case 0x14:{keycode=3;}break;
case 0x18:{keycode=4;}break;
case 0x21:{keycode=5;}break;
case 0x22:{keycode=6;}break;
case 0x24:{keycode=7;}break;
case 0x28:{keycode=8;}break;
default:{keycode=0;}break;
}
return keycode;