<?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>木客网 &#187; 8051f020</title>
	<atom:link href="http://woodfeed.com/category/%e5%8d%95%e7%89%87%e6%9c%ba%e5%bc%80%e5%8f%91/c8051f020/feed/" rel="self" type="application/rss+xml" />
	<link>http://woodfeed.com</link>
	<description></description>
	<lastBuildDate>Wed, 09 Jun 2010 12:15:52 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>C8051F020与80C51单片机的异同点</title>
		<link>http://woodfeed.com/mcu-c8051f020-and-mcu-80c51/</link>
		<comments>http://woodfeed.com/mcu-c8051f020-and-mcu-80c51/#comments</comments>
		<pubDate>Wed, 09 Jun 2010 12:15:52 +0000</pubDate>
		<dc:creator>vayu</dc:creator>
				<category><![CDATA[8051f020]]></category>
		<category><![CDATA[80c51]]></category>

		<guid isPermaLink="false">http://woodfeed.com/?p=606</guid>
		<description><![CDATA[80C51系列单片机及其衍生产品在我国乃至全世界范围获得了非常广泛的应用。单片机领域的大部分工作人员都熟悉80C51单片机，各大专院校都采用80C51系列单片机作为教学模型。随着单片机的不断发展，市场上出现了很多高速、高性能的新型单片机，基于标准8051内核的单片机正面临着退出市场的境地。为此，一些半导体公司开始对传统8051内核进行大的构造，主要是提高速度和增加片内模拟和数字外设，以期大幅度提高单片机的整体性能。其中美国Cygnal公司推出的C8051F系列单片机把80C51系列单片机从MCU时代推向SoC时代，使得以8051为内核的单片机上了一个新的台阶。

　　C8051F系列单片机是完全集成的混合信号系统级芯片，具有与8051兼容的CIP-51微控制器内核，采用流水线结构，单周期指令运行速度是8051的12倍，全指令集运行速度是原来的9.5倍。熟悉NCS-51系列单片机的工程技术人员可以很容易地掌握C8051F的应用技术并能进行软件的移植。但是不能将8051的程序完全照搬的应用于C8051F单片机中，这是因为两者的内部资源存在较大的差异，必须经过加工才能予以使用。其中C8051F020以其功能较全面，应用较广泛的特点成为C8051F的代表性产品，其性能价格比在目前应用领域也极具竞争力。C8051F020的内部电路包括CIP-51微控制器内核及RAM、ROM、I／O口、定时／计数器、ADC、DAC、PCA、SPI和SMBus等部件，即把计算机的基本组成单元以及模拟和数字外设集成在一个芯片上，构成一个完整的片上系统(SoC)。本文将介绍C8051F020单片机与80C51的异同点(主要是不同之处)及初学者编程时应该注意的问题，并给出经过Cygnal开发工具IDE调试环境软件验证的源程序。
]]></description>
			<content:encoded><![CDATA[<p>1 引言 </p>
<p>　　80C51系列单片机及其衍生产品在我国乃至全世界范围获得了非常广泛的应用。单片机领域的大部分工作人员都熟悉80C51单片机，各大专院校都采用80C51系列单片机作为教学模型。随着单片机的不断发展，市场上出现了很多高速、高性能的新型单片机，基于标准8051内核的单片机正面临着退出市场的境地。为此，一些半导体公司开始对传统8051内核进行大的构造，主要是提高速度和增加片内模拟和数字外设，以期大幅度提高单片机的整体性能。其中美国Cygnal公司推出的C8051F系列单片机把80C51系列单片机从MCU时代推向SoC时代，使得以8051为内核的单片机上了一个新的台阶。</p>
<p>　　C8051F系列单片机是完全集成的混合信号系统级芯片，具有与8051兼容的CIP-51微控制器内核，采用流水线结构，单周期指令运行速度是8051的12倍，全指令集运行速度是原来的9.5倍。熟悉NCS-51系列单片机的工程技术人员可以很容易地掌握C8051F的应用技术并能进行软件的移植。但是不能将8051的程序完全照搬的应用于C8051F单片机中，这是因为两者的内部资源存在较大的差异，必须经过加工才能予以使用。其中C8051F020以其功能较全面，应用较广泛的特点成为C8051F的代表性产品，其性能价格比在目前应用领域也极具竞争力。C8051F020的内部电路包括CIP-51微控制器内核及RAM、ROM、I／O口、定时／计数器、ADC、DAC、PCA、SPI和SMBus等部件，即把计算机的基本组成单元以及模拟和数字外设集成在一个芯片上，构成一个完整的片上系统(SoC)。本文将介绍C8051F020单片机与80C51的异同点(主要是不同之处)及初学者编程时应该注意的问题，并给出经过Cygnal开发工具IDE调试环境软件验证的源程序。</p>
<p>2 相同点</p>
<p>　　C8051F020单片机与80C51系列单片机的指令系统完全一样。掌握80C51单片机的人员可以很容易地接受C8051F020的应用技术并能完成相应软件的移植。</p>
<p>3 主要硬件不同点</p>
<p>3.1 运行速度</p>
<p>　　C8051F020的指令运行速度是一般80C51系列单片机的10倍以上。因为其CIP-51中采用了流水线处理结构，已经没有了机器周期时序，指令执行的最小时序单位为系统时钟，大部分指令只要1～2个系统周期即可完成。又由于其时钟系统比80C51的更加完善，有多个时钟源，且时钟源可编程，时钟频率范围为0～25 MHz，当CIP-5l工作在最大系统时钟频率25 MHz时，它的峰值速度可以达到25 MI／s，C8051F020已进入了8位高速单片机行列。</p>
<p>3.2 I／O端口的配置方式</p>
<p>　　C8051F020拥有8个8位的I／O端口，大量减少了外部连线和器件扩展，有利于提高可靠性和抗干扰能力。其中低4个I／O端口除可作为一般的通用I／O端口外，还可作为其他功能模块的输入或输出引脚，它是通过交叉开关配置寄存器XBR0、XBR1、XBR2(各位名称及格式如表1所示)选择并控制的，它们控制优先权译码选择开关电路如图1所示，可将片内的计数器／定时器、串行总线、硬件中断、比较器输出及其它的数字信号配置为在端口I／O引脚出现，这样用户可以根据自己的特定需要选择所需的数字资源和通用I／O口。数字交叉开关是一个比较大的数字开关网路，这在所有80C51系列单片机上是一个空白。另外P1MDIN用于选择P1的输入方式是模拟输入还是数字输入，复位值为11111111B，即默认为数字输入方式。而80C51单片机的I／O引脚是固定分配的，即占用引脚多，配置又不够灵活。</p>
<p style="text-align: center;"> </p>
<p style="text-align: center;"><a href="http://woodfeed.com/wp-content/uploads/2010/06/image002.jpg" rel="lightbox[606]"></a><a href="http://woodfeed.com/wp-content/uploads/2010/06/image001.jpg" rel="lightbox[606]"><img class="aligncenter size-full wp-image-602" title="image001" src="http://woodfeed.com/wp-content/uploads/2010/06/image001.jpg" alt="" width="550" height="384" /></a></p>
<p style="text-align: center;">　<a href="http://woodfeed.com/wp-content/uploads/2010/06/image002.jpg" rel="lightbox[606]"><img class="aligncenter size-full wp-image-603" title="image002" src="http://woodfeed.com/wp-content/uploads/2010/06/image002.jpg" alt="" width="550" height="238" /></a>　</p>
<p>      C8051F020通过优先权交叉开关译码器(如图2所示)控制数字开关网路，端口引脚的分配顺序是从P0.0开始一直到P3.7。当交叉开关配置寄存器XBR0、XBR1和XBR2中外设的对应使能位被设置为逻辑“1”时，交叉开关将端口引脚分配给外设，例如，如果UARTOEN位(XBR0.2)被设置为逻辑“1”，则TX0和RX0引脚将分别被分配到P0.0和P0.1。因为UART0有最高优先权，所以当UARTOEN位被设置为逻辑“1”时其引脚将总是被分配到P0.0和P0.1。未被设置的交叉开关分配端口可作为通用I／O口。注意：当选择了串行通信外设(即SMBus、SPI或UART)时，交叉开关将为所有相关功能分配引脚。例如，不能为UART0功能只分配TX0引脚而不分配RX0引脚。交叉开关寄存器被正确配置后，通过将XBARE(XBR2.6)设置为逻辑“1”来使能交叉开关。 </p>
<p style="text-align: center;"> <a href="http://woodfeed.com/wp-content/uploads/2010/06/image003.jpg" rel="lightbox[606]"><img class="aligncenter size-full wp-image-604" title="image003" src="http://woodfeed.com/wp-content/uploads/2010/06/image003.jpg" alt="" width="550" height="462" /></a></p>
<p>3.3 内部功能</p>
<p>　　C8051F020内部带有数据采集所需的ADC和DAC，其中ADC有两个，一个是8路12位逐次逼近型ADC，可编程转换速率，最大为100 kS／s．可通过多通道选择器配置为单端输入或差分输入。内有可编程增益放大器PGA用于将输入的信号放大，提高A／D的转换精度。可编程增益为：0.5、1、2、4、8或16，复位时默认值为1。另一个是8路8位ADC，可编程转换速率最大为500 kS／s，其可编程放大增益为0.5、1、2、4，复位时默认值为0.5。有2个12位的DAC，用于将12位的数字量转换为电压量，可产生连续变化的波形，两路信号可同步输出。</p>
<p>3.4 外部接口</p>
<p>　　C8051F020外设还增添了三个串行口。可同时与外界进行串行数据通信，SMBus兼容于I2C串行扩展总线；SPI串行扩展接口；两个增强型UART串口。C8051F020具有基于JTAG接口的在系统调试功能，片内的调试电路通过JTAG接口可提供高速、方便的在系统调试。</p>
<p>4 软件编程举例</p>
<p>　　鉴于C8051F020在硬件方面与80C51的不同之处，故它们在软件编程时也会有所区别，这种区别主要体现在初始化程序上。该程序是在Cygnal的开发工具即IDE调试环境中予以验证的。</p>
<p>　　例：利用定时器T0定时,在P1.2端输出一方波,方波周期为20 ms,已知晶振频率为12 MHz，采用中断的方式实现。</p>
<p>　　采用C8051F020单片机实现的程序如下： </p>
<p style="text-align: center;"> <a href="http://woodfeed.com/wp-content/uploads/2010/06/image005.jpg" rel="lightbox[606]"><img class="aligncenter size-full wp-image-601" title="image005" src="http://woodfeed.com/wp-content/uploads/2010/06/image005.jpg" alt="" width="400" height="526" /></a><a href="http://woodfeed.com/wp-content/uploads/2010/06/image004.jpg" rel="lightbox[606]"><img class="aligncenter size-full wp-image-605" title="image004" src="http://woodfeed.com/wp-content/uploads/2010/06/image004.jpg" alt="" width="380" height="203" /></a></p>
<p>　　从上面的程序中可以看出：在C8051F020软件编程中须首先设置看门狗定时器的工作状态，其次，要由内部振荡器控制寄存器OSCICN设置采用内部时钟还是外部时钟工作，若选择外部时钟可通过外部振荡器控制寄存器OSCXCN来选择适当的频率，本题目采用内部时钟，并通过时钟控制寄存器CKCON选择使用系统时钟的12分频。再次，若选择的I／O口是低四个端口P0～P3作为工作口，需要设定寄存器XBR0、XBR1、XBR2(复位值为0)，在本设计中未用到数字资源，故XBR0、XBR1的值为复位值，只需设定XBR2的值为40H允许功能选择开关即可，若本设计中的P1.2换为P4.2，则无需设定寄存器XBR0、XBR1、XBR2，因为高端口P4～P7与交叉开关无关。最后还要选择所用I／O口的输出方式，P0、P1、P2、P3口分别由POMDOUT、P1MD-OUT、P2MDOUT、P3MDOUT端口输出方式寄存器来选择，寄存器中的某位置0为漏极开路输出方式，置1则为推拉输出方式。另外，由于C8051F020的专用寄存器比一般51单片机多，而8051指令不能识别它增加的专用寄存器，公司提供了所有的专用寄存器及相应位的地址定义文件，用户只需加一条＄include(C8051F020.inc)指令即可。</p>
<p>　　该程序只需将与上面提到的几点相关的指令去掉即为80C51的源程序(程序中已标示)。当然这仅仅是一个简单的例子，并不能完全说明所有不同之处，但可说明它们典型的不同点。</p>
<p>5 结束语</p>
<p>　　C8051F020与80C51单片机的指令系统完全兼容，给用户使用带来了极大的方便，但它们的硬件结构不同，因此在使用上有所区别，只有了解了它们之间的异同点，才能更好地对C8051F020进行开发利用，充分发挥它的先进功效。 </p>
<p>来源：世界电子元器件</p>
<h2  class="related_post_title">相关文章</h2><ul class="related_post"><li><a href="http://woodfeed.com/remote-temperature-control-and-gathering-used-the-web-based-on-c8051f020-mcu/" title="基于C8051F020单片机的Web远程控制的温度采集系统">基于C8051F020单片机的Web远程控制的温度采集系统</a><br /><small>      随着互联网的日益普及，各种家电设备、仪器仪表以及工业生产中的数据采集与控制设...</small></li><li><a href="http://woodfeed.com/c8051f02x-external-memory-interface-and-i-o-port-configuration/" title="C8051F02X外部存储器接口和I/O端口配置">C8051F02X外部存储器接口和I/O端口配置</a><br /><small>介绍美国Cygnal公司生产的C8051F02X系列单片机的外部存储器接口、I/O端口配...</small></li></ul>]]></content:encoded>
			<wfw:commentRss>http://woodfeed.com/mcu-c8051f020-and-mcu-80c51/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>基于C8051F020单片机的Web远程控制的温度采集系统</title>
		<link>http://woodfeed.com/remote-temperature-control-and-gathering-used-the-web-based-on-c8051f020-mcu/</link>
		<comments>http://woodfeed.com/remote-temperature-control-and-gathering-used-the-web-based-on-c8051f020-mcu/#comments</comments>
		<pubDate>Sat, 05 Jun 2010 09:16:24 +0000</pubDate>
		<dc:creator>vayu</dc:creator>
				<category><![CDATA[8051f020]]></category>
		<category><![CDATA[温度采集]]></category>
		<category><![CDATA[远程控制]]></category>

		<guid isPermaLink="false">http://woodfeed.com/?p=599</guid>
		<description><![CDATA[      随着互联网的日益普及，各种家电设备、仪器仪表以及工业生产中的数据采集与控制设备在逐步地走向网络化，以实现分布式远程监控、信息交换与共享。目前广泛使用的以太网以及TCP/IP 协议已经成为最常用的网络标准之一，其高速、可靠、分层以及可扩充性使其在各个领域的应用越来越灵活，很多情况下采用以太网和TCP/IP，能够简化结构和降低成本。 
　　
     目前大多数智能设备和仪表都是采用RS232/485 或USB通讯方式，不具备远程控制和数据传输能力。 利用以太网实现工业系统远程控制，通过互联网共享小型嵌入式设备的信息，是工业控制研究的发展趋势。本系统采用高速单片机C8051F020及 RTL8019AS 以太网控制器，用嵌入式TCP/IP 协议可以实现TCP和UDP等网络功能,进一步实现HTTP协议服务,实现Web Server 及接入Internet 的功能。
]]></description>
			<content:encoded><![CDATA[<p>         随着互联网的日益普及，各种家电设备、仪器仪表以及工业生产中的数据采集与控制设备在逐步地走向网络化，以实现分布式远程监控、信息交换与共享。目前广泛使用的以太网以及TCP/IP 协议已经成为最常用的网络标准之一，其高速、可靠、分层以及可扩充性使其在各个领域的应用越来越灵活，很多情况下采用以太网和TCP/IP，能够简化结构和降低成本。　　</p>
<p>     目前大多数智能设备和仪表都是采用RS232/485 或USB通讯方式，不具备远程控制和数据传输能力。 利用以太网实现工业系统远程控制，通过互联网共享小型嵌入式设备的信息，是工业控制研究的发展趋势。本系统采用高速单片机C8051F020及 RTL8019AS 以太网控制器，用嵌入式TCP/IP 协议可以实现TCP和UDP等网络功能,进一步实现HTTP协议服务,实现Web Server 及接入Internet 的功能。　　</p>
<ol>
<li><strong>1.     </strong><strong>系统的总体设计</strong><strong> </strong></li>
</ol>
<p>          系统的结构框图如图1所示，高速单片机C8051F020 是完全集成的混合信号系统级芯片，具有与8051兼容的CIP-51微控制器内核，采用流水线结构，单周期指令运行速度是8051的12倍，全指令集运行速度是原来的9.5倍。可以满足系统在功耗和处理速度方面的要求。</p>
<p style="text-align: center;"> <a href="http://woodfeed.com/wp-content/uploads/2010/06/kuangjia.gif" rel="lightbox[599]"><img class="size-full wp-image-597  aligncenter" title="kuangjia" src="http://woodfeed.com/wp-content/uploads/2010/06/kuangjia.gif" alt="" width="545" height="333" /></a></p>
<p><strong> </strong></p>
<p>          RTL8019AS 是一种全双工即插即用的以太网控制器，在一块芯片上集成了RTL8019内核和一个16KB的SDRAM存储器，兼容RTL8019控制软件和NE2000 8bit或16bit的传输，支持外接闪烁存储器读写操作，支持I/O口地址的完全解码，具有LED指示功能，接口符合Ethernet2和IEEE802.3（10Base5,10Base2,10BaseT）标准</p>
<p><strong>        </strong>RTL8019AS 是一种高度集成的10MB以太网控制器，与NE2000兼容, 支持8位、16位数据总线；内置16KB SRAM缓存；可连接同轴电缆和双绞线,并可自动检测所连接的介质。以太网隔离滤波器选用20F00IN。</p>
<p>　　</p>
<p>        RTL8019AS 与主处理器的接口方式有三种:跳线方式、PNP(即插即用)方式和免跳线方式。RTL8019AS 的第65 脚JP 决定网卡的工作方式，本设计中JP脚接高电平(VCC),即使用跳线方式，此时可以省掉外部E2PROM 93C46芯片。单片机通过I/O 模式访问以太网控制器。RTL8019AS 必须工作在8位模式下，其引脚IOCS16B经电阻接地。RTL8019AS 的第64 脚AUI决定接口方式，本设计中AUI接地，使用BNC接口，使用的是8线双绞。</p>
<p>  <strong>2 </strong><strong>以太网控制器的工作过程</strong>　</p>
<p>        以太网控制器的 RAM 以 256 字节为一页，是按页存储的结构，16位RAM地址的高 8位又叫页码。以太网控制器的16KB RAM的地址从0&#215;4000～0x7FFF，即从页0&#215;40 到页0x7F，共有64 页用来接收和发送数据包。这64页RAM是一块双端口RAM。所谓双端口就是说有两套总线连接到该RAM，总线A 用于以太网控制器读/写片上RAM，总线B 用于单片机读/写以太网控制器上的 RAM。总线A又叫Local DMA，总线B 又叫 Remote DMA。　</p>
<p>    2.1 数据包的发送过程　</p>
<p>        (1)封装数据包：数据包在发送前，单片机将其按如图2所示的以太网帧格式封装好,并存放在外部SRAM。</p>
<table style="text-align: center;" border="0" cellspacing="0" cellpadding="0" width="539">
<tbody>
<tr>
<td style="text-align: center;" width="53" valign="top">PR</td>
<td style="text-align: center;" width="51" valign="top">SD</td>
<td style="text-align: center;" width="57" valign="top">DA</td>
<td style="text-align: center;" width="57" valign="top">SA</td>
<td style="text-align: center;" width="104" valign="top">LENGTH/TYPE</td>
<td style="text-align: center;" width="95" valign="top">DATA</td>
<td style="text-align: center;" width="57" valign="top">PAD</td>
<td style="text-align: center;" width="66" valign="top">FCS</td>
</tr>
<tr>
<td style="text-align: center;" width="53" valign="top">56位</td>
<td style="text-align: center;" width="51" valign="top">8位</td>
<td style="text-align: center;" width="57" valign="top">48位</td>
<td style="text-align: center;" width="57" valign="top">48位</td>
<td style="text-align: center;" width="104" valign="top">16位</td>
<td style="text-align: center;" width="95" valign="top">N&lt;=1500</td>
<td style="text-align: center;" width="57" valign="top">可选</td>
<td style="text-align: center;" width="66" valign="top">32位</td>
</tr>
</tbody>
</table>
<p>    以太网(802.3)帧结构</p>
<p>      (2)通过远程DMA将数据包写入到 RLT8019AS 的数据发送缓冲区， 数据的目的缓冲区首地址和字节数由内部寄存器RSCR0、1设定。</p>
<p>      (3) 通过RTL8019AS的本地DMA将数据送入FIFO 缓冲器进行发送。　</p>
<p>    2.2 数据包的接收过程　</p>
<p>      (1)本地 DMA 将需要接收的数据包存入到接收缓冲环中。</p>
<p>      (2)由远程 DMA 将接收缓冲环中的数据包写入到外部 SRAM 中。　</p>
<p>      如果以太网控制器运行正常，接收到数据包时自动启动本地 DMA 将数据存入接收缓冲环中，也就是说第一步是由 RTL8019AS 自动完成的。但是，接收缓冲环的范围需要设置，PSTART、PSTOP 分别用于设置接收缓冲环的起始页和发送页，设置了接收缓冲环之后，接收到的第一个数据包放置的位置由当前页面寄存器CURR 决定。</p>
<p>3 服务器端工作过程</p>
<p>          图3 所示为本系统 TCP/IP 各层协议，链路层协议由单片机控制RTL8019AS 实现，而其他协议由单片机内部程序实现。</p>
<p style="text-align: center;"> <a href="http://woodfeed.com/wp-content/uploads/2010/06/tcpip4.jpg" rel="lightbox[599]"><img class="aligncenter size-full wp-image-596" title="tcpip4" src="http://woodfeed.com/wp-content/uploads/2010/06/tcpip4.jpg" alt="" width="567" height="273" /></a></p>
<p>　    服务器接收数据时，以太网驱动程序负责接收数据，由以太网控制器中断处理程序唤醒数据接收任务，由数据接收任务将接收到的数据帧交给网络接口 层，网络接口层取出帧头，判断接收数据的类型，如果是ARP 报文，则将ARP 报文交给ARP 协议模块处理；如果是IP 数据包，则将IP数据包交给IP 协议模块处理，IP协议模块取出IP 首部信息，然后根据数据包的类型，将报文交给相应的协议模块(UDP 模块、TCP 模块或ICMP 模块)处理，UDP 模块或TCP 模块收到报文后，取出首部进行处理，并将用户数据交给应用程序。</p>
<p style="text-align: center;">　<a href="http://woodfeed.com/wp-content/uploads/2010/06/tcpbao.jpg" rel="lightbox[599]"><img class="aligncenter size-full wp-image-598" title="tcpbao" src="http://woodfeed.com/wp-content/uploads/2010/06/tcpbao.jpg" alt="" width="568" height="249" /></a></p>
<p>　     服务器发送数据时，将用户数据交给UDP协议模块或TCP 协议模块处理，UDP协议模块或TCP协议模块将其首部和数据封装成UDP数据包或TCP数据包，然后将封装好的数据包交给IP协议模块，IP模块在上层 交给的数据包上添加IP首部，并封装成IP数据包，然后为 IP 数据包寻找路由，如果找不到相应路由，则向ICMP 协议发送出错报文，由ICMP 协议模块进行处理，在找到了合适的路由后，如果是以太网方式，则将数据包发送到网络接口层，利用ARP协议找到目的IP对应的物理地址，然后封装成以太网 帧，由网卡驱动程序将以太网帧发送出去。</p>
<p>4 利用HTTP协议实现Web接收与发送控制数据　</p>
<p>　     在单片机系统中实现HTTP 协议服务端的功能，就可以为其他的客户机提供超文本信息，客户端只需要使用统一的浏览器就可以与服务器进行信息交换。</p>
<p>　      超文本传输协议(HTTP)是目前通过Internet进行信息交换最主要的方式。在Internet上HTTP 通讯经常发生在 TCP/IP 连接之上。其缺省端口是TCP 协议的80 端口，当然，其他的端口也是可以使用的。HTTP 协议是建立在请求/响应(request/response) 模型上的。首先由客户建立一条与服务器的TCP链接，并发送一个请求到服务器，请求中包含请求方法、URI、协议版本以及相关的MIME (Multipurpose Internet Mail Extensions) 样式的消息。服务器响应一个状态行，包含消息的协议版本、一个成功或失败码以及相关的MIME 式样的消息(包含服务器的信息、资源实体的信息和可能的资源内容)。</p>
<p>　      单片机服务器除了包括HTML 文件以外，还有一个HTTP 驻留程序，用于响应计算机端的控制请求。用HTML 文件编写的网络界面，可以通过浏览器访问并利用相应的按扭向服务器发送HTTP 请求，此请求被送往由IP地址指定的URL。驻留程序接收到请求，在进行必要的操作后回送所要求的文件。在这一过程中，在网络上发送和接收的数据已经被分 成一个或多个数据包(packet)，每个数据包包括：要传送的数据；控制信息，即告诉网络怎样处理数据包。TCP/IP决定了每个数据包的格式。</p>
<p style="text-align: center;">　　<a href="http://woodfeed.com/wp-content/uploads/2010/06/web.jpg" rel="lightbox[599]"><img class="aligncenter size-full wp-image-600" title="web" src="http://woodfeed.com/wp-content/uploads/2010/06/web.jpg" alt="" width="553" height="334" /></a></p>
<p>　         图5 是通过Web 浏览器看到的网络控制界面，必需将客户计算机与服务器系统的IP地址设置在一个段内。如本系统服务器IP地址设为192.168.0.10，客户机IP地址设为192.168.0.11，默认网关均为255.255.255.0。</p>
<p>　       (1) 发送控制数据过程:①通过浏览器向服务器系统(单片机)发送HTTP 请求；②服务器系统通过HTTP服务程序查看网页程序中表单内输入变量的变化；③取出变量值,调用串口程序将数据发出。　</p>
<p>　       (2)接收采集数据过程：①系统HTTP 协议程序的http_serve 中调用串口程序接收串口数据,并用此数据取代其内部网页中的表格内“NO DATA”标记；②服务器系统把Web页面传送给用户界面的浏览器。</p>
<p style="text-align: left;">　      用低成本的单片机和以太网控制器，配合适当的网络协议，实现了通过网络对RS232接口设备的数据采集及系统控制。如对其进行适当的改变 与扩展，便可以用于其他接口的仪器仪表，并应用于更广泛的领域。由于系统的控制器使用的是单片机，限于其内部资源，所以网页文件不能过大。</p>
<h2  class="related_post_title">相关文章</h2><ul class="related_post"><li><a href="http://woodfeed.com/mcu-c8051f020-and-mcu-80c51/" title="C8051F020与80C51单片机的异同点">C8051F020与80C51单片机的异同点</a><br /><small>80C51系列单片机及其衍生产品在我国乃至全世界范围获得了非常广泛的应用。单片机领域的大...</small></li><li><a href="http://woodfeed.com/c8051f02x-external-memory-interface-and-i-o-port-configuration/" title="C8051F02X外部存储器接口和I/O端口配置">C8051F02X外部存储器接口和I/O端口配置</a><br /><small>介绍美国Cygnal公司生产的C8051F02X系列单片机的外部存储器接口、I/O端口配...</small></li></ul>]]></content:encoded>
			<wfw:commentRss>http://woodfeed.com/remote-temperature-control-and-gathering-used-the-web-based-on-c8051f020-mcu/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>C8051f020外部数据存储器复用方式</title>
		<link>http://woodfeed.com/c8051f020-external-data-memory-reuse-approach/</link>
		<comments>http://woodfeed.com/c8051f020-external-data-memory-reuse-approach/#comments</comments>
		<pubDate>Wed, 02 Dec 2009 09:35:48 +0000</pubDate>
		<dc:creator>vayu</dc:creator>
				<category><![CDATA[8051f020]]></category>
		<category><![CDATA[EMIF]]></category>
		<category><![CDATA[复用方式]]></category>

		<guid isPermaLink="false">http://woodfeed.com/?p=535</guid>
		<description><![CDATA[C8051F020/1/1/3 MCU 内部有位于外部数据存储器空间的4096 字节片上RAM （XRAM ），还有外部数据存储器接口（EMIF），可用于访问片外存储器和存储器映射的I/O 器件。外部存储器空间可以用外部传送指令（MOVX ）和数据指针（DPTR ）访问，或者通过使用R0 或R1用间接寻址方式访问。如果 MOVX 指令使用一个 8 位地址操作数（例如  @R1 ），则 16 位地址的高字节由外部存储器接口控制寄存器（EMI0CN，如图 16.1 所示）提供。注意：MOVX指令还用于写 FLASH  存储器。缺省情况下 MOVX  指令访问XRAM。EMIF 可被配置为使用低I/O 端口（P0-P3 ）或高I/O 端口（P4-P7 ）。]]></description>
			<content:encoded><![CDATA[<p><strong>外部数据存储器接口和片内XRAM</strong></p>
<p>C8051F020/1/1/3 MCU 内部有位于外部数据存储器空间的4096 字节片上RAM （XRAM ），还有外部数据存储器接口（EMIF），可用于访问片外存储器和存储器映射的I/O 器件。外部存储器空间可以用外部传送指令（MOVX ）和数据指针（DPTR ）访问，或者通过使用R0 或R1用间接寻址方式访问。如果 MOVX 指令使用一个 8 位地址操作数（例如  @R1 ），则 16 位地址的高字节由外部存储器接口控制寄存器（EMI0CN，如图 16.1 所示）提供。注意：MOVX指令还用于写 FLASH  存储器。缺省情况下 MOVX  指令访问<span style="background-color: #ffffff;">XRAM。EMIF 可被配置为使用低I/O 端口（P0-P3 ）或高I/O 端口（P4-P7 ）。</span></p>
<p><strong>配置外部存储器接口</strong></p>
<p>配置外部存储器接口的过程包括下面4 个步骤：</p>
<p>1. 将EMIF 选到低端口（P3、P2、P1 和P0 ）或选到高端口（P7、P6、P5 和P4 ）。<br />
2. 选择复用方式或非复用方式。<br />
3. 选择存储器模式（只用片内存储器、不带块选择的分片方式、带块选择的分片方式或只用片外存储器）。<br />
4. 设置与片外存储器或外设接口的时序。<br />
5. 选择所需要的相关端口的输出方式（寄存器PnMDOUT 和P74OUT ）。</p>
<p>下面将对上述每个步骤作出详细说明。端口选择、复用方式选择和存储器模式位都位于<span style="background-color: #ffffff;">EMI0CN 寄存器中，如下。</span></p>
<p align="center"><strong>EMI0CN:  外部存储器接口控制</strong></p>
<p>R/W       R/W      R/W      R/W     R/W      R/W      R/W     R/W   PGSEL7   PGSEL6  PGSEL5   PGSEL4  PGSEL3  PGSEL2  PGSEL1   PGSEL0        位7        位6      位5        位4      位3       位2       位1        位0</p>
<p>复位值:00000000   SFR地址: 0xAF<br />
位 7-0： PGSEL[7:0]：XRAM 页选择位</p>
<p>当使用 8 位的 MOVX 命令时，XRAM 页选择位提供 16 位外部数据存储器地址的高字节，实际上是选择一个256 字节的RAM 页。<br />
0&#215;00：0&#215;0000 – 0x00FF<br />
0&#215;01：0&#215;0100 – 0x01FF<br />
…<br />
0xFE：0xFE00 – 0xFEFF<br />
0xFF：0xFF00 – 0Xffff</p>
<p><strong>端口选择和配置</strong></p>
<p>外部存储器接口可以位于端口3、2、1 和0（C8051F020/1/2/3）或端口7、6、5 和4（只限于C8051F020/2），由PRTSEL 位（EMI0CF.5 ）的状态决定。如果选择低端口，则EMIFLE位（XBR2.1 ）必须被置‘1’，以使交叉开关跳过P0.7(W/R)、P0.6(R/D)和 P0.5(ALE，如果选择复用方式)。<br />
外部存储器接口只在执行片外 MOVX 指令期间使用相关的端口引脚。一旦 MOVX 指令执行完毕，端口锁存器或交叉开关又重新恢复对端口引脚的控制（端口 3、2、1 和 0）。端口锁存器应被明确地配置为使外部存储器接口引脚处于休眠状态，通常是通过将它们设置为逻辑‘1’来实现这一要求。<br />
在执行MOVX 指令期间，外部存储器接口将禁止所有作为输入的那些引脚的驱动器（例如，读操作期间的Data[7:0]）。端口引脚的输出方式（无论引脚被配置为漏极开路或是推挽方式）不受外部存储器接口操作的影响，始终受 PnMDOUT  寄存器的控制。</p>
<p align="center"><strong>EMI0CF:  外部存储器接口配置</strong></p>
<p>R/W       R/W     R/W     R/W     R/W      R/W      R/W     R/W</p>
<p>-         -     PRTSEL   EMD2    EMD1     EMD0    EALE1  EALE0</p>
<p>位7       位6    位5      位4     位3       位2      位1       位0    SFR地址： 0xA3复位值:00000011</p>
<p>位 7-6： 未用。读  = 00b，写  =      忽略。<br />
位 5：      PRTSEL ：EMIF 端口选择位<br />
0：EMIF 在P0-P3。<br />
1：EMIF 在P4-P7。<br />
位4：       EMD2 ：EMIF 复用方式选择位<br />
0：EMIF 工作在地址/数据复用方式。<br />
1：EMIF 工作在非复用方式（分离的地址和数据引脚）。<br />
位 3-2：  EMD1-0 ：EMIF 工作模式选择位<br />
这两位控制外部存储器接口的工作模式。<br />
00：只用内部存储器：MOVX 只寻址片内 XRAM 。所有有效地址都指向片内存储器空间。<br />
01：不带块选择的分片方式。寻址低于4K 边界的地址时访问片内存储器，寻址高于4K 边界的地址时访问片外存储器。8 位片外MOVX 操作使用地址高端口锁存器的当前内容作为地址的高字节。注意：为了能访问片外存储器空间，EMI0CN 必须被设置成一个不属于片内地址空间的页地址。</p>
<p>10：带块选择的分片方式。寻址低于4K 边界的地址时访问片内存储器，寻址高于 4K  边界的地址时访问片外存储器。8 位片外 MOVX  操作使用 EMI0CN           的内容作为地址的高字节。<br />
11：只用外部存储器：MOVX 只寻址片外XRAM 。片内XRAM 对 CPU 为不可见。<br />
位 1-0：  EALE1-0 ：ALE 脉冲宽度选择位（只在EMD2 =0 时有效）<br />
00：ALE 高和ALE 低脉冲宽度  = 1 个 SYSCLK 周期。<br />
01：ALE 高和ALE 低脉冲宽度  = 2 个 SYSCLK 周期。<br />
10：ALE 高和ALE 低脉冲宽度  = 3 个 SYSCLK 周期。<br />
11：ALE 高和ALE 低脉冲宽度  = 4 个 SYSCLK 周期。</p>
<p style="text-align: center;"><strong> 复用方式配置</strong><a href="http://woodfeed.com/wp-content/uploads/2009/12/163emif.jpg" rel="lightbox[535]"><img class="size-medium wp-image-538  aligncenter" title="163emif" src="http://woodfeed.com/wp-content/uploads/2009/12/163emif-300x194.jpg" alt="163emif" width="300" height="194" /></a></p>
<p style="text-align: center;"><strong>带块选择的8 位 MOVX：EMI0CF[4:2] =   ‘010’，</strong><span style="background-color: #ffffff;"><strong>带块选择的复用方式8 位 MOVX 时序</strong></span></p>
<p style="text-align: center;"><a href="http://woodfeed.com/wp-content/uploads/2009/12/8read.jpg" rel="lightbox[535]"><img class="size-medium wp-image-539  aligncenter" title="8read" src="http://woodfeed.com/wp-content/uploads/2009/12/8read-300x134.jpg" alt="8read" width="300" height="134" /></a></p>
<p style="text-align: center;"><a href="http://woodfeed.com/wp-content/uploads/2009/12/8write.jpg" rel="lightbox[535]"><img class="size-medium wp-image-540  aligncenter" title="8write" src="http://woodfeed.com/wp-content/uploads/2009/12/8write-300x137.jpg" alt="8write" width="300" height="137" /></a></p>
<p>EMIF在P4-P7的程序配置：</p>
<p><code>XBR0    = 0x07;                     // Enable SMBus, SPI0, and UART0<br />
XBR1    = 0x00;<br />
XBR2    = 0x44;                     // Enable crossbar and weak pull-ups<br />
EMI0CF=0x2d;                                          //外部存储器接口配置<br />
EMI0TC  = 0xff;                                //外部存储器时序控制<br />
P74OUT  = 0xFF;</code></p>
<h2  class="related_post_title">精彩文章</h2><ul class="related_post"><li><a href="http://woodfeed.com/uip-transplantation/" title="uIP移植">uIP移植</a><br /><small>uIP的设备驱动程序接口。uIP内核中有两个函数直接需要底层设备驱动程序的支持。一是ui...</small></li><li><a href="http://woodfeed.com/%e8%ae%a4%e9%a2%86%e5%8d%9a%e5%ae%a2/" title="认领博客">认领博客</a><br /><small>QQREADER5A506122C50B4B1D...</small></li><li><a href="http://woodfeed.com/tencent-micoblog-invite/" title="发放腾讯微博邀请码（每天更新）">发放腾讯微博邀请码（每天更新）</a><br /><small>发放腾讯微博邀请码（每天更新）...</small></li><li><a href="http://woodfeed.com/detailed-description-of-commonly-used-linux-commands-6/" title="Linux常用命令详解(6)">Linux常用命令详解(6)</a><br /><small>八 网络通迅
1 ifconfig 2 netconfig 3 netstat 4 pi...</small></li><li><a href="http://woodfeed.com/internet/" title="Internet">Internet</a><br /><small>主要内容：1、internet体系结构 
　2、internet连接的方法 
　3、...</small></li><li><a href="http://woodfeed.com/robot-control-of-linear-maze/" title="浅谈机器人在线迷宫中的控制策略问题">浅谈机器人在线迷宫中的控制策略问题</a><br /><small>循迹存在一些直道、弯道、丁字路口、十字路口、死胡同等多种情况。在“左手法则”下，如何合理...</small></li><li><a href="http://woodfeed.com/remote-control-system-based-on-avr-microcontroller/" title="基于AVR单片机的远程控制系统的研究">基于AVR单片机的远程控制系统的研究</a><br /><small>介绍了一种利用AVR单片机和RTL8019AS以太网控制器实现的RS232接口设备远程控...</small></li><li><a href="http://woodfeed.com/a-different-day/" title="不一样的一天">不一样的一天</a><br /><small>为什么不一样呢？因为天明了，又黑了，然后又亮了！——日全食。

传说中五百年一次的日全食...</small></li><li><a href="http://woodfeed.com/detailed-description-of-commonly-used-linux-commands-2/" title="Linux常用命令详解(2)">Linux常用命令详解(2)</a><br /><small>三 文件管理
1.Diff  2. find  3. ln  4.locate  5. ...</small></li><li><a href="http://woodfeed.com/photoshop-box/" title="PhotoShop作业&#8211;盒子">PhotoShop作业&#8211;盒子</a><br /><small>
 
去年做的一个作业，ps的处女作。...</small></li></ul>]]></content:encoded>
			<wfw:commentRss>http://woodfeed.com/c8051f020-external-data-memory-reuse-approach/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>C8051f020产生16位PWM</title>
		<link>http://woodfeed.com/implementing-16-bit-pwm-using-the-pca-with-c8051f020/</link>
		<comments>http://woodfeed.com/implementing-16-bit-pwm-using-the-pca-with-c8051f020/#comments</comments>
		<pubDate>Thu, 13 Aug 2009 10:35:39 +0000</pubDate>
		<dc:creator>vayu</dc:creator>
				<category><![CDATA[8051f020]]></category>
		<category><![CDATA[c8051]]></category>
		<category><![CDATA[pca]]></category>
		<category><![CDATA[pwm]]></category>

		<guid isPermaLink="false">http://woodfeed.com/?p=285</guid>
		<description><![CDATA[脉冲宽度调制（PWM）波形常用于闭环反馈和控制应用，例如：控制加热单元的开关状态以调节DWDM（波分复用）系统中激光器的温度。在某些应用中可编程计数器阵列（PCA）的内建8位PWM方式不能提供任务所需要的足够的分辨率。本应用笔记介绍如何用PCA的‘高速输出’方式和最小的软件开销来产生一个16位分辨率的PWM波形。]]></description>
			<content:encoded><![CDATA[<p>脉冲宽度调制（PWM）波形常用于闭环反馈和控制应用，例如：控制加热单元的开关状态以调节DWDM（波分复用）系统中激光器的温度。在某些应用中可编程计数器阵列（PCA）的内建8位PWM方式不能提供任务所需要的足够的分辨率。本应用笔记介绍如何用PCA的‘高速输出’方式和最小的软件开销来产生一个16位分辨率的PWM波形。<br />
用于闭环控制应用的PWM信号的频率并不重要，只要波形足够快就可以了，象控制系统的阶跃响应时间就应远远小于PWM信号的周期。信号所携带的的信息用波形的占空度来编码，占空度是波形为高电平的时间与PWM信号的周期之比。对于一个PWM实现来说，其输入是一个数值，通常为整数，该数值与所要求的输出波形的占空度成正比。<br />
在一个基于8051的设计中，有很多方法用于产生PWM波形:软件循环,查询或中断驱动的定时器等.本应用笔记中的例子使用可编程计数器阵列PCA.相对于任何查询机制基于软件或定时器而言,使用PCA产生PWM可以大大降低所需要的CPU带宽,并可以消除在中断驱动的基于定时器的设计中因中断延迟不一致而产生的时序抖动。<br />
PCA包含一个16位的计数器/定时器和5个捕捉/比较模块如图2所示计数器/定时器有一个16位的计数器/定时器寄存器PCA0H:PCA0L一个用于选择时间基准的方式寄存器PCA0MD和一个包含计数器/定时器运行控制及各模块捕捉/比较标志的控制寄存器PCA0CN每个捕捉/比较模块有一个用于选择模块工作方式边沿触发捕捉软件定时器高速输出或PWM的配置寄存器PCA0CPMx和一个16位的捕捉/比较寄存器。<br />
PCA0CPHn:PCA0CPLn由于所有的捕捉/比较模块共享一个时间基准因此它们同步工作例如在电机控制应用中可以提供锁相激励波形另外由于每个模块有其自己的控制和捕捉/比较寄存器因此每一个模块工作上又独立于其它模块只要任何一个模块的服务程序都不影响共享的时间基准停止或重新设置计数器/定时器改变计数器/定时器的时钟源本应用笔记中的例子将PCA配置为独立工作每个模块的服务程序只影响该模块的配置寄存器和捕捉/比较寄存器PCA方式寄存器设置一次后不再改变让计数器/定时器寄存器PCA0H: PCA0L自由运行。<br />
PCA包含一个16位的计数器/定时器和5个捕捉/比较模块。计数器/定时器有一个16位的计数器/定时器寄存器PCA0H:PCA0L、一个用于选择时间基准的方式寄存器PCA0MD和一个包含计数器/定时器运行控制及各模块捕捉/比较标志的控制寄存器PCA0CN。每个捕捉/比较模块有一个用于选择模块工作方式（边沿触发、捕捉软件、定时器高速输出或PWM）的配置寄存器PCA0CPMx和一个16位的捕捉/比较寄存器PCA0CPHn:PCA0CPLn。<br />
由于所有的捕捉/比较模块共享一个时间基准，因此它们同步工作，例如在电机控制应用中可以提供锁相激励波形。另外，由于每个模块有其自己的控制和捕捉/比较寄存器，因此每一个模块工作上又独立于其它模块，只要任何一个模块的服务程序都不影响共享的时间基准（停止或重新设置计数器/定时器、改变计数器/定时器的时钟源）。<br />
PCA的时基信号可以是下述四个时钟源之一SYSCLK/12、SYSCLK/4、定时器0溢出、或出现在一个外部引脚ECI上的下降沿。<br />
用PCA产生16位PWM  为了产生一个具有16位精度的PWM波形，我们将PCA模块配置为高速输出方式。在该方式下，每当主定时器/计数器的寄存器PCA0H:PCA0L与模块的捕捉/比较寄存器PCA0CPHn:PCA0CPLn相匹配时CEXn引脚发生电平转换并可以选择产生中断。</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">void</span> SysClkInit<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span><span style="color: #666666; font-style: italic;">//配置系统时钟</span>
&nbsp;
<span style="color: #009900;">&#123;</span>
 <span style="color: #993333;">int</span> n <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
 OSCXCN <span style="color: #339933;">=</span> <span style="color: #208080;">0x67</span><span style="color: #339933;">;</span>
 <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>n <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> n <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">255</span><span style="color: #339933;">;</span> n<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">;</span>
 <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#40;</span>OSCXCN <span style="color: #339933;">&amp;</span> <span style="color: #208080;">0x80</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #0000dd;">0</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 OSCICN <span style="color: #339933;">=</span> <span style="color: #208080;">0x0C</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">void</span> SystemInit<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span><span style="color: #666666; font-style: italic;">//系统配置</span>
<span style="color: #009900;">&#123;</span>
WDTCN <span style="color: #339933;">=</span> <span style="color: #208080;">0xDE</span><span style="color: #339933;">;</span>   <span style="color: #666666; font-style: italic;">// 关闭 WDT</span>
WDTCN <span style="color: #339933;">=</span> <span style="color: #208080;">0xAD</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">void</span> PortInit<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span><span style="color: #666666; font-style: italic;">//端口配置</span>
<span style="color: #009900;">&#123;</span>
<span style="color: #666666; font-style: italic;">//交叉开关配置</span>
 XBR0 <span style="color: #339933;">=</span> <span style="color: #208080;">0x10</span><span style="color: #339933;">;</span>
 XBR1 <span style="color: #339933;">=</span> <span style="color: #208080;">0x00</span><span style="color: #339933;">;</span>
 XBR2 <span style="color: #339933;">=</span> <span style="color: #208080;">0x40</span><span style="color: #339933;">;</span>
 <span style="color: #666666; font-style: italic;">// P0 口分配状况</span>
 <span style="color: #666666; font-style: italic;">// P0.0 = CEX0</span>
 <span style="color: #666666; font-style: italic;">// P0.1 = CEX0</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">void</span> PCA_Init<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
 EIE1 <span style="color: #339933;">|=</span> <span style="color: #208080;">0x08</span><span style="color: #339933;">;</span>
 PCA0MD <span style="color: #339933;">=</span> <span style="color: #208080;">0X01</span><span style="color: #339933;">;</span><span style="color: #666666; font-style: italic;">//系统时钟的12分频</span>
 PCA0L <span style="color: #339933;">=</span> <span style="color: #208080;">0x00</span><span style="color: #339933;">;</span>
 PCA0H <span style="color: #339933;">=</span> <span style="color: #208080;">0x00</span><span style="color: #339933;">;</span>
 PCA0CPM0 <span style="color: #339933;">=</span> <span style="color: #208080;">0xcb</span><span style="color: #339933;">;</span>
 PCA0CPM1 <span style="color: #339933;">=</span> <span style="color: #208080;">0xcb</span><span style="color: #339933;">;</span>
 PCA0CPM0 <span style="color: #339933;">|=</span> <span style="color: #208080;">0x40</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//开启CCFn中断</span>
 PCA0CPM1 <span style="color: #339933;">|=</span> <span style="color: #208080;">0x40</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//开启CCFn中断</span>
 <span style="color: #666666; font-style: italic;">//PWM频率计算：系统时钟/12/计数=22118400/12/65536=28.125</span>
&nbsp;
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">void</span> PCA_CPHL0<span style="color: #009900;">&#40;</span><span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span> PWM<span style="color: #009900;">&#41;</span>
&nbsp;
<span style="color: #009900;">&#123;</span>
 PCA0CN <span style="color: #339933;">&amp;=</span> ~<span style="color: #208080;">0x40</span><span style="color: #339933;">;</span>
 PCA0CPL0 <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #208080;">0xff</span> <span style="color: #339933;">&amp;</span>  PWM<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 PCA0CPH0 <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #208080;">0xff</span> <span style="color: #339933;">&amp;</span> <span style="color: #009900;">&#40;</span>PWM <span style="color: #339933;">&gt;&gt;</span> <span style="color: #0000dd;">8</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 PCA0CN <span style="color: #339933;">|=</span> <span style="color: #208080;">0x40</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">void</span> PCA_CPHL1<span style="color: #009900;">&#40;</span><span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span> PWM<span style="color: #009900;">&#41;</span>
&nbsp;
<span style="color: #009900;">&#123;</span>
 PCA0CN <span style="color: #339933;">&amp;=</span> ~<span style="color: #208080;">0x40</span><span style="color: #339933;">;</span>
 PCA0CPL1 <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #208080;">0xff</span> <span style="color: #339933;">&amp;</span> PWM<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 PCA0CPH1 <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #208080;">0xff</span> <span style="color: #339933;">&amp;</span><span style="color: #009900;">&#40;</span>PWM <span style="color: #339933;">&gt;&gt;</span> <span style="color: #0000dd;">8</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 PCA0CN <span style="color: #339933;">|=</span> <span style="color: #208080;">0x40</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">void</span> PCA_ISR<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span> interrupt <span style="color: #0000dd;">9</span>
<span style="color: #009900;">&#123;</span>
 <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>CCF0<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
 CCF0 <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
 <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>CCF1<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
 CCF1 <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
 <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>CF<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
 CF <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
 <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<h2  class="related_post_title">精彩文章</h2><ul class="related_post"><li><a href="http://woodfeed.com/a-different-day/" title="不一样的一天">不一样的一天</a><br /><small>为什么不一样呢？因为天明了，又黑了，然后又亮了！——日全食。

传说中五百年一次的日全食...</small></li><li><a href="http://woodfeed.com/autotools-generated-makefile/" title="利用autotools生成Makefile">利用autotools生成Makefile</a><br /><small>对于一个较大的项目而言，完全手动建立Makefile是一件费力而又容易出错的工作。aut...</small></li><li><a href="http://woodfeed.com/application-of-the-uip-tcpip-protocol-stack-in-the-51-mcu/" title="uIP TCP/IP协议栈在51系列单片机上的应用">uIP TCP/IP协议栈在51系列单片机上的应用</a><br /><small>　uIP 协议栈是一种免费的可实现的极小的TCP/IP协议栈，可以使用于由8位或16位微...</small></li><li><a href="http://woodfeed.com/mail-problem-in-windows-host-for-wp/" title="WordPress使用win主机出现的邮件问题">WordPress使用win主机出现的邮件问题</a><br /><small>邮件问题是很头痛的，我搞了N天，首先就是肯定用不了自带的mail()函数来发注册邮件和评...</small></li><li><a href="http://woodfeed.com/detail-to-explain-the-nfs-under-linux/" title="Linux下NFS详解">Linux下NFS详解</a><br /><small>NFS(Network File System)是一种分布式文件系统，允许网络中的安装不...</small></li><li><a href="http://woodfeed.com/interconnection-technology/" title="网络互连技术">网络互连技术</a><br /><small>主要内容：1、局域网互连 
　2、网络互连原理 
　3、无连接网络互连、各种路由选择...</small></li><li><a href="http://woodfeed.com/my-alexa-ranking-out/" title="alexa排名出来了">alexa排名出来了</a><br /><small>alexa上有排名了。...</small></li><li><a href="http://woodfeed.com/detailed-description-of-commonly-used-linux-commands-5/" title="Linux常用命令详解(5)">Linux常用命令详解(5)</a><br /><small>七 系统管理
1 adduser 2 passwd 3 date 4 exit 5 f...</small></li><li><a href="http://woodfeed.com/detailed-description-of-commonly-used-linux-commands-4/" title="Linux常用命令详解(4)">Linux常用命令详解(4)</a><br /><small>五 磁盘维护
1 mkfs(make file system)
六 系统设置
1 exp...</small></li><li><a href="http://woodfeed.com/remote-temperature-control-and-gathering-used-the-web-based-on-c8051f020-mcu/" title="基于C8051F020单片机的Web远程控制的温度采集系统">基于C8051F020单片机的Web远程控制的温度采集系统</a><br /><small>      随着互联网的日益普及，各种家电设备、仪器仪表以及工业生产中的数据采集与控制设...</small></li></ul>]]></content:encoded>
			<wfw:commentRss>http://woodfeed.com/implementing-16-bit-pwm-using-the-pca-with-c8051f020/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C8051F02X外部存储器接口和I/O端口配置</title>
		<link>http://woodfeed.com/c8051f02x-external-memory-interface-and-i-o-port-configuration/</link>
		<comments>http://woodfeed.com/c8051f02x-external-memory-interface-and-i-o-port-configuration/#comments</comments>
		<pubDate>Thu, 30 Jul 2009 03:51:01 +0000</pubDate>
		<dc:creator>vayu</dc:creator>
				<category><![CDATA[8051f020]]></category>

		<guid isPermaLink="false">http://woodfeed.com/c8051f02x%e5%a4%96%e9%83%a8%e5%ad%98%e5%82%a8%e5%99%a8%e6%8e%a5%e5%8f%a3%e5%92%8cio%e7%ab%af%e5%8f%a3%e9%85%8d%e7%bd%ae.html</guid>
		<description><![CDATA[介绍美国Cygnal公司生产的C8051F02X系列单片机的外部存储器接口、I/O端口配置方法和有关注意的问题；在此基础上列举两个关于EMIF、I/O的配置应用。]]></description>
			<content:encoded><![CDATA[<p><strong> </strong></p>
<p>作者:魏永红 张勉 赵捷 来源:单片机与嵌入式系统应</p>
<p><strong>摘要：</strong>介绍美国Cygnal公司生产的C8051F02X系列单片机的外部存储器接口、I/O端口配置方法和有关注意的问题；在此基础上列举两个关于EMIF、I/O的配置应用。</p>
<p><strong>关键词：</strong>C8051F02X EMIF I/O 交叉开关</p>
<p>美国Cygnal公司C8051F02X系列单片机是集成在一起芯片上的混合信号系统级单片机。该单片机具有32/64位数字I/O端口（引脚）、25MIPS高速流水线式8051微控制器内核、64KB在系统可编程Flash存储器、 64KB地址的外部存储器接口、4352（4096+256）B片内RAM、各自独立的SPI、SMBUS/I2C和两个UART串行接口等特点。其最突出的优点就是，通过设置交叉开关寄存器控制片内数字资源映射到外部I/O引脚，这就允许用户根据自己的特定应用，选择通用I/O端口和所需要数字资源。当然，在设置数字交叉开关寄存器时，应该首先考虑EMIF的配置问题。其配置不同，将导致单片机通过不同的端口（低或高）访问片外存储器和存储器映像的 I/O部件，以及数字交叉开关是否分配外部设备给P0.7(WR)、P0.6（RD）、P0.5（ALE）引脚。（如图EMIF设置为多路器模式。）</p>
<p><strong>1 EMIF和I/O配置方法</strong></p>
<p>1.1 外部存储器接口（EMIF）配置</p>
<p>C8051F02X系列MCU有4KB的RAM可以只映射在片内，也可以映射在64KB外部数据存储器地址空间，还可以同时映射到片内和片外（4KB地址以内在片内存储器空间访问，4KB以上经过EMIF访问）三种方式。对于后两种存储器工作模式，需通过外部存储器接口使用MOVX和DPTR或MOVX和R0（R1）指令访问外部数据存储器和存储器映像的I/O设备。但是对于高8位地址，必须由外部存储器接口寄存器（EMI0CN）提供；而EMIF可将外部数据存储器接口映射到低端口（P0～P3）（F020/2/3系列）或高端口（P4～P7）（F020/2系列），以及配置为复用模式或非复用模式等。配置外部存储器接口的步骤下：</p>
<p>*设置EMIF为低端口或高端口；</p>
<p>*设置EMIF为复用模式或非复用模式；</p>
<p>*选择存储器模式（片内方式、无块选择分片方式、带块选择分片方式、片外方式）；</p>
<p>*设置片外存储器或片外设备时基；</p>
<p>*选择相关I/O端口（寄存器PnMOUT、P74OUT）的输出模式。</p>
<p>外部存储器接口（EMI）映射为低端口（P0～P3）即PRTSEL位（EMIOCH.5）置为0，如PRTSEL位置为1，EMI映射为高端口（P4～P7）（适用于P020/2系列）。此时如果EMIFLE位（XBR2.5）被设置为逻辑1，那么，数字交叉开关将不分配外部设备给P0.7（WR）、P0.6（RD）、P0.5（ALE）引脚（如果EMI设置为多中模式）；如果EMIFLE位设为0，那么P0.7、P0.6、P0.5引脚的功能将由交叉开关寄存器或端口锁存器来决定。外部存储器接口只有执行片外 MOVX指令期间使用相关的端口引脚，一旦MOVX指令执行完毕，端口锁存器或交叉开关寄存器又重新恢复对端口引脚的控制。</p>
<p>1.2 I/O端口配置</p>
<p>数字交叉开关译码器按照被使用设备的优先权顺序将端口P0～P7的引脚分配给外部数字外设。端口引脚的分配是从P0.0开始，没有被使用的引脚可作为一般通用的I/O引脚，通过读写相应的端口数据寄存器访问。在数字交叉开关寄存器XBR0、 XBR1、XBR2中将相应的内部数字资源使能位置1，数字资源就映射到I/O端口引脚。例如：将UART0EN位（XBR0.2）置为1，那么，TX0 和RX0引脚被分别映射到P0.0和P0.1。因为UART0具有最高的优先权，故在它的使能位置1时，TX0和RX0引脚总是被映射到P0.0和 P0.1。如果一个数字外设的使能位没有置1，它的端口的I/O引脚上是不能被访问的。数字交叉开关寄存器被正确配置以后，通过置XBARE （XBR2.4）位1来使能交叉开关。在交叉开关使能后。P0～P3（F020/1/2/3系列）或P0～P7（F020/2系列）输出驱动自动被禁止，从而避免了交叉开关寄存器和其它寄存器写入时在端口引脚上产生的冲突。注意：对于由交叉开关分配的输入引脚（如T0、INT0、RX0等），其输出驱动自动被禁止，因此，端口数据寄存器和PnMDOUT寄存器的值对这些引脚的状态没有影响。</p>
<p>在给单片机内部数字资源分配了相应的I/O引脚后，还应设置其输出方式：推挽和漏极开路。 PnMDOUT寄存器各位决定P0～P7端口引脚的输出方式，某一位置1，则该位为推挽输出方式；置0，为漏极开路输出方式。PnMDOUT寄存器控制端口引脚的输出方式，而与交叉开关是否把端口引脚分配给数字外设无关。注意：对于由交叉开关分配的输入引脚（如：SDA、SCL、RX0、RX1等）自动配置为漏极开路方式，而与相应的端口配置寄存器的设置无关。但对于一般的I/O引脚配置为输入时，与这一引脚相关的PnMDOUT设置为漏极开路，同时端口配置寄存器位必须清0。</p>
<p>尽管在C8051F021/3中P4、P5、P6和P7没有对应的引脚，但端口数据寄存器仍然存在，并可为软件所用。由于数字输入通路保持活动状态，所以建议不要将这些引脚处于“悬空”状态，避免因输入浮空为无效逻辑电平而导致不必要的功率消耗。下面的三种方法可以防止这种情况的发生：</p>
<p>①通过将WEAKPUD（XBR2.7）设置为逻辑0来使能弱上拉部件；</p>
<p>②通过写P74OUT=0xFF，将P4、P5、P6和P7的输出方式配置为推挽方式；</p>
<p>③通过向端口数据寄存器写0，将P4、P5、P6和P7的输出状态强制为逻辑0，即P4=0&#215;00、P5=0&#215;00、P6=0&#215;00、P7=0&#215;00。</p>
<p><strong>2 EMIF和I/O端口配置应用</strong></p>
<p>下面应用基于C8051F021/3单片机，也适应于C8051F020/2单片机。</p>
<p>*假设有一应用需要配置UART0、SMBus、UART1、INT0和INT1（8位），存储器的工作模式为片内方式；另外，P1端口作为4×4键盘的接口，P2、P3口作为通用的I/O端口。该应用的EMIF和I/O端口配置如下：</p>
<p>①设EMI的配置寄存器FMI0CF=0&#215;00，因为本应用无扩展存储器和存储器映像的I/O设备，即存储器工作模式为片内方式；同时，将EMIFLE（XBR2.5）设置为0，这样P0.7、P0.5的引脚将由交叉开关寄存器或端口锁存器来决定，不被交叉开关跳过。</p>
<p>②按UART0EN=1、UART1EN=1、SMB0EN=1、INT0E=1、INT1E=1和EMIFLE=0，设置XBR0、XBR1、XBR2为XBR0=0&#215;05、XBR1=0&#215;14、XBR2=0&#215;04。</p>
<p>③配置P1端口为数字输入模式，即P1MDIN=0xFF；P1端口低四位为键盘输出，高四位为输入，即P1MDOUT=0x0FH（P1.0～P1.3为推挽方式，P1.4～P1.7为漏极开路方式），P1|=0xF0。</p>
<p>④使能交叉开关，即XBARE=1、XBR2=0&#215;44。</p>
<p>因为EMIFLE=0，交叉开关译码器将不跳过P0.7、P0.6、P0.5引脚，所以按优先极交叉开关译码表进行分配。UART0具有最高优先极，故P0.0分配给TX0，P0.1分配给RX0；SMBus的SDA、SCL分别分配在 P0.2、P0.3引脚；UART1的TX1、RX1分别分配在P0.4、P0.5引脚；INT0分配在P0.6引脚；INT1分配在P0.7引脚。</p>
<p>⑤设置UART0的TX0引脚（TX0、P0.0）、UART1的TX1引脚（TX1，P0.4）为推挽输出方式，即P0MDOUT=0&#215;11。RX0、SDA、SCL、RX1、INT0和INT1是由交叉开关分配输入的，因此与其端口配置寄存器的值无关。</p>
<p>⑥P2、P3作为一般I/O端口初始化为输入状态，即P2MDOUT=0&#215;00、P2=0xFF和P3MDOUT=0&#215;00、P3=0xFF。</p>
<p>引脚功能如表1所列。<br />
<strong>表1</strong></p>
<p><a href="http://woodfeed.com/wp-content/uploads/2009/07/tab1.jpg" rel="lightbox[138]"><img style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" title="tab1" src="http://woodfeed.com/wp-content/uploads/2009/07/tab1_thumb.jpg" border="0" alt="tab1" width="568" height="53" /></a></p>
<p>*设现有一应用需要UART0、SMBus、UART1、INT0和INT1共8位。另外，存储器工作方式为带块选择的分片方式，EMIF为复用模式、低端口，并配置P1.2、P1.3、P1.4为模拟输入模式，通过这三个引脚利用ADC1 来测量输入电压。具体配置步骤如下：</p>
<p>①配置EMI为复用模式和工作在低端口，即PRTSEL=0，EMD2=0；存储器模式为带块选择的分片方式，即EMD1～0=10；ALE时基设为2个SYSCLK周期，即EALE1～0=01。</p>
<p>②按UART0EN=1、UART1EN=1、SYB0EN=1、INT0E=1、INT1E和EMIFLE=1，设置XBR0、XBR1、XBR2为XBR0=0&#215;05、XBR1=0&#215;14、XBR2=0&#215;42。</p>
<p>③配置P1端口的P1.2、P1.3、P1.4为模拟输入模式，这些引脚对应的位在P1MDIN寄存器中置为0，即P1MDIN=0xE3。</p>
<p>④使能交叉开关，即XBARE=1、XBR2=0&#215;46。</p>
<p>UART0具有最高优先权，故P0.0分配给TX0，P0.1分配给RX0；依次按照优先极分配表，SMBus的SDA、SCL分配在P0.2、P0.3引脚；UART1的TX1、RX1分配在P0.4、P1.0引脚。因为EMI工作在低端口且为复用模式，交叉开关译码器将不分配内部数字资源给P0.7(WR)、P0.6(RD)、P0.5(ALE)，所以，RX1按次序分配在P1.0引脚， INT0分配在P1.1引脚。由于P1.2、P1.3、P1.4被配置为模拟输入，交叉开关跳过这些引脚，故INT1分配在P1.5引脚。在执行片外 MOVX指令时，EMI将驱动P2和P3端口。</p>
<p>⑤配置UART0的TX0引脚（TX0，P0.0）、UART1的TX1引脚（TX1，P0.4）、P0.7(WR)、P03.6(RD)、P0.5(ALE)为推挽输出方式，即P0MDOUT=0xF1。</p>
<p>⑥配置EMIF的端口（P2、P3）输出为推挽方式，即P2MDOUT=0xFF和P3MDOUT=0xFF。</p>
<p>⑦通过设置P1MDOUT=0&#215;00(输出为开漏极)和P1=0xFF(P1为高阻状态)来禁止P1.2、P1.3、P1.4三个模拟输入引脚的输出驱动器。</p>
<p>引脚功能如表2所列。<br />
<strong>表2</strong></p>
<p><a href="http://woodfeed.com/wp-content/uploads/2009/07/tab2.jpg" rel="lightbox[138]"><img style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" title="tab2" src="http://woodfeed.com/wp-content/uploads/2009/07/tab2_thumb.jpg" border="0" alt="tab2" width="564" height="83" /></a></p>
<p><strong>3 总结</strong></p>
<p>C8051F02X具有低功耗（3V工作电压）、大容量存储器、高速度、高集成度等特点，广泛应用于工业控制、测量系统、报警系统。该单片机具有双串行口，更适合于定位和报警系统的前端，从而提高移动终端集成度和降低功耗。</p>
<h2  class="related_post_title">相关文章</h2><ul class="related_post"><li><a href="http://woodfeed.com/mcu-c8051f020-and-mcu-80c51/" title="C8051F020与80C51单片机的异同点">C8051F020与80C51单片机的异同点</a><br /><small>80C51系列单片机及其衍生产品在我国乃至全世界范围获得了非常广泛的应用。单片机领域的大...</small></li><li><a href="http://woodfeed.com/remote-temperature-control-and-gathering-used-the-web-based-on-c8051f020-mcu/" title="基于C8051F020单片机的Web远程控制的温度采集系统">基于C8051F020单片机的Web远程控制的温度采集系统</a><br /><small>      随着互联网的日益普及，各种家电设备、仪器仪表以及工业生产中的数据采集与控制设...</small></li></ul>]]></content:encoded>
			<wfw:commentRss>http://woodfeed.com/c8051f02x-external-memory-interface-and-i-o-port-configuration/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
	</channel>
</rss>
