功能描述: 串行通讯程序,单片机中断收到8个数据后,将收到的8个数据以中断发送方式返送回发送方
#include "pic18.h" /* 所有PIC18系列的头文件 */ unsigned char receive232[8]; // 接收数据数组 unsigned char send232[8]; // 发送数据数组 unsigned char receive_count=0;// 接收数据个数计数 unsigned char send_count=0; // 发送数据个数计数 unsigned char *pointer; // 发送指针 unsigned char SciReceiveFlag; // =1,接收到8个数据 /* **************************************************************** ** 函 数 名: initial() ** 功能描述: 系统初始化子程序,放在程序首部 *************************************************************** */ void initial() { INTCON=0x00; /* bit7-bit0:关总中断 */ ADCON1=0X07; /* 设置数字输入输出口 */ PIE1=0; /* PIE1 的中断不使能 */ PIE2=0; /* PIE2 的中断不使能 */ PIE3=0; /* PIE3 的中断不使能 */ } /* **************************************************************** ** 函 数 名: sciinitial() ** 功能描述: 232串行通讯初始化子程序,设置低优先级中断接收,使能232收 *************************************************************** */ void sciinitial() { TXSTA=0x04; // 选择异步高速方式传输8位数据 RCSTA=0x80; // 允许串行口工作使能, TRISC=TRISC|0X80; // PIC18F458:将RC7(RX)设置为输入方式 TRISC=TRISC&0Xbf; // RC6(TX)设置为输出 SPBRG=25; // 4M晶振时波特率为25 PIR1=0x00; // 清中断标志 PIE1=PIE1|0x20; /* 允许串行通讯接口接收中断使能 */ RCIP=0; // 设置SCI接收中断为低优先级中断 CREN=1; // 允许串口接收数据 PIE1=PIE1|0x10; // 允许中断发送 TXIP=0; // 低优先级中断 // TXEN=1; // 允许串口发送数据 } /* **************************************************************** ** 函 数 名: interrupt low_priority LOW_ISR() ** 功能描述: 低优先级中断子程序:RS232中断接收、中断发送 *************************************************************** */ void interrupt low_priority LOW_ISR() { if(RCIF==1) { RCIF=0; receive232[receive_count]=RCREG; //接收数据并存储 send232[receive_count]=RCREG; receive_count++; // 接收计数器加1 if(receive_count>7) // 如果已经接收到8个数据 { receive_count=0; // 接收计数器清0 SciReceiveFlag=1; //置接收到数据标志 } } else if(TXIF==1) { // TXIF不能用软件清0 if(send_count>7) { TXEN=0; // 已经发送到最后一个数,发送不使能 return; } else { send_count++; /* 发送计数器加1 */ TXREG=*pointer++; /* 发送当前应发送数据,发送指针加1 */ } } } main() { initial(); // 系统初始化 sciinitial(); // 串行通讯初始化子程序 IPEN=1; // 使能中断高低优先级 INTCON=INTCON|0xc0; // 开总中断、开外围接口中断 while(1) { if(1==SciReceiveFlag) /* 是否接收到通信数据 */ { SciReceiveFlag=0; /* 清接收标志 */ send_count=0; /* 发送数据计数清0 */ pointer=&send232[0];/* 发送数据指针指向发送数据数组首地址 */ TXREG=*pointer++; /* 发送第一个数据后,将发送指针加1 */ TXEN=1; /* 使能发送 */ } } }