⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hello.c

📁 开发的油烟机的程序,实现烟机风机开关,风速, LED指示灯显示,时钟定时.
💻 C
字号:
//烟机
//date 2004/12/01
#include <REG935.H>               /* special function register declarations   */
                                  /* for the Philips P89C935 device           */
#include <stdio.h>                /* prototype declarations for I/O functions */
#define uchar unsigned char

void Initialize();

sbit Key1=P0^0;
sbit Key2=P0^1;
sbit Key3=P0^2;
sbit Key4=P0^3;
sbit Key5=P0^6;

sbit QD1=P0^4;
sbit QD2=P0^5;
sbit QD3=P1^7;
sbit QD4=P1^6;

sbit Lamp=P1^4;
//sbit No_electricity=P1^7;//断电 保护
sbit Machine_mode=P1^3;
sbit Machine_drive=P1^2;

bit jump1,jump2,jump3;  //数码管 跳动
bit key_able;           //按键 使能
bit sys_begin;
bit Lamp1,Lamp2;

uchar deng,deng2;
uchar temp;//串口变量

uchar disp1[11]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF};
uchar disp2[11]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0xFF};//显示 带点 

uchar position;//移动数字的位置
uchar gear;    //风机的档数

unsigned int time;//总定时 秒数
uchar time60;  //最后60秒

uchar flash1,flash2,flash3; 
uchar flash_diode;
uchar high_low;

uchar hour,ten_minute,minute;//显示的 数码管 数字
uchar disp_diode;  //显示 发光二极管

uchar ii;
uchar com1,com2;

//----------------------------------------------------------
// The delay C function  needs about 0.5 ms time 
// time(us) = (250*6 + 2 +10)条指令  * 2/晶振
//  i=1 time =0.003ms;  i=2 time=0.5ms  i=3 time=1ms.......
//----------------------------------------------------------
void delay(unsigned int i)
{
    uchar j;
    while(--i)
    {
        j=250;
        while(--j);
    }
}

//-------------------
//串口接受数据中断
//-------------------
void Rcv_ISR() interrupt 4 using 1
{
  EA=0;

  temp=SBUF;//保存所读取的数据 
  RI=0;     //RI清零 以等待下次接受
  
  if((temp==0x15)&&(!Lamp2))         //接受到正确的数据  开炉具 烟机自动工作
  {   
     com1++;
     if(com1>2)
     {
      Initialize();

      Machine_mode=0;//中速
      Machine_drive=1;
    
	    hour=0;        //默认 50 分钟
        ten_minute=5;
        minute=0; 
        time=3058;     //默认 3000 秒

		gear=1;     // gear=1 表示 中速
		sys_begin=1;
 
        com1=0;
       }
   }
   
  if((temp==0x26)&&(!Lamp2))           //接受到正确的数据  关炉具 烟机延迟一分钟后自动关机
  {
    com2++;
    if(com2>2)
     {
      time=0;
      com2=0;
     }
  }
 
  EA=1;
 }

// void Send_ISR() interrupt 13
// {
// TI=0;
// }
//------------------
//发送数据
//------------------
void SendData()
{ EA=0;
  TI=0;     // TI 清零 准备 发送 
  SBUF=0x37;   // 发送数据
  while(!TI);// 当TI 为 1 时 发送完毕
   TI=0;     // TI 清0 准备下一次 发送
  EA=1;
}

//------------------
//串口初始化
//------------------
void UART_Init()
{
SCON=0x50; //使能接收,选择串口模式1
SSTAT=0x60; //选择独立的Tx/Rx中断

BRGCON =0x00;
BRGR0=0x78; //1200 baud @ 6MHz
BRGR1=0x13;

BRGCON =0x03; //使能BRG

ESR=1; //ESR=Enable Serial Recieve
//EST=1; //EST=Enable Serial Transmit
}

