#ifdef CPU_80C320
unsigned char data ser1_buf_rx[SERIAL_BUF_SIZE];
unsigned char ser1_rx_w,ser1_rx_r;
char verify1; //0 1 2 无 奇 偶
bit tx1_ok;
#endif
//extern unsigned char data ser1_buf_rx[SERIAL_BUF_SIZE];
//extern unsigned char ser1_rx_w,ser1_rx_r;
//extern char verify1; //0 1 2 无 奇 偶
//extern bit tx1_ok; //发送是否完成
/*
设置串口1通讯参数
入口: baud= 0 9600
1 19200
2 38400
3 1200
4 28800
5 57600
6 115200
7 300
8 600
9 2400
10 4800
返回: 1: 成功
0: 失败
*/
bit set_ser_port1(char baud, char databit,char stopbit,char ver)
{
unsigned int baudcap;
/* SM0=0; SM1=0; 串行口以 f/12的速率作串行同步移位 */
/* SM0=0; SM1=1; 8位数据 1位停止 正常通讯 */
/* SM0=1; SM1=0; 8位数据 1位标志 1位停止 用于多机通讯,但波特率不能变,一
般不用 */
/* SM0=1; SM1=1; 同上 但波特率能变 */
verify1=ver;
if(ver==0)
{
SM0_1=0; SM1_1=1; /* 无校验,正常点对点通讯 */
}
else if(ver==1 || ver==2)
{
SM0_1=1; SM1_1=1; /* 奇偶校验, 多机通讯 */
SM2_1=0;
}
REN_1=1; /* 允许接收 */
TMOD=TMOD & 0x0f; /* 把 TMOD 的高字节设为2 */
TMOD=TMOD | 0x20; /* 使 T1 工作于模式2 即提供波特率 */
#ifdef FREQ11
switch(baud)
{
case 0: TL1=TH1=0-3; WDCON &=0x7F; break; /* 9600 11M
DOUBLE */
case 1: TL1=TH1=0-3; WDCON |=0x80; break; /* 19200 11M
DOUBLE */
case 2: return 0; // break; /* 38400 11M
No */
case 3: TL1=TH1=0-24; WDCON &=0x7F; break; /* 1200 11M
DOUBLE */
case 4: TL1=TH1=0-1; WDCON &=0x7F; break; /* 28800 11M
DOUBLE */
case 5: TL1=TH1=0-1; WDCON |=0x80; break; /* 57600 11M
DOUBLE */
case 6: return 0; // break; /* 115200 11M
No */
case 7: TL1=TH1=0-96; WDCON &=0x7F; break; /* 300 11M DOUBLE
*/
case 8: TL1=TH1=0-48; WDCON &=0x7F; break; /* 600 11M DOUBLE
*/
case 9: TL1=TH1=0-12; WDCON &=0x7F; break; /* 2400 11M
DOUBLE */
case 10: TL1=TH1=0-6; WDCON &=0x7F; break; /* 4800 11M
DOUBLE */
}
#endif
#ifdef FREQ22
switch(baud)
{
case 0: TL1=TH1=0-12; WDCON |=0x80; break; /* 9600 11M
DOUBLE */
case 1: TL1=TH1=0-6; WDCON |=0x80; break; /* 19200 11M
DOUBLE */
case 2: TL1=TH1=0-3; WDCON |=0x80; break; /* 38400 11M No */
case 3: TL1=TH1=0-96; WDCON |=0x80; break; /* 1200 11M
DOUBLE */
case 4: TL1=TH1=0-4; WDCON |=0x80; break; /* 28800 11M
DOUBLE */
case 5: TL1=TH1=0-2; WDCON |=0x80; break; /* 57600 11M
DOUBLE */
case 6: TL1=TH1=0-1; WDCON |=0x80; break; /* 115200 11M No
*/
case 7: TL1=TH1=0-192; WDCON &=0x7f; break; /* 300 11M
DOUBLE */
case 8: TL1=TH1=0-192; WDCON |=0x80; break; /* 600 11M
DOUBLE */
case 9: TL1=TH1=0-48; WDCON |=0x80; break; /* 2400 11M
DOUBLE */
case 10: TL1=TH1=0-24; WDCON |=0x80; break; /* 4800 11M
DOUBLE */
}
#endif
TR1=1;
ser1_rx_w = ser1_rx_r =0;
tx1_ok=1;
ES_1=1; EA=1;
return 1;
/* IE=0; */ /* 全部中断清0 */
/* ES =1; */ /* 串行中断 */
/* IP=0x10; */ /* 串行中断优先 */
/* EA=1; */
}
void ser1_int() interrupt 7 //串口1中断
{
char c;
if(TI_1==1) {TI_1=0; tx1_ok=1; return; }
RI_1=0;
ser1_buf_rx[ser1_rx_w++]=SBUF1;
if(ser1_rx_w==SERIAL_BUF_SIZE)ser1_rx_w--; //保证程序不会因指针超出而出错
}