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

📄 main.c

📁 在AVR单片机上源程序 bluetooth uart
💻 C
字号:
#include<iom16v.h>
#include<macros.h>

#define ROOM1_SHOW asm("cbi 0x1b,0")
#define ROOM1_DOWN asm("sbi 0x1b,0")
#define ROOM2_SHOW asm("sbi 0x1b,1")
#define ROOM2_DOWN asm("cbi 0x1b,1")
unsigned char flag_twinkle1;
unsigned char flag_twinkle2;
unsigned char flag_stake;
unsigned char stakeout_key;
unsigned char data;
unsigned char data_stake;
unsigned char r_data[10];
unsigned char TV_on;
unsigned char Air_on;
unsigned int second1,second2;
unsigned int a,b;



//延时us级
void Delay_1us(void)
{
  unsigned int i;
  for(i=1;i<1000;i++)
    ;
}

 //延时ms级
void Delay_1ms(void)      
{
  unsigned int i;
  for(i=1;i<900;i++)
    ;
}

// 延时
void Delay(unsigned int n)      
{
  unsigned int i=0;
  for(i=0;i<n;i++)
  Delay_1ms();
}

//查询接收
unsigned char Uart_Read_Data(void)
{
  if(!(UCSRA&0x80)) {data=UDR; data_stake=data;}
    //else ;
}

//查询发送
void Uart_Write_Data(unsigned char r_data)
{
  if(!(UCSRA&0x40)) UDR=r_data;
    //else;
}

//*************************************************
//照明控制系统
//*************************************************


//房间选择
void Room_Select()
{
  if(((data&0xc3)==0x01)|(data==0x00)) Room1_Handle();  //房间1处理
    else if(((data&0xc3)==0x02)|((data&0xc3)==0x03)) Room2_Handle();  //房间2处理
	  //else ;
}




//房间1处理
unsigned char Room1_Handle(void)
{
  if(data&0x01) {flag_twinkle1=0; PORTB=(0xfe&PINB);}
    else if(data==0x00) {flag_twinkle1=0; PORTB=(0xfd|PINB);}
  //if(FLAG_TWINKLE1) Room_Twinkle(SECOND1,SECOND2);
  if((data&0x1c)==0x1c) {flag_twinkle1=1; second1=500;}//Room_Twinkle(500,SECOND2);}  //房间1_0.5s闪烁
    else if((data&0x1c)==0x10) {flag_twinkle1=1; second1=1000;}//Room_Twinkle(1000,SECOND2);}  //房间1_1s闪烁
	  else if((data&0x1c)==0x14) {flag_twinkle1=1; second1=2000;}//Room_Twinkle(2000,SECOND2);}  //房间1_2s闪烁
	    else if((data&0x1c)==0x18) {flag_twinkle1=1; second1=3000;}//Room_Twinkle(3000,SECOND2);}  //房间1_3s闪烁
		  //else ;
}   

//房间1闪烁处理
void Room_Twinkle(unsigned int second1,unsigned int second2)
{ 
  if(flag_twinkle1)
    {
      PORTB=(0xfe&PINB);  //1开
      Delay(second1);  
      PORTB^=0x01;  //1关
	  //PORTA=0xff;  //2关
      Delay(second1);
	  PORTB=(0xfe&PINB);  //1开
	}
  if(flag_twinkle2)
    {
      PORTB=(0xfd&PINB);  //2开
      Delay(second2);
      PORTB^=0x02;  //2关
	  //PORTA=0xff;  //1关
      Delay(second2);
	  PORTB=(0xfd&PINB);  //2开
    }
}
 



