求AT89C51单片机与DS18B20的C语言程序,温度设定为10℃—70℃最小区分度为0.

求AT89C51单片机与DS18B20的C语言程序,温度设定为10℃—70℃最小区分度为0.2℃,显示是四位共阳数码管,水温控制系统(仿真图这样的)求大神帮忙

第1个回答  2016-06-16
#include<reg51.h>
#include<INTRINS.h>
#define uchar unsigned char
#define uint unsigned int

sbit DI = P1^0;
sbit CS = P1^1;
sbit CK = P1^2;
sbit IO = P1^3;
sbit RS = P1^4;
sbit LL = P1^5;
sbit LZ = P1^6;
sbit LH = P1^7;
sbit TK = P3^0;
sbit IG = P3^1;
sbit TF = P3^2;
sbit DQ = P3^3;
sbit UP = P3^4;
sbit DN = P3^5;
sbit TM = P3^7;
bit ng,np,fg;
bit buftm = 0,buftf = 0;

uchar data Disp[8];
uchar data CurrentT,CurrentB,Count1,Count2 = 3,Dot;
char data SignedT,SignedB = 35,gl;
uchar data glc = 0;

void nNop(uint x)
{
while(--x );
}

void IB_Device_Reset( void )
{
DQ = 1; nNop(8); DQ = 0; nNop(90); DQ = 1; nNop(8);
nNop(100); DQ = 1;
}

uchar ReadOneChar( void )
{
uchar i,d = 0;
DQ = 1; _nop_();
for (i = 0; i < 8; i++)
{
DQ = 0; d >>= 1; DQ = 1; _nop_(); _nop_();
if(DQ) d |= 0x80; nNop(30); DQ = 1;
}
return d;
}

void WriteOneChar( uchar dat )
{
uchar i;
for (i = 0; i < 8; i++)
{
DQ = 0; DQ = dat & 0x01; nNop(5); DQ = 1; dat>>=1;
}
}

void Readtemp( void ) reentrant
{
uchar data Temp_Value[2];
IB_Device_Reset();
WriteOneChar( 0xCC );
WriteOneChar( 0x44 );
nNop( 100 );
IB_Device_Reset();
WriteOneChar( 0xCC );
WriteOneChar( 0xBE );
Temp_Value[0] = ReadOneChar();
Temp_Value[1] = ReadOneChar();
/*********Output_Fubi*********/
ng = 0; //Clr Fubi
if( (Temp_Value[1] & 0xF8) == 0xF8)
{
Temp_Value[1] = ~Temp_Value[1];
Temp_Value[0] = ~Temp_Value[0] + 1;
if( Temp_Value[0] == 0x00 ) Temp_Value[1]++;
ng = 1;
}
/*********Output_Temp*********/
CurrentT = Temp_Value[1] * 16 + Temp_Value[0] / 16;
Disp[0] = CurrentT / 10 % 10; Disp[1] = CurrentT % 10;
SignedT = ng? -CurrentT : CurrentT;
if(ng) Disp[0] = 10;
if( Disp[0] == 0 ) Disp[0] = 15;
}

uchar Read( uchar addr )
{
uchar i,b,t;
RS = 0; CK = 0; RS = 1;
for(i = 0; i < 8; i++)
{
IO = addr & 1; CK = 1; CK = 0; addr >>= 1;
}
for(i = 0; i < 8; i++)
{
b >>= 1; t = IO; b |= t<<7; CK = 1; CK = 0;
}
CK = 1; RS = 0;
return b / 16 * 10 + b % 16;
}

void write_7221( uint idat )
{
uchar i;
CS = 0;
for(i = 0; i < 16; i++)
{
CK = 0; idat <<= 1; DI = CY;
CK = 1; _nop_(); _nop_();
CK = 0;
}
CS = 1;
}

void Show( void )
{
uchar s;
for(s = 0; s < 8; s++) write_7221( ((s + 1) * 256) + Disp[s] );
}

void DispLimit( void )
{
np = 0; if( SignedB < 0 ) {CurrentB = ~SignedB + 1; np = 1;}
else CurrentB = SignedB;
Disp[2] = CurrentB / 10; Disp[3] = CurrentB % 10; if(np) Disp[2] = 10;
if( Disp[2] == 0 ) Disp[2] = 15;
}

void Rectime( void )
{
Disp[4] = Read( 0x85 ) / 10; Disp[5] = Read( 0x85 ) % 10 | Dot;
Disp[6] = Read( 0x83 ) / 10; Disp[7] = Read( 0x83 ) % 10;
}

void Flash( void ) interrupt 1
{
if(++Count1 == 60) {Count1 = 0; if(UP && DN) fg = 0; Dot = 0x00;}
if( Count1 == 30 ) Dot = 0x80;
if(++Count2 == 2)
{
if(fg) {Disp[2] = 15; Disp[3] = 15;}
}
if(Count2 == 4) {Count2 = 0; DispLimit();}
if(gl == 2)
{
if(buftm)
{
TM = 0;
}
else if(buftf)
{
TF = 0;
}
else
{
TM = 1;
TF = 1;
}
}
else
{
glc = glc + 1;
if(glc >= (3-gl))
{
glc = 0;
if(buftm)
{
TM = !TM;
}
else if(buftf)
{
TF = !TF;
}
else
{
TM = 1;
TF = 1;
}
}
}
Readtemp();
Rectime();
Show();
TH0 = -50000 / 256;
TL0 = -50000 % 256;
}

void DisplayLED( void )
{
switch(gl)
{
case 0:
LL = 0;
LZ = LH = 1;
break;
case 1:
LZ = 0;
LL = LH = 1;
break;
case 2:
LH = 0;
LL = LZ = 1;
break;
}
}

