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

📄 家电控制系统.c

📁 VB作上位机,通过跟51单片机通讯,控制家用电器电源的通断
💻 C
字号:
#include <reg51.h>
#include <math.h>
#include <stdlib.h>
#include <intrins.h>

#define uchar unsigned char
#define uint unsigned int
//typedef unsigned char uchar;
//typedef unsigned int uint;

sbit LCD_RS = P1^0;             
sbit LCD_RW = P1^1;
sbit LCD_EN = P1^2;
sbit LED = P1^6;//数据传输指示
sbit LED1=P1^0;
sbit LED2=P1^1;
sbit LED3=P1^2;
sbit LED4=P1^3;
sbit LED5=P1^4;
sbit LED6=P1^5;
sbit LED7=P1^6;
sbit LED8=P1^7;





uchar RST=0;
static count;
static value=0;
uchar p;
uchar flag=0;

	
char data  mode[20]={"INPUT:          "};

uchar code dis1[] = {"andy is the best!!"};    //预留要显示的内容
uchar code dis2[] = {"happy new year!!"};      //预留要显示的内容
/******************************************************************
/*
/*复位代码
/*
/******************************************************************/
void soft_reset(void)
{
   ((void (code *) (void)) 0x0000) ();
}
/*******************************************************************/
/*                                                                                                                                  */
/* 延时子程序                                                                                                                  */
/*                                                                                                                                  */
/*******************************************************************/

void delay(int ms)
{                           
   int i;
   while(ms--)
   {  
     for(i = 0; i< 250; i++)
     {
      _nop_();
      _nop_();
      _nop_();
      _nop_();
     }
   }
}

/*******************************************************************/
/*                                                                                                                                  */
/*检查LCD忙状态                                                                                                             */
/*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。                                      */
/*                                                                                                                                  */
/*******************************************************************/

bit lcd_busy()
{                          
    bit result;
    LCD_RS = 0;
    LCD_RW = 1;
    LCD_EN = 1;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
     result = (bit)(P0&0x80);
    LCD_EN = 0;
    return result; 
}

/*******************************************************************/
/*                                                                                                                                  */
/*写指令数据到LCD                                                                                                          */
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。                                                                   */
/*                                                                                                                                   */
/*******************************************************************/

void lcd_wcmd(uchar cmd)
{                          
   while(lcd_busy());
    LCD_RS = 0;
    LCD_RW = 0;
    LCD_EN = 0;
    _nop_();
    _nop_(); 
    P0 = cmd;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    LCD_EN = 1;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    LCD_EN = 0;  
}

/*******************************************************************/
/*                                                                                                                                  */
/*写显示数据到LCD                                                                                                          */
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。                                                                     */
/*                                                                                                                                  */
/*******************************************************************/

void lcd_wdat(uchar dat) 
{                          
   while(lcd_busy());
    LCD_RS = 1;
    LCD_RW = 0;
    LCD_EN = 0;
    P0 = dat;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    LCD_EN = 1;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    LCD_EN = 0; 
}

/*******************************************************************/
/*                                                                                                                                  */
/*  设定显示位置                                                                                                              */
/*                                                                                                                                  */
/*******************************************************************/

void lcd_pos(uchar pos)
{                          
   lcd_wcmd(pos|0x80);      //数据指针=80+地址变量
}

/*******************************************************************/
/*                                                                                                                                  */
/*  LCD初始化设定                                                                                                           */
/*                                                                                                                                  */
/*******************************************************************/

void lcd_init()
{ 
    delay(15);                     //等待LCD电源稳定        
    lcd_wcmd(0x38);          //16*2显示,5*7点阵,8位数据
    delay(5);
    lcd_wcmd(0x38);         
    delay(5);
    lcd_wcmd(0x38);         
    delay(5);

    lcd_wcmd(0x0c);          //显示开,关光标
    delay(5);
    lcd_wcmd(0x06);          //移动光标
    delay(5);
    lcd_wcmd(0x01);          //清除LCD的显示内容
    delay(5);
}

/*******************************************************************/
/*                                                                                                                                  */
/*  清屏子程序                                                                                                                 */
/*                                                                                                                                  */
/*******************************************************************/

void lcd_clr()
{
    lcd_wcmd(0x01);          //清除LCD的显示内容
    delay(5);
}

