?? 單片機c51串口中斷接收和發送測試例程(含通信協議的實現).htm
字號:
<TR>
<TD class=p16 id=fontzoom style="LINE-HEIGHT: 1.5" vAlign=top
width="100%" height=300><BR><!--畫中畫廣告開始-->
<TABLE cellSpacing=0 cellPadding=0 align=left border=0>
<TBODY>
<TR>
<TD><!-- 廣告位 -->
<TABLE cellSpacing=0 cellPadding=0 width="99%"
align=center background="" border=0>
<TBODY>
<TR>
<TD vAlign=top align=middle><A
href="http://www.51kaifa.com/upload/do_page/1119369847.html"
target=_blank><IMG height=50
src="單片機C51串口中斷接收和發送測試例程(含通信協議的實現)_files/1119368683.gif"
width=100 border=0></A></TD></TD></TR></TBODY></TABLE><!-- $sign哪個頁面$digit位置$way等h不循環TR;X循環TR;$num顯示個數 --></TD></TR></TBODY></TABLE><!--畫中畫廣告結束-->
通信協議:
第1字節,MSB為1,為第1字節標志,第2字節,MSB為0,為非第一字節標志,其余類推……,最后一個字節為前幾個字節后7位的異或校驗和。
<P class=style27 align=left> 測試方法:可以將串口調試助手的發送框寫上 95 10 20
25,并選上16進制發送,接收框選上16進制顯示,如果每發送一次就接收到95 10 20 25,說明測試成功。 </P>
<P class=style27 align=left>
<P class=style27
align=left><STRONG>//這是一個單片機C51串口接收(中斷)和發送例程,可以用來測試51單片機的中斷接收
</STRONG><BR><STRONG>//和查詢發送,另外我覺得發送沒有必要用中斷,因為程序的開銷是一樣的
</STRONG><BR><BR><BR><STRONG>#include </STRONG><reg51.h>
<BR><STRONG>#include </STRONG><string.h>
<BR><BR><STRONG>#define </STRONG>INBUF_LEN 4 <STRONG>//數據長度
</STRONG><BR><BR><STRONG>unsigned char
</STRONG>inbuf1[INBUF_LEN]; <BR><STRONG>unsigned char
</STRONG>checksum,count3; <BR>bit read_flag= 0 ;
<BR><BR><STRONG>void </STRONG>init_serialcomm( <STRONG>void
</STRONG>) <BR>{ <BR>SCON = 0x50 ; <STRONG>//SCON: serail mode
1, 8-bit UART, enable ucvr </STRONG><BR>TMOD |= 0x20 ;
<STRONG>//TMOD: timer 1, mode 2, 8-bit reload
</STRONG><BR>PCON |= 0x80 ; <STRONG>//SMOD=1; </STRONG><BR>TH1
= 0xF4 ; <STRONG>//Baud:4800 fosc=11.0592MHz </STRONG><BR>IE
|= 0x90 ; <STRONG>//Enable Serial Interrupt </STRONG><BR>TR1 =
1 ; <STRONG>// timer 1 run </STRONG><BR><STRONG>// TI=1;
</STRONG><BR>} <BR><BR><STRONG>//向串口發送一個字符
</STRONG><BR><STRONG>void </STRONG>send_char_com(
<STRONG>unsigned char </STRONG>ch) <BR>{ <BR>SBUF=ch;
<BR><STRONG>while </STRONG>(TI== 0 ); <BR>TI= 0 ; <BR>}
<BR><BR><STRONG>//向串口發送一個字符串,strlen為該字符串長度
</STRONG><BR><STRONG>void </STRONG>send_string_com(
<STRONG>unsigned char </STRONG>*str, <STRONG>unsigned int
</STRONG>strlen) <BR>{ <BR><STRONG>unsigned int </STRONG>k= 0
; <BR><STRONG>do </STRONG><BR>{ <BR>send_char_com(*(str + k));
<BR>k++; <BR>} <STRONG>while </STRONG>(k < strlen); <BR>}
<BR><BR><BR><STRONG>//串口接收中斷函數 </STRONG><BR><STRONG>void
</STRONG>serial () interrupt 4 using 3 <BR>{ <BR><STRONG>if
</STRONG>(RI) <BR>{ <BR><STRONG>unsigned char </STRONG>ch;
<BR>RI = 0 ; <BR>ch=SBUF; <BR><STRONG>if </STRONG>(ch> 127
) <BR>{ <BR>count3= 0 ; <BR>inbuf1[count3]=ch; <BR>checksum=
ch- 128 ; <BR>} <BR><STRONG>else </STRONG><BR>{ <BR>count3++;
<BR>inbuf1[count3]=ch; <BR>checksum ^= ch; <BR><STRONG>if
</STRONG>( (count3==(INBUF_LEN- 1 )) && (!checksum) )
<BR>{ <BR>read_flag= 1 ;
<STRONG>//如果串口接收的數據達到INBUF_LEN個,且校驗沒錯,
</STRONG><BR><STRONG>//就置位取數標志 </STRONG><BR>} <BR>} <BR>}
<BR>} <BR><BR><BR>main() <BR>{ <BR>init_serialcomm();
<STRONG>//初始化串口 </STRONG><BR><STRONG>while </STRONG>( 1 )
<BR>{ <BR><STRONG>if </STRONG>(read_flag)
<STRONG>//如果取數標志已置位,就將讀到的數從串口發出 </STRONG><BR>{ <BR>read_flag=
0 ; <STRONG>//取數標志清0
</STRONG><BR>send_string_com(inbuf1,INBUF_LEN); <BR>} <BR>}
<BR><BR>} <BR><BR></P></TD></TR>
<TR>
<TD align=right width="100%" height=17><BR><A
href="http://www.51kaifa.com/zxyd/read.php?ID=166">返回</A> <A
href="http://www.51kaifa.com/zxyd/read_z.php?ID=964&BigClass=6">上一頁</A>
<A
href="http://www.51kaifa.com/zxyd/read_z.php?ID=966&BigClass=6">下一頁</A>
信息發布:工號01 轉引自: 【<A
href="javascript:fontzoom(16)">大</A> <A
href="javascript:fontzoom(14)">中</A> <A
href="javascript:fontzoom(12)">小</A>】【<A
onclick=window.print();
href="http://www.51kaifa.com/zxyd/read_z.php?ID=965&BigClass=6#">打印</A>】【<A
href="javascript:window.close()">關閉</A>】
<BR><BR></TD></TR></TBODY></TABLE></TD>
<TD vAlign=top width=1 bgColor=#808080><IMG height=1 alt=""
src="單片機C51串口中斷接收和發送測試例程(含通信協議的實現)_files/xu2.gif" width=1
border=0></TD>
<TD vAlign=top width=169 bgColor=#edf0f5 height=500><!-- 廣告位 --><!-- $sign哪個頁面$digit位置$way等h不循環TR;X循環TR;$num顯示個數 --></TD></TR></TBODY></TABLE><!-- 尾部 -->
<SCRIPT language=JavaScript>document.write("<img src='http://www.51kaifa.com/HostAdmin/count/Count.php?Referer=http://www.51kaifa.com/zxyd/read_z.php&Ip=127.0.0.1&Width="+escape(screen.width)+"&Height="+escape(screen.height)+"' border=0 width=0 height=0>");</SCRIPT>
<TABLE cellSpacing=0 cellPadding=0 width=760 align=center border=0>
<TBODY>
<TR>
<TD>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD width="100%"
background=單片機C51串口中斷接收和發送測試例程(含通信協議的實現)_files/sy_top1.gif><IMG
height=16
src="單片機C51串口中斷接收和發送測試例程(含通信協議的實現)_files/sy_top1.gif"
width=4></TD></TR>
<TR>
<TD align=middle><A
href="http://www.51kaifa.com/gywm.php?action=guanyu">關于我們</A> ┋ <A
href="http://www.51kaifa.com/FriendSiteReg/F_read.php"
target=_blank>友情鏈接</A> </TD></TR></TBODY></TABLE>
<TABLE height=1 cellSpacing=0 cellPadding=0 width="100%"
background=單片機C51串口中斷接收和發送測試例程(含通信協議的實現)_files/xu2.gif border=0>
<TBODY>
<TR>
<TD width="100%"></TD></TR></TBODY></TABLE>
<TABLE height=60 cellSpacing=0 cellPadding=0 width="100%"
border=0><TBODY>
<TR>
<TD width="100%">
<P align=center><A
href="mailto:E-mail:webmaster@51kaifa.com"><BR>E-mail:webmaster@51kaifa.com</A>
<BR>Copyright©2005 無憂電子開發網版權所有 <BR><!-- <a href="mailto:E-mail:nan-ji-hu@sohu.com">南極狐工作室制作與維護</a> QQ:348322455 <br> -->
<CENTER><A href="http://www.miibeian.gov.cn/"
target=_blank>粵ICP備05064233號</A></CENTER><BR>
<CENTER>
<SCRIPT
src="單片機C51串口中斷接收和發送測試例程(含通信協議的實現)_files/count.htm"></SCRIPT>
<SCRIPT language=JavaScript
src="單片機C51串口中斷接收和發送測試例程(含通信協議的實現)_files/click.htm"
type=text/javascript></SCRIPT>
</CENTER><BR></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></BODY></HTML>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -