智能家居系统 单片机部分的源代码

2013-01-30 14:41:54  阅读 5506 次 评论 1 条

反正这个东西也是玩玩的 放在我这里 还不如大家一起用

 

#include <reg52.h>
#include <intrins.h>
#define uchar  unsigned char 
#define uint   unsigned int
sbit LCD_RS = P3^5;             
sbit LCD_RW = P3^6;
sbit LCD_EN = P3^7;   
sbit K0 = P1^0; 
sbit K1 = P1^1; 
sbit K2 = P1^2; 
sbit K3 = P1^3; 
sbit K4 = P1^4; 
sbit K5 = P1^5; 
sbit K6 = P1^6; 
sbit K7 = P1^7; 
  
uchar data  RXDdata[ ] = {0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
                          0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
        0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
                          0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20 };  //
uchar temp,buf,m,count,playflag,KK;
uchar code  cdis1[ ] = {"JHome System----"};
uchar code  cdis2[ ] = {"                "};

sbit k1=P3^2;// 用sbit 关键字 定义 LED到P0.0端口,
sbit k2=P3^3;              //LED是自己任意定义且容易记忆的符号

/**********************************************************
 延时子程序
**********************************************************/
void delay1(uint ms) 
{
   uchar k;
   while(ms--)
   {
     for(k=0;k<10;k++);
   }
}

