<?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>水寒博客</title>
	<atom:link href="http://www.shuihan.com/feed" rel="self" type="application/rss+xml" />
	<link>http://www.shuihan.com</link>
	<description>技术只有交流才会进步~</description>
	<lastBuildDate>Sun, 13 May 2012 06:22:23 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>STM32调试出现identifier “FILE” is undefined错误解决办法</title>
		<link>http://www.shuihan.com/article/369</link>
		<comments>http://www.shuihan.com/article/369#comments</comments>
		<pubDate>Sun, 13 May 2012 06:08:47 +0000</pubDate>
		<dc:creator>水寒</dc:creator>
				<category><![CDATA[STM32/STM8]]></category>

		<guid isPermaLink="false">http://www.shuihan.com/?p=369</guid>
		<description><![CDATA[<p>　　有同学在使用IAR做STM32的printf和scanf函数串口映射的时候出现<samp>“identifier "FILE" is undefined”</samp>错误，提示FILE类型没有定义，这是因为没有启用C/C++库的“file descriptor support”。这个问题只需要在project--&#62;project options--&#62;General Options--&#62;Library Configuration里启用该类型支持即可。</p>
<p>具体如下图所示：</p>
<p style="text-align: center"><input alt="启用“file descriptor support”" align="absMiddle" src="/images/2012/05/file-descriptor-support.jpg" type="image" /></p>

<p>注：Keil uVision MDK不会出现这个问题。</p>
<p>附：STM32中使用printf做串口映射需要重定义的两个函数fputc和fgetc。下面内容参考ST官方案例。</p>
<p><span style="color: #006600"><samp>/******************************************************************<br />
重定义fputc函数，这样可以使用scanff函数从串口1输入数据<br />
*/</samp></span><samp><br />
int fputc(int ch, FILE *f)<br />
{<br />
&#160; USART_SendData(USART1, (uint8_t) ch);<br />
</samp><samp>&#160; while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);<br />
</samp><samp>&#160; return ch;<br />
}</samp></p>
<p><span style="color: #006600"><samp>/******************************************************************<br />
&#160;重定义getc函数，这样可以使用scanff函数从串口1输入数据<br />
*/</samp></span><samp><br />
int fgetc(FILE *f)<br />
{<br />
&#160; while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);<br />
</samp><samp>&#160; return (int)USART_ReceiveData(USART1);<br />
}<br />
</samp></p>]]></description>
			<content:encoded><![CDATA[<p>　　有同学在使用IAR做STM32的printf和scanf函数串口映射的时候出现<samp>“identifier "FILE" is undefined”</samp>错误，提示FILE类型没有定义，这是因为没有启用C/C++库的“file descriptor support”。这个问题只需要在project--&gt;project options--&gt;General Options--&gt;Library Configuration里启用该类型支持即可。</p>
<p>具体如下图所示：</p>
<p style="text-align: center"><input alt="启用“file descriptor support”" align="absMiddle" src="/images/2012/05/file-descriptor-support.jpg" type="image" /></p>

<p>注：Keil uVision MDK不会出现这个问题。</p>
<p>附：STM32中使用printf做串口映射需要重定义的两个函数fputc和fgetc。下面内容参考ST官方案例。</p>
<p><span style="color: #006600"><samp>/******************************************************************<br />
重定义fputc函数，这样可以使用scanff函数从串口1输入数据<br />
*/</samp></span><samp><br />
int fputc(int ch, FILE *f)<br />
{<br />
&#160; USART_SendData(USART1, (uint8_t) ch);<br />
</samp><samp>&#160; while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);<br />
</samp><samp>&#160; return ch;<br />
}</samp></p>
<p><span style="color: #006600"><samp>/******************************************************************<br />
&#160;重定义getc函数，这样可以使用scanff函数从串口1输入数据<br />
*/</samp></span><samp><br />
int fgetc(FILE *f)<br />
{<br />
&#160; while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);<br />
</samp><samp>&#160; return (int)USART_ReceiveData(USART1);<br />
}<br />
</samp></p>]]></content:encoded>
			<wfw:commentRss>http://www.shuihan.com/article/369/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>关于IAR5.3下配置STM32项目的一个糗事</title>
		<link>http://www.shuihan.com/article/365</link>
		<comments>http://www.shuihan.com/article/365#comments</comments>
		<pubDate>Sat, 28 Apr 2012 18:43:27 +0000</pubDate>
		<dc:creator>水寒</dc:creator>
				<category><![CDATA[STM32/STM8]]></category>

		<guid isPermaLink="false">http://www.shuihan.com/?p=365</guid>
		<description><![CDATA[<p>　　 平常自己用Keil uVision MDK 3.8A和4.22开发环境用习惯了，今天临时需要使用IAR EWARM 5.30作为STM32的开发环境，看着一个教程配置下来的，可是死活运行不出来，提示不识别启动文件startup_stm32f10x_hd.s中的指令，居然70多个错误之多，折腾了一个多小时，死去活来的。</p>
<p>　　累了，抽颗烟，忽然想到问题所在，启动文件是汇编写的，ARM公司（Keil的开发公司）和IAR公司的汇编指令有所不同，自己下意识的加入了"Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10x_hd.s"文件，自然在IAR下无法运行。立刻换成“Libraries\CMSIS\Core\CM3\startup\iar\startup_stm32f10x_hd.s”，搞定！</p>]]></description>
			<content:encoded><![CDATA[<p>　　 平常自己用Keil uVision MDK 3.8A和4.22开发环境用习惯了，今天临时需要使用IAR EWARM 5.30作为STM32的开发环境，看着一个教程配置下来的，可是死活运行不出来，提示不识别启动文件startup_stm32f10x_hd.s中的指令，居然70多个错误之多，折腾了一个多小时，死去活来的。</p>
<p>　　累了，抽颗烟，忽然想到问题所在，启动文件是汇编写的，ARM公司（Keil的开发公司）和IAR公司的汇编指令有所不同，自己下意识的加入了"Libraries\CMSIS\Core\CM3\startup\arm\startup_stm32f10x_hd.s"文件，自然在IAR下无法运行。立刻换成“Libraries\CMSIS\Core\CM3\startup\iar\startup_stm32f10x_hd.s”，搞定！</p>]]></content:encoded>
			<wfw:commentRss>http://www.shuihan.com/article/365/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>LPC1114如何使用MDK与JLINK连接（SW模式）</title>
		<link>http://www.shuihan.com/article/358</link>
		<comments>http://www.shuihan.com/article/358#comments</comments>
		<pubDate>Fri, 04 Nov 2011 17:42:37 +0000</pubDate>
		<dc:creator>水寒</dc:creator>
				<category><![CDATA[STM32/STM8]]></category>
		<category><![CDATA[LPC]]></category>
		<category><![CDATA[LPC1114]]></category>
		<category><![CDATA[MDK]]></category>
		<category><![CDATA[SW]]></category>

		<guid isPermaLink="false">http://www.shuihan.com/?p=358</guid>
		<description><![CDATA[<p>使用MDK 4.12A及其他版本时，设置如下：</p>
<h5><a title="3" rel="lightbox[slideshow]" href="/images/2011/11/3.jpg"><img alt="3" width="400" height="330" src="/images/2011/11/400/3.jpg" /></a><br />
图1</h5>
<h5><a title="4" rel="lightbox[slideshow]" href="/images/2011/11/4.jpg"><img alt="4" width="400" height="300" src="/images/2011/11/400/4.jpg" /></a><br />
图2</h5>
<p>但是使用MDK 4.13A时特殊，需要设置如下：</p>
<h5><a title="1" rel="lightbox[slideshow]" href="/images/2011/11/1.jpg"><img alt="1" width="400" height="330" src="/images/2011/11/400/1.jpg" /></a><br />
图3</h5>
<h5><a title="2" rel="lightbox[slideshow]" href="/images/2011/11/2.jpg"><img alt="2" width="400" height="299" src="/images/2011/11/400/2.jpg" /></a><br />
图4</h5>]]></description>
			<content:encoded><![CDATA[<p>使用MDK 4.12A及其他版本时，设置如下：</p>
<h5><a title="3" rel="lightbox[slideshow]" href="/images/2011/11/3.jpg"><img alt="3" width="400" height="330" src="/images/2011/11/400/3.jpg" /></a><br />
图1</h5>
<h5><a title="4" rel="lightbox[slideshow]" href="/images/2011/11/4.jpg"><img alt="4" width="400" height="300" src="/images/2011/11/400/4.jpg" /></a><br />
图2</h5>
<p>但是使用MDK 4.13A时特殊，需要设置如下：</p>
<h5><a title="1" rel="lightbox[slideshow]" href="/images/2011/11/1.jpg"><img alt="1" width="400" height="330" src="/images/2011/11/400/1.jpg" /></a><br />
图3</h5>
<h5><a title="2" rel="lightbox[slideshow]" href="/images/2011/11/2.jpg"><img alt="2" width="400" height="299" src="/images/2011/11/400/2.jpg" /></a><br />
图4</h5>
]]></content:encoded>
			<wfw:commentRss>http://www.shuihan.com/article/358/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>“您的SIM卡不允许连接到此网络”解决办法</title>
		<link>http://www.shuihan.com/article/357</link>
		<comments>http://www.shuihan.com/article/357#comments</comments>
		<pubDate>Mon, 31 Oct 2011 02:16:25 +0000</pubDate>
		<dc:creator>水寒</dc:creator>
				<category><![CDATA[水寒日志]]></category>
		<category><![CDATA[您的SIM卡不允许连接到此网络 不识别SIM卡 中国移动]]></category>

		<guid isPermaLink="false">http://www.shuihan.com/?p=357</guid>
		<description><![CDATA[<p>　　一般是WCDMA/GSM手机装上移动的卡，找不到网络，手动搜索选择“中国移动”，就提示“您的SIM卡不允许连接到此网络”。</p>
<p>　　有人说拔卡，有人说拆电池……等等等等，其实都有可能解决问题，但是不是把把奏效，有的时候你早晨一开手机找不到网络，拆一早上电池他依然找不到。不是手机的问题，也不是你人品的问题，是你手上的这张卡的问题，你可以找移动营业厅把情况如实告诉她们，营业厅的小姐会给你免费换一张卡的。</p>
<p>　　你要是不想换卡，可以用水寒推荐的这种办法，屡试不爽。把手机模式切换到“飞行模式”，再切换回“正常模式”，立马就识别到你的卡了。</p>
<p>　　要是说你找不到“飞行模式”，要么你没坐过飞机，要么是你没玩儿过智能手机-_-! 你查看手机说明书吧。</p>]]></description>
			<content:encoded><![CDATA[<p>　　一般是WCDMA/GSM手机装上移动的卡，找不到网络，手动搜索选择“中国移动”，就提示“您的SIM卡不允许连接到此网络”。</p>
<p>　　有人说拔卡，有人说拆电池……等等等等，其实都有可能解决问题，但是不是把把奏效，有的时候你早晨一开手机找不到网络，拆一早上电池他依然找不到。不是手机的问题，也不是你人品的问题，是你手上的这张卡的问题，你可以找移动营业厅把情况如实告诉她们，营业厅的小姐会给你免费换一张卡的。</p>
<p>　　你要是不想换卡，可以用水寒推荐的这种办法，屡试不爽。把手机模式切换到“飞行模式”，再切换回“正常模式”，立马就识别到你的卡了。</p>
<p>　　要是说你找不到“飞行模式”，要么你没坐过飞机，要么是你没玩儿过智能手机-_-! 你查看手机说明书吧。</p>

]]></content:encoded>
			<wfw:commentRss>http://www.shuihan.com/article/357/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>中国移动139邮箱pushmail手机客户端别名设置</title>
		<link>http://www.shuihan.com/article/354</link>
		<comments>http://www.shuihan.com/article/354#comments</comments>
		<pubDate>Sat, 15 Oct 2011 15:27:09 +0000</pubDate>
		<dc:creator>水寒</dc:creator>
				<category><![CDATA[共享资源]]></category>
		<category><![CDATA[水寒日志]]></category>
		<category><![CDATA[139邮箱]]></category>
		<category><![CDATA[139邮箱别名设置]]></category>
		<category><![CDATA[PushMail]]></category>

		<guid isPermaLink="false">http://www.shuihan.com/?p=354</guid>
		<description><![CDATA[<p>中国移动的139邮箱的PushMail客户端默认使用的是<u><span style="color: #ff0000">手机号码@139.com</span></u>这种邮件格式，对方收到的邮件显示的发件人是你的手机号码对应的邮箱，显然不好，但是官方没有给出如何设置别名发送的方法，下面是一个网上网友给出的解决办法，老鲁试过，可行！推荐遇到这个问题的朋友参考。</p>
<p>使用电脑登录139邮箱（<a href="http://mail.10086.cn/">http://mail.10086.cn/</a>）。<br />
（1）点开左侧PushEmail的标签；<br />
（2）点开账户选择的下来菜单 （里面应该有默认账户和你的别名账户）；<br />
（4）选择你的别名账户；<br />
（5）点击右边的“设置”按钮确认；<br />
（6）选择下面的“配置信息”-&#62;“发送帐户配置”-&#62;“发送”按钮发送！<br />
（7）OK！</p>
<p>现在，在手机端登陆你的139信箱，发一个邮件试试，接收人看到的你的邮件的发送人邮箱地址应该是使用你的别名的邮箱地址。如果不行，请退出你的手机139Pushmail程序，然后再执行上面的操作，再打开手机客户端试试，多试几次就应该就能行了！</p>]]></description>
			<content:encoded><![CDATA[<p>中国移动的139邮箱的PushMail客户端默认使用的是<u><span style="color: #ff0000">手机号码@139.com</span></u>这种邮件格式，对方收到的邮件显示的发件人是你的手机号码对应的邮箱，显然不好，但是官方没有给出如何设置别名发送的方法，下面是一个网上网友给出的解决办法，老鲁试过，可行！推荐遇到这个问题的朋友参考。</p>
<p>使用电脑登录139邮箱（<a href="http://mail.10086.cn/">http://mail.10086.cn/</a>）。<br />
（1）点开左侧PushEmail的标签；<br />
（2）点开账户选择的下来菜单 （里面应该有默认账户和你的别名账户）；<br />
（4）选择你的别名账户；<br />
（5）点击右边的“设置”按钮确认；<br />
（6）选择下面的“配置信息”-&gt;“发送帐户配置”-&gt;“发送”按钮发送！<br />
（7）OK！</p>
<p>现在，在手机端登陆你的139信箱，发一个邮件试试，接收人看到的你的邮件的发送人邮箱地址应该是使用你的别名的邮箱地址。如果不行，请退出你的手机139Pushmail程序，然后再执行上面的操作，再打开手机客户端试试，多试几次就应该就能行了！</p>]]></content:encoded>
			<wfw:commentRss>http://www.shuihan.com/article/354/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>钽电容是黄色还是黑色？有什么区别？</title>
		<link>http://www.shuihan.com/article/348</link>
		<comments>http://www.shuihan.com/article/348#comments</comments>
		<pubDate>Thu, 07 Jul 2011 02:57:41 +0000</pubDate>
		<dc:creator>水寒</dc:creator>
				<category><![CDATA[8051]]></category>
		<category><![CDATA[PIC]]></category>
		<category><![CDATA[STM32/STM8]]></category>
		<category><![CDATA[电脑硬件]]></category>

		<guid isPermaLink="false">http://www.shuihan.com/?p=348</guid>
		<description><![CDATA[<p><span style="font-family: Comic Sans MS">本文摘自AVX代理的网站，详细叙述了钽电容黄色和黑色的区别。</span></p>
<p><strong>目前全球主要有以下几个品牌的钽电容：</strong>AVX、KEMET(基美)、VISHAY、NEC、NICHICON(尼仕康).</p>
<p>市场上的钽电容，分为<span style="background-color: #ff6600"><span style="color: #ffffff">黄钽</span></span>和<span style="background-color: #000000"><span style="color: #ffffff">黑钽</span></span>两种。</p>
<p><strong>黄钽品牌主要是：</strong>AVX 、KEMET</p>
<p><strong>黑钽主要品牌是：</strong>NEC、NICHICON</p>
<p>市场占有方面：AVX远高于KEMET，NEC高于 NICHICON。</p>
<p>　　黑钽是开模将钽粉压成型，而黄钽，是在表面用聚氧树脂包裹而成。由于生产工艺的原因，黑钽的内部空间没有得最有效的利用，所以黄钽能做的容量会比黑钽要大，也就是说有些黄钽能做到的规格型号，黑钽做不了。</p>
<p>　　钽电容全称是钽电解电容，也属于电解电容的一种，使用金属钽做介质，不像普通电解电容那样使用电解液，AVX代理商钽电容的特点是寿命长、耐高温、准确度高、滤高频改波性能极好。</p>
<p>　　它被应用于大容量滤波的地方，像CPU插槽附近就看到钽电容的身影，多同陶瓷电容，电解电容配合使用或是应用于电压、电流不大的地方。</p>
<p>　　在钽电容器工作过程中，具有自动修补或隔绝氧化膜中的疵点所在的性能，使氧化膜介质随时得到加固和恢复其应有的绝缘能力，而不致遭到连续的累积性破坏。这种独特自愈性能，保证了其长寿命和可靠性的优势。</p>
<p>附件：黄钽和黑钽的外观</p>
<p style="text-align: center"><a href="http://www.shuihan.com/wp-content/uploads/2011/07/050606131159s.jpg"><img class="alignnone size-large wp-image-349" title="050606131159s" alt="" width="640" height="202" src="http://www.shuihan.com/wp-content/uploads/2011/07/050606131159s-1024x324.jpg" /></a></p>]]></description>
			<content:encoded><![CDATA[<p><span style="font-family: Comic Sans MS">本文摘自AVX代理的网站，详细叙述了钽电容黄色和黑色的区别。</span></p>
<p><strong>目前全球主要有以下几个品牌的钽电容：</strong>AVX、KEMET(基美)、VISHAY、NEC、NICHICON(尼仕康).</p>
<p>市场上的钽电容，分为<span style="background-color: #ff6600"><span style="color: #ffffff">黄钽</span></span>和<span style="background-color: #000000"><span style="color: #ffffff">黑钽</span></span>两种。</p>
<p><strong>黄钽品牌主要是：</strong>AVX 、KEMET</p>
<p><strong>黑钽主要品牌是：</strong>NEC、NICHICON</p>
<p>市场占有方面：AVX远高于KEMET，NEC高于 NICHICON。</p>
<p>　　黑钽是开模将钽粉压成型，而黄钽，是在表面用聚氧树脂包裹而成。由于生产工艺的原因，黑钽的内部空间没有得最有效的利用，所以黄钽能做的容量会比黑钽要大，也就是说有些黄钽能做到的规格型号，黑钽做不了。</p>
<p>　　钽电容全称是钽电解电容，也属于电解电容的一种，使用金属钽做介质，不像普通电解电容那样使用电解液，AVX代理商钽电容的特点是寿命长、耐高温、准确度高、滤高频改波性能极好。</p>
<p>　　它被应用于大容量滤波的地方，像CPU插槽附近就看到钽电容的身影，多同陶瓷电容，电解电容配合使用或是应用于电压、电流不大的地方。</p>
<p>　　在钽电容器工作过程中，具有自动修补或隔绝氧化膜中的疵点所在的性能，使氧化膜介质随时得到加固和恢复其应有的绝缘能力，而不致遭到连续的累积性破坏。这种独特自愈性能，保证了其长寿命和可靠性的优势。</p>
<p>附件：黄钽和黑钽的外观</p>
<p style="text-align: center"><a href="http://www.shuihan.com/wp-content/uploads/2011/07/050606131159s.jpg"><img class="alignnone size-large wp-image-349" title="050606131159s" alt="" width="640" height="202" src="http://www.shuihan.com/wp-content/uploads/2011/07/050606131159s-1024x324.jpg" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.shuihan.com/article/348/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Microchip&#174; 25AA256 EEPROM调试笔记</title>
		<link>http://www.shuihan.com/article/342</link>
		<comments>http://www.shuihan.com/article/342#comments</comments>
		<pubDate>Fri, 24 Jun 2011 02:07:50 +0000</pubDate>
		<dc:creator>水寒</dc:creator>
				<category><![CDATA[8051]]></category>
		<category><![CDATA[PIC]]></category>
		<category><![CDATA[STM32/STM8]]></category>
		<category><![CDATA[水寒日志]]></category>

		<guid isPermaLink="false">http://www.shuihan.com/article/342</guid>
		<description><![CDATA[<p><font color="#808080">注：本调试笔记操作适用于Microchip公司生产的25AA256和25LC256 EEPROM，其中25AA256操作电压为1.8V-5.5V，25LC256操作电压为2.5V-5.5V。</font></p>
<p>调试时间：2009年3月12日 <br />
调试对象：主控芯片PIC18F97J60+25AA256(EEPROM) <br />
作 者：鲁信琼 <br />
演示程序：<a href="http://www.shuihan.com/article/342">http://www.shuihan.com/article/342</a></p>
<h4>一、介绍：</h4>
<p>25AA256 EEPROM是Microchip公司生产的SPI总线串行通信EEPROM，容量256Kbit（合32KByte），采用四线SPI总线通信，操作电压1.8V-5.5V（4.5V-5.5V供电下10MHz时钟全速存取）。内部存储单元共分64个页，每页512个字节，地址分布：<u>0000H-7FFFH</u>，可以按地址单字节访问（存取数据），也可以<b><u>页内</u></b>批量存取数据，但是批量<b><u>写入</u></b>数据每批<b><u>不能超过</u></b>64个字节，批量读出不受该限制。</p>
<p>更多资料请参见：<a href="http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en010846">http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en010846</a></p>
<h4>二、芯片引脚说明：</h4>
<p style="text-align: center"><a href="http://www.shuihan.com/wp-content/uploads/2011/06/QQ20110624095636.png"><img title="QQ截图20110624095636" border="0" alt="QQ截图20110624095636" width="240" height="159" style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" src="http://www.shuihan.com/wp-content/uploads/2011/06/QQ20110624095636_thumb.png" /></a></p>
<p style="text-align: center">图1. 25AA256 EEPROM引脚分布</p>
<ul>
    <li>&#160;CS： 片选输入，低电平有效。（四线SPI通信的RST引脚）。</li>
    <li>SO： 串行输出数据引脚。（四线SPI通信的MOSI引脚）。</li>
    <li>WP： 写保护，（低电平时不可存取，平时不保护数据需要接到高电平）。</li>
    <li>VSS：电源地</li>
    <li>SI： 串行输入数据引脚。（四线SPI通信的MISO引脚）。</li>
    <li>SCK：串行时钟引脚。（四线SPI的时钟线，25AA256属于SPI从设备，该时钟有主设备提供）</li>
    <li>HOLD：操作暂停保持信号。（低电平时暂停当前的存取，但没有停止，当恢复为高电平后继续当前操作，在暂停保持阶段输入的数据将被25AA256忽略）。</li>
    <li>VCC：正电源（1.8V-5.5V）</li>
</ul>
<h4>三、极限承受能力（设备损坏极限）</h4>
<ul>
    <li>极限承受电压：6.5V</li>
    <li>IO口极限承受电压，0（-0.6V），1（Vcc+1.0V）</li>
    <li>工作温度：-65℃-150℃</li>
</ul>
<h4>四、读写操作：</h4>
<p><b>1. </b><b>前言</b></p>
<p>（1） 25AA256有一个8位的指令寄存器，通过SPI总线访问，通过指令寄存器写不同的指令，告知25AA256将要进行的操作。如下表：</p>
<p align="center">表1. 25AA256 EEPROM指令集</p>
<p align="center"><a href="http://www.shuihan.com/wp-content/uploads/2011/06/2.png"><img title="2" border="0" alt="2" width="640" height="197" style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" src="http://www.shuihan.com/wp-content/uploads/2011/06/2_thumb.png" /></a></p>
<p align="center">（2）<b>在</b><b>CLK</b><b>上升沿SI</b><b>采样数据</b>。对于CPU写入25AA256来说，应该在CLK时钟的上升沿之前准备好待写数据，CLK上升沿产生后， 25AA256将对SI端线采样。</p>
<p>（3）<b>在</b><b>CLK</b><b>下降沿SO</b><b>输出数据</b>。在读取数据周期内，在CLK时钟的下降沿将数据送出到SO引脚锁存。对于CPU从25AA256读数据，应该在CLK时钟下降沿产生之后马上读取SO端口数据。</p>
<p>（4）串行数据的发送方向：先发送高字节，再发送低字节。</p>
<p>（5）在对25AA256的访问过程中CS必须保持低电平。HOLD保持高电平。一般如果不用存取等待，我们在设计电路的时候就把HOLD引脚接到高电平了。</p>
<p>（6）当CS引脚由高电平变为低电平之后的<b><u>第一个上升沿</u></b>结束后，25AA256就会马上对SI引脚采样。我们先发送的第一帧数据的都是指令码（8位，表1）。</p>
<p><b>2. </b><b>读时序：</b></p>
<p style="text-align: center"><a href="http://www.shuihan.com/wp-content/uploads/2011/06/3.png"><img title="3" border="0" alt="3" width="640" height="210" style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" src="http://www.shuihan.com/wp-content/uploads/2011/06/3_thumb.png" /></a></p>
<p align="center">图2. CPU对25AA256“读”时序图</p>
<p><strong>操作步骤：</strong></p>
<p>1） <b>将CS</b><b>拉低</b>；</p>
<p>2） <b>通过SI</b><b>传送8</b><b>位指令到25AA256</b><b>指令寄存器</b>；（读指令：00000011）</p>
<p>3） <b>紧接着马上传送16</b><b>位地址</b>。由于25AA256只有32K字节的存储量，16位的地址只使用了15位（0000H-7FFFH），所以最高位的地址我们可以随便发，“1”也可以，“0”也可以。</p>
<p>4） <b>通过DO</b><b>引脚读取内容</b>，该8位内容就是刚才发送的地址对应的单元的内容。</p>
<p>5） <b>如果CS</b><b>不拉高，持续提供CLK</b><b>时钟，则内部地址指针将增加1</b><b>，指向下一个数据单元，可以继续读取下一个单元的内容。</b>如果一直这样往下读，这样的读取将会持续，当达到最大的存储单元地址7FFFH时，地址指针重新指回0000H，如此往复以至无穷的循环往下读。</p>
<p>6） <b>当CS</b><b>拉为高电平后，读取操作终止，而且这个终止可以在任何时段。</b></p>
<p><b>（※</b><b>与写操作对比，写操作CS拉高必须写数据字节的边缘上，也就是说要完整的写完一个字节才能把CS拉高终止本次写操作，否则这个单元的写不被执行。解释的通俗一点：如果说写的数据是D7~D0这么组成的八位数据，必须把D0锁存到SI上之后才能把CS拉高，通常把D0叫做LSB—Least Significant Bit，D7叫做MSB—Most Significant Bit</b><b>）。</b></p>
<p><b>3. </b><b>写时序</b></p>
<p>（1）在任何对25AA256“写”的操作之前，都必须先设置“写操作”使能寄存器，只有当写操作寄存器设置为“可写”时，才能对25AA256进行数据写入。使能“写操作”的指令为00000110（见表1）。</p>
<p>（2）单字节写操作时序：</p>
<p align="center"><a href="http://www.shuihan.com/wp-content/uploads/2011/06/4.png"><img title="4" border="0" alt="4" width="640" height="167" style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" src="http://www.shuihan.com/wp-content/uploads/2011/06/4_thumb.png" /></a></p>
<p align="center">图3. CPU对25AA256“写”单字节时序图</p>
<p><strong>操作步骤：</strong></p>
<p>1） <b>将CS</b><b>拉低</b>；</p>
<p>2） <b>设置“写操作”使能寄存器</b>。写“写使能指令”（00000110）。</p>
<p>3） <b>※CS</b><b>拉高。</b>（这一步很重要，只有在这里把CS拉高，才能更新“写使能”寄存器，才可以写入数据）。</p>
<p>4） <b>CS</b><b>拉低。</b></p>
<p>5） <b>发送“写指令”（</b>00000010<b>）</b></p>
<p>6） <b>紧接着发送16</b><b>为地址单元。</b>16位地址最高位可以随便写，只有前15位有效。</p>
<p>7） <b>通过SI</b><b>写入8</b><b>位。</b>这样这8位数据就写入目标地址了。</p>
<p>8） 如果写完这个字节的数据之后CS不拉高，CLK继续提供时钟，那么内部地址指针将增加1，可以继续往下一个存储单元继续写入8位数据。这就是批量“写”数据操作。时序见图4。</p>
<p>9） 写操作必须在字节的最低位锁存到SI端之后才能停止（即CS拉高）。否则，最后写入的这个字节数据将不会写入。</p>
<p>图4. CPU对25AA256批量“写”操作时序图</p>
<p>10） 批量“写”与批量“读”还不一样。他有一些限制：</p>
<p>※ 最多可以一批写入64个字节的数据，再写第65个字节数据的时候其实写入到了第0个字节位置处（就是本次批量写最早写入的那个位置），覆盖掉了该位置原来的数，这样在这64个字节的空间内循环覆盖写入。</p>
<p>※ 批量写操作被限制在同一个“页”内，不能跨越页边界往下一页写入数据。如果到了页末尾，继续写入，数据将被写到本页头的第1个位置处，覆盖掉原来的数据。</p>
<h4>五、地址映射</h4>
<p>25AA256总共32KB存储单元（256KBit），共64个页（Page），每页有512个字节的存储单元，如表2所示。</p>
<h4>六、易犯错误</h4>
<p>在使用过程中，以下错误需要特别注意：</p>
<p>1. <b>“读”和“写”25AA256</b><b>数据锁存的位置不一样：</b>（“读”、“写”操作是站在CPU的角度） <br />
· 写入数据是在CLK时钟的上升沿锁存，上升沿结束后，25AA256会立刻去采样SI引脚，所以写入数据时应该在CLK上升沿之前在SI引脚上准备好数据； <br />
· 读取数据是在下降沿锁存到SO引脚，在下降沿瞬间25AA256把数据送到SO引脚，所以读取数据的时候CPU应该在CLK下降沿产生后立刻去读取SO引脚。</p>
<p>2. 批量读取数据数量没有上限限制。但是批量写入数据最多64个字节。</p>
<p>3. ※“写”入数据之前必须先发送使能“写”操作指令WREN，即00000110，否则不能写入。而且在<b><u>发送完</u></b><b><u>WREN</u></b><b><u>指令之后需要将CS</u></b><b><u>拉高一次</u></b>，然后再拉低CS发送写指令进行写操作。</p>
<p>4. 一次写数据不可跨越“页”边界，所以批量写入数据的时候一定要先判断是否有页面跨越这种情况，否则不仅是数据不会正确写入，更严重的是本“页”前面的数据将被覆盖掉。</p>
<p align="center">表2. 25AA256 存储单元映射</p>
<p style="text-align: center"><a href="http://www.shuihan.com/wp-content/uploads/2011/06/5.png"><img title="5" border="0" alt="5" width="305" height="480" style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" src="http://www.shuihan.com/wp-content/uploads/2011/06/5_thumb.png" /></a></p>
<p><b>说明：</b></p>
<p>（1） 上表中红色小格代表一个二进制位，“X”表示0或者1；<br />
（2） 按照“位”计算25AA256的存储容量为256Kbit，按照“字节”计算其容量为32Kbyte；<br />
16位地址0000H-0FFFFH可以寻址64K个地址单元，其中真实的存储空间为前32KB；后32KB（表2蓝色部分）将地址对应映射到了前32K中。也就是说：读取0000H存储单元的数和8000H存储单元，他们的数值是一样的。</p>
<p><strong>本文PDF版本下载: </strong><a href="http://www.shuihan.com/wp-content/uploads/2011/06/25xx256调试笔记.pdf">25xx256调试笔记</a><br />
<strong>原程序包：<a href="http://www.shuihan.com/wp-content/uploads/2011/06/EEPROM.zip">25xx256 EEPROM读写演示程序</a></strong><br />
本程序包基于MPLAB 6.0+C18 3.0，CPU使用PIC18F97J60，为了说明时序，没有使用内置SPI，使用模拟SPI时序操作。</p>]]></description>
			<content:encoded><![CDATA[<p><font color="#808080">注：本调试笔记操作适用于Microchip公司生产的25AA256和25LC256 EEPROM，其中25AA256操作电压为1.8V-5.5V，25LC256操作电压为2.5V-5.5V。</font></p>
<p>调试时间：2009年3月12日 <br />
调试对象：主控芯片PIC18F97J60+25AA256(EEPROM) <br />
作 者：鲁信琼 <br />
演示程序：<a href="http://www.shuihan.com/article/342">http://www.shuihan.com/article/342</a></p>
<h4>一、介绍：</h4>
<p>25AA256 EEPROM是Microchip公司生产的SPI总线串行通信EEPROM，容量256Kbit（合32KByte），采用四线SPI总线通信，操作电压1.8V-5.5V（4.5V-5.5V供电下10MHz时钟全速存取）。内部存储单元共分64个页，每页512个字节，地址分布：<u>0000H-7FFFH</u>，可以按地址单字节访问（存取数据），也可以<b><u>页内</u></b>批量存取数据，但是批量<b><u>写入</u></b>数据每批<b><u>不能超过</u></b>64个字节，批量读出不受该限制。</p>
<p>更多资料请参见：<a href="http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en010846">http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en010846</a></p>
<h4>二、芯片引脚说明：</h4>
<p style="text-align: center"><a href="http://www.shuihan.com/wp-content/uploads/2011/06/QQ20110624095636.png"><img title="QQ截图20110624095636" border="0" alt="QQ截图20110624095636" width="240" height="159" style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" src="http://www.shuihan.com/wp-content/uploads/2011/06/QQ20110624095636_thumb.png" /></a></p>
<p style="text-align: center">图1. 25AA256 EEPROM引脚分布</p>
<ul>
    <li>&#160;CS： 片选输入，低电平有效。（四线SPI通信的RST引脚）。</li>
    <li>SO： 串行输出数据引脚。（四线SPI通信的MOSI引脚）。</li>
    <li>WP： 写保护，（低电平时不可存取，平时不保护数据需要接到高电平）。</li>
    <li>VSS：电源地</li>
    <li>SI： 串行输入数据引脚。（四线SPI通信的MISO引脚）。</li>
    <li>SCK：串行时钟引脚。（四线SPI的时钟线，25AA256属于SPI从设备，该时钟有主设备提供）</li>
    <li>HOLD：操作暂停保持信号。（低电平时暂停当前的存取，但没有停止，当恢复为高电平后继续当前操作，在暂停保持阶段输入的数据将被25AA256忽略）。</li>
    <li>VCC：正电源（1.8V-5.5V）</li>
</ul>
<h4>三、极限承受能力（设备损坏极限）</h4>
<ul>
    <li>极限承受电压：6.5V</li>
    <li>IO口极限承受电压，0（-0.6V），1（Vcc+1.0V）</li>
    <li>工作温度：-65℃-150℃</li>
</ul>
<h4>四、读写操作：</h4>
<p><b>1. </b><b>前言</b></p>
<p>（1） 25AA256有一个8位的指令寄存器，通过SPI总线访问，通过指令寄存器写不同的指令，告知25AA256将要进行的操作。如下表：</p>
<p align="center">表1. 25AA256 EEPROM指令集</p>
<p align="center"><a href="http://www.shuihan.com/wp-content/uploads/2011/06/2.png"><img title="2" border="0" alt="2" width="640" height="197" style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" src="http://www.shuihan.com/wp-content/uploads/2011/06/2_thumb.png" /></a></p>
<p align="center">（2）<b>在</b><b>CLK</b><b>上升沿SI</b><b>采样数据</b>。对于CPU写入25AA256来说，应该在CLK时钟的上升沿之前准备好待写数据，CLK上升沿产生后， 25AA256将对SI端线采样。</p>
<p>（3）<b>在</b><b>CLK</b><b>下降沿SO</b><b>输出数据</b>。在读取数据周期内，在CLK时钟的下降沿将数据送出到SO引脚锁存。对于CPU从25AA256读数据，应该在CLK时钟下降沿产生之后马上读取SO端口数据。</p>
<p>（4）串行数据的发送方向：先发送高字节，再发送低字节。</p>
<p>（5）在对25AA256的访问过程中CS必须保持低电平。HOLD保持高电平。一般如果不用存取等待，我们在设计电路的时候就把HOLD引脚接到高电平了。</p>
<p>（6）当CS引脚由高电平变为低电平之后的<b><u>第一个上升沿</u></b>结束后，25AA256就会马上对SI引脚采样。我们先发送的第一帧数据的都是指令码（8位，表1）。</p>
<p><b>2. </b><b>读时序：</b></p>
<p style="text-align: center"><a href="http://www.shuihan.com/wp-content/uploads/2011/06/3.png"><img title="3" border="0" alt="3" width="640" height="210" style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" src="http://www.shuihan.com/wp-content/uploads/2011/06/3_thumb.png" /></a></p>
<p align="center">图2. CPU对25AA256“读”时序图</p>
<p><strong>操作步骤：</strong></p>
<p>1） <b>将CS</b><b>拉低</b>；</p>
<p>2） <b>通过SI</b><b>传送8</b><b>位指令到25AA256</b><b>指令寄存器</b>；（读指令：00000011）</p>
<p>3） <b>紧接着马上传送16</b><b>位地址</b>。由于25AA256只有32K字节的存储量，16位的地址只使用了15位（0000H-7FFFH），所以最高位的地址我们可以随便发，“1”也可以，“0”也可以。</p>
<p>4） <b>通过DO</b><b>引脚读取内容</b>，该8位内容就是刚才发送的地址对应的单元的内容。</p>
<p>5） <b>如果CS</b><b>不拉高，持续提供CLK</b><b>时钟，则内部地址指针将增加1</b><b>，指向下一个数据单元，可以继续读取下一个单元的内容。</b>如果一直这样往下读，这样的读取将会持续，当达到最大的存储单元地址7FFFH时，地址指针重新指回0000H，如此往复以至无穷的循环往下读。</p>
<p>6） <b>当CS</b><b>拉为高电平后，读取操作终止，而且这个终止可以在任何时段。</b></p>
<p><b>（※</b><b>与写操作对比，写操作CS拉高必须写数据字节的边缘上，也就是说要完整的写完一个字节才能把CS拉高终止本次写操作，否则这个单元的写不被执行。解释的通俗一点：如果说写的数据是D7~D0这么组成的八位数据，必须把D0锁存到SI上之后才能把CS拉高，通常把D0叫做LSB—Least Significant Bit，D7叫做MSB—Most Significant Bit</b><b>）。</b></p>
<p><b>3. </b><b>写时序</b></p>
<p>（1）在任何对25AA256“写”的操作之前，都必须先设置“写操作”使能寄存器，只有当写操作寄存器设置为“可写”时，才能对25AA256进行数据写入。使能“写操作”的指令为00000110（见表1）。</p>
<p>（2）单字节写操作时序：</p>
<p align="center"><a href="http://www.shuihan.com/wp-content/uploads/2011/06/4.png"><img title="4" border="0" alt="4" width="640" height="167" style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" src="http://www.shuihan.com/wp-content/uploads/2011/06/4_thumb.png" /></a></p>
<p align="center">图3. CPU对25AA256“写”单字节时序图</p>
<p><strong>操作步骤：</strong></p>
<p>1） <b>将CS</b><b>拉低</b>；</p>
<p>2） <b>设置“写操作”使能寄存器</b>。写“写使能指令”（00000110）。</p>
<p>3） <b>※CS</b><b>拉高。</b>（这一步很重要，只有在这里把CS拉高，才能更新“写使能”寄存器，才可以写入数据）。</p>
<p>4） <b>CS</b><b>拉低。</b></p>
<p>5） <b>发送“写指令”（</b>00000010<b>）</b></p>
<p>6） <b>紧接着发送16</b><b>为地址单元。</b>16位地址最高位可以随便写，只有前15位有效。</p>
<p>7） <b>通过SI</b><b>写入8</b><b>位。</b>这样这8位数据就写入目标地址了。</p>
<p>8） 如果写完这个字节的数据之后CS不拉高，CLK继续提供时钟，那么内部地址指针将增加1，可以继续往下一个存储单元继续写入8位数据。这就是批量“写”数据操作。时序见图4。</p>
<p>9） 写操作必须在字节的最低位锁存到SI端之后才能停止（即CS拉高）。否则，最后写入的这个字节数据将不会写入。</p>
<p>图4. CPU对25AA256批量“写”操作时序图</p>
<p>10） 批量“写”与批量“读”还不一样。他有一些限制：</p>
<p>※ 最多可以一批写入64个字节的数据，再写第65个字节数据的时候其实写入到了第0个字节位置处（就是本次批量写最早写入的那个位置），覆盖掉了该位置原来的数，这样在这64个字节的空间内循环覆盖写入。</p>
<p>※ 批量写操作被限制在同一个“页”内，不能跨越页边界往下一页写入数据。如果到了页末尾，继续写入，数据将被写到本页头的第1个位置处，覆盖掉原来的数据。</p>
<h4>五、地址映射</h4>
<p>25AA256总共32KB存储单元（256KBit），共64个页（Page），每页有512个字节的存储单元，如表2所示。</p>
<h4>六、易犯错误</h4>
<p>在使用过程中，以下错误需要特别注意：</p>
<p>1. <b>“读”和“写”25AA256</b><b>数据锁存的位置不一样：</b>（“读”、“写”操作是站在CPU的角度） <br />
· 写入数据是在CLK时钟的上升沿锁存，上升沿结束后，25AA256会立刻去采样SI引脚，所以写入数据时应该在CLK上升沿之前在SI引脚上准备好数据； <br />
· 读取数据是在下降沿锁存到SO引脚，在下降沿瞬间25AA256把数据送到SO引脚，所以读取数据的时候CPU应该在CLK下降沿产生后立刻去读取SO引脚。</p>
<p>2. 批量读取数据数量没有上限限制。但是批量写入数据最多64个字节。</p>
<p>3. ※“写”入数据之前必须先发送使能“写”操作指令WREN，即00000110，否则不能写入。而且在<b><u>发送完</u></b><b><u>WREN</u></b><b><u>指令之后需要将CS</u></b><b><u>拉高一次</u></b>，然后再拉低CS发送写指令进行写操作。</p>
<p>4. 一次写数据不可跨越“页”边界，所以批量写入数据的时候一定要先判断是否有页面跨越这种情况，否则不仅是数据不会正确写入，更严重的是本“页”前面的数据将被覆盖掉。</p>
<p align="center">表2. 25AA256 存储单元映射</p>
<p style="text-align: center"><a href="http://www.shuihan.com/wp-content/uploads/2011/06/5.png"><img title="5" border="0" alt="5" width="305" height="480" style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" src="http://www.shuihan.com/wp-content/uploads/2011/06/5_thumb.png" /></a></p>
<p><b>说明：</b></p>
<p>（1） 上表中红色小格代表一个二进制位，“X”表示0或者1；<br />
（2） 按照“位”计算25AA256的存储容量为256Kbit，按照“字节”计算其容量为32Kbyte；<br />
16位地址0000H-0FFFFH可以寻址64K个地址单元，其中真实的存储空间为前32KB；后32KB（表2蓝色部分）将地址对应映射到了前32K中。也就是说：读取0000H存储单元的数和8000H存储单元，他们的数值是一样的。</p>
<p><strong>本文PDF版本下载: </strong><a href="http://www.shuihan.com/wp-content/uploads/2011/06/25xx256调试笔记.pdf">25xx256调试笔记</a><br />
<strong>原程序包：<a href="http://www.shuihan.com/wp-content/uploads/2011/06/EEPROM.zip">25xx256 EEPROM读写演示程序</a></strong><br />
本程序包基于MPLAB 6.0+C18 3.0，CPU使用PIC18F97J60，为了说明时序，没有使用内置SPI，使用模拟SPI时序操作。</p>]]></content:encoded>
			<wfw:commentRss>http://www.shuihan.com/article/342/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>MDK ULINK 烧写HEX文件方法</title>
		<link>http://www.shuihan.com/article/324</link>
		<comments>http://www.shuihan.com/article/324#comments</comments>
		<pubDate>Fri, 17 Jun 2011 12:32:21 +0000</pubDate>
		<dc:creator>水寒</dc:creator>
				<category><![CDATA[水寒日志]]></category>

		<guid isPermaLink="false">http://www.shuihan.com/?p=324</guid>
		<description><![CDATA[<p>用MDK烧写HEX文件的说明：<br />
1、新建一个工程，选这好CPU，不要添加启动代码；<br />
2、把生成的hex文件复制到新工程的目录下；<br />
3、在工程的Output选项里，把Name of Executable：设成你的hex文件名；<br />
4、设置好Utilities的选项；<br />
5、直接点Load就行了；</p>]]></description>
			<content:encoded><![CDATA[<p>用MDK烧写HEX文件的说明：<br />
1、新建一个工程，选这好CPU，不要添加启动代码；<br />
2、把生成的hex文件复制到新工程的目录下；<br />
3、在工程的Output选项里，把Name of Executable：设成你的hex文件名；<br />
4、设置好Utilities的选项；<br />
5、直接点Load就行了；</p>]]></content:encoded>
			<wfw:commentRss>http://www.shuihan.com/article/324/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>无线通信中的一些词汇和公式（逐渐增加）</title>
		<link>http://www.shuihan.com/article/319</link>
		<comments>http://www.shuihan.com/article/319#comments</comments>
		<pubDate>Fri, 06 May 2011 01:09:14 +0000</pubDate>
		<dc:creator>水寒</dc:creator>
				<category><![CDATA[通信通讯]]></category>

		<guid isPermaLink="false">http://www.shuihan.com/?p=319</guid>
		<description><![CDATA[<p><span style="font-size: large">1. 什么是微波？ </span></p>
<p>微波，即Microwave。在利用频率对电磁波进行分类时，频率在 3GHz 至 30GHz 范围内的波称为微波。也称为 SHF （特高频）。卫星转播和部分无线局域网等使用微波。此外，尽管频率在 1GHz 至 3GHz 范围内的亚微波与微波是有区别的，但有时谈到微波时也包括这一部分。</p>
<p><span style="font-size: large">2. 什么是UHF? </span></p>
<p>超高频(UHF -Ultra High Frequency)。UHF波段则是指频率为300~3000MHz的特高频无线电波。</p>]]></description>
			<content:encoded><![CDATA[<p><span style="font-size: large">1. 什么是微波？ </span></p>
<p>微波，即Microwave。在利用频率对电磁波进行分类时，频率在 3GHz 至 30GHz 范围内的波称为微波。也称为 SHF （特高频）。卫星转播和部分无线局域网等使用微波。此外，尽管频率在 1GHz 至 3GHz 范围内的亚微波与微波是有区别的，但有时谈到微波时也包括这一部分。</p>
<p><span style="font-size: large">2. 什么是UHF? </span></p>
<p>超高频(UHF -Ultra High Frequency)。UHF波段则是指频率为300~3000MHz的特高频无线电波。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.shuihan.com/article/319/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>8051单片机波特率计算公式（配套C语言例程）</title>
		<link>http://www.shuihan.com/article/315</link>
		<comments>http://www.shuihan.com/article/315#comments</comments>
		<pubDate>Thu, 28 Apr 2011 16:59:37 +0000</pubDate>
		<dc:creator>水寒</dc:creator>
				<category><![CDATA[8051]]></category>
		<category><![CDATA[RS232通信]]></category>
		<category><![CDATA[串口通信]]></category>
		<category><![CDATA[波特率计算]]></category>

		<guid isPermaLink="false">http://www.shuihan.com/?p=315</guid>
		<description><![CDATA[<p>8051单片机使用<u><strong>定时器1</strong></u>工作在<u><strong>方式2</strong></u>的情况下作为<u><strong>串口波特率发生器</strong></u>，其<u><strong>波特率</strong></u>=(2<sup>smod</sup> /32)×(<span style="color: #ff0000">定时器T1溢出率</span>)，其中smod是PCON&#60;7&#62;，表示是否波特率加倍，Fsoc是系统的晶振大小。</p>
<p>波特率公式中：<span style="color: #ff0000">T1溢出率</span>=<span style="color: #0000ff">溢出周期</span>的倒数；<span style="color: #0000ff">溢出周期</span>=(256-TH1)×12/Fosc；</p>
<p>最终公式：</p>
<p style="text-align: center"><span style="border-bottom: #c00 1px solid; border-left: #c00 1px solid; padding-bottom: 0.5em; line-height: 300%; padding-left: 0.5em; padding-right: 0.5em; font-family: '微软雅黑'; border-top: #c00 1px solid; border-right: #c00 1px solid; padding-top: 0.5em"><span style="font-size: large"><span style="background-color: yellow">波特率：Baud=(2<sup>smod</sup> × Fsoc)/(32 ×12×(256-TH1))</span></span></span></p>
<p style="text-align: left">我们一般不太关注波特率的计算，而是关心选用的传输速度（波特率）去反算定时器1（自动重装模式）的初值（TH1），所以将上面的公式导一下，得到TH1的公式：</p>
<p style="text-align: center"><span style="border-bottom: #c00 1px solid; border-left: #c00 1px solid; padding-bottom: 0.5em; line-height: 300%; padding-left: 0.5em; padding-right: 0.5em; font-family: '微软雅黑'; border-top: #c00 1px solid; border-right: #c00 1px solid; padding-top: 0.5em"><span style="font-size: large"><span style="background-color: yellow">TH1=256-(Fsoc×2<sup>smod</sup>)/(12×32×Baud)</span></span></span></p>
<p style="text-align: left">下面针对串口发送程序，水寒写下例程，供大家参考。（我使用的是STC12C5A40S2调试，原则上在STC89C5x、AT89C5x等8051核心的单片机上都能够成功，由于程序比较简单，我没有试，但应该没有问题的）</p>
<p style="text-align: left">&#160;</p>
<p style="text-align: left">&#160;</p>
<pre>
#include "Reg52.H"
/*******************************************************************
请提前计算一下所选晶振能达到的最高速度，波特率不能超过最高速度
(1) 波特率加倍(SMOD=1)：  Max_Baud = FOSC/12/16
(2) 波特率不加倍(SMOD=0)：Max_Baud = FOSC/12/32
例如：22.1184MHz晶振，波特率加倍时，最大波特率=22118400/12/16=115200
*******************************************************************/
#define FOSC	22118400		//振荡频率
#define BAUD	9600			//波特率
#define SMOD	1			//是否波特率加倍
#if SMOD
	#define TC_VAL	(256-FOSC/16/12/BAUD)
#else
	#define TC_VAL	(256-FOSC/32/12/BAUD)
#endif

typedef unsigned char uint8;
typedef unsigned int uint16;

code const char str1[] = "Ther string is transmitted from 80C51!\r\n";
code const char str2[] = "Author: xqlu(at)ysu.edu.cn\r\n";

/***************函数声明*******************/
void InitUART(void);
void SendOneByte(uint8);
void SendrStr(const uint8 *ptr);

/****************主函数********************/
void main(void)
{
    uint8 i=0;
    InitUART();

    while(str2[i]!='\0')
    {
	SendOneByte(str2[i++]);	
    }

    SendrStr(str1);

    while(1);
}

/****************中断服务函数***************/
void UART_ISR(void) interrupt 4
{
    uint8 RX_Data;
    //只响应“接收”中断，“发送”中断来了就直接抹掉
    if(RI)
   {
     RI = 0;				//串口中断标志不能自己清除，需要手动清除
      RX_Data=SBUF;
     SendOneByte(RX_Data);
   }
   else
     TI = 0;				//串口发中断是发送完缓冲区数据之后产生
}

/****************串口初始化函数*************/
void InitUART(void)
{
    TMOD = 0x20;
    SCON = 0x50;
    TH1 = TC_VAL;
    TL1 = TH1;
    PCON = 0x80; 			//发送速率加倍
     ES = 1;
    EA = 1;
    TR1 = 1;
}
/**************串口发送字符函数*************/
void SendOneByte(uint8 c)
{
    ES = 0;			//禁止发送中断
     SBUF = c;
    while(!TI);
    TI = 0;
    ES = 1;
}
/**************串口发送字符串函数*************/
void SendrStr(const uint8 *ptr)
{
    do
    {
	SendOneByte(*ptr);
    }while(*ptr++!='\0');
}
</pre>]]></description>
			<content:encoded><![CDATA[<p>8051单片机使用<u><strong>定时器1</strong></u>工作在<u><strong>方式2</strong></u>的情况下作为<u><strong>串口波特率发生器</strong></u>，其<u><strong>波特率</strong></u>=(2<sup>smod</sup> /32)×(<span style="color: #ff0000">定时器T1溢出率</span>)，其中smod是PCON&lt;7&gt;，表示是否波特率加倍，Fsoc是系统的晶振大小。</p>
<p>波特率公式中：<span style="color: #ff0000">T1溢出率</span>=<span style="color: #0000ff">溢出周期</span>的倒数；<span style="color: #0000ff">溢出周期</span>=(256-TH1)×12/Fosc；</p>
<p>最终公式：</p>
<p style="text-align: center"><span style="border-bottom: #c00 1px solid; border-left: #c00 1px solid; padding-bottom: 0.5em; line-height: 300%; padding-left: 0.5em; padding-right: 0.5em; font-family: '微软雅黑'; border-top: #c00 1px solid; border-right: #c00 1px solid; padding-top: 0.5em"><span style="font-size: large"><span style="background-color: yellow">波特率：Baud=(2<sup>smod</sup> × Fsoc)/(32 ×12×(256-TH1))</span></span></span></p>
<p style="text-align: left">我们一般不太关注波特率的计算，而是关心选用的传输速度（波特率）去反算定时器1（自动重装模式）的初值（TH1），所以将上面的公式导一下，得到TH1的公式：</p>
<p style="text-align: center"><span style="border-bottom: #c00 1px solid; border-left: #c00 1px solid; padding-bottom: 0.5em; line-height: 300%; padding-left: 0.5em; padding-right: 0.5em; font-family: '微软雅黑'; border-top: #c00 1px solid; border-right: #c00 1px solid; padding-top: 0.5em"><span style="font-size: large"><span style="background-color: yellow">TH1=256-(Fsoc×2<sup>smod</sup>)/(12×32×Baud)</span></span></span></p>
<p style="text-align: left">下面针对串口发送程序，水寒写下例程，供大家参考。（我使用的是STC12C5A40S2调试，原则上在STC89C5x、AT89C5x等8051核心的单片机上都能够成功，由于程序比较简单，我没有试，但应该没有问题的）</p>
<p style="text-align: left">&#160;</p>
<p style="text-align: left">&#160;</p>
<pre>
#include "Reg52.H"
/*******************************************************************
请提前计算一下所选晶振能达到的最高速度，波特率不能超过最高速度
(1) 波特率加倍(SMOD=1)：  Max_Baud = FOSC/12/16
(2) 波特率不加倍(SMOD=0)：Max_Baud = FOSC/12/32
例如：22.1184MHz晶振，波特率加倍时，最大波特率=22118400/12/16=115200
*******************************************************************/
#define FOSC	22118400		//振荡频率
#define BAUD	9600			//波特率
#define SMOD	1			//是否波特率加倍
#if SMOD
	#define TC_VAL	(256-FOSC/16/12/BAUD)
#else
	#define TC_VAL	(256-FOSC/32/12/BAUD)
#endif

typedef unsigned char uint8;
typedef unsigned int uint16;

code const char str1[] = "Ther string is transmitted from 80C51!\r\n";
code const char str2[] = "Author: xqlu(at)ysu.edu.cn\r\n";

/***************函数声明*******************/
void InitUART(void);
void SendOneByte(uint8);
void SendrStr(const uint8 *ptr);

/****************主函数********************/
void main(void)
{
    uint8 i=0;
    InitUART();

    while(str2[i]!='\0')
    {
	SendOneByte(str2[i++]);	
    }

    SendrStr(str1);

    while(1);
}

/****************中断服务函数***************/
void UART_ISR(void) interrupt 4
{
    uint8 RX_Data;
    //只响应“接收”中断，“发送”中断来了就直接抹掉
    if(RI)
   {
     RI = 0;				//串口中断标志不能自己清除，需要手动清除
      RX_Data=SBUF;
     SendOneByte(RX_Data);
   }
   else
     TI = 0;				//串口发中断是发送完缓冲区数据之后产生
}

/****************串口初始化函数*************/
void InitUART(void)
{
    TMOD = 0x20;
    SCON = 0x50;
    TH1 = TC_VAL;
    TL1 = TH1;
    PCON = 0x80; 			//发送速率加倍
     ES = 1;
    EA = 1;
    TR1 = 1;
}
/**************串口发送字符函数*************/
void SendOneByte(uint8 c)
{
    ES = 0;			//禁止发送中断
     SBUF = c;
    while(!TI);
    TI = 0;
    ES = 1;
}
/**************串口发送字符串函数*************/
void SendrStr(const uint8 *ptr)
{
    do
    {
	SendOneByte(*ptr);
    }while(*ptr++!='\0');
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.shuihan.com/article/315/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

