#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); } }
|