
求用单片机和DS1820做的数字温度程序仿真与程序
2个回答
2014-01-16
展开全部
#include <AT892051.H>
#include <absacc.h>
#define uchar unsigned char
#define uint unsigned intuchar code dscrc_table[] = {
0, 94,188,226, 97, 63,221,131,194,156,126, 32,163,253, 31, 65,
157,195, 33,127,252,162, 64, 30, 95, 1,227,189, 62, 96,130,220,
35,125,159,193, 66, 28,254,160,225,191, 93, 3,128,222, 60, 98,
190,224, 2, 92,223,129, 99, 61,124, 34,192,158, 29, 67,161,255,
70, 24,250,164, 39,121,155,197,132,218, 56,102,229,187, 89, 7,
219,133,103, 57,186,228, 6, 88, 25, 71,165,251,120, 38,196,154,
101, 59,217,135, 4, 90,184,230,167,249, 27, 69,198,152,122, 36,
248,166, 68, 26,153,199, 37,123, 58,100,134,216, 91, 5,231,185,
140,210, 48,110,237,179, 81, 15, 78, 16,242,172, 47,113,147,205,
17, 79,173,243,112, 46,204,146,211,141,111, 49,178,236, 14, 80,
175,241, 19, 77,206,144,114, 44,109, 51,209,143, 12, 82,176,238,
50,108,142,208, 83, 13,239,177,240,174, 76, 18,145,207, 45,115,
202,148,118, 40,171,245, 23, 73, 8, 86,180,234,105, 55,213,139,
87, 9,235,181, 54,104,138,212,149,203, 41,119,244,170, 72, 22,
233,183, 85, 11,136,214, 52,106, 43,117,151,201, 74, 20,246,168,
116, 42,200,150, 21, 75,169,247,182,232, 10, 84,215,137,107, 53
};bit in=0,LastDeviceFlag=0,search_result=0,Rbit, cmp_bit, search_direction,ED=0,state=0;/*ED为允许显示*/sbit n1=P1^0;
sbit n2=P1^1;
sbit n3=P1^2;
sbit n4=P1^3;sbit settemp=P3^1; /*设置温度*/
sbit ADD=P3^2; /*增加*/
sbit SUB=P3^3; /*减少*/
sbit port=P3^4;
sbit LE=P3^5; /*为零时送数,为1时锁存*/
sbit DS=P3^7; /*为零时消隐*/
sbit ARMING=P3^0;union {uint t_value;uchar ds1,ds2,ds3,ds4,ds5,ds6,time,var; uchar ROM_NO[8];}V={0};
union {uint t_value,t_arm;uchar TEMPH,TEMPL,ARMH,ARML,ID_Number,Flag ;uchar Lastdif,crc8,bit_number,last_zero,byte_number,byte_mask;}W={0};/* Lastdif 查找到的最大器件数量 CRC8 校验和 bit_number 码位ID last_zero最后的冲突个数 byte_number ROM字节位,
byte_mask 辅助标识位*/uchar ROM[9][8]={0},i,j;uchar docrc8( uchar value);
bit Ds18b20Int(void);
void DS18b20st(void);
void dly(uchar temp);
void delayms(void);
bit ReadBit(void);
uchar Readbyte(void);
void WriteBit(bit temp);
void WriteByte(uchar wb);
void readTemp(uchar id);
bit SEARCH(void);
bit OWFirst(void);
bit OWNext(void);
void dsp(uchar id,bit ds);
void dd(uchar id,uchar d);
//void readArm(uchar id);
void WriteArm(uchar id);
/*------------------------------主程序------------------------------------*/
void main()
{
i=0;
j=0;
Rbit=0;
dsp(0x10,0); /*初始化不成功,则一直显示4个点,表示当前没有任何器件在线上*/Ds18b20Int();if(OWFirst())
{
for(i=0;i<9;i++)
ROM[0][i]=V.ROM_NO[i];
dsp(0x11,0); /*显示器件号1秒*/
delayms();
while(OWNext())
{
j++;
ROM[j][i]=V.ROM_NO[i];
dsp(0x11+j,0);
delayms(); /*显示器件号1秒*/
if(j>7)
break;
}
W.ID_Number=j;
} W.ARMH=35; /*+35*/
W.ARML=0XB5; /*-35*/
for(i=0;i<W.ID_Number;i++) /*配置所有器件*/
WriteArm(i); /*----------------------------------主程序循环段----------------------------------*/
/* 可重用的变量:ID_Number,TEMPH,TEMPL ,ARMH,ARML,FLAG,ROM_NO[8]
重新定意:ID_Number 传感器数量
FLAG 当前处理的传感器
TEMPH 温度高字节
TEMPL 温度低字节
ARMH 警告高值
ARML 警告低值 */ V.time=0;
i=0;
j=0;
Rbit=1;
state=0; /*正常测量状态*/
W.Flag=0;
for(;;)
{
if(W.Flag>W.ID_Number)
{
DS18b20st();
W.Flag=0;
}
if(!state)
{
readTemp(W.Flag);
W.Flag++;
}
V.var=250; /*----- 显示1秒的时间------*/
while(V.var--)
dsp(W.Flag,0);
/*----------------------------------------以上循环显示各点温度----------------------------*/
P3=0XFF;
if(!settemp) /*设置报警温度,循环5次进入设置状态,再一次显示下一个,再一次,退出状态*/
{
V.time++;
if(V.time>5)
{
state=!state;
V.time=0;
}
if(state)
{
WriteArm(W.Flag-1);
readTemp(W.Flag);
W.Flag++;
V.time=4;
Rbit=1;
}
}
else
V.time=0;
if(state&!ADD) /*显示高值*/
Rbit=1;
if(state&!SUB) /*显示低值*/
Rbit=0;
}
if(state&!settemp&!ADD&Rbit) /*高值加*/
{
if(W.ARMH>0x80)
W.ARMH--;
else
W.ARMH++;
if(W.ARMH>183)
W.ARMH=183;
} if(state&!settemp&!SUB&Rbit) /*高值减*/
{
if(W.ARMH>0x80)
W.ARMH++;
else
W.ARMH--;
if(W.ARMH==0xff)
W.ARMH=0;
}
if(state&!settemp&!ADD&!Rbit) /*低值加*/
{
if(W.ARML>0x80)
W.ARML--;
else
W.ARML++;
if(W.ARML>183)
W.ARML=183;
}
if(state&!settemp&!SUB&!Rbit) /*低值减*/
{
if(W.ARML>0x80)
W.ARML++;
else
W.ARML--;
if(W.ARML==0xff)
W.ARML=0;
} if(state&!ADD&!SUB)
{
WriteArm(W.Flag-1);
state=0;
}
}
#include <absacc.h>
#define uchar unsigned char
#define uint unsigned intuchar code dscrc_table[] = {
0, 94,188,226, 97, 63,221,131,194,156,126, 32,163,253, 31, 65,
157,195, 33,127,252,162, 64, 30, 95, 1,227,189, 62, 96,130,220,
35,125,159,193, 66, 28,254,160,225,191, 93, 3,128,222, 60, 98,
190,224, 2, 92,223,129, 99, 61,124, 34,192,158, 29, 67,161,255,
70, 24,250,164, 39,121,155,197,132,218, 56,102,229,187, 89, 7,
219,133,103, 57,186,228, 6, 88, 25, 71,165,251,120, 38,196,154,
101, 59,217,135, 4, 90,184,230,167,249, 27, 69,198,152,122, 36,
248,166, 68, 26,153,199, 37,123, 58,100,134,216, 91, 5,231,185,
140,210, 48,110,237,179, 81, 15, 78, 16,242,172, 47,113,147,205,
17, 79,173,243,112, 46,204,146,211,141,111, 49,178,236, 14, 80,
175,241, 19, 77,206,144,114, 44,109, 51,209,143, 12, 82,176,238,
50,108,142,208, 83, 13,239,177,240,174, 76, 18,145,207, 45,115,
202,148,118, 40,171,245, 23, 73, 8, 86,180,234,105, 55,213,139,
87, 9,235,181, 54,104,138,212,149,203, 41,119,244,170, 72, 22,
233,183, 85, 11,136,214, 52,106, 43,117,151,201, 74, 20,246,168,
116, 42,200,150, 21, 75,169,247,182,232, 10, 84,215,137,107, 53
};bit in=0,LastDeviceFlag=0,search_result=0,Rbit, cmp_bit, search_direction,ED=0,state=0;/*ED为允许显示*/sbit n1=P1^0;
sbit n2=P1^1;
sbit n3=P1^2;
sbit n4=P1^3;sbit settemp=P3^1; /*设置温度*/
sbit ADD=P3^2; /*增加*/
sbit SUB=P3^3; /*减少*/
sbit port=P3^4;
sbit LE=P3^5; /*为零时送数,为1时锁存*/
sbit DS=P3^7; /*为零时消隐*/
sbit ARMING=P3^0;union {uint t_value;uchar ds1,ds2,ds3,ds4,ds5,ds6,time,var; uchar ROM_NO[8];}V={0};
union {uint t_value,t_arm;uchar TEMPH,TEMPL,ARMH,ARML,ID_Number,Flag ;uchar Lastdif,crc8,bit_number,last_zero,byte_number,byte_mask;}W={0};/* Lastdif 查找到的最大器件数量 CRC8 校验和 bit_number 码位ID last_zero最后的冲突个数 byte_number ROM字节位,
byte_mask 辅助标识位*/uchar ROM[9][8]={0},i,j;uchar docrc8( uchar value);
bit Ds18b20Int(void);
void DS18b20st(void);
void dly(uchar temp);
void delayms(void);
bit ReadBit(void);
uchar Readbyte(void);
void WriteBit(bit temp);
void WriteByte(uchar wb);
void readTemp(uchar id);
bit SEARCH(void);
bit OWFirst(void);
bit OWNext(void);
void dsp(uchar id,bit ds);
void dd(uchar id,uchar d);
//void readArm(uchar id);
void WriteArm(uchar id);
/*------------------------------主程序------------------------------------*/
void main()
{
i=0;
j=0;
Rbit=0;
dsp(0x10,0); /*初始化不成功,则一直显示4个点,表示当前没有任何器件在线上*/Ds18b20Int();if(OWFirst())
{
for(i=0;i<9;i++)
ROM[0][i]=V.ROM_NO[i];
dsp(0x11,0); /*显示器件号1秒*/
delayms();
while(OWNext())
{
j++;
ROM[j][i]=V.ROM_NO[i];
dsp(0x11+j,0);
delayms(); /*显示器件号1秒*/
if(j>7)
break;
}
W.ID_Number=j;
} W.ARMH=35; /*+35*/
W.ARML=0XB5; /*-35*/
for(i=0;i<W.ID_Number;i++) /*配置所有器件*/
WriteArm(i); /*----------------------------------主程序循环段----------------------------------*/
/* 可重用的变量:ID_Number,TEMPH,TEMPL ,ARMH,ARML,FLAG,ROM_NO[8]
重新定意:ID_Number 传感器数量
FLAG 当前处理的传感器
TEMPH 温度高字节
TEMPL 温度低字节
ARMH 警告高值
ARML 警告低值 */ V.time=0;
i=0;
j=0;
Rbit=1;
state=0; /*正常测量状态*/
W.Flag=0;
for(;;)
{
if(W.Flag>W.ID_Number)
{
DS18b20st();
W.Flag=0;
}
if(!state)
{
readTemp(W.Flag);
W.Flag++;
}
V.var=250; /*----- 显示1秒的时间------*/
while(V.var--)
dsp(W.Flag,0);
/*----------------------------------------以上循环显示各点温度----------------------------*/
P3=0XFF;
if(!settemp) /*设置报警温度,循环5次进入设置状态,再一次显示下一个,再一次,退出状态*/
{
V.time++;
if(V.time>5)
{
state=!state;
V.time=0;
}
if(state)
{
WriteArm(W.Flag-1);
readTemp(W.Flag);
W.Flag++;
V.time=4;
Rbit=1;
}
}
else
V.time=0;
if(state&!ADD) /*显示高值*/
Rbit=1;
if(state&!SUB) /*显示低值*/
Rbit=0;
}
if(state&!settemp&!ADD&Rbit) /*高值加*/
{
if(W.ARMH>0x80)
W.ARMH--;
else
W.ARMH++;
if(W.ARMH>183)
W.ARMH=183;
} if(state&!settemp&!SUB&Rbit) /*高值减*/
{
if(W.ARMH>0x80)
W.ARMH++;
else
W.ARMH--;
if(W.ARMH==0xff)
W.ARMH=0;
}
if(state&!settemp&!ADD&!Rbit) /*低值加*/
{
if(W.ARML>0x80)
W.ARML--;
else
W.ARML++;
if(W.ARML>183)
W.ARML=183;
}
if(state&!settemp&!SUB&!Rbit) /*低值减*/
{
if(W.ARML>0x80)
W.ARML++;
else
W.ARML--;
if(W.ARML==0xff)
W.ARML=0;
} if(state&!ADD&!SUB)
{
WriteArm(W.Flag-1);
state=0;
}
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询