/*******************************************************************/
/*                                                                                                                                  */
/*  闪动子程序                                                                                                                 */
/*                                                                                                                                  */
/*******************************************************************/

void flash()
{
    delay(200);                     //控制停留时间
    lcd_wcmd(0x08);            //关闭显示
    delay(50);                    //延时
    lcd_wcmd(0x0c);            //开显示
    delay(200);
    lcd_wcmd(0x08);            //关闭显示
    delay(50);                     //延时
    lcd_wcmd(0x0c);            //开显示
    //delay(200);			
}


/*******************************************************************/
/*                                                                                                                                  */
/*  延时子程序                                                                                                                 */
/*                                                                                                                                  */
/*******************************************************************/

void delay_t(uint useconds)
{
 uint x;
for(x=useconds;x>0;x--);
}

/*******************************************************************/
/*                                                                                                                                  */
/*  主程序                                                                                                                       */
/*                                                                                                                                  */
/*******************************************************************/

main()
{
    uchar k=10;
    uchar i;
	PCON=0x00;
    SCON=0x50;
    TMOD=0x21;
    TL1=0xfd;
    TH1=0xfd;
    TR1=1;
    ES=1;
    EA=1;
	PS=1;
    TH0=0;
	TL0=0;
	LED1=1;
	LED2=1;
	LED3=1;
	LED4=1;
	P1=0XFF;
	//TR0=1;
    ET0=1;
    delay(10);
    lcd_init();                          //初始化LCD
    lcd_clr();

	     
   while(1)
   {
    
    //flag=1;
	if(RST==1)
	 {
	 soft_rest();
	 }
    if(flag==1)      //显示接收到的字符
    { 
	   lcd_pos(0x40);
	   for(i=0;i<20;i++)
	  {
	   
       p=mode[i];
       lcd_wdat(p);
     
	  }
	  }
	else
	{
	lcd_pos(0x00);               //设置显示位置为第一行第17列
      i = 0;
	  for(i=0;i<20;i++)
	  {
	   
       p=mode[i];
       lcd_wdat(p);
	  }
	
	}

      //delay(100);
     }

   }




uart_int(void) interrupt 4 using 3
 {
  
  char x;
  int y;

  LED=~LED;
  if(RI)
     {
	  RI=0;
	  if(SBUF=='R')
       {
	    RST=1;
       }
	   if(SBUF=='C')
       {
	    SBUF='C';
       }
	  if(SBUF=='1')
	   {
		 LED1=~LED1;
		 if(LED1==1)
		 {
		 SBUF='1';
		 }
		 
	   
	   }
	 if(SBUF=='2')
	   {
		 LED2=~LED2;
		  if(LED2==1)
		 {
		 SBUF='2';
		 }
	   }
	 if(SBUF=='3')
	   {
		 LED3=~LED3;
		  if(LED3==1)
		 {
		 SBUF='3';
		 }
	   }
     if(SBUF=='4')
	   {
		 LED4=~LED4;
		  if(LED4==1)
		 {
		 SBUF='4';
		 }
	   }
	    if(SBUF=='5')
	   {
		 LED5=~LED5;
		  if(LED5==1)
		 {
		 SBUF='5';
		 }
	   }
	    if(SBUF=='6')
	   {
		 LED6=~LED6;
		  if(LED6==1)
		 {
		 SBUF='6';
		 }
	   }
	    if(SBUF=='7')
	   {
		 LED7=~LED7;
		  if(LED7==1)
		 {
		 SBUF='7';
		 }
	   }
	    if(SBUF=='8')
	   {
		 LED8=~LED8;
		  if(LED8==1)
		 {
		 SBUF='8';
		 }
	   }
		 
	    //if(count==8)
	    //{
	     //y=atoi(temp);
	    //}
     /*if(flag==0)
      {
       for(x=0;x<19;x++)
	  {
	   mode[x]=' ';
	  }
      flag=1;
      }*/
	 }
  else
  {
  TI=0;  
  }

      //作指示用,闪烁表示在发送数据
   /*mode[count]=SBUF;
   if(count==19)
   {
    count=0;
   }*/
   
   }

Timer_Int(void) interrupt 1 
  {
   unsigned int x;
   TR0=0;
   TH0=0;
   TL0=0;
   x=P1;
   SBUF=x; 
   TR0=1;
 
  }





⌨️ 快捷键说明

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