📄 main.c
字号:
#include <common.h>
#include <scom.h>
uint delay; //用作延时
uchar RecCount;
uchar T0out=NO;
uchar COMFlag;
uchar RecBuf[15];
uchar extendUARTrecData=0x66;
#ifdef extendUART
void init_T0(void)
{
/*如果使用T0 Mode2:8-bit with auto-reload from TH0
则应加入以下2条语句同时去除相应的语句*/
//TMOD |= 0x02; //T0 Mode2:8-bit with auto-reload from TH0
//TH0 = 0xA0;
TMOD |= 0x01; //T0 is 16-bit timer(mod 1)
TH0 = 0xFF; //UART's BaudRate is 9600bps
TL0 = 0xA5; //定时约 0.1 ms
//ET0 = 1; //enable T0 interrupt
//TR0 = 1;
}
void int_T0(void) interrupt 1 using 2 //T0 is 16-bit timer(mode 1)
{
//如果使用T0 Mode 2:8-bit with auto-reload from TH0则应去除以下2条语句
TH0 = 0xFF; //定时约 0.1 ms
TL0 = 0xA5;
T0out = YES;
}
#endif
#ifdef extendUART_SEND
/**********************************************************************
功能: 通过TXD(one MCU's pin)模拟UART发送数据,将TXD接至MAX232的11脚(TXD)
即可把数据通过MAX232送给PC的RS232端口
占用: T0(enable T0 interrupt), TXD(one MCU's pin)
特性: 波特率:9600, 接收方的停止位:1个或2个均可, 校验位:无, 流控制:无
条件: MCU运行模式12分频, 其晶振11.0592MHz
***********************************************************************/
void extendUARTsend(uchar DataToSend)
{
uchar i;
#ifdef extendUART_REC_INT1
EX1 = 0;
#endif
TR0 = 1;
TXD = 0; //start bit
while(T0out==NO) ;
T0out = NO;
for(i=8;i>0;i--) //8-bit data
{
TXD = DataToSend&0x01; //LSB is sent first
DataToSend >>= 1;
while(T0out==NO) ;
T0out = NO;
}
//如果用TB8/RB8区分地址/数据则应加入这三条语句
//TXD = 1 or 0;
//while(T0out==NO) ;
//T0out = NO;
TXD = 1; //stop bit
while(T0out==NO) ;
T0out = NO;
TR0 = 0;
#ifdef extendUART_REC_INT1
EX1 = 1;
#endif
}
#endif
#ifdef extendUART_REC
/**********************************************************************
功能: 通过RXD(one MCU's pin)模拟UART接收数据,将RXD接至MAX232的12脚(RXD)
即可通过MAX232接收PC的RS232端口数据
占用: T0(enable T0 interrupt), RXD(one MCU's pin)
特性: 波特率:9600, 发送方的停止位:1个或2个均可, 校验位:无, 流控制:无
条件: MCU运行模式12分频, 其晶振11.0592MHz
***********************************************************************/
uchar extendUARTreceive(void)
{
uchar i;
uchar recData=0;
while(RXD==1) ; //空闲状态为"1"
TR0 = 1;
while(T0out==NO) ;
T0out = NO; //detect start bit
//for(delay=0;delay<1;delay++) ; //此处可能需要调整采样时机
for(i=8;i>0;i--) //8-bit data
{
recData >>= 1; //LSB is sent first
if(RXD==1) recData |= 0x80;
while(T0out==NO) ;
T0out = NO;
}
//如果用TB8/RB8区分地址/数据则应加入这两条语句
//if(RXD==1) {...} //TB8==1
//else {...} //TB8==0
//while(T0out==NO) ;
//T0out = NO;
TR0 = 0;
return(recData);
}
#endif
#ifdef extendUART_REC_INT0
void int_INT0(void) interrupt 0 using 1
{
uchar i;
uchar recData=0;
EX0 = 0;
TR0 = 1;
while(T0out==NO) ;
T0out = NO; //detect start bit
//for(delay=0;delay<1;delay++) ; //此处可能需要调整采样时机
for(i=8;i>0;i--) //8-bit data
{
recData >>= 1; //LSB is sent first
if(RXD==1) recData |= 0x80;
while(T0out==NO) ;
T0out = NO;
}
TR0 = 0;
//extendUARTrecData = recData;
RecBuf[RecCount] = recData;
RecCount++;
if(RecCount>12) RecCount = 0;
EX0 = 1;
}
#endif
#ifdef extendUART_REC_INT1
void int_INT1(void) interrupt 2 using 1
{
uchar i;
uchar recData=0;
EX1 = 0;
TR0 = 1;
while(T0out==NO) ;
T0out = NO; //detect start bit
//for(delay=0;delay<1;delay++) ; //此处可能需要调整采样时机
for(i=8;i>0;i--) //8-bit data
{
recData >>= 1; //LSB is sent first
if(RXD==1) recData |= 0x80;
while(T0out==NO) ;
T0out = NO;
}
TR0 = 0;
//extendUARTrecData = recData;
RecBuf[RecCount] = recData;
RecCount++;
if(RecCount>=15) RecCount = 0;
EX1 = 1;
}
#endif
void main(void)
{
uchar i;
uchar temp[3];
uchar CheckSum1=0;
#ifdef extendUART
init_T0( );
#endif
PORT2_5 = 1;
PORT2_6 = 1; //TXD
PORT2_7 = 1; //RXD
//TXD = 1;
//RXD = 1;
#ifdef T1AsBaudGN
InitUART_T1( );
#endif
#ifdef T2AsBaudGN
InitUART_T2( );
#endif
#ifdef extendUART_REC_INT0
IT0 = 0; //INT0 is triggered by LOW level,而且只能用低电平触发方式
EX0 = 1;
PX0 = 0;
#endif
#ifdef extendUART_REC_INT1
IT1 = 0; //INT1 is triggered by LOW edge,而且只能用低电平触发方式
EX1 = 1;
PX1 = 0;
#endif
PT0 = 1;
ET0 = 1;
EA = 1;
while( 1 )
{
/* #ifdef extendUART_SEND
extendUARTsend(0xaa);
extendUARTsend(0x01);
extendUARTsend(0x55);
for(delay=0;delay<30000;delay++) ; //delay 5ms
for(delay=0;delay<30000;delay++) ; //delay 5ms
extendUARTsend(0xaa);
extendUARTsend(0x02);
extendUARTsend(0x54);
for(delay=0;delay<30000;delay++) ; //delay 5ms
for(delay=0;delay<30000;delay++) ; //delay 5ms
#endif
*/
#ifdef extendUART_REC
temp[0]=extendUARTreceive( );
if(temp[0]==0xAA)
{
temp[1]=extendUARTreceive( );
temp[2]=extendUARTreceive( );
CheckSum1 += temp[0];
CheckSum1 += temp[1];
CheckSum1 += temp[2];
if(CheckSum1 == 0) //check correct
{
SendUART(temp[0]);
SendUART(temp[1]);
SendUART(temp[2]);
}
}
#endif
//#ifdef extendUART_REC_INT0
#ifdef extendUART_REC_INT1
if(extendUARTrecData!=0x66)
{
SendUART(extendUARTrecData);
extendUARTrecData=0x66;
}
if(RecCount==12)
{
for(i=0;i<RecCount;i++)
{
//SendUART(RecBuf[i]);
extendUARTsend(RecBuf[i]);
}
RecCount=0;
}
#endif
LED = !LED;
for(delay=0;delay<35000;delay++) ;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -