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