PIC單片機通用同步異步收發(fā)器的編程應(yīng)用
voidinterrupt low_priorityLOW_ISR()/* 低優(yōu)先級中斷子程序 */
{
if(RCIF==1)/* RS232接收中斷 */
{
RCIF=0;/* 清中斷標志 */
receive232[receive_count]=RCREG;/* 接收數(shù)據(jù)并存儲 */
send232[receive_count]=RCREG; /* 接收數(shù)據(jù)存放到發(fā)送緩沖數(shù)組 */
receive_count++;/* 接收計數(shù)器加1 */
if(receive_count>7)/* 如果已經(jīng)接收到8個數(shù)據(jù) */
{
receive_count=0;/* 接收計數(shù)器清0 */
SciReceiveFlag=1;/* 置接收到8個數(shù)據(jù)標志 */
}
}
elseif((0!=Send_Mode)(TXIF==1))/* 中斷發(fā)送數(shù)據(jù)方式且為發(fā)送中斷 */
{
if(send_count>7)/* 已經(jīng)發(fā)送完8個數(shù) */
{
TXEN=0;/* 發(fā)送不使能 */
return;
}
else
{
send_count++;/* 發(fā)送計數(shù)器加1 */
TXREG=*pointer++;/* 發(fā)送當前應(yīng)發(fā)送數(shù)據(jù),發(fā)送指針加1 */
}
}
}
main() /* 主程序 */
{
INTCON=0x00;/* 關(guān)總中斷 */
ADCON1=0X07;/* 設(shè)置數(shù)字輸入輸出口,不用作模擬口 */
PIE1=0;/* PIE1 的中斷不使能 */
PIE2=0;/* PIE2 的中斷不使能 */
PIE3=0;/* PIE3 的中斷不使能 */
Send_Mode=1;/* Send_Mode不為0,中斷方式發(fā)送數(shù)據(jù);
Send_Mode =0,非中斷方式發(fā)送數(shù)據(jù) */
sciinitial();/* 串行通訊初始化子程序 */
IPEN=1;/* 使能中斷高低優(yōu)先級 */
INTCON=INTCON|0xc0;/* 開總中斷、開外圍接口中斷 */
while(1)
{
if(1==SciReceiveFlag)/* 是否接收到8個通信數(shù)據(jù) */
{
SciReceiveFlag=0;/* 清接收到8個通信數(shù)據(jù)標志 */
if(0!=Send_Mode) /* Send_Mode不為0,中斷方式發(fā)送 */
{
send_count=0;/* 發(fā)送數(shù)據(jù)計數(shù)清0 */
pointer=send232[0];/* 發(fā)送指針指向發(fā)送數(shù)據(jù)數(shù)組首地址 */
TXREG=*pointer++;/* 發(fā)送第一個數(shù)據(jù)后,將發(fā)送指針加1 */
TXEN=1;/* 使能發(fā)送 */
}
else /* Send_Mode =0,非中斷方式發(fā)送數(shù)據(jù) */
{
pointer=send232[0];/* 發(fā)送指針指向發(fā)送數(shù)據(jù)數(shù)組首地址 */
for(i=0;i8;i++)
{
TXREG=*pointer++;/* 發(fā)送數(shù)據(jù)后,將發(fā)送指針加1 */
while(1)/* 等待發(fā)送完成 */
{
if(TXIF==1)break;/* 等待發(fā)送完成 */
}
}
}
}
}
}
評論