📄 单片机启点-i2c程序c语言.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0055)http://www.mcu99.com/bbs/printpage.asp?BoardID=32&ID=65 -->
<!--HTTP头--><HTML><HEAD><TITLE>单片机启点-I2C程序C语言</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<META content="MSHTML 6.00.2800.1515" name=GENERATOR>
<META content=单片机,单片机教程,单片机学习交流,单片机启点网,asp,论坛,插件 name=keywords>
<META content=动网论坛是使用量最多、覆盖面最广的免费中文论坛,也是国内知名的技术讨论站点,希望我们辛苦的努力可以为您带来很多方便
name=description><!--默认风格-->
<STYLE type=text/css>A:link {
COLOR: #000000; TEXT-DECORATION: none
}
A:active {
COLOR: #000000; TEXT-DECORATION: none
}
A:visited {
COLOR: #000000; TEXT-DECORATION: none
}
A:hover {
COLOR: #4455aa; TEXT-DECORATION: underline
}
BODY {
SCROLLBAR-FACE-COLOR: #dee3e7; FONT-SIZE: 12px; SCROLLBAR-HIGHLIGHT-COLOR: #ffffff; SCROLLBAR-SHADOW-COLOR: #dee3e7; COLOR: #000000; SCROLLBAR-3DLIGHT-COLOR: #d1d7dc; SCROLLBAR-ARROW-COLOR: #006699; SCROLLBAR-TRACK-COLOR: #efefef; FONT-FAMILY: 宋体; SCROLLBAR-DARKSHADOW-COLOR: #98aab1
}
FONT {
LINE-HEIGHT: normal
}
TD {
FONT-SIZE: 12px; LINE-HEIGHT: 15px; FONT-FAMILY: 宋体
}
TH {
FONT-WEIGHT: bold; FONT-SIZE: 12px; BACKGROUND-IMAGE: url(Skins/Default/css/default/bg1.gif); COLOR: white; BACKGROUND-COLOR: #4455aa
}
TD.TableTitle2 {
BACKGROUND-COLOR: #e4e8ef
}
TD.TableBody1 {
LINE-HEIGHT: normal; BACKGROUND-COLOR: #ffffff
}
TD.TableBody2 {
LINE-HEIGHT: normal; BACKGROUND-COLOR: #e4e8ef
}
TD.TopDarkNav {
BACKGROUND-IMAGE: url(Skins/Default/css/default/topbg.gif)
}
TD.TopLighNav {
BACKGROUND-IMAGE: url(Skins/Default/css/default/bottombg.gif)
}
TD.TopLighNav1 {
BACKGROUND-IMAGE: url(Skins/Default/css/default/tabs_m_tile.gif)
}
TD.TopLighNav2 {
BACKGROUND-COLOR: #ffffff
}
.tableBorder1 {
BORDER-RIGHT: 1px; BORDER-TOP: 1px; BORDER-LEFT: 1px; WIDTH: 98%; BORDER-BOTTOM: 1px; BACKGROUND-COLOR: #6595d6
}
.tableBorder2 {
BORDER-RIGHT: #dedede 1px solid; BORDER-TOP: #dedede 1px solid; BORDER-LEFT: #dedede 1px solid; WIDTH: 98%; BORDER-BOTTOM: #dedede 1px solid; BACKGROUND-COLOR: #efefef
}
#TableTitleLink A:link {
COLOR: #ffffff; TEXT-DECORATION: none
}
#TableTitleLink A:visited {
COLOR: #ffffff; TEXT-DECORATION: none
}
#TableTitleLink A:active {
COLOR: #ffffff; TEXT-DECORATION: none
}
#TableTitleLink A:hover {
COLOR: #ffffff; TEXT-DECORATION: underline
}
INPUT {
FONT-SIZE: 12px; COLOR: #000000; LINE-HEIGHT: 15px; FONT-FAMILY: Tahoma,Verdana,"宋体"
}
SELECT {
FONT-SIZE: 12px; COLOR: #000000; LINE-HEIGHT: 15px; FONT-FAMILY: Tahoma,Verdana,"宋体"
}
TEXTAREA {
FONT-SIZE: 12px; COLOR: #000000; LINE-HEIGHT: 15px; FONT-FAMILY: Tahoma,Verdana,"宋体"
}
OPTION {
FONT-SIZE: 12px; COLOR: #000000; LINE-HEIGHT: 15px; FONT-FAMILY: Tahoma,Verdana,"宋体"
}
.normalTextSmall {
FONT-SIZE: 11px; COLOR: #000000; FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif
}
.menuskin {
BORDER-RIGHT: #666666 1px solid; BORDER-TOP: #666666 1px solid; BACKGROUND-IMAGE: url(Skins/Default/dvmenubg3.gif); VISIBILITY: hidden; FONT: 12px Verdana; BORDER-LEFT: #666666 1px solid; BORDER-BOTTOM: #666666 1px solid; BACKGROUND-REPEAT: repeat-y; POSITION: absolute; BACKGROUND-COLOR: #efefef
}
.menuskin A {
PADDING-RIGHT: 10px; PADDING-LEFT: 25px; BEHAVIOR: url(inc/noline.htc); COLOR: black; TEXT-DECORATION: none
}
#mouseoverstyle {
BORDER-RIGHT: #597db5 1px solid; PADDING-RIGHT: 0px; BORDER-TOP: #597db5 1px solid; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 2px; BORDER-LEFT: #597db5 1px solid; PADDING-TOP: 0px; BORDER-BOTTOM: #597db5 1px solid; BACKGROUND-COLOR: #c9d5e7
}
#mouseoverstyle A {
COLOR: black
}
.menuitems {
PADDING-RIGHT: 1px; PADDING-LEFT: 1px; PADDING-BOTTOM: 1px; MARGIN: 2px; WORD-BREAK: keep-all; PADDING-TOP: 1px
}
A.navlink:link {
COLOR: #000000; TEXT-DECORATION: none
}
A.navlink:visited {
COLOR: #000000; TEXT-DECORATION: none
}
A.navlink:hover {
COLOR: #003399; TEXT-DECORATION: none
}
.BrightClass {
BACKGROUND-COLOR: #d7d7d7
}
DIV.quote {
BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 5px; BACKGROUND: #f3f3f3; PADDING-BOTTOM: 5px; MARGIN: 5px 20px; BORDER-LEFT: #cccccc 1px solid; LINE-HEIGHT: normal; PADDING-TOP: 5px; BORDER-BOTTOM: #cccccc 1px solid
}
DIV.HtmlCode {
BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 5px; FONT-WEIGHT: bold; FONT-SIZE: 14px; BACKGROUND: #fdfddf; PADDING-BOTTOM: 5px; MARGIN: 5px 20px; BORDER-LEFT: #cccccc 1px solid; LINE-HEIGHT: normal; PADDING-TOP: 5px; BORDER-BOTTOM: #cccccc 1px solid; FONT-STYLE: oblique; FONT-FAMILY: Tahoma
}
</STYLE>
<!--论坛页面开始代码-->
<SCRIPT language=JavaScript src="单片机启点-I2C程序C语言.files/Main.js"></SCRIPT>
</HEAD>
<BODY leftMargin=0 topMargin=0>
<DIV class=menuskin id=popmenu
onmouseover="clearhidemenu();highlightmenu(event,'on')" style="Z-INDEX: 100"
onmouseout="highlightmenu(event,'off');dynamichide(event)"></DIV><!--printpage.asp##帖子可打印页面-->
<TABLE style="TABLE-LAYOUT: fixed; WORD-BREAK: break-all" width="98%"
align=center border=0>
<TBODY>
<TR>
<TD vAlign=center
align=top><B>以文本方式查看主题</B><BR><BR>- <B>单片机启点</B> (http://www.mcu99.com/bbs/index.asp)<BR>-- <B>特色源程序</B> (http://www.mcu99.com/bbs/list.asp?boardid=32)<BR>---- <B>I2C程序C语言</B> (http://www.mcu99.com/bbs/dispbbs.asp?boardid=32&id=65)<BR>
<HR>
</TD></TR><!--printpage.asp##{$bbslist}循环部分-->
<TR>
<TD vAlign=center
align=top>-- 作者:atmel<BR>-- 发布时间:2004-9-3
15:16:08<BR><BR>-- I2C程序C语言<BR>/*VIICC.H*/<BR>#pragma db cd
small<BR>#include <BR>#include <BR>#define NOP nop ( ); nop ( ); nop ( );
nop ( )<BR>#define SDA P1^7<BR>#define SCL P1^6<BR><BR>void sta(
);<BR>void cack( );<BR>void stop( );<BR>void mnack( );<BR>void mack(
);<BR>void wrbyt(uchar shu);<BR>void wrnbyta(uchar slaw,uchar gg[],uchar
n);<BR>void wrnbyt(uchar slaw,uchar ff[],uchar number);<BR>uchar rdbyt(
);<BR>void rdnbyt(uchar slar,uchar qq[],uchar
number);<BR>源程序由9个函数组成,程序清单如下:<BR>voidsta(
)/*启动I2C总线*/<BR>{<BR>SDA=1;<BR>SCL=1;<BR>NOP;<BR>SDA=0;<BR>NOP;<BR>SCL=0;<BR>}<BR><BR>void
stop(
)/*停止I2C总线<BR>*/<BR>{<BR>SDA=0;<BR>SCL=1;<BR>NOP;<BR>SDA=1;<BR>NOP;<BR>SCL=0;<BR>}<BR><BR>void
mack(
)/*发送应答位*/<BR>{<BR>SDA=0;<BR>SCL=1;<BR>NOP;<BR>SCL=0;<BR>SDA=1;<BR>}<BR><BR>void
mnack(
)/*发送非应答位*/<BR>{<BR>SDA=1;<BR>SCL=1;<BR>NOP;<BR>SCL=0;<BR>SDA=0;<BR>}<BR><BR>void
cack(
)/*应答位检查*/<BR>{<BR>SDA=1;<BR>SCL=1;<BR>F0=0;<BR>if(SDA==1)<BR>F0=1;<BR>SCL=0;<BR>nop(
);<BR>}<BR>/*向虚拟I2C总线上发送1个数据字节*/<BR>void wrbyt(uchar shu)<BR>{<BR>uchar
i;<BR>for(i=0;i0){<BR>SDA=1;<BR>SCL=1;<BR>NOP;<BR>SCL=0;<BR>SDA=0;<BR>}<BR>else{<BR>SDA=0;<BR>SCL=1;<BR>NOP;<BR>SCL=0;<BR>}<BR>shu=shu
<HR>
</TD></TR><!--printpage.asp##{$bbslist}循环部分-->
<TR>
<TD vAlign=center
align=top>-- 作者:江在流<BR>-- 发布时间:2004-9-23
17:54:20<BR><BR>-- <BR>
<P>请问nop可以这样引用吗?</P>
<P>我看到过: _nop_();</P>
<P>这样的引用方式,不知道对不对?</P>
<HR>
</TD></TR><!--printpage.asp##{$bbslist}循环部分-->
<TR>
<TD vAlign=center
align=top>-- 作者:mmlyy2001<BR>-- 发布时间:2004-9-27
11:26:18<BR><BR>-- <BR>可以呀 #define NOP _nop_();
<HR>
</TD></TR><!--printpage.asp##{$bbslist}循环部分-->
<TR>
<TD vAlign=center
align=top>-- 作者:alan325<BR>-- 发布时间:2004-10-30
16:36:50<BR><BR>-- <BR>
<P>还有数组作参数那部分呢?我想看看.我邮箱guoyangqing@21cn.com</P>
<HR>
</TD></TR><!--printpage.asp##{$bbslist}循环部分-->
<TR>
<TD vAlign=center
align=top>-- 作者:lzf713<BR>-- 发布时间:2005-1-22
18:12:59<BR><BR>-- <BR>
<P>#define NOP nop ( ); nop ( ); nop ( ); nop ( )</P>
<P>然后在程序中多处使用NOP我觉得不好,原因就是占用大量的ROM,例如在程序中使用20次NOP,那么就要占用80byte ROM。</P>
<P>我觉得比较好的做法是:</P>
<P>void delay(unsigned char counter)</P>
<P>{</P>
<P> for(;counter>0;counter--)</P>
<P> _nop_(); </P>
<P>}</P>
<P>然后调用delay()</P>
<HR>
</TD></TR><!--printpage.asp##{$bbslist}循环部分-->
<TR>
<TD vAlign=center
align=top>-- 作者:lzf713<BR>-- 发布时间:2005-1-22
18:21:02<BR><BR>-- <BR>
<P>voidsta(
)/*启动I2C总线*/<BR>{<BR>SDA=1;<BR>SCL=1;<BR>NOP;<BR>SDA=0;<BR>NOP;<BR>SCL=0;<BR>}<BR>//=============================</P>
<P>我觉得不是很恰当</P>
<P>我认为因该这样初始化IIC总线:</P>
<P>void iic_init(void)</P>
<P>{</P>
<P>SCL=0;</P>
<P>SDA=0;</P>
<P>delay(5);</P>
<P>SCL=1;</P>
<P>// SDA=0;</P>
<P>delay(5);</P>
<P>// SCL=1;</P>
<P>SDA=1;</P>
<P>delay(5);</P>
<P>SCL=0;</P>
<P>// SDA=1;</P>
<P>delay(5);</P>
<P>}</P>
<HR>
</TD></TR><!--printpage.asp##{$bbslist}循环部分-->
<TR>
<TD vAlign=center
align=top>-- 作者:lzf713<BR>-- 发布时间:2005-1-22
18:26:40<BR><BR>-- <BR>
<P>void stop(
)/*停止I2C总线<BR>*/<BR>{<BR>SDA=0;<BR>SCL=1;<BR>NOP;<BR>SDA=1;<BR>NOP;<BR>SCL=0;<BR>}</P>
<P>file://==================================</P>
<P>我觉得不对,原因没有释放SCL</P>
<P>我认为因该这样:</P>
<P>void stop(void)</P>
<P>{</P>
<P> SDA=0;</P>
<P>SCL=1;</P>
<P>delay(5);</P>
<P>SDA=1;</P>
<P>// SCL=1;</P>
<P>delay(5);</P>
<P>}</P>
<HR>
</TD></TR><!--printpage.asp##{$bbslist}循环部分-->
<TR>
<TD vAlign=center
align=top>-- 作者:lzf713<BR>-- 发布时间:2005-1-22
18:31:34<BR><BR>-- <BR>
<P>void mnack(
)/*发送非应答位*/<BR>{<BR>SDA=1;<BR>SCL=1;<BR>NOP;<BR>SCL=0;<BR>SDA=0;<BR>}<BR>file://-------------------------------------------------------------</P>
<P>是否可以改为这样?</P>
<P>void mnack( )/*发送非应答位*/<BR>{<BR>SDA=1;<BR>SCL=1;<BR>NOP;<BR>SCL=0;</P>
<P>/* SDL=1; */</P>
<P>NOP;<BR>}</P>
<HR>
</TD></TR><!--printpage.asp##{$bbslist}循环部分-->
<TR>
<TD vAlign=center
align=top>-- 作者:lzf713<BR>-- 发布时间:2005-1-22
18:45:24<BR><BR>-- <BR>
<P>/*向虚拟I2C总线上发送1个数据字节*/<BR>void wrbyt(uchar shu)<BR>{<BR>uchar
i;<BR>for(i=0;i0){<BR>SDA=1;<BR>SCL=1;<BR>NOP;<BR>SCL=0;<BR>SDA=0;<BR>}<BR>else{<BR>SDA=0;<BR>SCL=1;<BR>NOP;<BR>SCL=0;<BR>}<BR>shu=shu<BR>/*===========================================================*/</P><BR>
<P>这么我看来看去总觉得缺什么的。我给出一个吧</P><BR>
<P>bit sendbyte(unsigned char outdata)</P><BR>
<P>{</P><BR>
<P> unsigned char i;</P><BR>
<P> for(i=0;i<8;i++)</P><BR>
<P> {</P><BR>
<P> SCL=0;</P><BR>
<P> SDA=(bit) (outdata & 0x80);</P><BR>
<P>/*--------------或者可以使用下面的语句--------------------------------</P><BR>
<P> if(outdata & 0x80)</P><BR>
<P> SDA=1;</P><BR>
<P> else</P><BR>
<P> SDA=0;</P><BR>
<P>-------代替SDA=(bit) (outdata &
0x80);--------------------------------------*/</P><BR>
<P> outdata=outdata<<1;</P><BR>
<P> delay(2);</P><BR>
<P> SCL=1;</P><BR>
<P> delay(5);</P><BR>
<P>}</P><BR>
<P>/* 等待应答,如有应答则返回1,否则返回0 */</P><BR>
<P>SDA=1;</P><BR>
<P>SCL=1;</P><BR>
<P>delay(5) ;</P><BR>
<P>if(SDA)</P><BR>
<P> {</P><BR>
<P> SCL=0;</P><BR>
<P> delay(1);</P><BR>
<P> return (0);</P><BR>
<P> }</P><BR>
<P> else</P><BR>
<P> {</P><BR>
<P>
SCL=0;</P><BR>
<P>
delay(1);</P><BR>
<P> return
(1);</P><BR>
<P> }</P><BR>
<P>}</P><BR>
<DIV align=right><FONT color=#000066>[此贴子已经被作者于2005-1-22
18:46:50编辑过]</FONT></DIV>
<HR>
</TD></TR></TBODY></TABLE><!--页面结束部分-->
<DIV id=bottom align=center></DIV><BR>
<TABLE cellSpacing=0 cellPadding=0 width="98%" align=center border=0>
<TBODY>
<TR>
<TD id=Footer_ads align=middle></TD></TR>
<TR>
<TD align=middle>
<TABLE align=center>
<TBODY>
<TR>
<TD align=middle>Powered By :<A
href="http://www.dvbbs.net/download.asp" target=_blank>Dvbbs Version
7.0.0</A> Sp2<BR>Copyright ©2002 - 2005 <A
href="http://www.mcu99.com/"><FONT face=Verdana, sans-serif
Helvetica, Arial,><B>单片机<FONT
color=#cc0000>启点</FONT></B></FONT></A><BR>执行时间:1,125.00000毫秒。查询数据库5次。<BR><FONT
onmousemove="this.color='#FF0000';"
onmouseout="this.color='#999999';"
color=#999999>当前模板样式:[默认模板]</FONT>
</TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -