会写单片机程序的大神请进来帮帮忙
做毕业设计,所有东西都是自己做的,板子也是自己画的,自己洗的,所有都调试好了,可是程序是硬伤,希望能有大神帮帮忙写下程序,谢啦。STC89C52的单片机,晶振12MHZ,...
做毕业设计,所有东西都是自己做的,板子也是自己画的,自己洗的,所有都调试好了,可是程序是硬伤,希望能有大神帮帮忙写下程序,谢啦。
STC89C52的单片机,晶振12MHZ,通过DS18B20温度传感器检测温度,当温度低于1℃时,触发三个中间继电器动作,动作10S后复位。
DS18B20接线端口P0.3
中间继电器1接线端口P0.0
中间继电器2接线端口P0.1
中间继电器3接线端口P0.2
调试后如果成功,追加大量分数,谢谢大神啦!!! 展开
STC89C52的单片机,晶振12MHZ,通过DS18B20温度传感器检测温度,当温度低于1℃时,触发三个中间继电器动作,动作10S后复位。
DS18B20接线端口P0.3
中间继电器1接线端口P0.0
中间继电器2接线端口P0.1
中间继电器3接线端口P0.2
调试后如果成功,追加大量分数,谢谢大神啦!!! 展开
1个回答
展开全部
/*************************此部分为18B20的驱动程序,自己整合吧相信难不倒你*************************************/
#include <reg52.H>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit D18B20=P3^7; // 18b20的引脚定义
#define NOP() _nop_() /* 定义空指令 */
#define _Nop() _nop_() /*定义空指令*/
void TempDelay (uchar us); //18b20的函数声明
void Init18b20 (void);
void WriteByte (uchar wr); //单字节写入
void read_bytes (uchar j);
uchar CRC (uchar j);
void GemTemp (void);
void TemperatuerResult(void);
bit flag;
uint Temperature; //用来存放读出温度后的值
uchar temp_buff[9]; //存储读取的字节,read scratchpad为9字节,read rom ID为8字节
uchar *p,TIM;
/************************************************************
*Function:延时处理
*************************************************************/
void TempDelay (uchar us)
{
while(us--);
}
/************************************************************
*Function:18B20初始化
*************************************************************/
void Init18b20 (void)
{
D18B20=1;
_nop_();
D18B20=0;
TempDelay(80); //delay 530 uS//80
_nop_();
D18B20=1;
TempDelay(14); //delay 100 uS//14
_nop_();
_nop_();
_nop_();
if(D18B20==0)
flag = 1; //detect 1820 success!
else
flag = 0; //detect 1820 fail!
TempDelay(20); //20
_nop_();
_nop_();
D18B20 = 1;
}
/************************************************************
*Function:向18B20写入一个字节
*parameter:
*Return:
*Modify:
*************************************************************/
void WriteByte (uchar wr) //单字节写入
{
unsigned char idata i;
for (i=0;i<8;i++)
{
D18B20 = 0;
_nop_();
D18B20=wr&0x01;
TempDelay(3); //delay 45 uS //5
_nop_();
_nop_();
D18B20=1;
wr >>= 1;
}
}
/************************************************************
*Function:读18B20的一个字节
*************************************************************/
unsigned char ReadByte (void) //读取单字节
{
unsigned char idata i,u=0;
for(i=0;i<8;i++)
{
D18B20 = 0;
u >>= 1;
D18B20 = 1;
if(D18B20==1)
u |= 0x80;
TempDelay (2);
_nop_();
}
return(u);
}
/************************************************************
*Function:读18B20
*************************************************************/
void read_bytes (uchar j)
{
unsigned char idata i;
for(i=0;i<j;i++)
{
*p = ReadByte();
p++;
}
}
/************************************************************
*Function:读取温度
*************************************************************/
void GemTemp (void)
{
Temperature = temp_buff[1]*0x100 + temp_buff[0];
// Temperature *= 0.625;
Temperature /= 16;
TempDelay(1);
}
/************************************************************
*Function:18B20ID全处理
*************************************************************/
void TemperatuerResult(void)
{
Init18b20 ();
WriteByte(0xcc); //skip rom
WriteByte(0x44); //Temperature convert
Init18b20 ();
WriteByte(0xcc); //skip rom
WriteByte(0xbe); //read Temperature
p = temp_buff;
read_bytes (9);
GemTemp();
}
void GetTemp()
{
if(TIM==100) //每隔 1000ms 读取温度
{ TIM=0;
TemperatuerResult();
}
}
#include <reg52.H>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit D18B20=P3^7; // 18b20的引脚定义
#define NOP() _nop_() /* 定义空指令 */
#define _Nop() _nop_() /*定义空指令*/
void TempDelay (uchar us); //18b20的函数声明
void Init18b20 (void);
void WriteByte (uchar wr); //单字节写入
void read_bytes (uchar j);
uchar CRC (uchar j);
void GemTemp (void);
void TemperatuerResult(void);
bit flag;
uint Temperature; //用来存放读出温度后的值
uchar temp_buff[9]; //存储读取的字节,read scratchpad为9字节,read rom ID为8字节
uchar *p,TIM;
/************************************************************
*Function:延时处理
*************************************************************/
void TempDelay (uchar us)
{
while(us--);
}
/************************************************************
*Function:18B20初始化
*************************************************************/
void Init18b20 (void)
{
D18B20=1;
_nop_();
D18B20=0;
TempDelay(80); //delay 530 uS//80
_nop_();
D18B20=1;
TempDelay(14); //delay 100 uS//14
_nop_();
_nop_();
_nop_();
if(D18B20==0)
flag = 1; //detect 1820 success!
else
flag = 0; //detect 1820 fail!
TempDelay(20); //20
_nop_();
_nop_();
D18B20 = 1;
}
/************************************************************
*Function:向18B20写入一个字节
*parameter:
*Return:
*Modify:
*************************************************************/
void WriteByte (uchar wr) //单字节写入
{
unsigned char idata i;
for (i=0;i<8;i++)
{
D18B20 = 0;
_nop_();
D18B20=wr&0x01;
TempDelay(3); //delay 45 uS //5
_nop_();
_nop_();
D18B20=1;
wr >>= 1;
}
}
/************************************************************
*Function:读18B20的一个字节
*************************************************************/
unsigned char ReadByte (void) //读取单字节
{
unsigned char idata i,u=0;
for(i=0;i<8;i++)
{
D18B20 = 0;
u >>= 1;
D18B20 = 1;
if(D18B20==1)
u |= 0x80;
TempDelay (2);
_nop_();
}
return(u);
}
/************************************************************
*Function:读18B20
*************************************************************/
void read_bytes (uchar j)
{
unsigned char idata i;
for(i=0;i<j;i++)
{
*p = ReadByte();
p++;
}
}
/************************************************************
*Function:读取温度
*************************************************************/
void GemTemp (void)
{
Temperature = temp_buff[1]*0x100 + temp_buff[0];
// Temperature *= 0.625;
Temperature /= 16;
TempDelay(1);
}
/************************************************************
*Function:18B20ID全处理
*************************************************************/
void TemperatuerResult(void)
{
Init18b20 ();
WriteByte(0xcc); //skip rom
WriteByte(0x44); //Temperature convert
Init18b20 ();
WriteByte(0xcc); //skip rom
WriteByte(0xbe); //read Temperature
p = temp_buff;
read_bytes (9);
GemTemp();
}
void GetTemp()
{
if(TIM==100) //每隔 1000ms 读取温度
{ TIM=0;
TemperatuerResult();
}
}
追问
大神您好,首先先谢谢你能回答。
可是我再单片机的软件方面真的很小白,这段程序基本上都看不懂,呜呜。
能帮我再把程序补充成完整的么?真的很需要你的帮助呢,我会追加大量财富的,倾其所有的追加,太感谢啦。。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询