📄 main.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 + -