|
2#
樓主 |
發(fā)表于 2023-9-3 12:28:04
|
只看該作者
// *****************************************************************************************************************************************
// * 程序名稱:《大氣溫度計(jì)》
// * 硬件設(shè)計(jì):
// * 軟件設(shè)計(jì):
// * 開始日期:
// * 定型日期:
// * 接口定義:P10(與18B20通訊口)
// * P2 (段控)
// * P0 (位控)
// *****************************************************************************************************************************************
#include<reg52.h>
#include<intrins.h>
#define jump_ROM 0xCC
#define start 0x44
#define read_EEROM 0xBE
sbit DQ = P1^0; //DS18B20數(shù)據(jù)口
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()
// * 功能 : 延時(shí),延時(shí)時(shí)間大概為140US。
// * 輸入 : 無
// * 輸出 : 無
// *****************************************************************************************************************************************
void delay_1()
{
int i,j;
for(i=0; i<=10; i++)
for(j=0; j<=2; j++);
}
// *****************************************************************************************************************************************
// * 名稱 : delay()
// * 功能 : 延時(shí)函數(shù)
// * 輸入 : 無
// * 輸出 : 無
// *****************************************************************************************************************************************
void delay(unsigned int N)
{
int i;
for(i=0; i<N; i++) ;
}
// *****************************************************************************************************************************************
// * 名稱 : Delay_1ms()
// * 功能 : 延時(shí)子程序,延時(shí)時(shí)間為 1ms * x
// * 輸入 : x (延時(shí)一毫秒的個(gè)數(shù))
// * 輸出 : 無
// *****************************************************************************************************************************************
void Delay_1ms(unsigned int i)//1ms延時(shí)
{
unsigned char x,j;
for(j=0;j<i;j++)
for(x=0;x<=50;x++);
}
// *****************************************************************************************************************************************
// * 名稱 : Reset()
// * 功能 : 復(fù)位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讀一個(gè)位值
// * 輸入 : 無
// * 輸出 : 從DS18B20讀出的一個(gè)位值
// *****************************************************************************************************************************************
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讀一個(gè)字節(jié)
// * 輸入 : 無
// * 輸出 : 從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寫一個(gè)字節(jié)
// * 輸入 : 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()
// * 功能 : 主函數(shù)
// * 輸入 : 無
// * 輸出 : 無
// *****************************************************************************************************************************************
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;
}
}
} |
|