技术交流 · 2010年 7月 5日 1

温控步进电机-这是给宝爱妃弄的

/***************************************************
要求电动机的转速随外部环境温度的变化而变化,具体的要求是:
外部温度时,电动机在L298驱动下加速正转,温度时电动机全速
正转;当外部温度时电动机加速反转,温度时电动机全速反转;温
度回到之间时电动机逐渐停止转动。
********************************************************/

#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define uint8 unsigned char
#define uint16 unsigned int
uint delaynum,flag,dingflag,dingnum;
sbit lcdrs = P3^0;
sbit lcdrw = P3^1;
sbit lcden = P3^3;

sbit DQ = P1^0;
uchar Temp_Value;
uint8 TEMP_ERR;

uchar code lbj[15] = ” 0605044225 ZCF”;
uchar code num[10] = “0123456789”;
uchar code speed[6] = “speed:”;
uchar code danw[4] = “r/s.”;
uchar code test[15] = ” Waitting 3s. “;

uchar code hz[16] = {
0xFF,0xE4,0xE4,0xE7,0xF4,0xF4,0xFF,0x00, //”正”字
0xE2,0xFC,0xF0,0xFE,0xFA,0xF4,0xFA,0x00 //”反”字
};

void delayms(uint z)
{
uint i,j;
for(i=z;i>0;i–)
for(j=124;j>0;j–);
}

void lcd_write_com(uchar com) //液晶写指令函数
{
lcdrw = 0;
lcdrs = 0;
P0 = com;
delayms(5);
lcden = 1;
delayms(5);
lcden = 0;
}

void lcd_write_dat(uchar dat) //液晶写数据函数
{
lcdrw = 0;
lcdrs = 1;
P0 = dat;
delayms(5);
lcden = 1;
delayms(5);
lcden = 0;
}

void lcd_init() //液晶初始化函数
{
lcden = 0;
lcd_write_com(0x38);
lcd_write_com(0x0c);
lcd_write_com(0x06);
lcd_write_com(0x01);
lcd_write_com(0x80);
}

void TEMP_Delay(uint16 i)
{
while(i–);
}
void TEMP_INITIALIZE()
{
DQ=1;
TEMP_Delay(8);
DQ=0;
TEMP_Delay(80);
DQ=1;
TEMP_Delay(14);
TEMP_ERR=DQ;
TEMP_Delay(20);
}

uint8 TEMP_Read_Char()
{
uint8 i;
uint8 dat;
for(i=0;i<8;i++)
{
DQ=0;
dat>>=1;
DQ=1;
if(DQ==1)
dat|=0x80;
TEMP_Delay(4);
}
return dat;
}

void TEMP_Write_Char(uint8 dat)
{
uint8 i;
for(i=0;i<8;i++)
{
DQ=0;
DQ=dat&0x01;
TEMP_Delay(5);
DQ=1;
dat>>=1;
}
}

void TEMP_Read()
{
uint8 a,b;
TEMP_INITIALIZE();
TEMP_Write_Char(0xcc);
TEMP_Write_Char(0x44);
TEMP_Delay(100);
TEMP_INITIALIZE();
TEMP_Write_Char(0xcc);
TEMP_Write_Char(0xbe);
TEMP_Delay(100);
a=TEMP_Read_Char();
b=TEMP_Read_Char();
Temp_Value=b<<4;
Temp_Value+=(a&0xf0)>>4;
}

void main()
{
uchar i;
lcd_init();
delaynum = 0;
flag = 0;
dingflag = 0;
dingnum = 0;
lcd_write_com(0x40);
for(i=0;i<16;i++)
lcd_write_dat(hz[i]);
lcd_write_com(0x80);
for(i=0;i<15;i++)
lcd_write_dat(lbj[i]);
lcd_write_com(0x80+0x40);
for(i=0;i<15;i++)
lcd_write_dat(test[i]);
delayms(3000);
EA = 1;
ET0 = 1;
TH0 = 0x3c;
TL0 = 0xb0;
lcd_write_com(0x80+0x40);
lcd_write_dat(‘ ‘);
for(i=0;i<6;i++)
lcd_write_dat(speed[i]);
lcd_write_dat(‘ ‘);
lcd_write_dat(‘ ‘);
for(i=0;i<4;i++)
lcd_write_dat(danw[i]);
lcd_write_dat(‘ ‘);
lcd_write_dat(‘ ‘);
lcd_write_dat(0xdf);
TR0 = 1;
while(1)
{
if(flag==0) //停转
{
P2 = 0x00;
}
if(flag==1) //正转
{
P2 = 0x07;
delayms(delaynum);
P2 = 0x0b;
delayms(delaynum);
P2 = 0x0d;
delayms(delaynum);
P2 = 0x0e;
delayms(delaynum);
}
if(flag==2) //反转
{
P2 = 0x0e;
delayms(delaynum);
P2 = 0x0d;
delayms(delaynum);
P2 = 0x0b;
delayms(delaynum);
P2 = 0x07;
delayms(delaynum);
}
}
}

void intt0() interrupt 1
{
TH0 = 0x3C;
TL0 = 0x0B0;
dingnum++;
if(dingnum==100)
{
TR0 = 0;
dingnum = 0;
TEMP_Read();
lcd_write_com(0x80+0x40+13);
lcd_write_dat(num[Temp_Value/10]);
lcd_write_dat(num[Temp_Value%10]);
if(Temp_Value>0&&Temp_Value<=10)
{
if(flag==0)
{
flag = 2;
delaynum=50;
}
else
{
flag = 2;
switch(delaynum)
{
case 50:
delaynum = 40;break;
case 40:
delaynum = 30;break;
case 30:
delaynum = 20;break;
case 20:
delaynum = 10;break;
default:
break;
}
}
}
else if(Temp_Value<=0)
{
flag = 2;
delaynum = 10;
}
else if(Temp_Value>=75)
{
flag = 1;
delaynum = 10;
}
else if(Temp_Value>=45&&Temp_Value<75)
{
if(flag==0)
{
flag = 1;
delaynum=50;
}
else
{
flag = 1;
switch(delaynum)
{
case 50:
delaynum = 40;break;
case 40:
delaynum = 30;break;
case 30:
delaynum = 20;break;
case 20:
delaynum = 10;break;
default:
break;
}
}
}
else if(Temp_Value>0&&Temp_Value<45)
{
flag = 0;
}
if(flag==0)
{
lcd_write_com(0x80+0x40);
lcd_write_dat(‘ ‘);
lcd_write_com(0x80+0x40+7);
lcd_write_dat(num[0]);
lcd_write_dat(num[0]);
}
else
{
lcd_write_com(0x80+0x40);
lcd_write_dat(flag-1);
lcd_write_com(0x80+0x40+7);
lcd_write_dat(num[(60-delaynum)/10]);
lcd_write_dat(num[(60-delaynum)%10]);
}
TR0 = 1;
}
}