05

/***************************************************
要求电动机的转速随外部环境温度的变化而变化,具体的要求是:
外部温度时,电动机在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,0×00, //”正”字
      0xE2,0xFC,0xF0,0xFE,0xFA,0xF4,0xFA,0×00  //”反”字
      };

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(0×38);
 lcd_write_com(0x0c);
 lcd_write_com(0×06);
 lcd_write_com(0×01);
 lcd_write_com(0×80);
}

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|=0×80;
  TEMP_Delay(4);
 }
 return dat;
}

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

void TEMP_Read()
{
 uint8 a,b;
 TEMP_INITIALIZE();
 TEMP_Write_Char(0xcc);
 TEMP_Write_Char(0×44);
 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(0×40);
 for(i=0;i<16;i++)
  lcd_write_dat(hz[i]);
 lcd_write_com(0×80);
 for(i=0;i<15;i++)
  lcd_write_dat(lbj[i]);
 lcd_write_com(0×80+0×40);
 for(i=0;i<15;i++)
  lcd_write_dat(test[i]);
 delayms(3000);
 EA = 1;
 ET0 = 1;
 TH0 = 0x3c;
 TL0 = 0xb0;
 lcd_write_com(0×80+0×40);
 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 = 0×00;
  }
  if(flag==1)  //正转
  {
   P2 = 0×07;
   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 = 0×07;
   delayms(delaynum);
  }
 }
}

void intt0() interrupt 1
{
 TH0 = 0x3C;
    TL0 = 0x0B0;
 dingnum++;
 if(dingnum==100)
 {
  TR0 = 0;
  dingnum = 0;
  TEMP_Read();
  lcd_write_com(0×80+0×40+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(0×80+0×40);
   lcd_write_dat(‘ ‘);
   lcd_write_com(0×80+0×40+7);
   lcd_write_dat(num[0]);
   lcd_write_dat(num[0]);
  }
  else
  {
   lcd_write_com(0×80+0×40);
   lcd_write_dat(flag-1);
   lcd_write_com(0×80+0×40+7);
   lcd_write_dat(num[(60-delaynum)/10]);
   lcd_write_dat(num[(60-delaynum)%10]);
  }
  TR0 = 1;
 }
}

Leave a Reply

click to change 看不清?点击换一张!

备案号:晋ICP备08002207号