void Delay(unsigned int t)
{
  while(--t);
}
/******************************************************************/
/*检查LCD忙状态                                                   */
/*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。     */
/******************************************************************/ 
bit lcd_busy()
 {                          
    bit result;
    LCD_RS = 0;
    LCD_RW = 1;
    LCD_EN = 1;
 delay1(1);
    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; 
    P0 = cmd;
    delay1(1);
    LCD_EN = 1;
    delay1(1);
    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;
    delay1(2);
    LCD_EN = 1;
    delay1(2);
    LCD_EN = 0; 
}
/*******************************************************************/
/*  LCD初始化设定                                                  */
/*******************************************************************/
void lcd_init()

    delay1(15);  
    lcd_wcmd(0x38);         
    delay1(5);
    lcd_wcmd(0x0f);      //开显示,显示光标,光标闪烁
    delay1(5);
    lcd_wcmd(0x06);       //光标设置
     delay1(5);
    lcd_wcmd(0x01);      //清除LCD的显示内容
    delay1(5);
}
/*******************************************************************/
/*  设定显示位置                                                   */
/*******************************************************************/
void lcd_pos(uchar pos)
{                          
  lcd_wcmd(pos+0x80);  //数据指针=80+地址变量
}
/*********************************************************
  发送数据函数
*********************************************************/
//void senddata(uchar dat)
//{
//     SBUF =dat;
//     while(!TI);
//     TI=0;
//}
/*********************************************************
  串行中断服务函数
*********************************************************/
void  serial() interrupt 4 
{
 //  uchar i;
   ES=0;                //关闭串行中断
   RI=0;                //清除串行接受标志位
   buf=SBUF;            //从串口缓冲区取得数据
   playflag=1;


   if(buf!=0x0D)   
   {   
     if(buf!=0x0A)
     { 
       temp=buf;
       if(count<32)
       {         
         RXDdata[count]=temp;
         count++;
       }

     } 
   }
   ES = 1;    //允许串口中断
}
/*********************************************************
  数据显示函数
*********************************************************/
void  play()
{

   if(playflag==1)
   { 
     lcd_pos(0x00);           //设置位置为第二行
     for(m=0;m<16;m++) 
     lcd_wdat(RXDdata[m]);      //清LCD1602第二行
     for(m=0;m<16;m++)
     {
       lcd_pos(0x40+m);       //设置显示位置为第二行
 // RXDdata[m]=cdis2[m];
       lcd_wdat(RXDdata[m+16]);  //显示字符 
     }
//在显示数据之后 执行指令       
// 指令格式 J-CMD-OFF-K0
 //         J-CMD-ON--K0
 //         J-CMD-LEFT
 //         J-CMD-RIGHT
 //
//  //收到  J-CMD- 
 if (RXDdata[0]=='J' && RXDdata[1]=='-'  && RXDdata[2]=='C'  && RXDdata[3]=='M'  && RXDdata[4]=='D' && RXDdata[5]=='-'  )
 {
 //RXDdata[17]=0x40;

 // 是否收到LEFT
  if (RXDdata[6]=='L' && RXDdata[7]=='E'  && RXDdata[8]=='F'  && RXDdata[9]=='T' )
 {
    k1=1;            
 k2=0;  
 Delay(5000);
 k1=0;          
 k2=0; 
 }
 // 是否收到RIGHT
  if (RXDdata[6]=='R' && RXDdata[7]=='I'  && RXDdata[8]=='G'  && RXDdata[9]=='H' && RXDdata[10]=='T' )
 {
    k1=0;            
 k2=1;  
 Delay(5000);
 k1=0;          
 k2=0; 
 }
 if (RXDdata[6]=='O' && RXDdata[7]=='N'  && RXDdata[8]=='-'  && RXDdata[9]=='-' )
 {
 KK=0;
 }
 if (RXDdata[6]=='O' && RXDdata[7]=='F'  && RXDdata[8]=='F'  && RXDdata[9]=='-' )
 {
 KK=1;
 }
 if (RXDdata[9]=='-' )
 {
  if (RXDdata[10]=='K'  && RXDdata[11]=='0'  ) 
  {
   K0=KK;
  }

  if (RXDdata[10]=='K'  && RXDdata[11]=='1'  ) 
  {
   K1=KK;
  }

  if (RXDdata[10]=='K'  && RXDdata[11]=='2'  ) 
  {
   K2=KK;
  }

  if (RXDdata[10]=='K'  && RXDdata[11]=='3'  ) 
  {
   K3=KK;
  }

  if (RXDdata[10]=='K'  && RXDdata[11]=='4'  ) 
  {
   K4=KK;
  }

  if (RXDdata[10]=='K'  && RXDdata[11]=='5'  ) 
  {
   K5=KK;
  }

  if (RXDdata[10]=='K'  && RXDdata[11]=='6'  ) 
  {
   K6=KK;
  }

  if (RXDdata[10]=='K'  && RXDdata[11]=='7'  ) 
  {
   K7=KK;
  }

 }  
 }

//清除数据接收标记等 
  playflag=0;            
     count=0x00;
     for(m=0;m<32;m++)      
     RXDdata[m]=0x20;         //清显存单元  
 
   }               
}
/*********************************************************
  主函数
*********************************************************/
void main(void) 
{
    P0 = 0xff;
    P1 = 0xff;     
 
 k1=0;            //将P0.0口赋值 0,对外输出低电平
 k2=0;   
 KK=0;     
 //   SCON=0x50;           //设定串口工作方式
 //   PCON=0x00;           //波特率不倍增
 //   TMOD=0x20;           //定时器1工作于8位自动重载模式, 用于产生波特率
    EA=1;
    ES = 1;              //允许串口中断
//    TL1=0xfd;
//    TH1=0xfd;             //波特率9600
//    TR1=1;


  SCON=0x50; //串口工作方式1,8位UART,波特率可变  
     TH2=0xFF;           
     TL2=0xFD;    //波特率:115200 晶振=11.0592MHz 
     RCAP2H=0xFF;   
     RCAP2L=0xFD; //16位自动再装入值 

/*****************/
     TCLK=1;   
     RCLK=1;   
     C_T2=0;   
     EXEN2=0; //波特率发生器工作方式

/*****************/
    TR2=1 ; //定时器2开始

 

 


    lcd_init();
    lcd_pos(0x00);        //设置显示位置为第一行
    for(m=0;m<16;m++) 
    lcd_wdat(cdis1[m]);   //显示字符
    lcd_pos(0x40);        //设置显示位置为第二行
    for(m=0;m<16;m++) 
    lcd_wdat(cdis2[m]);   //显示字符            
     while(1)        
    {
      play(); 
         
    }
}

 

本文地址:https://jinesc.net/?id=93
版权声明:本文为原创文章,版权归 jinesc 所有,欢迎分享本文,转载请保留出处!

发表评论


表情

评论列表

  1. bbis
    bbis  @回复

    编程不太懂。
    这几天在学习用无线路由器组建WIFI遥控开关