|
程序代碼
#include "reg51.h"
#include "intrins.h"
bit busy;
unsigned char uart_buff = 0xff;
unsigned char speak_buff = 0x0f;
unsigned char out_buff = 0xff;
unsigned char temp;
unsigned char counter0 = 0;
bit speak_refresh_flag = 0;
bit hmi_refresh_flag = 0;
void delay_ms(unsigned int ms)//延時(shí)函數(shù)
{
unsigned char k;
while(ms--)
{
for(k=0;k<123;k++);//晶振頻率12MHz時(shí),1ms實(shí)際延時(shí)1.016ms。
}
}
void uart_check( )//串口屏點(diǎn)亮函數(shù)
{
switch( SBUF )//循環(huán)接收SBUF當(dāng)中的信息
{
case 0x02:
{
uart_buff = uart_buff & 0xfe;//接收到02信號后客廳的燈光打開
break;
}
case 0x01:
{
uart_buff = uart_buff | 0x01;//接收到01信號后客廳的燈光關(guān)閉
break;
}
case 0x04:
{
uart_buff = uart_buff & 0xfd;//接收到04的信號后臥室一的燈光打卡
break;
}
case 0x03:
{
uart_buff = uart_buff | 0x02;//接收到03的信號后臥室一的燈光關(guān)閉
break;
}
case 0x06:
{
uart_buff = uart_buff & 0xfb;//接收到06的信號后臥室二的燈光打開
break;
}
case 0x05:
{
uart_buff = uart_buff | 0x04;//接收到05的信號后臥室二的燈光關(guān)閉
break;
}
case 0x08:
{
uart_buff = uart_buff & 0xf7;//接收的08的信號后臥室三的燈光打開
break;
}
case 0x07:
{
uart_buff = uart_buff | 0x08;//接收到07的信號后臥室三的燈光關(guān)閉
break;
}
case 0x00:
{
uart_buff = uart_buff & 0xf0;//接收到00的信號后全部的房間的燈光打開
break;
}
case 0xff:
{
uart_buff = uart_buff | 0x0f;//接收到ff信號后全部房間的燈光都關(guān)閉
break;
}
default: break;
}
}
void UartIsr() interrupt 4//串口中斷函數(shù)
{
if (TI)
{
TI = 0;//發(fā)送信號后TI置0
busy = 0;//清空BUSY中的信息
}
if (RI)
{
RI = 0;//接收信號后RI置0
hmi_refresh_flag = 1;
//uart_buff = SBUF;
uart_check();
}
}
void Timer0Isr() interrupt 1//延時(shí)中斷函數(shù)
{
TH0 = (65536 - 50000) / 256;
TL1 = (65536 - 50000) % 256;
counter0++;
if(counter0 == 4)
{
counter0 = 0;
temp = ( P0 & 0X0F );
if(speak_buff != temp)
{
speak_buff = temp;
speak_refresh_flag = 1;
}
}
}
void UartInit( )//功能初始化
{
SCON = 0x50;
TMOD = 0x21;
PCON = PCON | 0X80;
TL1 = 0XFA;
TH1 = 0XFA;
TR1 = 1;
busy = 0;
}
void Timer0Init()//內(nèi)存初始化
{
TMOD = 0x21;
TH0 = (65536 - 50000) / 256;
TL1 = (65536 - 50000) % 256;
TR0 = 1;
}
void UART_Send_Byte(char dat)//字節(jié)發(fā)送
{
while (busy);
busy = 1;
SBUF = dat;
}
void UART_Send_Str(char *p)//字符串發(fā)送
{
while (*p)
{
UART_Send_Byte(*p++);
}
}
void UART_Send_END(void) //發(fā)送結(jié)束符
{
UART_Send_Byte(0xFF);
UART_Send_Byte(0xFF);
UART_Send_Byte(0xFF);
}
void speak_check( )//語音點(diǎn)亮函數(shù)
{
switch(speak_buff)//循環(huán)語音接收模塊內(nèi)存
{
case 0x00://接收到02信號后客廳的燈光打開
{
UART_Send_Str("bt0.pic=3"); //發(fā)送指令控制串口屏控制圖標(biāo)的改變 UART_Send_END();
UART_Send_Str("bt1.pic=3");
UART_Send_END();
UART_Send_Str("bt2.pic=3");
UART_Send_END();
UART_Send_Str("bt3.pic=3");
UART_Send_END();//結(jié)束指令發(fā)送
break;
}
case 0x01://接受到01信號后客廳的燈光關(guān)閉
{
UART_Send_Str("bt0.pic=4"); //發(fā)送指令控制串口屏控制圖標(biāo)的改變
UART_Send_END();
UART_Send_Str("bt1.pic=3");
UART_Send_END();
UART_Send_Str("bt2.pic=3");
UART_Send_END();
UART_Send_Str("bt3.pic=3");
UART_Send_END();//結(jié)束指令發(fā)送
break;
}
case 0x02:/接受到04信號后客廳的燈光打開
{
UART_Send_Str("bt0.pic=3"); //發(fā)送指令控制串口屏控制圖標(biāo)的改變
UART_Send_END();
UART_Send_Str("bt1.pic=4");
UART_Send_END();
UART_Send_Str("bt2.pic=3");
UART_Send_END();
UART_Send_Str("bt3.pic=3");
UART_Send_END();//結(jié)束指令發(fā)送
break;
}
case 0x03://接受到03信號后客廳的燈光關(guān)閉
{
UART_Send_Str("bt0.pic=4"); //發(fā)送指令控制串口屏控制圖標(biāo)的改變
UART_Send_END();
UART_Send_Str("bt1.pic=4");
UART_Send_END();
UART_Send_Str("bt2.pic=3");
UART_Send_END();
UART_Send_Str("bt3.pic=3");
UART_Send_END();/結(jié)束指令發(fā)送
break;
}
case 0x04://接受到06信號后客廳的燈光打開
{
UART_Send_Str("bt0.pic=3"); //發(fā)送指令控制串口屏控制圖標(biāo)的改變
UART_Send_END();
UART_Send_Str("bt1.pic=3");
UART_Send_END();
UART_Send_Str("bt2.pic=4");
UART_Send_END();
UART_Send_Str("bt3.pic=3");
UART_Send_END();//結(jié)束指令發(fā)送
break;
}
case 0x05://接受到05信號后客廳的燈光關(guān)閉
{
UART_Send_Str("bt0.pic=4"); //發(fā)送指令控制串口屏控制圖標(biāo)的改變
UART_Send_END();
UART_Send_Str("bt1.pic=3");
UART_Send_END();
UART_Send_Str("bt2.pic=4");
UART_Send_END();
UART_Send_Str("bt3.pic=3");
UART_Send_END();//結(jié)束指令發(fā)送
break;
}
case 0x06:/接受到08信號后客廳的燈光打開
{
UART_Send_Str("bt0.pic=3"); //發(fā)送指令控制串口屏控制圖標(biāo)的改變
UART_Send_END();
UART_Send_Str("bt1.pic=4");
UART_Send_END();
UART_Send_Str("bt2.pic=4");
UART_Send_END();
UART_Send_Str("bt3.pic=3");
UART_Send_END();/結(jié)束指令發(fā)送
break;
}
case 0x07://接受到07信號后客廳的燈光關(guān)閉
{
UART_Send_Str("bt0.pic=4"); //發(fā)送指令控制串口屏控制圖標(biāo)的改變
UART_Send_END();
UART_Send_Str("bt1.pic=4");
UART_Send_END();
UART_Send_Str("bt2.pic=4");
UART_Send_END();
UART_Send_Str("bt3.pic=3");
UART_Send_END();//結(jié)束指令發(fā)送
break;
}
case 0x08:
{
UART_Send_Str("bt0.pic=4"); //發(fā)送指令控制串口屏控制圖標(biāo)的改變
UART_Send_END();
UART_Send_Str("bt1.pic=3");
UART_Send_END();
UART_Send_Str("bt2.pic=3");
UART_Send_END();
UART_Send_Str("bt3.pic=3");
UART_Send_END();/結(jié)束指令發(fā)送
break;
}
case 0x09:
{
UART_Send_Str("bt0.pic=4"); //發(fā)送指令控制串口屏控制圖標(biāo)的改變
UART_Send_END();
UART_Send_Str("bt1.pic=3");
UART_Send_END();
UART_Send_Str("bt2.pic=3");
UART_Send_END();
UART_Send_Str("bt3.pic=4");
UART_Send_END();//結(jié)束指令發(fā)送
break;
}
case 0x0a:
{
UART_Send_Str("bt0.pic=3"); //發(fā)送指令控制串口屏控制圖標(biāo)的改變
UART_Send_END();
UART_Send_Str("bt1.pic=4");
UART_Send_END();
UART_Send_Str("bt2.pic=3");
UART_Send_END();
UART_Send_Str("bt3.pic=4");
UART_Send_END();//結(jié)束指令發(fā)送
break;
}
case 0x0b:
{
UART_Send_Str("bt0.pic=4"); //發(fā)送指令控制串口屏控制圖標(biāo)的改變
UART_Send_END();
UART_Send_Str("bt1.pic=4");
UART_Send_END();
UART_Send_Str("bt2.pic=3");
UART_Send_END();
UART_Send_Str("bt3.pic=4");
UART_Send_END();//結(jié)束指令發(fā)送
break;
}
case 0x0c:
{
UART_Send_Str("bt0.pic=3"); //發(fā)送指令控制串口屏控制圖標(biāo)的改變
UART_Send_END();
UART_Send_Str("bt1.pic=3");
UART_Send_END();
UART_Send_Str("bt2.pic=4");
UART_Send_END();
UART_Send_Str("bt3.pic=4");
UART_Send_END();//結(jié)束指令發(fā)送
break;
}
case 0x0d:
{
UART_Send_Str("bt0.pic=4"); //發(fā)送指令控制串口屏控制圖標(biāo)的改變
UART_Send_END();
UART_Send_Str("bt1.pic=3");
UART_Send_END();
UART_Send_Str("bt2.pic=4");
UART_Send_END();
UART_Send_Str("bt3.pic=4");
UART_Send_END();/結(jié)束指令發(fā)送
break;
}
case 0x0e:
{
UART_Send_Str("bt0.pic=3"); //發(fā)送指令控制串口屏控制圖標(biāo)的改變
UART_Send_END();
UART_Send_Str("bt1.pic=4");
UART_Send_END();
UART_Send_Str("bt2.pic=4");
UART_Send_END();
UART_Send_Str("bt3.pic=4");
UART_Send_END();//結(jié)束指令發(fā)送
break;
}
case 0x0f:
{
UART_Send_Str("bt0.pic=4"); //發(fā)送指令控制串口屏控制圖標(biāo)的改變
UART_Send_END();
UART_Send_Str("bt1.pic=4");
UART_Send_END();
UART_Send_Str("bt2.pic=4");
UART_Send_END();
UART_Send_Str("bt3.pic=4");
UART_Send_END();/結(jié)束指令發(fā)送
break;
}
default:break;
}
}
void main()
{
P0 = 0XFF;
UartInit();
Timer0Init();
ES = 1;
ET0 = 1;
EA = 1;
delay_ms(1000);
UART_Send_END();
while (1)
{
while((speak_refresh_flag == 0) && (hmi_refresh_flag == 0))/循環(huán)語音恢復(fù)標(biāo)志和屏幕恢復(fù)標(biāo)志都等于零那么所有房間的燈光都關(guān)閉。
{
P1 = out_buff;
}
if((speak_refresh_flag == 1) || (hmi_refresh_flag == 1))//如果語音恢復(fù)標(biāo)志或者是屏幕恢復(fù)標(biāo)志其中一個(gè)等于一。
{
if( speak_refresh_flag == 1 )//如果是語音的等于一那么執(zhí)行語音模塊。 {
out_buff = speak_buff;
speak_check( );
speak_refresh_flag = 0;
}
else if( hmi_refresh_flag == 1 )//若是屏幕那么就執(zhí)行屏幕功能。 {
out_buff = uart_buff;
hmi_refresh_flag = 0;
}
}
}
}
|
|