//第一种模式:串口2直通,通过电脑控制
//第二种模式:串口2用于串接按键板
//串口发送@00:01$
//返回//RS232: 1 => 01/
//播放完返回END
#include "reg51.h"
#include "intrins.h"
#include "PCB.h"
#define FOSC 22118400UL
#define BRT (65536 - FOSC / 9600 / 4)
//#define BRT (65536 - FOSC / 115200 / 4)
sfr AUXR = 0x8e;
#define uchar unsigned char //0-255
#define uint unsigned int //0-65535
#define BYTE unsigned char //0-255
#define u8 unsigned char //0-255
#define u16 unsigned int //0-65535
#define u32 unsigned long
//========================================================================
// MACRO DEFINE
//========================================================================
#define KEY_MAX 7// 16
#define KEY_PRESS_DELAY 15000
#define UART1_BUF_LENGTH 19
#define UART2_BUF_LENGTH 19
#define UART_DATA_OK 2
uint PIR_10S_cnt=0;
uint LED_3S_cnt=0;
bit LED_flash_falg=1;
//========================================================================
// STRUCT DEFINE
//========================================================================
typedef struct {
u8 busy;
u8 flag;
u8 len;
u8 buff[UART1_BUF_LENGTH];
} _TUART;
//========================================================================
// GLOBAL VALUE
//========================================================================
_TUART gUart1, gUart2;
void LightLED(u8 id);
void OffALL();
/*----------------------------------------------------------------------------------
//十六进制转ASCII函数
----------------------------------------------------------------------------------*/
unsigned char HEX2ASCII(unsigned char dat)
{
dat &= 0x0f;
if(dat <= 9) return (dat + '0'); //数字0~9
return (dat - 10 + 'A'); //字母A~F
}
///*----------------------------------------------------------------------------------
//delay 函数
//----------------------------------------------------------------------------------*/
void delay_ms(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=200;y>0;y--); //delay 0.2ms 12T 12M y=200
}
//----------------------------------------------------------------------------------*/
void UartInit()
{
/********定时器1做串口1波特率发生器***发送接收*测试OK***************/
/* SCON = 0x50;
TMOD = 0x00;
TL1 = BRT;
TH1 = BRT >> 8;
TR1 = 1;
AUXR = 0x40;
ES = 1;
EA = 1;
/********定时器2做串口1波特率发生器****发送接收**测试OK***************/
/*
SCON = 0x50;
T2L = BRT;
T2H = BRT >> 8;
AUXR = 0x15;
ES = 1;
EA = 1;
/*************定时器2做串口2波特率发生器*****发送接收*测试OK************/
/*
S2CON = 0x50;
T2L = BRT;
T2H = BRT >> 8;
AUXR = 0x14;
IE2 = 0x01;
ES=1;
EA = 1; */
/******串口1.2共用定时器1做波特率发生器***发送接收*测试OK*************/
SCON = 0x50;
S2CON = 0x50;
T2L = BRT;
T2H = BRT >> 8;
AUXR = 0x14;
AUXR|= 0x01;
IE2 = 0x01; //使能串口中断
PS=1; //设定串行口为高优先级中断
ES=1; //允许串口中断
EA = 1;
/****************************************************************************************/
/*
AUXR.0:S1BRS,如果为1那么串口1的波特率发生器为独立波特率发生器,否则为定时器1
AUXR.1:EXTRAM,为1则可以使用内部扩展RAM
AUXR.2:BRTx12,为1则独立波特率发生器不分频,否则12分频。
AUXR.3:S2SMOD,为1串口2波特率加倍,否则不加倍
AUXR.4:BRTR,为1则允许独立波特率允许,否则不允许。
AUXR.5:UART_M0x6,为1则串口模式0为2分频,否则为12分频
AUXR.6:T1x12,为1则定时器1不分频,否则12分频
AUXR.7:T0x12,为1则定时器0不分频,否则12分频
*/
gUart1.len = 0;
gUart1.flag = 0;
gUart1.busy = 0;
gUart2.len = 0;
gUart2.flag = 0;
gUart2.busy = 0;
return;
}
//----------
//初始化时间timer0
//----------
void InitTimer0(void)
{
//AUXR &= 0x7F; //定时器时钟12T模式
//TMOD &= 0xF0; //设置定时器模式
TMOD=0x11;
TH0=(65536-50000)/256; //50 ms
TL0=(65536-50000)%256; //50 ms
TR0 = 1; //启动定时器
ET0 = 1; //使能定时器中断
//EA = 1;
}
//----------
//初始化时间timer1
//----------
void InitTimer1(void)
{
//AUXR &= 0x7F; //定时器时钟12T模式
//TMOD &= 0xF0; //TMOD低4位设置为0,高4位不变
//TMOD|=0xf0; //对TMOD的高4位 置1,其他不变
TMOD=0x11;
//TH1=(65536-50000)/256; //50 ms
//TL1=(65536-50000)%256; //50 ms
TL1=0x00; //50 ms
TH1=0x4C; //50 ms
TR1 = 1; //启动定时器
ET1 = 1; //使能定时器中断
EA = 1;
}
void SendData1(BYTE dat)
{
while (gUart1.busy); //等待前一个数据发送完成
gUart1.busy = 1; //清除发送标志
SBUF = dat; //发送当前数据
return;
}
void SendData2(BYTE dat)
{
while (gUart2.busy); //等待前一个数据发送完成
gUart2.busy = 1; //清除发送标志
S2BUF = dat; //发送当前数据
return;
}
/*--------------------------------------------------------------------------------
发送字符串
--------------------------------------------------------------------------------*/
void SendString1(char *s)
{
while (*s) //检测字符串结束标志
{
SendData1(*s++); //发送当前字符
}
return;
}
void SendString2(char *s)
{
while (*s) //检测字符串结束标志
{
SendData2(*s++); //发送当前字符
}
return;
}
//========================================================================
// Function : Uart1_Service
// Discription :
// Parameter :
// Return :
// Author :
// Date :
// Remark :
//========================================================================
void Uart1_Service() interrupt 4 using 1
{
u8 c;
if (TI)
{
TI = 0;
gUart1.busy = 0;
}
if (RI)
{
RI = 0;
c = SBUF;
if (UART_DATA_OK > gUart1.flag)
{
if (0x0d == c) gUart1.flag = 1;
else if ((0x0a == c) ||(0x24 == c))gUart1.flag = UART_DATA_OK;
gUart1.buff[gUart1.len++] = c;
if (UART1_BUF_LENGTH <= gUart1.len)
{
gUart1.len = 0;
gUart1.flag = 0;
}
}
}
return;
}
//========================================================================
// Function : Uart1_Handle
// Discription :
// Parameter :
// Return :
// Author :
// Date :
// Remark :
//========================================================================
void Uart1_Handle(void) //连电脑
{
u8 i, buff[UART1_BUF_LENGTH];
if (UART_DATA_OK != gUart1.flag) return;
for (i=0; i<gUart1.len; i++) buff[i] = gUart1.buff[i];
buff[i] = 0;
gUart1.len = 0;
gUart1.flag = 0;
return;
}
//========================================================================
// Function : Uart2_Service
// Discription :
// Parameter :
// Return :
// Author :
// Date :
// Remark :
//========================================================================
void Uart2_Service() interrupt 8 using 1
{
u8 c ;
//u8 m,x;
//u8 buffs[UART2_BUF_LENGTH];
if ((S2CON & 0x02))
{
S2CON &= ~0x02; /*S2CON=S2CON&0xfd 等于把s2con的bit设为0其它位不变*/
/* S2CON &= 0xFD; 跟 S2CON &= ~0x02;完全一样 */
gUart2.busy = 0;
}
if (S2CON & 0x01)
{
S2CON &= ~0x01;
c = S2BUF;
}
if ( gUart2.flag<UART_DATA_OK)
{