//------------------
// T0 定时器
//------------------
void T0_int() interrupt 1 using 2
{
 EA=0;
 TR0=0;

 TL0=0x00;  TH0=0x00;
 TR0=1;

 

if((Key1)&&(Key2)&&(Key3)&&(Key4)&&(Key5))
   EKBI=1;                         //键盘中断允许

//初始化端口
 QD1=1;
 QD2=1;
 QD3=1;
 QD4=1;
 P2=0xFF;

 QD1=0;    //点亮第一个数码管
 if(!jump1)//如果不跳动的话
  P2=disp2[hour];
 else      //处理跳动
 {
   flash1++;
    switch (flash1/10)
    {
	case 0: P2=0xFF;        break;
	case 1: P2=disp2[hour]; break;
    case 2: P2=0xFF;        break;
	case 3: P2=disp2[hour]; break;
	case 4: P2=0xFF;        break;
	case 5: P2=disp2[hour]; break;
	case 6: P2=0xFF;        break;
	case 7: P2=disp2[hour]; break;
	default:  jump1=0;      break;//不跳了
    }
  }
  delay(5);// Delay about 2 ms 

//初始化端口
 QD1=1;
 QD2=1;
 QD3=1;
 QD4=1;
 P2=0xFF;

 QD2=0; //点亮第二个数码管
 if(!jump2)//如果不跳动的话
  P2=disp1[ten_minute];
 else     //处理跳动
 {
  flash2++;
    switch (flash2/10)
    {
	case 0: P2=0xFF;              break;
	case 1: P2=disp1[ten_minute]; break;
    case 2: P2=0xFF;              break;
	case 3: P2=disp1[ten_minute]; break;
	case 4: P2=0xFF;              break;
	case 5: P2=disp1[ten_minute]; break;
	case 6: P2=0xFF;              break;
	case 7: P2=disp1[ten_minute]; break;
	default:  jump2=0;            break;//不跳了
    }
  }
  delay(5);// Delay about 2 ms 

//初始化端口
 QD1=1;
 QD2=1;
 QD3=1;
 QD4=1;
 P2=0xFF;

 QD3=0;//点亮第三个数码管
 if(!jump3) //如果不跳动的话
  P2=disp1[minute];
 else   //处理跳动
 {
  flash3++;
    switch (flash3/10)
    {
	case 0: P2=0xFF;          break;
	case 1: P2=disp1[minute]; break;
    case 2: P2=0xFF;          break;
	case 3: P2=disp1[minute]; break;
	case 4: P2=0xFF;          break;
	case 5: P2=disp1[minute]; break;
	case 6: P2=0xFF;          break;
	case 7: P2=disp1[minute]; break;
	default:  jump3=0;        break;//不跳了
    }
  }
 delay(5);// Delay about 2 ms 

//初始化端口
 QD1=1;
 QD2=1;
 QD3=1;
 QD4=1;
 P2=0xFF;

 QD4=0;
 disp_diode|=0xF9;//除了 灯 以外的 发光二极管 全关
 if(gear==1) //中速
 { 
   flash_diode++;
    switch (flash_diode/10)
    {
	case 0: disp_diode&=0x7E;     break;
	case 1: disp_diode&=0x5F;     break;
   // case 2: disp_diode&=0x7D;     break;
	default:  flash_diode=0;      break;
    }
  }

 if(gear==2)//高速
 {
   flash_diode++;
    switch (flash_diode/5)
    {
	case 0: disp_diode&=0xBE;     break;
	case 1: disp_diode&=0x9F;     break;
 //   case 2: disp_diode&=0xBD;     break;
	default:  flash_diode=0;      break;
    }
  }

 if(gear==3)//低速
 {
    flash_diode++;
    switch (flash_diode/15)
    {
	case 0: disp_diode&=0x7E;     break;
	case 1: disp_diode&=0x5F;     break;
 //   case 2: disp_diode&=0x7D;     break;
	default:  flash_diode=0;      break;
    }
   if(flash_diode/15==1)//表示低数度的 发光二极管 闪动
       disp_diode|=0x80;
  }
  	  if(Lamp1)
	  disp_diode&=0xFB;
	  else
	  disp_diode|=0x04;

  	  if(Lamp2)
	  disp_diode&=0xFD;
	  else
	  disp_diode|=0x02;

 P2=disp_diode;

 delay(5);// Delay about 2 ms 

//初始化端口
 QD1=1;
 QD2=1;
 QD3=1;
 QD4=1;
 P2=0xFF;

  EA=1;  
}

//------------------
// 实时时钟定时器
//------------------
unsigned int time1,time2;
void RTC_int() interrupt 10 using 3
{ 
  EA=0;

 RTCH=0xB7;   //定时 1S 
  RTCL=0x1A;  

  RTCCON=0x43;// 清零中断标志

   if(time>0)
   {
    time--;
	hour=time/3600;
	time1=time%3600;
	ten_minute=time1/600;
	time2=time1%600;
	minute=time2/60;
   }
   else
   {
     if(sys_begin)
	 {
      key_able=0;// 移位 和 加法 按键不可用
	  time60--; //最后60秒
	  hour=10;  //不显示小时位
	  ten_minute=time60/10;
	  minute=time60%10;

	     if(time60==0)
	      {
	        Initialize();
            TR0=0;
            if(!Lamp2)
            {
               for(ii=0;ii<10;ii++)
			   {
               SendData();
			   delay(11);
			   }
             }
            TR0=1;
	      }
	 }
   }

   if(gear==3) //风机 低数 状态下的 高2秒 低2秒的 控制
   { 
     high_low++;
     switch (high_low/2)
    {
	case 0:  Machine_mode=0;
             Machine_drive=0;     break;
	case 1:  Machine_mode=0;
             Machine_drive=1;     break;
   	default: Machine_mode=0;
             Machine_drive=0; 
	         high_low=0;          break;
    }
   
   }

  EA=1;
}



