/*--------------------------------------
芯片 :STC12C5A60S2
晶振 :11.0592MHZ
开发平台:KEIL
功能 :串口一或者串口二都可以通过上位机控制30路继电器
波特率 :9600BPS
日期 :11.5.19
注意 :下载完程序后请复位系统!!(切记!)
--------------------------------------*/
#include "Hfile\\STC12C5A60S2.h"
#include"Hfile\\PublicV.H"
#define uchar unsigned char
#define uint unsigned int
uchar dat;
void init ()
{
//串口2波特率
TMOD = 0x20; //定时器1产生波特率
SCON = 0x50; //方式1,8位数据,波特率可变
TH1= 0xfd;
TL1 = 0xfd; //波特率 9600
//串口1波特率
S2CON = 0x50; //方式1,八位数据,可变波特率
BRT=0XFD; //设置波特率9600
TR1=1; //启动定时器产生串口2波特率
AUXR=0x10; //启动串口1波特率发生器
IP=0x00; //优先级默认
EA=1; //开总中断
ES=1; //开串口1中断
IE2=0x01; //开串口2中断
}
/*--------------------------------------
延时函数
--------------------------------------*/
void delay ( uint t )
{
uint i,j;
for( i=0; i<t; i++)
for( j=0; j<250; j++);
}
/*--------------------------------------
主函数
--------------------------------------*/
void main()
{
uchar k=10;
P4SW|=0x20; //配置P4.5为IO口
P4M0|=0x10; //配置P4.4为IO口
P4M1|=0x10;
P0=P1=P2=P3=0xff;
P4|=0x30;
init(); // 定时器初始化
add=0X00;
while(1)
{
if(receive==1&&bite[1]==add)
{
/*0=握手 1=地址 2=继电器开关 3=继电器1-8路 4=继电器9-16路 5=继电器17=24路
*6=继电器25-30路*/
receive=0;
if(bite[2]==0x11) //打开
open_X1(bite[3],0);
if(bite[2]==0x01) //关闭
open_X1(bite[3],1);
if(bite[4]==0x12) //打开
open_X2(bite[5],0);
if(bite[4]==0x02) //关闭
open_X2(bite[5],1);
// IapEraseSector(0);
// IapProgramByte(1,bite[3]);
// IapProgramByte(2,bite[5]);
// IapProgramByte(3,bite[7]);
// IapProgramByte(4,bite[9]);
}
}
}
/*--------------------------------------
串口一 发送接收中断函数
--------------------------------------*/
void uart_isr() interrupt 4 using 2
{
ES=0;
if( RI )
{
RI=0;
bite[r] = SBUF;
if(bite[0]==0XAA || bite[0]==0XAB || bite[0]==0XAC || bite[0]==0XAD)
r++;
if(r>=6)
{
receive=1;
r=0;
}
}
ES=1;
}
void uart2_isr() interrupt 8 using 1
{
if( S2CON & 0x01 )
{
S2CON &= ~0x01;
bite[r] = S2BUF;
if(bite[0]==0XAA || bite[0]==0XAB || bite[0]==0XAC || bite[0]==0XAD)
r++;
if(r>=6)
{
receive=1;
r=0;
}
}
if( S2CON & 0x02 )
{
S2CON &= ~0x02;
}
}
|