源程序清單如下: //ds18b20 driveprogram //for 51 mcuwith 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 #defineConvertTemperature 0x44 #define Read Scratchpad 0xbe sbitOne_Wire_Bus=P1^6; void One_ Wire_ Delay(unsigned char delay_ time); voidOne_Wire_Write_Byte (unsigned char oww_dat); unsigned charOne_Wire_Read_Byte(void); voidRead_18B20(void); voidInitize_One_Wire_Bus(void); voiddelay(void); /********************************************************************/ data unsignedchar GetScratchpad[2]; code unsignedchardecimalH[16]={00,06,12,18,25,31,37,43,50,56,62,68,75,81,87,93}; code unsignedchar decimalL[16]={00,25,50,75,00,25,50,75,00,25,50,75,00,25,50,75}; unsigned charResult Temperature H;//經過處理后的溫度整數部分 unsigned charResult Temperature L H, Result Temperature LL;//經過處理后的溫度的小數部分 data unsignedchar ResultSignal;//溫度為負數標志位 /********************************************************************/ voidInitize_One_Wire_Bus(void) {One_Wire_Bus=0; One_Wire_Delay (80); / /Bus master pulling low488us One_Wire_Bus=1; One_Wire_Delay (25);//Resister pull up 158us;} /********************************************************************/ /*******************ds18b20 **********************************/ voidOne_Wire_Delay (unsigned char delay_time) { While (delay_time) delay_time--;//Delay timeus :=(8+delay_time*6)us; } /********************************************************************/ unsigned charOne_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); } /********************************************************************/ voidOne_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 thispart at different board #define LCDIO P0 sbitLCD1602_RS=P1^0; //數據命令選擇 1 data 0 command sbitLCD1602_RW=P1^1; //讀寫選擇 1 read 0 write sbitLCD1602_EN=P1^2; //LCD使能信號 //function define /********************************************************************/ voidLCD_delay(void);//lcd 延時函數 voidLCD_en_command(unsigned char command);//寫命令 voidLCD_en_dat(unsigned char temp);//寫數據 void LCD_set_xy(unsigned char x, unsigned char y );//設置顯示地址 voidLCD_write_char( unsigned x,unsigned char y,unsigned char dat);//write lcd acharacter function void LCD_write_string(unsigned char X,unsigned char Y,unsigned char*s);//write lcd string function voidLCD_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); } /********************************************************************/ /******************** LCD PART*************************************/ voidLCD_delay(void) { unsigned chari; for(i=LCD_DELAY_TIME;i>ZERO;i--);//be surelcd reset } /********************************************************************/ voidLCD_en_command(unsigned char command) { LCDIO=command; COMMAND_SLOT; LCD_delay(); LCD1602_EN=HIGH; } /********************************************************************/ voidLCD_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); } /********************************************************************/ voidLCD_write_char( unsigned x,unsigned char y,unsigned char dat) { LCD_set_xy( x, y ); LCD_en_dat(dat); } /********************************************************************/ voidLCD_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 ++;} } /********************************************************************/ voidLCD_init(void) { unsigned char i; CLEARSCREEN;//clear screen LCD_en_command(DATA_MODE);//set 8 bit datatransmission mode LCD_en_command(OPEN_SCREEN);//open display(enable lcd display) LCD_en_command(DISPLAY_ADDRESS);//set lcdfirst display address CLEARSCREEN;//clear screen for(i=0;i<15;i++) LCD_delay(); } #defineuint 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;
|