⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pc机与单片机的通讯.htm

📁 8250扩展串口的单片机C51例程和相关资料。
💻 HTM
📖 第 1 页 / 共 5 页
字号:
                        inportb(PortBase+0); else 
                        break;<BR>&nbsp;}<BR><BR>&nbsp;outportb(PortBase,ch);<BR>}<BR><BR>int 
                        com_chkch(void) {<BR>&nbsp;unsigned char 
                        status;<BR><BR>&nbsp;status = 
                        inportb(PortBase+5);<BR>&nbsp;status &amp;= 
                        0x01;<BR>&nbsp;if(status) 
                        return((int)inportb(PortBase+0)); else 
                        return(-1);<BR><BR>}<BR></FONT><BR></P>
                        <P align=left>&nbsp;&nbsp;&nbsp; 
                        使用查询方式的通讯程序适合9600bps以下的应用。</P>
                        <P align=left>(3)<A name=serial></A>使用中断的串行通讯程序设计:   <A 
                        href="http://www.ewbbs.com/Admin_ArticleShow.asp?ArticleID=128#0">返回页首</A></P>
                        <P align=left>&nbsp;&nbsp;&nbsp; 
                        该程序由两部分组成,serial.c及sercom.c,sercom.c为通讯的底层驱动,使用中断的串行通讯程序可以工作到115.2Kbps.</P>
                        <P align=left><FONT 
                        color=#ff3300><I>serial.c&nbsp;&nbsp;&nbsp; 
                        </I></FONT><FONT color=#000000></FONT></P>
                        <BLOCKQUOTE>
                          <P align=left><FONT color=#0000ff>#include 
                          <DOS.H><BR>#include <STDIO.H><BR>#include 
                          <CONIO.H><BR>#include <STRING.H><BR>#include 
                          <BIOS.H><BR>#include "sercom.c"<BR><BR>COM 
                          *c;<BR><BR>main()<BR>{<BR>&nbsp;unsigned char 
                          ch;<BR><BR>&nbsp;c = ser_init( 
                          PORT_B,BAUD_9600,_COM_CHR8,_COM_NOPARITY,4096,4096 
                          );<BR><BR>&nbsp;while(1) {<BR><BR>&nbsp; if( 
                          serhit(c)) {<BR>&nbsp;&nbsp; ch = 
                          getser(c);<BR>&nbsp;&nbsp; putchar(ch);<BR>&nbsp; 
                          }<BR><BR>&nbsp; if(kbhit()) {<BR>&nbsp;&nbsp; ch = 
                          getch();<BR>&nbsp;&nbsp; putser(ch,c);<BR>&nbsp; 
                          }<BR><BR>&nbsp;}<BR>}<BR><BR></FONT></P></BLOCKQUOTE>
                        <P align=left><FONT 
                        color=#ff0000><I>llio.c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                        </I></FONT></P>
                        <BLOCKQUOTE>
                          <P align=left><FONT color=#0000ff>#include 
                          <STDIO.H><BR>#include <DOS.H><BR>#include 
                          <BIOS.H><BR>#include 
                          <MALLOC.H><BR><BR>#define&nbsp;&nbsp;&nbsp;&nbsp; CR 
                          0x0d<BR>#define&nbsp;&nbsp;&nbsp;&nbsp; TRUE 
                          0xff<BR>#define&nbsp;&nbsp;&nbsp;&nbsp; FALSE 
                          0<BR><BR>#define&nbsp;&nbsp;&nbsp;&nbsp; 
                          PORT_A&nbsp;&nbsp;&nbsp;&nbsp; 0 /* COM1 
                          */<BR>#define&nbsp;&nbsp;&nbsp;&nbsp; 
                          PORT_B&nbsp;&nbsp;&nbsp;&nbsp; 1 /* COM2 
                          */<BR>#define&nbsp;&nbsp;&nbsp;&nbsp; BAUD_9600&nbsp; 
                          _COM_9600<BR>#define&nbsp;&nbsp;&nbsp;&nbsp; 
                          BAUD_4800&nbsp; 
                          _COM_4800<BR>#define&nbsp;&nbsp;&nbsp;&nbsp; 
                          BAUD_2400&nbsp; 
                          _COM_2400<BR>#define&nbsp;&nbsp;&nbsp;&nbsp; 
                          BAUD_1200&nbsp; 
                          _COM_1200<BR>#define&nbsp;&nbsp;&nbsp;&nbsp; 
                          BAUD_600&nbsp;&nbsp; 
                          _COM_600<BR>#define&nbsp;&nbsp;&nbsp;&nbsp; 
                          BAUD_300&nbsp;&nbsp; 
                          _COM_300<BR>#define&nbsp;&nbsp;&nbsp;&nbsp; 
                          BAUD_110&nbsp;&nbsp; _COM_110<BR><BR><BR>typedef 
                          struct {<BR>&nbsp;char 
                          ready;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                          /* TRUE when ready */<BR>&nbsp;unsigned 
                          com_base;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* 8250 Base 
                          Address */<BR>&nbsp;char 
                          irq_mask;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                          /* IRQ Enable Mask */<BR>&nbsp;char 
                          irq_eoi;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                          /* EOI reply for this port */<BR>&nbsp;char 
                          int_number;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                          /* Interrupt # used */<BR>&nbsp;void (_interrupt _far 
                          *old)( void );&nbsp;&nbsp;&nbsp;&nbsp; /* Old 
                          Interrupt */<BR><BR>&nbsp;/* Buffers for I/O 
                          */<BR><BR>&nbsp;char 
                          *in_buf;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                          /* Input buffer */<BR>&nbsp;int 
                          in_tail;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                          /* Input buffer TAIL ptr */<BR>&nbsp;int 
                          in_head;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                          /* Input buffer HEAD ptr */<BR>&nbsp;int 
                          in_size;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                          /* Input buffer size */<BR>&nbsp;int 
                          in_crcnt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                          /* Input <CR>count */<BR>&nbsp;char 
                          in_mt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                          /* Input buffer FLAG */<BR><BR>&nbsp;char 
                          *out_buf;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                          /* Output buffer */<BR>&nbsp;int 
                          out_tail;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                          /* Output buffer TAIL ptr */<BR>&nbsp;int 
                          out_head;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                          /* Output buffer HEAD ptr */<BR>&nbsp;int 
                          out_size;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                          /* Output buffer size */<BR>&nbsp;char 
                          out_full;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                          /* Output buffer FLAG */<BR>&nbsp;char 
                          out_mt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                          /* Output buffer MT */<BR>} 
                          COM;<BR><BR><BR>COM&nbsp;&nbsp;&nbsp;&nbsp; *ser_init( 
                          int port,int baud,int bit,int parity,int isize,int 
                          osize );<BR>void&nbsp;&nbsp;&nbsp;&nbsp; ser_close( 
                          COM *c );<BR><BR><BR>int getsers( COM *c,int len,char 
                          *str );<BR>int putsers( char *str, COM *c );<BR>char 
                          serline( COM *c );<BR>int getser( COM *c );<BR>char 
                          serhit(COM *c);<BR>char putser(char outch,COM 
                          *c);<BR>void cntl_rts(int flag,COM *c);<BR>void 
                          cntl_dtr(int flag,COM *c);<BR>void clean_ser( COM *c 
                          );<BR><BR><BR>#define&nbsp;&nbsp;&nbsp;&nbsp; 
                          COM1_BASE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                          0x03F8<BR>#define&nbsp;&nbsp;&nbsp;&nbsp; 
                          COM1_IRQ_MASK&nbsp;&nbsp;&nbsp;&nbsp; 
                          0xEF&nbsp;&nbsp;&nbsp;&nbsp; /*11101111B IRQ 4 For 
                          COM1 */<BR>#define&nbsp;&nbsp;&nbsp;&nbsp; 
                          COM1_IRQ_EOI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                          0x64&nbsp;&nbsp;&nbsp;&nbsp; /* IRQ 4 Spec EOI 
                          */<BR>#define&nbsp;&nbsp;&nbsp;&nbsp; 
                          COM1_INT_NUM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                          0x0C&nbsp;&nbsp;&nbsp;&nbsp; /* Int # for IRQ4 
                          */<BR><BR>#define&nbsp;&nbsp;&nbsp;&nbsp; 
                          COM2_BASE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                          0x02F8<BR>#define&nbsp;&nbsp;&nbsp;&nbsp; 
                          COM2_IRQ_MASK&nbsp;&nbsp;&nbsp;&nbsp; 
                          0xF7&nbsp;&nbsp;&nbsp;&nbsp; /*11110111B IRQ 3 For 
                          COM2 */<BR>#define&nbsp;&nbsp;&nbsp;&nbsp; 
                          COM2_IRQ_EOI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                          0x63&nbsp;&nbsp;&nbsp;&nbsp; /* IRQ 3 Spec EOI 
                          */<BR>#define&nbsp;&nbsp;&nbsp;&nbsp; 
                          COM2_INT_NUM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                          0x0B&nbsp;&nbsp;&nbsp;&nbsp; /* Int # for IRQ3 
                          */<BR><BR>/* 8250 ACE register defs 
                          */<BR><BR>#define&nbsp;&nbsp;&nbsp;&nbsp; 
                          THR&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp; 
                          /* Offset to Xmit hld reg (write) 
                          */<BR>#define&nbsp;&nbsp;&nbsp;&nbsp; 
                          RBR&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp; 
                          /* Receiver holding buffer (read) 
                          */<BR>#define&nbsp;&nbsp;&nbsp;&nbsp; 
                          IER&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp; 
                          /* Interrupt enable register 
                          */<BR>#define&nbsp;&nbsp;&nbsp;&nbsp; 
                          IIR&nbsp;&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp; 
                          /* Interrupt identification reg 
                          */<BR>#define&nbsp;&nbsp;&nbsp;&nbsp; 
                          LCR&nbsp;&nbsp;&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp; 
                          /* Line control register 
                          */<BR>#define&nbsp;&nbsp;&nbsp;&nbsp; 
                          MCR&nbsp;&nbsp;&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp;&nbsp; 
                          /* Modem control register 
                          */<BR>#define&nbsp;&nbsp;&nbsp;&nbsp; 
                          LSR&nbsp;&nbsp;&nbsp;&nbsp; 5&nbsp;&nbsp;&nbsp;&nbsp; 
                          /* Line status register 
                          */<BR>#define&nbsp;&nbsp;&nbsp;&nbsp; 
                          MSR&nbsp;&nbsp;&nbsp;&nbsp; 6&nbsp;&nbsp;&nbsp;&nbsp; 
                          /* Modem status register 
                          */<BR><BR>#define&nbsp;&nbsp;&nbsp;&nbsp; 
                          SREG(x)&nbsp;&nbsp;&nbsp;&nbsp; 
                          ((unsigned)((unsigned)x + c-&gt;com_base))<BR><BR>/* 
                          8259 Int controller registers 
                          */<BR><BR>#define&nbsp;&nbsp;&nbsp;&nbsp; 
                          INTC_MASK&nbsp;&nbsp;&nbsp;&nbsp; 
                          0x21&nbsp;&nbsp;&nbsp;&nbsp; /* Interrupt controller 
                          MASK reg */<BR>#define&nbsp;&nbsp;&nbsp;&nbsp; 
                          INTC_EOI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                          0x20&nbsp;&nbsp;&nbsp;&nbsp; /* Interrupt controller 
                          EOI reg */<BR><BR><BR>#define&nbsp;&nbsp;&nbsp;&nbsp; 
                          MAX_PORTS&nbsp;&nbsp;&nbsp;&nbsp; 
                          2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* # I/O 
                          ports (DOS limit) */<BR>static int&nbsp; count = 
                          0;<BR>static COM&nbsp; 
                          com_list[MAX_PORTS];&nbsp;&nbsp; /* I/O data structure 
                          */<BR><BR>static COM&nbsp; 
                          *com1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                          /* Pointers for interrupt actions */<BR>static 
                          COM&nbsp; *com2;<BR>static COM&nbsp; 
                          *com_xfer;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                          /* Transfer interrupt data structure 
                          */<BR><BR>COM&nbsp;&nbsp;&nbsp;&nbsp; *ser_init0(int 
                          port,char *ibuf,int isize, char *obuf,int 
                          osize);<BR>void&nbsp;&nbsp;&nbsp; ser_close0( COM *c 
                          );<BR><BR><BR>void (_interrupt _far int_ser1)( void 
                          );&nbsp;&nbsp;&nbsp; /* Int rtn for serial I/O COM 1 
                          */<BR>void (_interrupt _far int_ser2)( void 
                          );&nbsp;&nbsp;&nbsp; /* Int rtn for serial I/O COM 2 
                          */<BR>void (_interrupt _far int_ser_sup)( void ); /* 
                          Support int actions 
                          */<BR><BR>COM&nbsp;&nbsp;&nbsp;&nbsp; *ser_init( int 
                          port,int baud,int bit,int parity,int isize,int osize 
                          )<BR>{<BR>&nbsp;unsig

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -