pic16f877A 串行异步通讯转换模块C语言简易程序13917093724

[复制链接]
3172|0
 楼主| dream2010 发表于 2008-12-30 08:52 | 显示全部楼层 |阅读模式
//SPBRG=25;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;SPBRG=51;&nbsp;&nbsp;9600波特率计算出来的结果。&nbsp;&nbsp;&nbsp;25为19200&nbsp;波特率计算的通讯结果<br />//&nbsp;&nbsp;&nbsp;辅助试验,改变波特率&nbsp;&nbsp;&nbsp;或者改变通讯方式“&nbsp;&nbsp;异步高速、异步低速通讯方式&nbsp;及基本的同步通讯方式F/4(X+1)&nbsp;&nbsp;通常简易9600&nbsp;&nbsp;高速异步通讯误差小<br /><br />#include&quot;pic.h&quot;<br />#include&quot;pic1687x.h&quot;<br />unsigned&nbsp;char&nbsp;table0[10]={0XBF,0X86,0XDB,0XCF,0XE6,0XED,0XFD,0XF7,0XFF,0XEF};&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//LED&nbsp;共阴极数码管显示代码,带点。<br />unsigned&nbsp;char&nbsp;table[10]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F};<br /><br />unsigned&nbsp;char&nbsp;recdata;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//来自计算机串口窗口发送的数据&nbsp;V2.2<br /><br />void&nbsp;SYSinitial()<br />{<br />TRISD=0X00;<br />PORTD=0XFF;<br />INTCON=0X00;<br />ADCON1=0X07;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//声明8个模拟通道都恢复通常的IO输入输出功能。不是模拟输入也不是参考电压设置。<br />}<br /><br />void&nbsp;USART232initial()<br />{<br />TRISC6=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//RC6,SCL/TX&nbsp;方向输出&nbsp;RC7,SDA/RX&nbsp;方向输入接受;&nbsp;<br />TRISC7=1;<br />PORTD=0XFF;<br /><br />TXSTA=0B00000000;&nbsp;&nbsp;&nbsp;&nbsp;//改为异步低速通讯&nbsp;&nbsp;&nbsp;&nbsp;//CSRC,&nbsp;&nbsp;TX9,TXEN,SYNC;&nbsp;*&nbsp;;BRGH,TRMT,TX9D;&nbsp;&nbsp;异步通讯模式下,没有启用CSRC时钟源选择位。&nbsp;本题是异步高速通讯模式。<br />RCSTA=0X80;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//SPEN,RX9,SREN,CREN;&nbsp;&nbsp;ADDEN,&nbsp;FERR,OERR,RX9D;<br /><br />SPBRG=13;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;SPBRG=51;&nbsp;&nbsp;9600波特率计算出来的结果。&nbsp;&nbsp;&nbsp;25为19200&nbsp;波特率计算的通讯结果<br />PIR1=0X00;<br /><br />RCIE=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设置好串口的接受、发送中断使能位。&nbsp;&nbsp;之后则只需要一个中断标志位置1.<br />//TXIE=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//函数加了这条语句,RD&nbsp;端口显示为全8&nbsp;字符。&nbsp;&nbsp;&nbsp;会影响到后期的显示部分,可以根据书本要点,省列此语句。<br />CREN=1;<br />TXEN=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//首先考虑中断使能位,&nbsp;再考虑具体的位。&nbsp;&nbsp;RCSTA;&nbsp;&nbsp;&nbsp;TXSTA;<br />}<br /><br />void&nbsp;interrupt&nbsp;&nbsp;USART232()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//异步同步(都包括)&nbsp;的串口通讯中断子程序<br />{<br />if(RCIF==1)<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;RCIF=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;recdata=RCREG;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//数据信息首先来自&nbsp;&nbsp;PC机界面&nbsp;V2.2窗口。&nbsp;四个寄存器&nbsp;接受结果寄存器,其中的数据赋值给变量,变量再转给发送&nbsp;结果寄存器。<br />&nbsp;&nbsp;&nbsp;&nbsp;TXREG=recdata+1;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;TXREG=recdata+2;&nbsp;&nbsp;如果函数再界面传送的数据都是16进制,那么可以考虑同时选中。<br />&nbsp;&nbsp;}<br />}<br /><br /><br />void&nbsp;main()<br />{<br />SYSinitial();<br />USART232initial();<br />INTCON=INTCON|0XC0;<br /><br />while(1)<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;PORTD=table0[7];<br />&nbsp;&nbsp;}<br /><br />}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

26

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部