表情[讨论]C语言编写,用PIC16F690双机异步USART通信(发送程序) 我的这个程序是利用PIC16F690单片机编写的。 要实现双机异步通信,用USART进行通信。 目的是,让单片机A发送00~99到单片机B中,然后在单片机B链接一个LED数码管显示出00~99; 与此同时,单片机A也同样链接一个LED数码管,显示发送出去的00~99. 也就是让单片机A和B的数码管显示同样的00和99。 我的程序如下,本程序已经调通,但是不知道用USART发送PORTC=0x10高位和PORTC=0x40低位是否发送成功。请那位老师指点一下。 这个是发送端的程序: #include<pic.h>
/*该程序实现PIC16F690单片机双机异步通信功能;*/ /*该程序是发送部分(发送00~99),并在LED显示器上显示出发送的数据;*/
#define PRESCALE1S 40 //1s
unsigned char Reg_L = 0; unsigned char Reg_H = 0; unsigned char IntFlag = 0;
const char NumTab[10] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0XD8,0x80,0x90}; //不带小数点,共阳极显示0~9;
unsigned int DispPreScale = PRESCALE1S; unsigned int DispPreScaleCnt = 0x00;
/***函数名称:InitPort;***/ /***函数功能:I/O端口初始化;***/ void InitPort(void) { TRISA = 0x00; //PORTA初始化; PORTA = 0x00; TRISB = 0x00; //PORTB初始化; PORTB = 0x00; TRISC = 0x00; //PORTC初始化; PORTC = 0x00; }
/***函数名称:InitTMR1;***/ /***函数功能:定时器1初始化;***/ void InitTMR1(void) { T1CON = 0x30; //TMR1寄存器时钟为Fosc/4再经8分频; TMR1H = 0x3C; TMR1L = 0xB0; //50ms定时初始化值; TMR1IE = 1; //允许Timer1 溢出中断; TMR1ON = 1; //TMR1使能; }
/***函数名称:InitDevice;***/ /***函数功能:对MCU各个功能初始化;***/ void InitDevices(void) { InitPort(); //端口初始化; InitTMR1(); //TMR1定时器初始化; BRGH = 1; //选择高速波特率; SPBRG = 103; //晶振8M,异步,高速,19200BPS,误差0.16; TXSTA = 0x04; //8bit; RCSTA = 0x80; //使能发送器; // TXIE = 0; //写中断标志位置1使能写中断; OSCCON = 0x70; //振荡器选择为内部8M晶振; //内部振荡器用作系统时钟; GIE = 1; //全局终端允许位;使能所有未屏蔽中断; PEIE = 1; //外设终端允许位;使能所有非屏蔽外设中断; ANSEL = 0x00; //模拟口转数字口; ANSELH = 0x00; }
/***函数名称:delay_1ms***/ /***函数功能:定时器TMR0延时1ms***/ void delay_1ms(void) { OPTION = 0x07; //设置TMR0寄存器; while(1) { if(TMR0 == 0x75) //1us*256*0x75=29952us 大概3ms ; { TMR0 = 0x00; break; } } }
/***中断服务程序入口***/ void interrupt USART(void) { if(TMR1IE && TMR1IF) //定时器1溢出 中断处理 { TMR1IF = 0; //清除TMR1中断标志; TMR1H = 0xFC; TMR1L = 0x18; //延时4ms; IntFlag = 1; } }
/******主函数******/ void main(void) { InitDevices(); PORTB = 0x50; PORTC = NumTab[0]; TXEN = 1; //发送允许; CREN = 1; //接收数据允许; while(1) //循环运行; { if(IntFlag == 1) { IntFlag = 0; DispPreScaleCnt++; if(DispPreScaleCnt == DispPreScale) //延时1s后 { DispPreScaleCnt = 0x00; if(Reg_L<0x09) { Reg_L += 1; } else { Reg_L = 0; if(Reg_H < 0x09) { Reg_H += 1; } else { Reg_H = 0; } } } } delay_1ms(); PORTA = 0x00; PORTB = 0x40; //低位; PORTC = NumTab[Reg_L]; TXREG = PORTC; delay_1ms(); PORTA = 0x00; PORTB = 0x10; //高位; PORTC = NumTab[Reg_H]; TXREG = PORTC; while(1) { if(TXIF == 1)break; } while(1) { if(RCIF == 1)break; //若收到响应字节,则终止等待; } RCREG = RCREG; //读响应字节,清RCIF; }
while(1) { ; }
}
|