📄 16c554.c
字号:
#include ".\16c554.H"
#include".\COM.H"
#include<absacc.h>
#include <intrins.h>
//*******************************************************ST16C1554端口定义
//*******************************************************
void init_16c554uart(void)
{
RESET= 1; //RESET 16C554
_nop_();_nop_();
_nop_();_nop_();
_nop_();_nop_();
_nop_();_nop_();
_nop_();_nop_();
RESET=0;
uc_16c554a_LCR=0x80; //串口1使能波特率设置
uc_16c554a_DLL=0x30; //外部晶振为7.3728M 波特率为9600
uc_16c554a_DLM=0x00;
uc_16c554a_FCR=0x07; //FIFO trigger level 为1字节
uc_16c554a_LCR=0x03; //8 bit data 1 stop no parity
uc_16c554a_IER=0x01;//使能接收和发送中断
uc_16c554a_MCR=0x08; //使能串口中断
_nop_();_nop_();
_nop_();_nop_();
_nop_();_nop_();
uc_16c554b_LCR=0x80; //串口2使能波特率设置
uc_16c554b_DLL=0x30; //外部晶振为单片机的六分之一波特率为9600
uc_16c554b_DLM=0x00;
uc_16c554b_FCR=0x07;
uc_16c554b_LCR=0x03; //8 bit data 1 stop no parity
uc_16c554b_IER=0x01;//使能接收和发送中断
uc_16c554b_MCR=0x08; //使能串口中断
_nop_();_nop_();
_nop_();_nop_();
_nop_();_nop_();
uc_16c554c_LCR=0x80; //串口3使能波特率设置
uc_16c554c_DLL=0x30; //外部晶振为单片机的六分之一波特率为9600
uc_16c554c_DLM=0x00;
uc_16c554c_FCR=0x07;
uc_16c554c_LCR=0x03; //8 bit data 1 stop no parity
uc_16c554c_IER=0x01;//使能接收
uc_16c554c_MCR=0x08; //使能串口中断
_nop_();_nop_();
_nop_();_nop_();
_nop_();_nop_();
uc_16c554d_LCR=0x80; //串口2使能波特率设置
uc_16c554d_DLL=0x30; //外部晶振为单片机的六分之一波特率为9600
uc_16c554d_DLM=0x00;
uc_16c554d_FCR=0x07;
uc_16c554d_LCR=0x03; //8 bit data 1 stop no parity
uc_16c554d_IER=0x01;//使能接收
uc_16c554d_MCR=0x08; //使能串口中断
_nop_();_nop_();
_nop_();_nop_();
_nop_();_nop_();
}
//发送一个字节
void uart_16C554asend(unsigned char s)
{ unsigned char temp;
uc_16c554a_THR=s;
temp=uc_16c554a_LSR;
while((temp&0x40)!=0x40)
{
temp=uc_16c554a_LSR;
}
}
//发送一帧数据
void frame_16c554asend(unsigned char t)//发送数据桢
{ EX0=0;//当RTS 变高时RX1变低16c554认为有数据要接受会产生接受中断,关闭中断
RTS1=ENABLE;
for(i=0;i<t;i++)
{
uart_16C554asend(s_buffer[i]);
}
RTS1=DISABLE;
EX0=1;
}
//发送一个字节
void uart_16C554bsend(unsigned char s)
{ unsigned char temp;
uc_16c554b_THR=s;
temp=uc_16c554b_LSR;
while((temp&0x40)!=0x40)
{
temp=uc_16c554b_LSR;
}
}
//发送一帧数据
void frame_16c554bsend(unsigned char t)//发送数据桢
{ EX1=0;//当RTS 变高时RX1变低16c554认为有数据要接受会产生接受中断,关闭中断
RTS2=ENABLE;
for(i=0;i<t;i++)
{
uart_16C554bsend(s_buffer[i]);
}
RTS2=DISABLE;
EX1=1;
}
//发送一个字节
void uart_16C554csend(unsigned char s)
{ unsigned char temp;
uc_16c554c_THR=s;
temp=uc_16c554c_LSR;
while((temp&0x40)!=0x40)
{
temp=uc_16c554c_LSR;
}
}
//发送一帧数据
void frame_16c554csend(unsigned char t)//发送数据桢
{ EX1=0;//当RTS 变高时RX1变低16c554认为有数据要接受会产生接受中断,关闭中断
RTS3=ENABLE;
for(i=0;i<t;i++)
{
uart_16C554csend(s_buffer[i]);
}
RTS3=DISABLE;
EX1=1;
}
//发送一个字节
void uart_16C554dsend(unsigned char s)
{ unsigned char temp;
uc_16c554d_THR=s;
temp=uc_16c554d_LSR;
while((temp&0x40)!=0x40)
{
temp=uc_16c554d_LSR;
}
}
//发送一帧数据
void frame_16c554dsend(unsigned char t)//发送数据桢
{ EX0=0;//当RTS 变高时RX1变低16c554认为有数据要接受会产生接受中断,关闭中断
RTS4=ENABLE;
for(i=0;i<t;i++)
{
uart_16C554dsend(s_buffer[i]);
}
RTS4=DISABLE;
EX0=1;
}
void INTA_int(void) interrupt 0 using 1 //串口1中断
{
unsigned char x;
if(INTD==1)
{
uc_554d_isr=uc_16c554d_ISR; //读中断状态寄存器
if(uc_554d_isr_status) //ISR INT STATUS为0表示有中断产生
return;
switch(uc_554d_isr)
{ case 0xc1:
case 0x01: //NO INTERRUPT
break;
case 0xc4:
case 0x04: // receive data interrupt
uc_554d_r_buffer[uc_554d_r_number]=uc_16c554d_RHR;
break;
case 0xc2:
case 0x02: //tranmit data interrupt
break;
case 0xc6:
case 0x06: //lsr interrupt
x=uc_16c554d_LSR; //清除LSR中断
break;
case 0x0c: //receive time out interrupt
case 0xcc:
x=uc_16c554d_RHR; //清除接受超时
break;
case 0x00: //msr interrupt
case 0xc0:
x=uc_16c554d_MSR; //清除msr中断
break;
default:
break;
}
}
else
{
uc_554a_isr=uc_16c554a_ISR; //读中断状态寄存器
if(uc_554a_isr_status) //ISR INT STATUS为0表示有中断产生
return;
switch(uc_554a_isr)
{ case 0xc1:
case 0x01: //NO INTERRUPT
break;
case 0xc4:
case 0x04: // receive data interrupt
uc_554a_r_buffer[uc_554a_r_number]=uc_16c554a_RHR;
break;
case 0xc2:
case 0x02: //tranmit data interrupt
break;
case 0xc6:
case 0x06: //lsr interrupt
x=uc_16c554a_LSR; //清除LSR中断
break;
case 0x0c: //receive time out interrupt
case 0xcc:
x=uc_16c554a_RHR; //清除接受超时
break;
case 0x00: //msr interrupt
case 0xc0:
x=uc_16c554a_MSR; //清除msr中断
break;
default:
break;
}
//uc_16c554a_MCR=0x08; //使能串口中断
}
}
void INTB_int(void) interrupt 2 using 0 //串口2中断
{
unsigned char x;
if(INTC==1)//串口3接收到数据,原理图本意是用定时器做外部中断,现改为查询
{
uc_554c_isr=uc_16c554c_ISR; //读中断状态寄存器
if(uc_554c_isr_status) //ISR INT STATUS为0表示有中断产生
return;
switch(uc_554c_isr)
{
case 0xc1:
case 0x01: //NO INTERRUPT
break;
case 0xc4:
case 0x04: // receive data interrupt
uc_554c_r_buffer[uc_554c_r_number]=uc_16c554c_RHR;
break;
case 0xc2:
case 0x02: //tranmit data interrupt
break;
case 0xc6:
case 0x06: //lsr interrupt
x=uc_16c554c_LSR; //清除LSR中断
break;
case 0x0c: //receive time out interrupt
case 0xcc:
x=uc_16c554c_RHR; //清除接受超时
break;
case 0x00: //msr interrupt
case 0xc0:
x=uc_16c554c_MSR; //清除msr中断
break;
default:
break;
}
}
else
{
uc_554b_isr=uc_16c554b_ISR; //读中断状态寄存器
if(uc_554b_isr_status) //ISR INT STATUS为0表示有中断产生
return;
switch(uc_554b_isr)
{
case 0xc1:
case 0x01: //NO INTERRUPT
break;
case 0xc4:
case 0x04: // receive data interrupt
uc_554b_r_buffer[uc_554b_r_number]=uc_16c554b_RHR;
case 0xc2:
case 0x02: //tranmit data interrupt
break;
case 0xc6:
case 0x06: //lsr interrupt
x=uc_16c554b_LSR; //清除LSR中断
break;
case 0xcc:
case 0x0c: //receive time out interrupt
x=uc_16c554b_RHR; //清除接受超时
break;
case 0xc0:
case 0x00: //msr interrupt
x=uc_16c554b_MSR; //清除msr中断
break;
}
}
// uc_16c554b_MCR=0x08; //使能串口中断
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -