将LcD1602定义为头文件测温程片 #ifndef_LCD1602_H_ #include<reg51.h #define LCD1602 H #include<intrins.h> #define INT8U unsigned char #include<stdio.h> #define INT16U unsigned int Hinclude"LCD1602.h" shit RS=P200- #define INT8U nsigned char sbit RW=P21; #define INT16U unsigned int sbit EN=P2^2; sbit DQ=P3^4; void delay_ms(INT16U ms) INT8U Temp_value[]=[0x00,0x00); INT8U i:while(ms-)for (i=0:i<120:i++): INT8U Temp disp value[17]: void busy wait() void delay2_ms(INT16U ms) (INT8Ui:while(ms-)for(i=O;i<120;i++); 9 PO=OxFF: void delayX(INT16U x)while(-x): EN=0-RS=0-RW=1: void delay us(INT16U us) EN=1;Icd_status=PO [for(:us>0:us-) EN-O;) _nop_(): while(lcd_status&x);} void write lcd command(INT8U cmd) INT8U Init DS18B20() (busy_wait(); INT8U status: EN=O:RS=0:RW=0: DQ=1;delayX(8): PO=cmd; DQ=0:delayX( EN=1;_nop_(;EN-O DQ=1;delayX(5): status=DQ;delayX(90) void write_lcd_data(INT8U dat) return status: fbusy wait(): INT8U Readonebyte() EN-O;RS-1;RW-O; INT8Ui,dat=0x00 PO-dat; 001il=0x00,k<=1 EN=1;_nop_(;EN-O;) {DQ=0;_nop_0: void initialize Icd() DQ=1:nop0月 (write lcd command(0x38):delay ms(1): if(DQ)dat|=i; write_kcd_command(Ox01):delay_ms(1); delayX(8); } write lcd_commar nd(OxO6):del ay_ms(1) return dat write_lcd_command(OxOc):delay_ms(1); void Writeonebyte(INT8U dat) void Icd_showstring(INT8U r,INT8U C,INT8U (INT8U i; +strl for(i=0:i<8:i++) (INT8Ui=0: D0=0:dat>>=1 code INTUDDRAM-(0x,) DQ=CY:delayX(8) write_lcd_command(DDRAM[r]c); DQ=1:} while (*str)(write_lcd_data(*str); s对r++ INT8U Read temp( i++} if(Init_DS18B20()==1)returnO; for(i<16;i++) else write_lcd_data();} (Writeonebyte(OxCC) #endif Writeonebyte(Ox44);
一、将 LCD1602 定义为头文件测温程序 #ifndef _LCD1602_H_ #define _LCD1602_H_ #define INT8U unsigned char #define INT16U unsigned int sbit RS=P2^0; sbit RW =P2^1; sbit EN=P2^2; void delay_ms(INT16U ms) {INT8U i;while(ms-)for (i=0;i<120;i++);} void busy_wait() {INT8U lcd_status; do {P0=0xFF; EN=0;RS=0;RW=1; EN=1;lcd_status=P0; EN=0;} while(lcd_status & 0x80);} void write_lcd_command(INT8U cmd) {busy_wait(); EN=0;RS=0;RW=0; P0=cmd; EN=1;_nop_(); EN=0; } void write_lcd_data(INT8U dat) {busy_wait(); EN=0;RS=1;RW=0; P0=dat; EN=1;_nop_();EN=0;} void initialize_lcd() {write_lcd_command(0x38);delay_ms(1); write_lcd_command(0x01);delay_ms(1); write_lcd_command(0x06);delay_ms(1); write_lcd_command(0x0c);delay_ms(1); } void lcd_showstring(INT8U r,INT8U c,INT8U *str) {INT8U i=0; code INT8U DDRAM[]={0X80,0XC0}; write_lcd_command(DDRAM[r]| c); while (*str) {write_lcd_data(*str); str++; i++;} for(;i<16;i++) write_lcd_data(' ');} #endif #include<reg51.h> #include<intrins.h> #include<stdio.h> #include"LCD1602.h" #define INT8U unsigned char #define INT16U unsigned int sbit DQ=P3^4; INT8U Temp_value[]={0x00,0x00}; INT8U Temp_disp_value[17]; void delay2_ms(INT16U ms) {INT8U i;while(ms-)for (i=0;i<120;i++); } void delayX(INT16U x){while(-x);} void delay_us(INT16U us) { for(;us>0;us-) { _nop_(); } } INT8U Init_DS18B20() {INT8U status; DQ=1;delayX(8); DQ=0;delayX(90); DQ=1;delayX(5); status=DQ; delayX(90); return status;} INT8U Readonebyte() {INT8U i,dat=0x00; for(i=0x01;i!=0x00;i<<=1) {DQ=0;_nop_(); DQ=1;_nop_(); if(DQ) dat|=i; delayX(8); } return dat; } void Writeonebyte(INT8U dat) {INT8U i; for(i=0;i<8;i++) {DQ=0;dat>>=1; DQ=CY;delayX(8); DQ=1; } } INT8U Read_temp() { if(Init_DS18B20()==1) return 0; else {Writeonebyte(0xCC); Writeonebyte(0x44);
Init_DS18B2O() Read_temp(): Writeonebyte(OxCC) delay ms(1500); Writeonebyte(OxBE): while(1) Temp valuelOl=Readonebyte() fif(Read temp()) Temp_value[1]=Readonebyte) (temp=(int)(Temp_value[1<8|Temp_va lue[0)*0.0625; /生程序 sprintf(Temp disp value,"TEMP:%5.1f\x void main() df x43"temp): (float temp ld_showstring(1,0,Temp disp_value);} ntafae_lcd0 delay_ms(50);) Icd_showstring(,0,"DSB18B20 TEST"): Icd showstring(1,0,"Waiting."); 1、新建一个文本文档,重新命名为LCD1602.h。打开后将LCD1602的所有子程序以及引脚 定义复制粘贴。在最开始添加语右句. #ifndef LCD1602 H #define_LCD1602_H. 最后面添加: #endif 2、在主文件里的最开始调用该头文件,语句为 #include"LCD1602.h" 3、其余不做动,编译,生产HEX文件即可
Init_DS18B20(); Writeonebyte(0xCC); Writeonebyte(0xBE); Temp_value[0]=Readonebyte(); Temp_value[1]=Readonebyte(); return 1; } } //主程序 void main() {float temp; initialize_lcd(); lcd_showstring(0,0," DSB18B20 TEST "); lcd_showstring(1,0," Waiting."); Read_temp(); delay_ms(1500); while(1) {if(Read_temp()) {temp=(int)(Temp_value[1]<<8|Temp_va lue[0])*0.0625; sprintf(Temp_disp_value,"TEMP: %5.1f\x df\x43",temp); lcd_showstring(1,0,Temp_disp_value); } delay_ms(50); } } 1、新建一个文本文档,重新命名为 LCD1602.h。打开后将 LCD1602 的所有子程序以及引脚 定义复制粘贴。在最开始添加语句, #ifndef _LCD1602_H_ #define _LCD1602_H_ 最后面添加: #endif 2、在主文件里的最开始调用该头文件,语句为 #include"LCD1602.h" 3、其余不做改动,编译,生产 HEX 文件即可
二、将LCD1602、DS18B20均写成头文件程序 #ifndef DSB18B20 H {Writeonebyte(OxCC); #define DSB18B20 H Writeonebyte(0x44); #define INT8U unsigned char Init_DS18B20(); #define INT16U unsigned int Writeonebyte(0xCC); sbit DQ=P3^4; Writeonebyte(OxBE); INT8U Temp_value[]=(0x00,0x00}; Temp_value[0]=Readonebyte(); INT8U Temp_disp_value[17]; Temp value[1]=Readonebyte(); void delay2_ms(INT16U ms) return 1; (INT8U i; while(ms-)for (i=0;i<120;i++): void delayX(INT16U x){while(-x);} #endif void delay_us(INT16U us) for(;us>0;us-) 主文件 {_nop_0: #include<reg51.h> } #include<intrins.h> INT8U Init DS18B20() #include<stdio.h> [INT8U status; #include"LCD1602.h" DQ=1;delayX(8); #include"DSB18B20.h" DQ=0;delayX(90); #define INT8U unsigned char DQ=1;delayX(5); #define INT16U unsigned int status=DQ;delayX(90); 川住程序 return status; void main() float temp; INT8U Readonebyte() initialize_lcd(); [INT8U i,dat=0x00; Icd_showstring(0,0,"DSB18B20 TEST for(i=0x01;il=0x00,ik<=1) "方 {DQ=0;_nop_(); Icd_showstring(1,0,"Waiting."); DQ=1;_nop_(); Read_temp(); if(DQ)dat|=i; delay_ms(1500); delayX(8); while(1) } (if(Read_temp()) return dat; {temp=(int)(Temp_value[1]<<8|Tem void Writeonebyte(INT8U dat) p_value[0])*0.0625; (INT8U i; for(i=0;i<8;i++) sprintf(Temp disp value,"TEMP:%5 {DQ=0;dat>=1; .1f xdf x43",temp); DQ=CY;delayX(8); Icd showstring(1,0,Temp disp valu DQ=1; e); } } delay_ms(50); } INT8U Read_temp() } 注意:在这里除了使用前面定义的 if(Init DS18B20()==1)return 0 LCD1602头文件外,又定义了DsB18B20 else 头文件。在主文件了直接调用就可以了
二、将 LCD1602、DS18B20 均写成头文件程序 #ifndef _DSB18B20_H_ #define _DSB18B20_H_ #define INT8U unsigned char #define INT16U unsigned int sbit DQ=P3^4; INT8U Temp_value[]={0x00,0x00}; INT8U Temp_disp_value[17]; void delay2_ms(INT16U ms) {INT8U i; while(ms-)for (i=0;i<120;i++);} void delayX(INT16U x){while(-x);} void delay_us(INT16U us) { for(;us>0;us-) { _nop_(); } } INT8U Init_DS18B20() {INT8U status; DQ=1;delayX(8); DQ=0;delayX(90); DQ=1;delayX(5); status=DQ; delayX(90); return status; } INT8U Readonebyte() {INT8U i,dat=0x00; for(i=0x01;i!=0x00;i<<=1) {DQ=0;_nop_(); DQ=1;_nop_(); if(DQ) dat|=i; delayX(8); } return dat; } void Writeonebyte(INT8U dat) {INT8U i; for(i=0;i<8;i++) {DQ=0;dat>>=1; DQ=CY;delayX(8); DQ=1; } } INT8U Read_temp() { if(Init_DS18B20()==1) return 0; else {Writeonebyte(0xCC); Writeonebyte(0x44); Init_DS18B20(); Writeonebyte(0xCC); Writeonebyte(0xBE); Temp_value[0]=Readonebyte(); Temp_value[1]=Readonebyte(); return 1; } } #endif 主文件 #include<reg51.h> #include<intrins.h> #include<stdio.h> #include"LCD1602.h" #include"DSB18B20.h" #define INT8U unsigned char #define INT16U unsigned int //主程序 void main() {float temp; initialize_lcd(); lcd_showstring(0,0," DSB18B20 TEST "); lcd_showstring(1,0," Waiting."); Read_temp(); delay_ms(1500); while(1) {if(Read_temp()) {temp=(int)(Temp_value[1]<<8|Tem p_value[0])*0.0625; sprintf(Temp_disp_value,"TEMP: %5 .1f\xdf\x43",temp); lcd_showstring(1,0,Temp_disp_valu e); } delay_ms(50); } } 注意:在这里除了使用前面定义的 LCD1602 头文件外,又定义了 DSB18B20 头文件。在主文件了直接调用就可以了