#include <reg52.h>
#include <absacc.h>
#include <intrins.h>
sbit key40=P1^0;
sbit key50=P1^1;
sbit keyup=P1^2;
sbit keydown=P1^3;
sbit l1=P1^4;
sbit l2=P1^5;
sbit DQ = P3^7; //定义温度传感器DS18B20通信端口
#define uint unsigned int
#define uchar unsigned char
uint t,tx,m,n;
int c,d,q;
c=0;d=0;q=0;
//12mhz
//延时函数
void delay_18B20(unsigned int i)
{
while(i--);
}
void delay_10us(uchar n) //10us延时程序
{
do
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
while(--n);
}
void delay_ms(uint n)//毫秒级延时程序
{
do delay_10us(131);
while(--n);
}
//初始化函数
Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1; //DQ复位
delay_18B20(3); //稍做延时
DQ = 0; //单片机将DQ拉低
delay_18B20(80); //精确延时 大于 480us
DQ = 1; //拉高总线
delay_18B20(25);
}
//读一个字节
ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80;
delay_18B20(6);
}
return(dat);
}
//写一个字节
WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay_18B20(6);
DQ = 1;
dat>>=1;
}
}
//读取温度
/*/一般通用延时函数
void delay(unsigned int time)
{
while(--time);
}
*/
ReadTemperature(void)
{
unsigned char a=0;
unsigned char b=0;
unsigned int t=0;
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar();
b=ReadOneChar();
//启动下一次温度转换
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换*/
t=b;t<<=8;t=t|a;
//18b20:t=d*0.0625
t=t*0.0625; //有效位到小数点后1位
return(t);
}
//步进电机函数
void stepmotor_up()
{ uchar i;
for(i=0;i<2;i++)
{
P2=0X01;//控制反转 //0011
delay_ms(140);
P2=0X02;//0110
delay_ms(140);
P2=0X04;//1100
delay_ms(140);
P2=0X08;//1001
delay_ms(140);
}
P2=0x00;
delay_ms(2);
}
void stepmotor_down()
{ uchar i;
for(i=0;i<2;i++)
{
P2=0x08;//控制正转
delay_ms(140);
P2=0x04;
delay_ms(140);
P2=0x02;
delay_ms(140);
P2=0x01;
delay_ms(140);
}
P2=0x00;
delay_ms(2);
}
void stepmotor_up01() //快正转
{ uchar i;
for(i=0;i<2;i++)
{
P2=0X01;//控制反转 //0011
delay_ms(20);
P2=0X02;//0110
delay_ms(20);
P2=0X04;//1100
delay_ms(20);
P2=0X08;//1001
delay_ms(20);
}
P2=0x00;
delay_ms(2);
}
void stepmotor_down01() //快反转
{ uchar i;
for(i=0;i<2;i++)
{
P2=0x08;//控制正转
delay_ms(20);
P2=0x04;
delay_ms(20);
P2=0x02;
delay_ms(20);
P2=0x01;
delay_ms(20);
}
P2=0x00;
delay_ms(5);
}
void stepmotor_stop()
{
P2=0x00;
delay_ms(10);
}
main()
{ int p=0;
t=0;
delay_18B20(500);
Init_DS18B20();
delay_18B20(500);
ReadTemperature();
for(p=0;p<15;p++)//第一阶段球阀转60度
{
stepmotor_up01();
q++;
}
stepmotor_stop();
TMOD=0x11;
TH0=(65536-33000)/256;//按键扫描定时33ms
TL0=(65536-33000)%256;
TH1=(65536-30000)/256;//数码管显示中断30ms
TL1=(65536-30000)%256;
EA=1;//开总中断
EX0=1;//开外部中断0
EX1=1;//开外部中断1
IT0=0;//电平触发
ET0=1;//开放定时器中断
ET1=1;
TR0=1;//启动定时器
TR1=1;
tx=40;
delay_ms(30);
while(t<tx||t==85)
{stepmotor_stop();}
for(p=0;p<7;p++)
{stepmotor_up01();
q++;
}
while(1)
{
if(q<31&&q>13)
{if(t>=tx+1)//实际温度小于要求温度
{stepmotor_up();//顺时针转
q+=1;
}
else if(t<=tx-1)//要求温度小于实际温度
{stepmotor_down();
q-=1;}
else stepmotor_stop();
}
else if(q==31)
{
do
{ stepmotor_stop();}
while(t>=tx);
stepmotor_down();
q-=1;
}
else if(q==13)
{
do
{ stepmotor_stop();}
while(t<=tx);
stepmotor_up();
q+=1;
}
stepmotor_stop();
delay_ms(1000);
}
}
//中断函数
void outside_0() interrupt 0 //外部中断函数0
{
if(q>0)
{
for(d=0;d<q;d++)
{stepmotor_down01();}
/*{
P2=0x08;//控制正转
delay_ms(20);
P2=0x04;
delay_ms(20);
P2=0x02;
delay_ms(20);
P2=0x01;
delay_ms(20);
}*/
P2=0x00;
}
else if(q<0)
{
for(d=q;d<0;d++)
{stepmotor_up01();}
}
else stepmotor_stop();
stepmotor_stop();
P1=0xff;
PCON=0x01;
}
void timer_0() interrupt 1//定时器中断0键盘扫描
{
TH0=(65536-33000)/256;//按键扫描定时33ms
TL0=(65536-33000)%256;
if(!key40||!key50||!keyup||!keydown)
{
delay_ms(5);
if(!key40||!key50||!keyup||!keydown)
{
if(!key40)
{
tx=40;
}
else if(!key50)
{
tx=50;
}
else if(!keyup)
{
tx=tx+2;
}
else
{
tx=tx-2;
}
delay_ms(5);
while(!key40||!key50||!keyup||!keydown);
}
}
}
void outside_1() interrupt 2 //外部中断函数1
{ ;
}
void timer_1() interrupt 3 //定时器中断1数码管显示
{
uchar i,j;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f};
TH1=(65536-30000)/256;//数码管显示中断30ms
TL1=(65536-30000)%256;
Init_DS18B20();
delay_18B20(500);
t = ReadTemperature();
for(i=0;i<2;i++)
{
i=t/10;
l1=0;
l2=1;
P0=table[i];
delay_ms(1);
j=t%10;
l1=1;
l2=0;
P0=table[j];
delay_ms(1);
l1=1;
l2=1;
}
}