void Key_int() interrupt 7 using 0
{
 EA=0;
 EKBI=0;

   if((!Key1)&&(key_able))
   {
    delay(31);//// Delay about 15 ms 
     if(!Key1)
	 {//处理时钟移位动作
       position++;
	  if(position>3) position=1;
	  
      if(position==1) {jump1=1;jump2=0;jump3=0;flash1=0;}
      if(position==2) {jump1=0;jump2=1;jump3=0;flash2=0;}
      if(position==3) {jump1=0;jump2=0;jump3=1;flash3=0;}
      
	 }
   }

   if((!Key2)&&(key_able))
   {
    delay(31);//// Delay about 15 ms 
     if(!Key2)
	 {//处理时钟加法动作
        if(position==1)
  	    {
		 if(hour<10)
          {
          hour++;
		  if(hour>9) hour=0;
		  
          time=hour*3600+ten_minute*600+minute*60+58; 
		  jump1=1;
		  flash1=0;
		  }
		}

	    if(position==2)
  	    {
		  if(ten_minute<10)
		  {
          ten_minute++;
		  if(ten_minute>5) ten_minute=0;
		  
          time=hour*3600+ten_minute*600+minute*60+58;
		  jump2=1;
		  flash2=0;
		  }
		}

		if(position==3)
  	    { 
		  if(minute<10)
		  {
          minute++;
		  if(minute>9) minute=0;

		  time=hour*3600+ten_minute*600+minute*60+58;
		  jump3=1;
		  flash3=0;
		  }
		}
	 }
   }

   if(!Key3)
   {
    delay(31);//// Delay about 15 ms 
     if(!Key3)
	 {//点亮或熄灭 灯 动作
      Lamp=~Lamp;
      deng++;
      switch (deng/2)
    {
	case 0:  Lamp1=1;  break;
   	default:   deng=0  ;Lamp1=0;  break;
    }
     

	  if(Lamp1)
	  disp_diode&=0xFB;
	  else
	  disp_diode|=0x04;
	 }
   }

   if(!Key5)
   {
    delay(31);//// Delay about 15 ms 
    if(!Key5)
	{//点亮或熄灭 灯 动作
      deng2++;
      switch (deng2/2)
      {
	   case 0:  Lamp2=1;  break;
   	   default:   deng2=0; Lamp2=0;  break;
      }
 
	  if(Lamp2)
	  disp_diode&=0xFD;
	  else
	  disp_diode|=0x02;
	 }
   }

   if(!Key4)
   {
    delay(31);//// Delay about 15 ms 
      if(!Key4)
	  {//风机 转速 控制
        gear++;
	    if(gear>3) gear=0;

		if(gear==0)   //停机
		{
		  Machine_mode=0;
          Machine_drive=0;
		}

	    if(gear==1)   //开始 中档
	    { 
		  Machine_mode=0;
          Machine_drive=1;
		  if(!sys_begin)
		  {
	       hour=0;      
           ten_minute=5;
           minute=0; 
           time=3058;

		   sys_begin=1;
  	      }
        }

		if(gear==2)    //高档
		{
		  Machine_mode=1;
          Machine_drive=0;

		}

		if(gear==3)    //低档
		{
	     high_low=0;
        }

      }
   }

KBCON=0x00;
EA=1;
}

//------------------
//  数据 初始化
//------------------
void Initialize()
{
  key_able=1;//按键能动
  sys_begin=0;
  
  position=1;//位置在第一位
  jump1=0;jump2=0;jump3=0;    //数字不跳动

  gear=0;//风机停机档 
  Machine_mode=0;  //关风机
  Machine_drive=0;

  Lamp=0;//关灯
  Lamp1=0;
  deng=0;
  Lamp2=0;
  deng2=0;

  time=0;//时间清空
  time60=60;

  flash1=0;
  flash2=0;
  flash3=0;
  flash_diode=0;

  high_low=0;

  hour=10;       //都不显示    
  ten_minute=10;
  minute=10; 
  disp_diode=0xFF;

   com1=0;com2=0;
}
//------------------------------------------------
//  The main C function.  
//------------------------------------------------
void main() 
{
  EA=1;  //中断总允许
 
  //P0,P1,P2口模式设置
  P0M1 = 0xFF;
  P0M2 = 0xFF;
  P1M1 = 0xDC;
  P1M2 = 0xDC;
  P2M1 = 0xFF;
  P2M2 = 0xFF;

   //P0,P1,P2初始化
   P0=0xFF;
   P1=0xC3;
   P2=0xFF;


  TMOD=0x01;//定时器模式1
  TL0=0x00;  TH0=0x00;
  ET0=1;  //定时器中断允许
  TR0=1;  //打开 定时器 以产生 振荡频率

//产生38KHz,50%占空比
//使T1(P0.7)
  TH1=0xD9;
  TMOD=0x21;
  AUXR1|=0x20;
  TR1=1;
//产生38KHz,50%占空比的方波

  EWDRT=1;     //实时时钟 中断开启
  WDCON=0xE0;  //关看门狗 定时器
  RTCH=0xB7;   //定时 1S 
  RTCL=0x1A;  

  RTCCON=0x43;// 开启实时时钟定时器
  WFEED1=0xA5;
  WFEED2=0x5A;

  UART_Init();//串口初始化

  KBPATN=0xFF;//键盘中断初始设置
  KBCON=0x00;
  KBMASK=0x4F;
  EKBI=1;

  Initialize();//数据初始化

   delay(1001); // Delay about 0.5 seconds 
 
   while (1) 
   {	
    delay(2); // Delay about 0.0005 seconds    
   }  
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -