#include #define uchar unsigned char #define uint unsigned int extern TemperatuerResult(); //声明引用外部函数 extern unsigned int idata Temperature; sbit lcd_e=P2^7; sbit lcd_rs=P2^6; sbit lcd_rw=P2^5; void delay_ms(uchar i) //延时毫秒 { int j; for(i;i>0;i--) for(j=110;j>0;j--); } bit lcd_check() //检测忙 { bit result; lcd_rs=0; lcd_rw=1; lcd_e=1; delay_ms(1); result=(bit)(P0&0x80); lcd_e=0; return (result); } void write_cmd(uchar cmd) //向lcd写命令 { while(lcd_check()); lcd_rs=0; delay_ms(1); lcd_rw=0; delay_ms(1); P0=cmd; delay_ms(1); lcd_e=1; delay_ms(1); lcd_e=0; } void write_data(uchar shuju) //向lcd写数据 { while(lcd_check()); lcd_rs=1; delay_ms(1); lcd_rw=0; delay_ms(1); P0=shuju; delay_ms(1); lcd_e=1; delay_ms(1); lcd_e=0; } void lcd_init() //初始化 { delay_ms(15); write_cmd(0x38); delay_ms(5); write_cmd(0x0c); delay_ms(5); write_cmd(0x06); delay_ms(5); write_cmd(0x01); } void display(uchar i,uchar j,uchar shuju) //在指定位置显示 { write_cmd(0x80+j*0x40+i); delay_ms(1); write_data(shuju); delay_ms(1); } void main() { lcd_init(); while(1) { TemperatuerResult(); display(0,0,'T'); display(1,0,'e'); display(2,0,'m'); display(3,0,'p'); display(4,0,'e'); display(5,0,'r'); display(6,0,'a'); display(7,0,'t'); display(8,0,'u'); display(9,0,'r'); display(10,0,'e'); display(11,0,' '); display(12,0,'i'); display(13,0,'s'); display(0,1,(Temperature/16%10000/1000+0x30)); display(1,1,(Temperature/16%1000/100+0x30)); display(2,1,(Temperature/16%100/10+0x30)); display(3,1,(Temperature/16%10+0x30)); display(4,1,'.'); display(5,1,(Temperature*10/16%10+0x30)); display(6,1,'`'); display(7,1,'C'); } } 温度采集子程序 /*************************此部分为18B20的驱动程序*************************************/ #include #include sbit D18B20=P3^7; #define NOP() _nop_() /* 定义空指令 */ #define _Nop() _nop_() /*定义空指令*/ bit flag; unsigned int idata Temperature; unsigned char idata temp_buff[9]; //存储读取的字节,read scratchpad为9字节,read rom ID为8字节 unsigned char idata id_buff[8]; unsigned char idata *p,TIM; unsigned char idata crc_data; //************************************************************ void TempDelay (unsigned char idata us) { while(us--); } //************************************************************ void Init18b20 (void) { D18B20=1; _nop_(); D18B20=0; TempDelay(80); //delay 530 uS//80 _nop_(); D18B20=1; TempDelay(14); //delay 100 uS//14 _nop_(); _nop_(); _nop_(); if(D18B20==0) flag = 1; //detect 1820 success! else flag = 0; //detect 1820 fail! TempDelay(20); //20 _nop_(); _nop_(); D18B20 = 1; } //************************************************************ void WriteByte (unsigned char idata wr) //单字节写入 { unsigned char idata i; for (i=0;i<8;i++) { D18B20 = 0; _nop_(); D18B20=wr&0x01; TempDelay(3); //delay 45 uS //5 _nop_(); _nop_(); D18B20=1; wr >>= 1; } } //************************************************************ unsigned char ReadByte (void) //读取单字节 { unsigned char idata i,u=0; for(i=0;i<8;i++) { D18B20 = 0; u >>= 1; D18B20 = 1; if(D18B20==1) u |= 0x80; TempDelay (2); _nop_(); } return(u); } //************************************************************ void read_bytes (unsigned char j) { unsigned char idata i; for(i=0;i *p = ReadByte(); p++; } } //************************************************************ void TemperatuerResult(void) { Init18b20 (); WriteByte(0xcc); //skip rom WriteByte(0x44); //Temperature convert Init18b20 (); WriteByte(0xcc); //skip rom WriteByte(0xbe); //read Temperature p = temp_buff; read_bytes (2); Temperature = temp_buff[1]*0x100 + temp_buff[0]; TempDelay(1); }下载本文