void main( )
{
Readtemp();
nNop(50000); nNop(50000);
write_7221( 0x09FF );
write_7221( 0x0A0C );
write_7221( 0x0B07 );
write_7221( 0x0C01 );
IE = 0x83;
IP = 0x01;
TMOD = 0x21;
TH0 = TL0 = 254;
TR0 = IT0 = 1;
DisplayLED();

while(1)
{
if(!UP && SignedB < 99)
{
++SignedB; if(!fg) fg = 1; DispLimit();
while(!UP);
}
if(!DN && SignedB > -9)
{
--SignedB; if(!fg) fg = 1; DispLimit();
while(!DN);
}
if(!IG)
{
gl = (gl + 1) % 3;
DisplayLED();
while(!IG);
}
TK = SignedT == SignedB ? 0 : 1;
buftm = SignedT < SignedB ? 1 : 0;
buftf = SignedT > SignedB ? 1 : 0;
}
}

这个程序是带时间显示的程序,51也管用

用AT89C51单片机和温度传感器DS18B20S设计数字式温度计
本次设计采用的AT89S52是一种flash型单片机,可以直接在线编程,向单片机中写程序变得更加容易。本次设计的数字温度计采用的是DS18B20数字温度传感器,DS18B20是一种可组网的高精度数字式温度传感器,由于其具有单总线的独特优点,可以使用户轻松地组建起传感器网络,并可使多点温度测量电路变得简单、可靠。本设计根据设计要求,首...

求基于AT89C51单片机的DS18B20温度检测程序(用C语言)
define discan P2 \/\/扫描口 define uchar unsigned char define uint unsigned int sbit DQ=P3^3; \/\/温度输入口 sbit DIN=P0^7; \/\/LED小数点控制 uint h;uchar flag;\/\/***温度小数部分用查表法***\/\/ uchar code ditab[16]= {0x00,0x01,0x01,0x02,0x03,0...

用AT89c51与DS18B20做数字温度计proteus怎么连接仿真图和C语言编程?
1、PROTEUS安装好后,默认不会在桌面上产生快捷方式。先打开开始菜单,依次点击“程序、Proteus 7 Professional、ISIS 7 Professional”打开PROTEUS。2、单击图中的P,添加单片机等元件。3、用关键字搜索,89C51,再加几个LED,因为是仿真就不用加限流电阻和晶振复位的元件了。4、把元件排列放好,再放一...

求:基于AT89C51单片机的多路DS18B20测温显示
startTempTrans(); \/\/步骤1:启动温度转换 LEDBuf[3] = 12; \/\/显示“+”LEDBuf[2] = t\/1000; \/\/显示温度的十位 LEDBuf[1] = (t\/100)%10; \/\/显示温度的个位 LEDBuf[0] = (t\/10)%10; \/\/显示温度的小数位 for(i = 0; i < 200; i++) \/\/步骤2:等待温度转换完成(必...

急需:AT89C51单片机的DS18B20温度检测电路及程序。
MOV A,29H MOV B,#10 ;10进制\/10=10进制 DIV AB MOV B_BIT,A ;十位在A MOV A_BIT,B ;个位在B MOV R0,#4 CLR C;多加的 DPL1: MOV R1,#250 ;显示1000次 DPLOP:MOV DPTR,#NUMTAB MOV A,TD MOVC A,@A+DPTR ;查通道的7段代码 MOV P0,A ;送出十位的7段代码 CLR P2.3...

急救!!基于AT89C51单片机的多路DS18b20测温显示系统的所有相关资料_百 ...
同DS1820一样,DS18B20也支持“一线总线”接口,测量温度范围为-55°C~+125°C,在-10~+85°C范围内,精度为±0.5°C。现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。适合于恶劣环境的现场温度测量,如:环境控制、设备或过程控制、测温类消费电子产品等。与前一代产品...

求C语言程序,AT89C51单片机为核心,DS18B20测温度,实时用4位LED显示...
\/\/温度正负标志 \/***ds1820程序***\/ void delay_18B20(unsigned int i) \/\/延时1微秒 { while(i--); }void ds1820rst() \/*ds1820复位*\/ { unsigned char x=0; DQ = 1; \/\/DQ复位 delay_18B20(4); \/\/延时 DQ = 0; \/\/DQ拉低 delay...

求基于AT89C51单片机和DS18B20温度传感器、LCD1602液晶显示的数字温度...
\/\/延时程序 void delay(uint z){ uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);} \/\/lcd的写指令 void write_com(uchar com){ lcdrs=0;lcden=0;P0=com;delay(5);lcden=1;delay(5);lcden=0;} \/\/lcd的写数据 void write_data(uchar da){ lcdrs=1;lcden=0;P0=...

基于AT89C51单片机和DS18B20温度传感器、LCD1602液晶显示的高精度数字温...
Init_DS18B20();WriteOneChar(0xCC); \/\/跳过读序号列号的操作 WriteOneChar(0xBE); \/\/读取温度寄存器等(共可读9个寄存器) 前两个就是温度 delay_18B20(100);a=ReadOneChar(); \/\/读取温度值低位 b=ReadOneChar(); \/\/读取温度值高位 temp_value=b<<4;temp_value+=(a&0xf0)>>4...

基于AT89C51单片机与DS18B20的温度控制器程序中中断程序的作用是...
读 DS18B20的温度 的占用CPU时间较长,需要先进行中断保护才行。不然其他部分不能很正常的工作。

相似回答
大家正在搜