<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>正在戒网&#039;Blog &#187; 串行</title>
	<atom:link href="http://isfate.com/tag/%e4%b8%b2%e8%a1%8c/feed" rel="self" type="application/rss+xml" />
	<link>http://isfate.com</link>
	<description>放了自已,才能高飞!</description>
	<lastBuildDate>Fri, 21 Oct 2011 13:48:15 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>用Ｃ５１实现带奇偶校验的串行通信[转]</title>
		<link>http://isfate.com/117.html</link>
		<comments>http://isfate.com/117.html#comments</comments>
		<pubDate>Wed, 21 Jan 2009 03:21:37 +0000</pubDate>
		<dc:creator>正在戒网</dc:creator>
				<category><![CDATA[记事本]]></category>
		<category><![CDATA[c51]]></category>
		<category><![CDATA[串行]]></category>
		<category><![CDATA[奇偶校验]]></category>
		<category><![CDATA[通信]]></category>

		<guid isPermaLink="false">http://sowait.cn/?p=117</guid>
		<description><![CDATA[ＭＣＳ－５１系列单片机的串行口有４种工作方式。方式０为移位寄存器方式，用于外接同步Ｉ／Ｏ设备或扩展Ｉ／Ｏ口，不算起始位和停止位。方式１为８位异步串行通讯，方式２和方式３为９位异步串行通讯。方式２和方式３中的第９位是可程控位，即可由软件来确定第９位是“０”还是“１”。也就是说，ＭＣＳ－５１系列单片机不像某些专用串行芯片，如ＩＮＴＥＬ８０５１、８０５０、ＴＬＣ１６Ｃ５５０等那样，可根据初始化条件自动加入串行通讯中的奇偶校验位发送出去，而是需要软件参与产生奇偶校验位。用软件产生奇偶校验位是根据ＭＣＳ－５１系列单片机的状态寄存器ＰＳＷ的定义：当累加器Ａ中为１的个数为奇数时，Ｐ＝１，否则Ｐ＝０，来编程的。假定待发送的数据已放入累加器Ａ中，可用如下汇编语言来实现（串行口工作于方式２）： ＭＯＶ Ｃ，Ｐ； 把奇偶标志送给进位位 ＭＯＶ ＴＢ８，Ｃ； 把进位位送给ＴＢ８ ＭＯＶ ＳＢＵＦ，Ａ； 把待发送的数据放入串行口 用Ｃ语言来编写时，因累加器Ａ对编程者不透明，则会带来问题。例如，假定待发送的数据已放入变量ＶＡＲＩＡＢＬＥ中，若要从串行口发送出去，想当然地认为使用如下语句即可： ＴＢ８＝Ｐ； ／*语句１*／ ＳＢＵＦ＝ＶＡＲＩＡＢＬＥ ／*语句２*／ 实际上，２条语句并不能可靠地产生奇偶校验位。因为在语句１前面的语句所对应的汇编语言中的累加器Ａ中为１的个数是不确定的，而 语句２又是不可分割的。语句１和２对应的汇编语言程序为： ＭＯＶ Ｃ，Ｐ； 语句３ ＭＯＶ ＴＢ８，Ｃ； 语句４ ＭＯＶ Ａ，ＶＡＲＩＡＢＬＥ； 语句５ ＭＯＶ ＳＢＵＦ，Ａ； 语句６ 可以看出，只有将语句３、４放到语句５和语句６之间时，才能正确地产生奇偶校验位。为了达到这一目的，可引入全局变量ＶＡＲＩＡＢＬＥ１相应的Ｃ语言程序如下： ＶＡＲＩＡＢＬＥ１＝０； ／* 语句７*／ ＶＡＲＩＡＢＬＥ ＋＝ＶＡＲＩＡＢＬＥ１； ／* 语句８*／ ＴＢ８＝Ｐ； ／*语句９ *／ ＳＢＵＦ＝ＶＡＲＩＡＢＬＥ； ／*语句１０*／ 需要强调的是： １．在串行中断服务程序中，ＶＡＲＩＡＢＬＥ１一定要设置为全局变量，若设置为局部变量，则可能引起意想不到的后果。 ２．语句７和语句８尽量不要缩写成： ＶＡＲＩＡＢＬＥ ＋＝０； ／* 语句１０*／ 而把全局变量ＶＡＲＩＡＢＬＥ１省掉。这主要是为了防止编译程序在某种可能的编译优化条件下将语句１０也省略掉。]]></description>
		<wfw:commentRss>http://isfate.com/117.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

