标题:
单片机智慧大棚监测程序-18b20实验
[打印本页]
作者:
zx173
时间:
2024-12-4 22:49
标题:
单片机智慧大棚监测程序-18b20实验
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //段码表
unsigned char code table1[]={0x7f,0xbf,0xdf,0xef,0xf7};
bit DS18B20_Reset();
void DS18B20_WriteData(uchar dat);
uchar DS18B20_RadeData();
void Seg7_Display(uint val);
void delayms(uint xms);
void system_Ini();
void InitMotor();
void SetMotor();
uchar tempL;
sbit CS88=P2^2;
uint tempH;
uint temp;
sbit LED=P1^1;
sbit DS=P2^4; //引脚定义
sbit DU=P2^0;
sbit WE=P2^1;
sbit beep = P2^3;
sbit A = P3^4; //定义管脚
sbit b = P3^5;
sbit C = P3^6;
sbit D = P3^7;
//步进电机驱动
unsigned char MotorStep=0; //步进马达步序
unsigned int MotorDelay,Speed=1,TIM,CT;
#define speed 12 // 调整速度 数值不要设的太低 低了会引起震动。
void main()
{
system_Ini();
InitMotor();
while(1)
{
CS88=0;
DS18B20_Reset();
DS18B20_WriteData(0xcc); //跳过ROM检测
DS18B20_WriteData(0x44); //启动温度转换
DS18B20_Reset();
DS18B20_WriteData(0xcc); //跳过ROM检测
DS18B20_WriteData(0xbe); //读暂存器
tempL=DS18B20_RadeData(); //读温度地位
tempH=DS18B20_RadeData();
tempH=(tempH<<8)|tempL; //16位
if((tempH&0xf8)==0xf800) //如果温度是负值,取反加一
tempH=~tempH+1;
temp=tempH*0.0625*1000; //25 25360
//显示读取到的温度
Seg7_Display(temp); //25.360
//判断温度是否超过29度
if (temp>34000)
{
LED=0;
beep=0;
SetMotor();
}
else
{
LED=1;
beep=1;
A = 0;
b = 0;
C = 0;
D = 0;
}
//静态显示小数点
DU=1;
P0=0x80;
DU=0;
P0=0xff;
WE=1;
P0=0xef;
WE=0;
}
}
bit DS18B20_Reset()
{
bit flag;
uchar i;
DS=0;
for(i=240;i>0;i--); //每执行一次,是两个机器周期 240X2=480
DS=1;
for(i=40;i>0;i--); //延时80us
flag=DS;
for(i=200;i>0;i--); //延时400us
return flag;
}
void DS18B20_WriteData(uchar dat)
{
uchar i,j;
for(j=0;j<8;j++)
{
DS=0;
for(i=2;i>0;i--);
DS=dat&0x01; //取出最低位
for(i=30;i>0;i--); //延时约60us
DS=1; //释放总线
dat = dat>>1;
}
}
uchar DS18B20_RadeData()
{
uchar i,j,rdata;
for(j=0;j<8;j++)
{
rdata>>=1;
DS=0;
for(i=2;i>0;i--);
DS=1;
for(i=3;i>0;i--);
if(DS==1)
rdata=rdata|0x80;
for(i=30;i>0;i--);
DS=1;
}
return rdata;
}
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void Seg7_Display(uint val)
{
uint i=4;
uint dis_data[5]={0};
dis_data[0]=val%10;
dis_data[1]=val/10%10;
dis_data[2]=val/100%10;
dis_data[3]=val/1000%10;
dis_data[4]=val/10000%10;
for (i=0;i<5;i++)
{
P0=0xff;
DU=1;
P0=table[dis_data[i]];
DU=0;
P0=0xff;
WE=1;
P0=table1[i];
WE=0;
delayms(1);
}
}
void InitMotor()
{
A = 1;
b = 1;
C = 1;
D = 1;
}
void SetMotor()
{
MotorDelay=Speed; //调整速度
switch(MotorStep)
{
case 0:
if(TIM) // A
{
A = 0; //0xf1
b = 1;
C = 1;
D = 1;
MotorStep = 1;
TIM=0;
}
break;
case 1: // AB
if(TIM)
{
A = 0; //0xf3
b = 0;
C = 1;
D = 1;
MotorStep = 2;
TIM=0;
}
break;
case 2: //B
if(TIM)
{
A = 1;
b = 0; //0xf2
C = 1;
D = 1;
MotorStep = 3;
TIM=0;
}
break;
case 3: //BC
if(TIM)
{
A = 1;
b = 0; //0xf6
C = 0;
D = 1;
MotorStep = 4;
TIM=0;
}
break;
case 4: //C
if(TIM)
{
A = 1;
b = 1; //0xf4
C = 0;
D = 1;
MotorStep = 5;
TIM=0;
}
break;
case 5: //CD
if(TIM)
{
A = 1;
b = 1; //0xfc
C = 0;
D = 0;
MotorStep = 6;
TIM=0;
}
break;
case 6: //D
if(TIM)
{
A = 1;
b = 1; //0xf8
C = 1;
D = 0;
MotorStep = 7;
TIM=0;
}
break;
case 7: //DA
if(TIM)
{
A = 0;
b = 1; //0xf9
C = 1;
D = 0;
MotorStep = 0;
TIM=0;
}
break;
}
}
void system_Ini()
{
TMOD|= 0x11;
TH0=0xDC; //11.0592M
TL0=0x00;
IE = 0x8A;
TR0 = 1;
}
void Tzd(void) interrupt 1
{
TH0 = 0xfe; //11.0592
TL0 = 0x33;
if( CT++==speed)
{TIM=1;
CT=0;
}
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1