// ***************************************************************************************************************************************** // * 程序名称:《大气温度计》 // * 硬件设计: // * 软件设计: // * 开始日期: // * 定型日期: // * 接口定义:P10(与18B20通讯口) // * P2 (段控) // * P0 (位控) // *****************************************************************************************************************************************
#include #include
#define jump_ROM 0xCC #define start 0x44 #define read_EEROM 0xBE
sbit DQ = P1^0; //DS18B20数据口
unsigned char TMPH,TMPL;
unsigned char code table[12] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40}; unsigned char code tabld[10] = {0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
// ***************************************************************************************************************************************** // * 名称 : delay() // * 功能 : 延时,延时时间大概为140US。 // * 输入 : 无 // * 输出 : 无 // *****************************************************************************************************************************************
void delay_1() { int i,j; for(i=0; i<=10; i++) for(j=0; j<=2; j++); }
// ***************************************************************************************************************************************** // * 名称 : delay() // * 功能 : 延时函数 // * 输入 : 无 // * 输出 : 无 // *****************************************************************************************************************************************
void delay(unsigned int N) { int i; for(i=0; i}
// ***************************************************************************************************************************************** // * 名称 : Delay_1ms() // * 功能 : 延时子程序,延时时间为 1ms * x // * 输入 : x (延时一毫秒的个数) // * 输出 : 无 // *****************************************************************************************************************************************
void Delay_1ms(unsigned int i)//1ms延时 { unsigned char x,j; for(j=0;jfor(x=0;x<=50;x++); }
// ***************************************************************************************************************************************** // * 名称 : Reset() // * 功能 : 复位DS18B20 // * 输入 : 无 // * 输出 : 无 // *****************************************************************************************************************************************
unsigned char Reset(void) { unsigned char deceive_ready; DQ = 0; delay(29); DQ = 1; delay(3); deceive_ready = DQ; delay(25); return(deceive_ready); }
// ***************************************************************************************************************************************** // * 名称 : read_bit() // * 功能 : 从DS18B20读一个位值 // * 输入 : 无 // * 输出 : 从DS18B20读出的一个位值 // *****************************************************************************************************************************************
unsigned char read_bit(void) { unsigned char i; DQ = 0; DQ = 1; for(i=0; i<3; i++); return(DQ); }
// ***************************************************************************************************************************************** // * 名称 : write_bit() // * 功能 : 向DS18B20写一位 // * 输入 : bitval(要对DS18B20写入的位值) // * 输出 : 无 // *****************************************************************************************************************************************
void write_bit(unsigned char bitval) { DQ=0; if(bitval==1) DQ=1; delay(5); DQ=1; }
// ***************************************************************************************************************************************** // * 名称 : read_byte() // * 功能 : 从DS18B20读一个字节 // * 输入 : 无 // * 输出 : 从DS18B20读到的值 // *****************************************************************************************************************************************
unsigned char read_byte(void) { unsigned char 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(unsigned char val) { unsigned char i,temp; for(i=0; i<8; i++) { temp = val >> i; temp = temp & 0x01; write_bit(temp); delay(5); } }
// ***************************************************************************************************************************************** // * 名称 : Main() // * 功能 : 主函数 // * 输入 : 无 // * 输出 : 无 // *****************************************************************************************************************************************
void main() { // float tt; unsigned char w,k; unsigned int temp, x, y; P1 = 0x00; P2 = 0x00; P0 = 0x00;
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();
for (k=0;k<220;k++) { temp = TMPL + TMPH * 256;
if(temp >= 32768) { temp = 65535-temp; temp = temp + 1; w = 11; } else w = 10;
temp = temp * 10 / 16;
x = temp/100; y = temp%100;
if(temp < 100) { if(w == 11) { x = 11; w = 10; } else x = 10; }
P2 = table[x]; P0 = 0x02; Delay_1ms(10); P0 = 0x00;
x = temp%100/10; y = y%10;
P2 = tabld[x]; P0 = 0x04; Delay_1ms(10); P0 = 0x00;
P2 = table[y]; P0 = 0x08; Delay_1ms(10); P0 = 0x00;
P2 = table[w]; P0 = 0x01; Delay_1ms(10); P0 = 0x00; } } } |