PIC18F46K22串口通信问题

ZBL394710971LH 2012-09-07 11:48:04
//主控芯片PIC18F46K22////////////////////////////////////

#include <pic18.h> //头文件在HI-TECH安装目录下\HI-TECH Software\PICC\std\9.60\include
__CONFIG(1,FOSC_XT&IESO_ON&FCMEN_ON) ;
__CONFIG(2,PWRTEN_OFF &HFOFST_ON & WDTEN_OFF ) ;
__CONFIG(3,MCLRE_EXTMCLR & WDTPS_1 & WDTEN_OFF ) ;
__CONFIG(4,DEBUG_ON&LVP_OFF) ;
__CONFIG(5,CP3_OFF&CP2_OFF&CP1_OFF&CP0_OFF&CPB_OFF&CPD_OFF) ;
__CONFIG(6,WRT0_OFF&WRT1_OFF&WRT2_OFF&WRT3_OFF&WRTC_OFF&WRTB_OFF&WRTD_OFF) ;
__CONFIG(7,EBTR0_OFF&EBTR1_OFF&EBTR2_OFF&EBTR3_OFF) ;

//#pragma config FOSC = XT //外部晶振
//#pragma config WDTEN = OFF //关闭 WDT
//#pragma config XINST = OFF //指令集关
//#pragma config LVP = OFF //低压编程
//DEVID1=0x01; //0000 0001
//DEVID2=0x54; //0101 0100 器件版本号:PIC18F46K22

#define LED0 LATDbits.LATD0 //定义LED0
#define LED1 LATDbits.LATD1 //定义LED1
#define LED2 LATDbits.LATD2 //定义LED2
#define LED3 LATDbits.LATD3 //定义LED3
#define LED4 LATDbits.LATD4 //定义LED4
#define LED5 LATDbits.LATD5 //定义LED5
#define LED6 LATDbits.LATD6 //定义LED6
#define LED7 LATDbits.LATD7 //定义LED7

#define TxBusy TXSTA1bits.TRMT //等待1个字节发送完毕

#define uchar unsigned char
#define uint unsigned int

uint i=0;
uint UART_State; //标志接收到的数据
uchar RevDate; //临时存储串口接收到的数据
uchar RealAddress; //存储密集架实际地址
uchar DisplayAddress; //存储密集架显示地址
uchar OrderState; //存储接收到的指令
uchar RecSucStr[2]={0xBB,0xAA}; //命令接收成功标志寄存器 BB 00
uchar teststr[6]={0x11,0x22,0x01,0x10,0x33,0x00}; //测试使用
//uchar RecStr[]; //串口接收数据寄存器
//uchar SendStr[]; //串口发送数据寄存器

//uint temp1,temp2;
//***********************************************************************************
//IO初始化操作
//***********************************************************************************
void IO_init(void)
{
//OSCCON = 0b01101000; //主振荡器
TRISD=0x00; //RD设置为输出
PORTD=0xFF; //初始化为高
//TRISC=0x80; //置RC6/TX与RC7/RX分别为UART的传送与接收引脚
//UART_State=0;//串口接收数据初始化
//RealAddress=0x07; //默认地址第7列
OrderState=0x80; //默认命令为00
}
//**************************************************************************************************
//初始化串口

//**************************************************************************************************
void init_com( void )
{
TXSTA1=0x04;//发送数据控制位配置00100100,异步方式、高波特率,波特率=Fosc/16*(SPBTG+1);TXSTA寄存器的D5(TXEN)=1,启动UART的发送功能
//CSRC TX9 TXEN SYNC SENDB BRGH TRMT TX9D
// 0 0 1 0 0 1 0 0
//【CSRC】时钟源选择位,【TX9】9位发送使能位,【TXEN】发送使能位,【SYNC】EUSART模式选择位
//【SENDB】发送间隔字符位,【BGRH】高波特率选择位,【TRMT】发送移位寄存器状态位,【TX9D】发送数据的第9位
RCSTA1=0x90;//接收数据控制位配置1001 0000,设置连续接收数据 //SPEN RX9 SREN CREN ADDEN FERR OERR RX9D 串口使能位
// 1 0 0 1 0 0 0 0
//【SPEN】串口使能,【RX9】9位接收使能位,【SREN】单字节接收使能位,【CREN】连续接收使能位,
//【ADDEW】地址检测使能位,【FERR】帧错误位,【OERR】溢出错误位,【RX9D】接收数据的第9位
IPEN=0;
INTCONbits.PEIE=1; //INTCON的D6(PEIE)=1,外围中断开允许
INTCONbits.GIE=1; //总中断开启
SPBRG1=25; //设置波特率9600,系统时钟11.0592MHZ,波特率=4000000/16/(25+1)=9615(Bps)
PIE1bits.RC1IE=1; //接收中断使能
//TX1IE=1; //发送中断禁止
//IPR1=0x20;//串口1 优先级

UART_State=0;//串口接收数据初始化
RealAddress=0x07; //默认地址第7列
OrderState=0x00; //默认命令为00
}

//***********************************************************************************
//延时:基数:1ms 延时1S time=1000
//***********************************************************************************
void delay(uint time)
{
uint i,j;
for(i = 0;i < time; i++)
{
for(j = 0;j < 15; j++);
}
}

//**************************************************************************************************
//串口中断函数
//TXREG:发送接收数据存储器//RCREG:接收发送数据存储器
//**************************************************************************************************
void interrupt isr(void)
{

if(RC1IF==1) //接收到数据产生中断
{
//LED5=0;
RevDate=RCREG1; //读取接收到的数据
switch(UART_State)
{
case 0:
if(RevDate == 0x07)
{
UART_State=1;
}
break;
case 1:
if(RevDate == 0xAA)
{
UART_State=2;
}
break;
case 2:
UART_State=3;
OrderState=RevDate;
break;
case 3:
if(RevDate == 0xEE) //指令接收完毕
{
UART_State=0;
//SendDate(RecSucStr,2); //发送接收命令成功标志:BB 00
}
break;
}
//RC1IF=0;
}
}
//**************************************************************************************************
//主函数
//**************************************************************************************************
void main(void)
{
// __CONFIG(XT&WDTDIS&LVPDIS);//配置,设置为晶振XT方式振荡,禁看门狗,禁低电压编程

IO_init(); //IO初始化
init_com(); //初始化串口
//USART1_Init();
//timer0_init;
//timer1_init;
//SendDate(); //发送接收命令成功标志:BB 00
while(1) //循环
{
//SendDate(); //发送接收命令成功标志:BB 00
switch(OrderState)
{
case 0x00: //灭灯指令
{
PORTD=0xFF; //1111 1111
}
break;
case 0x01: //开灯指令
{
PORTD=0xBF; //1011 1111
}
break;
case 0x02: //流水灯指令
{
PORTD=0xFE; //1111 1110
delay(1000);
PORTD=0xFD; //1111 1101
delay(1000);
PORTD=0xFB; //1111 1011
delay(1000);
PORTD=0xF7; //1111 0111
delay(1000);
PORTD=0xEF; //1110 1111
delay(1000);
PORTD=0xDF; //1101 1111
delay(1000);
PORTD=0xBF; //1011 1111
delay(1000);
PORTD=0x7F; //0111 1111
delay(1000);
}
break;
case 0x03: //高四位亮。低四位灭指令
{
PORTD=0x0F; //0000 1111
}
break;
case 0x04: //高四位亮灭。低四位亮灭指令
{
PORTD=0xF0; //1111 0000
}
break;
default: break;
}
}
}


...全文
403 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
ForestDB 2012-09-07
  • 打赏
  • 举报
回复
问题呢?

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