/******************************************************************** * 文件名 : 温度采集DS18B20.c * 描述 : 该文件实现了用温度传感器件DS18B20对温度的采集,并在数码管上显示出来。 ***********************************************************************/ #include<reg52.h> #include<intrins.h> #define uchar unsigned char #define uint unsigned int #define jump_ROM 0xCC #define start 0x44 #define read_EEROM 0xBE sbit DQ = P2^3; //DS18B20数据口 unsigned char TMPH,TMPL; uchar code table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //这三个引脚参考资料 sbit E=P2^7; //1602使能引脚 sbit RW=P2^6; //1602读写引脚 sbit RS=P2^5; //1602数据/命令选择引脚 /******************************************************************** * 名称 : delay() * 功能 : 延时,延时时间大概为5US。 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void delays() { _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); } /******************************************************************** * 名称 : delay() * 功能 : 延时函数 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void delay(uint N) { int i; for(i=0; i<N; i++) ; } /******************************************************************** * 名称 : Reset() * 功能 : 复位DS18B20 * 输入 : 无 * 输出 : 无 ***********************************************************************/ uchar Reset(void) { uchar deceive_ready; DQ = 0; delay(29); DQ = 1; delay(3); deceive_ready = DQ; delay(25); return(deceive_ready); } /******************************************************************** * 名称 : read_bit() * 功能 : 从DS18B20读一个位值 * 输入 : 无 * 输出 : 从DS18B20读出的一个位值 ***********************************************************************/ uchar read_bit(void) { uchar i; DQ = 0; DQ = 1; for(i=0; i<3; i++); return(DQ); } /******************************************************************** * 名称 : write_bit() * 功能 : 向DS18B20写一位 * 输入 : bitval(要对DS18B20写入的位值) * 输出 : 无 ***********************************************************************/ void write_bit(uchar bitval) { DQ=0;if(bitval==1) DQ=1; delay(5); DQ=1; } /******************************************************************** * 名称 : read_byte() * 功能 : 从DS18B20读一个字节 * 输入 : 无 * 输出 : 从DS18B20读到的值 ***********************************************************************/ uchar read_byte(void) { uchar i,m,receive_data; m = 1; receive_data = 0; for(i=0; i<8; i++) { if(read_bit()) { receive_data = receive_data + (m << i); } delay(6); } return(receive_data); } /******************************************************************** * 名称 : write_byte() * 功能 : 向DS18B20写一个字节 * 输入 : val(要对DS18B20写入的命令值) * 输出 : 无 ***********************************************************************/ void write_byte(uchar val) { uchar i,temp; for(i=0; i<8; i++) { temp = val >> i; temp = temp & 0x01; write_bit(temp); delay(5); } } /******************************************************************** * 名称 : bit Busy(void) * 功能 : 这个是一个读状态函数,读出函数是否处在忙状态 * 输入 : 输入的命令值 * 输出 : 无 ***********************************************************************/ bit Busy(void) { bit busy_flag = 0; RS = 0; RW = 1; E = 1; delays(); busy_flag = (bit)(P0 & 0x80); E = 0; return busy_flag; } /******************************************************************** * 名称 : wcmd(uchar del) * 功能 : 1602命令函数 * 输入 : 输入的命令值 * 输出 : 无 ***********************************************************************/ void wcmd(uchar del) { while(Busy()); RS = 0; RW = 0; E = 0; delays(); P0 = del; delays(); E = 1; delays(); E = 0; } /******************************************************************** * 名称 : wdata(uchar del) * 功能 : 1602写数据函数 * 输入 : 需要写入1602的数据 * 输出 : 无 ***********************************************************************/ void wdata(uchar del) { while(Busy()); RS = 1; RW = 0; E = 0; delays(); P0 = del; delays(); E = 1; delays(); E = 0; } /******************************************************************** * 名称 : L1602_init() * 功能 : 1602初始化,请参考1602的资料 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void L1602_init(void) { wcmd(0x38); wcmd(0x0c); wcmd(0x06); wcmd(0x01); } /******************************************************************** * 名称 : L1602_char(uchar hang,uchar lie,char sign) * 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符显示"b" ,调用该函数如下 L1602_char(1,5,'b') * 输入 : 行,列,需要输入1602的数据 * 输出 : 无 ***********************************************************************/ void L1602_char(uchar hang,uchar lie,char sign) { uchar a; if(hang == 1) a = 0x80; if(hang == 2) a = 0xc0; a = a + lie - 1; wcmd(a); wdata(sign); } /******************************************************************** * 名称 : L1602_string(uchar hang,uchar lie,uchar *p) * 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下 L1602_string(1,5,"ab cd ef;") * 输入 : 行,列,需要输入1602的数据 * 输出 : 无 ***********************************************************************/ void L1602_string(uchar hang,uchar lie,uchar *p) { uchar a,b=0; if(hang == 1) a = 0x80; if(hang == 2) a = 0xc0; a = a + lie - 1; while(1) { wcmd(a++); if((*p == '\0')||(b==16)) break; b++; wdata(*p); p++; } } /******************************************************************** * 名称 : Main() * 功能 : 主函数 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void main() { uint temp; L1602_init(); L1602_string(1,1," The temperature is"); L1602_char(2,9,'`'); L1602_char(2,10,'C'); while(1) { Reset(); write_byte(jump_ROM); write_byte(start); Reset(); write_byte(jump_ROM); write_byte(read_EEROM); TMPL = read_byte(); TMPH = read_byte(); temp = TMPL / 16 + TMPH * 16; L1602_char(2,7,temp/10%10+48); L1602_char(2,8,temp%10+48); } }