#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P1^7; // DS18B20与单片机连接口
sbit R4=P1^6; //进料口水分测量电路与单片机接口
sbit R9=P1^5; //出料口水分测量电路与单片机接口
sbit fj1=P0^0;
sbit fj2=P0^3;
sbit fj3=P0^6;
sbit fjr1=P2^0;
sbit fjr2=P2^2;
sbit fjr3=P2^4; //风机与单片机连接口
sbit jr1=P0^1;
sbit jr2=P0^2;
sbit jr3=P0^4;
sbit jr4=P0^5;
sbit jr5=P0^7;
sbit jr6=P2^7;
sbit fjr4=P2^1;
sbit fjr5=P2^3;
sbit fjr6=P2^5; //电阻丝与单片机连接口
uint wendu; //温度值
uint shuifen1; //进料口水分值
uint shuifen2; //出料口水分值
uint tem0,tem1; //计数器T1计数高低位值
/*************************延时程序****************************/
void delay1(int i)
{
while(i--);
} //延时ius
void delay2(unsigned int i)
{
unsigned int j;
while(i--)
{
for(j = 0; j < 125; j++);
}
} //延时ims
void delay3(unsigned int i)
{
unsigned int j,k,h;
while(i--)
{
for(j=0;j<20;j++)
{
for(k=0;k<200;k++)
{
for(h=0;h<250;h++);
}
}
}
} //延时is
/*************************DS18B20程序****************************/
void init_18b20() //18b20的复位函数
{
DQ=1; //总线拉高电平
delay1(10); //延时10us
DQ=0;
delay1(750);
DQ=1; //释放总线
_nop_(); //延时一个机器周期
_nop_();
delay1(560);
DQ=1; //总线拉高
}
void weite(uchar dat) //18b20写函数
{
uchar i; //定义变量
for(i=0;i<8;i++)
{
DQ=0; //总线拉低
DQ=dat﹠0x01;
delay1(45);
DQ=1; //总线拉高
dat>>=1; //右移一位
}
}
uchar read() //18b20?梁?
{
uchar i,dat=0; //定义变量
DQ=1; //总线拉高,读数据条件
_nop_(); //延时一个机器周期
for(i=0;i<8;i++)
{
DQ=0; //总线拉低
_nop_(); //延时一个机器周期
_nop_();
_nop_();
dat>>=1; //右移一位
DQ=1; //总线拉高
_nop_(); //延时,使数据总线稳定,保证数据没有错误
_nop_();
if(DQ) //判断总线的值是否为1
dat|=0x80; //条件或
delay1(40); //延时40us
DQ=1; //总线拉高
}
return dat; //返回所读数据
}
uchar read_tu() //读取18b20中温度的函数
{
uchar a,b; //定义变量
init_18b20(); //18b20复位
weite(0xcc); //写入0xcc,跳过序列号
weite(0x44); //启动温度转换
init_18b20(); //18b20复位
weite(0xcc);
weite(0xbe); //读取温度
a=read(); //装低字节
b=read(); //装高字节
b<<=4; //b左移四位,前五位为区分温度正负位
a﹠=0xf0; //条件与
a>>=4; //a右移四位,去温度小数位
b+=a; //b=a+b,此时b为温度整数值
returu b; //返回所读数据
}
/*************************定时器程序****************************/
void timer0() interrupt 1 //T0定时中断
{
TR0=0;
TR1=0;
TL0=0xB0; //重装值,定时50000us
TH0=0x3C;
tem0=TL1; //读数
tem1=TH1;
TL1=0x00; //计数器1清零
TH1=0x00;
TR0=1;
TR1=1;
}
void timer1() interrupt 3 //T1计数中断
{
TR0=0;
TR1=0;
TL0=0xB0; //重装值,定时50000us
TH0=0x3C;
TL1=0x00; //计数器1清零
TH1=0x00;
TR0=1;
TR1=1;
}
void init_timer()
{
TMOD=0x51; //0101 0001 定时器0在模式1下工作16位定时器,定时方式 定时器1在模式1下工作16位计数器,T1负跳变加1
TL0=0xB0; //定时器0初值 定时50000us
TH0=0x3C;
TL1=0x00; //定时器1清零
TH1=0x00;
TR0=1; //T0开始计时
TR1=1; //T1开始计数
}
uchar read_sf() //读取水分的函数
{
uchar f,shuifen;
f=tem1*256+tem0;
f=f*20;
if(f<6399)
{
shuifen=16;
}
elseif(f<7038)
{
shuifen=6;
}
elseif(f<7287)
{
shuifen=2;
}
else
{
shuifen=0;
}
return shuifen;
}
uchar read_sf1() //读取进料口水分的函数
{
uchar c;
R4=1;
R9=0;
c=read_sf();
return c;
}
uchar read_sf2() //读取出料口水分的函数
{
uchar d;
R4=0;
R9=1;
d=read_sf();
return d;
}
/*************************控制子程序****************************/
void_kongzhi()
{
if(shuifen1>15)
{
fj1=0;
fj2=0;
fj3=0;
if(wendu<0)
{
jr1=0;
jr2=0;
jr3=0;
jr4=0;
jr5=0;
jr6=0;
}
elseif(wendu<15)
{
jr1=0;
jr3=0;
jr5=0;
}
}
elseif(shuifen1>5)
{
fj1=0;
fj2=0;
if(wendu<0)
{
jr1=0;
jr2=0;
jr3=0;
jr4=0;
}
elseif(wendu<15)
{
jr1=0;
jr3=0;
}
}
else
{
fj1=0;
if(wendu<0)
{
jr1=0;
jr2=0;
}
elseif(wendu<15)
{
jr1=0;
}
}
while(shuifen2>1)
{
int i=1;
if(i<7)
{
fjri=0;
i++;
}
delay3(300);
shuifen2=read_sf2();
}
}
/****************************主程序******************************/
void main()
{
EA=1; //开中断
ET0=1; //允许定时器0中断
ET1=1; //允许定时器1中断
init_timer(); //定时器、计数器初始化设置
while(1)
{
wendu=read_tu(); //读取温度值给全局变量
shuifen1=read_sf1();
shuifen2=read_sf2();
kongzhi();
delay3(600);
}
}
急求啊...
哪位大神帮帮忙...
万分感谢啊...
欢迎光临 (http://www.51hei.com/bbs/) | Powered by Discuz! X3.1 |