#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P3^7;
sbit P1_0=P1^0;
sbit P1_1=P1^1;
sbit P1_2=P1^2;
sbit P1_3=P1^3;
uchar t,s,speed=50;
unsigned int temp1;
void delay(uint N)//廷迟时间为(24+N*16)us
{
int i;
for(i=0;i<N;i++);
}
//步进电机
void gorun(unsigned char step)
{
switch(step)
{
case 0:
P1_0 = 0;
P1_1 = 0;
P1_2 = 0;
P1_3 = 0;
break;
case 1:
P1_0 = 1;
P1_1 = 0;
P1_2 = 0;
P1_3 = 0;
break;
case 2:
P1_0 = 1;
P1_1 = 1;
P1_2 = 0;
P1_3 = 0;
break;
case 3:
P1_0 = 0;
P1_1 = 1;
P1_2 = 0;
P1_3 = 0;
break;
case 4:
P1_0 = 0;
P1_1 = 1;
P1_2 = 1;
P1_3 = 0;
break;
case 5:
P1_0 = 0;
P1_1 = 0;
P1_2 = 1;
P1_3 = 0;
break;
case 6:
P1_0 = 0;
P1_1 = 0;
P1_2 = 1;
P1_3 = 1;
break;
case 7:
P1_0 = 0;
P1_1 = 0;
P1_2 = 0;
P1_3 = 1;
break;
case 8:
P1_0 = 1;
P1_1 = 0;
P1_2 = 0;
P1_3 = 1;
break;
}
}
/**************************************************
DS18B20初始化
/********************************************/
void init()
{
DQ=1;
delay(0);
DQ=0;
delay(50); //廷迟24+50*16=824us
DQ=1;
delay(3); //48us
delay(10); //184us
DQ=1;
}
void write(uchar date)
{
uint i;
for (i=0; i<8; i++)
{
DQ = 0;
DQ = date & 0x01; //最低位移出 最低位先写入 //i=0:DQ=(0101 0101 &0000 0001)=0000 0001
delay(2); //56us 即将最低位1 写入,i=1 : 将0写入.......
DQ=1;
date >>= 1; //右移一位
}
}
uchar read()
{
uint i, value=0;
DQ=1;
_nop_(); //一个机器周期:(1/11.0952(即晶振频率))*12=1.085us
for (i=0; i<8; i++)
{
value = value>>1; //15us 之内必须读完一位
DQ = 0; //设i=0 :value=0101 0101 >>1 得到:0010 1010
_nop_(); // 读到的DQ=1,0010 1010|1000 0000=1010 1010
_nop_(); // i=1: value=01010101
DQ = 1; //读到的DQ=0, value=01010101
_nop_(); //i=2: value=0010 1010
_nop_();
if (DQ) //先读最低位
value|=0x80;
delay(2); // 56us
DQ=1;
}
return(value);
}
//DS18B20数据采集转换
uint read_wen_du()
{
uchar HB,LB,temp;
init(); // 复位
write(0xcc); // 跳过ROM 即不必读64位序列号的ROM
write(0x44); // 启动温度转换
init();
write(0xcc); // 跳过ROM 即不必读64位序列号的ROM
write(0xbe); // 读命令
LB=read(); // 低八位 1011 1010
HB=read(); // 高八位 1111 1010
HB=HB<<4; // 1011 000
HB+=(LB&0XF0)>>4; // (LB&0xF0)=1011 0000 >>4 :0000 1011 +HB :1010 1011
temp=HB;
return temp; // 返回温度值
}
//DS18B20基本函数结束
void main()
{
TMOD = 0x01;
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256;
TR0=1;
ET0=1;
EA=1;
while(1)
{
temp1=read_wen_du();
if(temp1>=20)
{
gorun(s);
EA=1;
}
else
{
s=0;
t=0;
EA=0;
}
}
}
//中断服务函数
void timeint(void) interrupt 1
{
TR0=0;
TH0 = 254;
TL0 = 255-speed; //调速
t++;
if(t==10)
{
s++;
if(s>8)
s=1;
t=0;
}
TR0=1;
}
|