//房间2处理
unsigned char Room2_Handle(void)
{
  if((data&0x03)==0x02) {flag_twinkle2=0; PORTB=(0xfd&PINB);}
    else {flag_twinkle2=0; PORTB=(0xfe|PINB);}
	  //if(FLAG_TWINKLE2) Room_Twinkle(SECOND1,SECOND2);
  if((data&0x1c)==0x1c) {flag_twinkle2=1; second2=500;}//Room_Twinkle(SECOND1,500);}  //房间2_0.5s闪烁
    else if((data&0x1c)==0x10) {flag_twinkle2=1; second2=1000;}//Room_Twinkle(SECOND1,1000);}  //房间2_1s闪烁
	  else if((data&0x1c)==0x14) {flag_twinkle2=1; second2=2000;}//Room_Twinkle(SECOND1,2000);}  //房间2_2s闪烁
	    else if((data&0x1c)==0x18) {flag_twinkle2=1; second2=3000;}//Room_Twinkle(SECOND1,3000);}  //房间2_3s闪烁
		  //else ;
}

//********************************************
//安防监视系统
//********************************************

void stakeout(void)
{
  if(data==0x41) flag_stake=1;
    else {flag_stake=0; stakeout_key=0;}
  if((!(PINB&0x04))&flag_stake) stakeout_key=1;   //PINB?
  while(flag_stake&stakeout_key)
  {
    Uart_Read_Data();
	if(data_stake==0x45) {data_stake=0; Uart_Write_Data(0x45);}
	if(data==0x40) {flag_stake=0; stakeout_key=0;}
	  else
	  {
        PORTB=0xfb;
	    Delay_1us();
	    PORTB^=0x04;
	    Delay_1us();
	  }
  }
}

//***************************************
//电视系统
//***************************************



void Volunme_Handle()
{  
	if((data>0xf0)&&(data<0xff))  PORTA--;  //增加音量
	else if(data<0xf0) PORTA++;   //减小音量
}

void TV_Handle()
{
	if((data&0xcf)==0x85) {PORTB=(0xf7&PINB);TV_on=1;}  //电视开
    else if((data&0xcf)==0x80) { PORTB=(0Xf7|PINB); TV_on=0;}  //电视关
	  while(TV_on)
      {   
          Uart_Read_Data();
		  if(data==0x85)  PORTA=(PINA&0xfe);   //选择1频道,显示1
		    else if(data==0x8a)  PORTA=(PINA&0xfd);   //选择2频道,显示2
			  //else;
		  PORTA=(0xbf&PINA);  //初始音量
		  if((data&0xf0)==0x90)  Volunme_Handle(data);
	  }
}

//***************************************
//空调系统
//***************************************

//温度处理
void Tem_Handle()
{
	if((data==0xc5)&&PORTC>0) PORTC--;  //升温
	else if((data==0xC9)&&(PORTC<0X1e)) PORTC++;  //降温
	else if((data&0xe0)==0xe0) PORTC=^(data&0x1f);   //显示设定温度
	else;
}

//风速处理
void Wind_Handle()
{
    if((data&0xc3)==0xc2)  PORTC=(0xdf&PINC);  //暖风
    else if((data&0xc3)==0xc3)   PORTC=(0xbf&PINC);   //冷风
	if(data==0xd1)  PORTC=(0X1f&PINC);          //高速
	else if(data==0xd5)  PORTC=(0x3f&PINC);     //中速
	else if(data==0xd9)  PORTC=(0x5f&PINC);     //低速
}

void Air_condition()
{
	if((data&0xc3)==0xc1)  {PORTB=(0xef&PINB);Air_on=1;}  //空调开
	else if((data&0xc3)==0xc0) {PORTB=(0Xef|PINB);Air_on=0;}   //空调关
	    while(Air_on)
		{
            Uart_Read_Data();
			Tem_Handle();
			Wind_Handle();
		}
}


	
	
	
	
	
	
	

	
	
//主函数
void main(void)
{
  PORTA=0xff;
  DDRA=0xff;
  PORTB=0xff;
  DDRB=0xff;
  PORTC=0xff;
  DDRC=0xff;
  UBRRH=0x00;  //初始化串口9600,f=4m时
  UBRRL=0x33;
  UCSRC=0x83;  //选择异步传输模式,设置数据长度8位
  UCSRB=0x18;  //发送接收允许
   Delay_1ms();
  while(1)
  {
    Uart_Read_Data();
	Room_Select();
	Room_Twinkle(second1,second2);
	stakeout();
    TV_Handle();
	Air_condition();
  }
}

⌨️ 快捷键说明

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