📄 用单片机进行串并行数据转化及其在家用电器控制中的应用.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0153)http://72.14.235.104/search?q=cache:3vdmrGstnisJ:www.eetchina.com/ARTICLES/2006JAN/PDF/EECOL_2006JAN12_CTRLD_EMS_NT_34.PDF+74hc164&hl=zh-CN&ct=clnk&cd=10 -->
<HTML><HEAD><TITLE>用单片机进行串并行数据转化及其在家用电器控制中的应用</TITLE>
<META http-equiv=Content-Type content="text/html; charset=UTF-8">
<META content="MSHTML 6.00.2900.2995" name=GENERATOR></HEAD>
<BODY vLink=blue link=blue bgColor=#ffffff>
<TABLE width="100%" border=1>
<TBODY>
<TR>
<TD>
<TABLE cellSpacing=0 cellPadding=10 width="100%" bgColor=#ffffff border=1
color="#ffffff">
<TBODY>
<TR>
<TD><FONT face=arial,sans-serif color=black size=-1>这是 <A
href="http://www.eetchina.com/ARTICLES/2006JAN/PDF/EECOL_2006JAN12_CTRLD_EMS_NT_34.PDF"><FONT
color=blue>http://www.eetchina.com/ARTICLES/2006JAN/PDF/EECOL_2006JAN12_CTRLD_EMS_NT_34.PDF</FONT></A>
的 HTML 档。<BR><B><FONT color=#0039b6>G</FONT> <FONT
color=#c41200>o</FONT> <FONT color=#f3c518>o</FONT> <FONT
color=#0039b6>g</FONT> <FONT color=#30a72f>l</FONT> <FONT
color=#c41200>e</FONT></B> 在网路漫游时会自动将档案转换成 HTML 网页来储存。<BR>请使用网址
<CODE>http://www.google.com/search?q=cache:3vdmrGstnisJ:www.eetchina.com/ARTICLES/2006JAN/PDF/EECOL_2006JAN12_CTRLD_EMS_NT_34.PDF+74hc164&hl=zh-CN&ct=clnk&cd=10</CODE>
链接此页或将其做成书签。</FONT><BR><BR>
<CENTER><FONT size=-1><I>Google
和网页作者无关,不对网页的内容负责。</I></FONT></CENTER></TD></TR>
<TR>
<TD>
<TABLE cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR>
<TD><FONT face=arial,sans-serif color=black
size=-1>这些搜索字词都已标明如下: </FONT></TD>
<TD bgColor=#ffff66><B><FONT face=arial,sans-serif color=black
size=-1>74hc164 </FONT></B></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
<HR>
<META content="D:20060111142914+08'00'" name=ModDate>
<META content="D:20060111142854+08'00'" name=CreationDate>
<META content="Acrobat Distiller 6.0 (Windows)" name=Producer>
<META content=9 name=Author>
<META content=9 name=Company>
<META content=D:20060111062850 name=SourceModified>
<TABLE width="100%" border=0>
<TBODY>
<TR>
<TD align=right bgColor=#eeeeee><FONT face=arial,sans-serif><A
name=1><B>Page 1</B></A></FONT></TD></TR></TBODY></TABLE><FONT face=Times
size=3><SPAN style="FONT-SIZE: 16px; FONT-FAMILY: Times">
<DIV
style="LEFT: 211px; POSITION: absolute; TOP: 311px"><NOBR>用单片机进行串并行数据转化及其在家用电器控制中的应用
</NOBR></DIV></SPAN></FONT><FONT face=Times size=3><SPAN
style="FONT-SIZE: 13px; FONT-FAMILY: Times">
<DIV
style="LEFT: 135px; POSITION: absolute; TOP: 360px"><NOBR>在家用电器控制中,数据将串并行转换是经常进行的,这是因为很多时候我们需要并行的数</NOBR></DIV>
<DIV
style="LEFT: 135px; POSITION: absolute; TOP: 384px"><NOBR>据传输,比如驱动一个七段显示器显示出数据出来,就需要至少
7 比特的并行数据。而如果</NOBR></DIV>
<DIV
style="LEFT: 135px; POSITION: absolute; TOP: 407px"><NOBR>一个家电产品中同时有多个七段显示器以及各种按键等,则并行数据量就更大了。而单片机</NOBR></DIV>
<DIV
style="LEFT: 135px; POSITION: absolute; TOP: 431px"><NOBR>输入输出端口总是有限的,为了能够完成家用电器的更多的控制功能,用来驱动这些并行数</NOBR></DIV>
<DIV
style="LEFT: 135px; POSITION: absolute; TOP: 454px"><NOBR>据的端口只能限定在少数的几个。为了达到少数的输入输出端口来控制大量的外部设备,就</NOBR></DIV>
<DIV style="LEFT: 135px; POSITION: absolute; TOP: 477px"><NOBR>需要将串行数据转换到并行数据。
</NOBR></DIV>
<DIV
style="LEFT: 135px; POSITION: absolute; TOP: 524px"><NOBR>通常这种串行数据转换到并行数据的过程通过单片机以及外部的移位锁存器来完成。下面的</NOBR></DIV>
<DIV style="LEFT: 135px; POSITION: absolute; TOP: 548px"><NOBR>内容介绍 Holtek 单片机
46R47 配合 <B style="COLOR: black; BACKGROUND-COLOR: #ffff66">74HC164</B>
移位锁存器来实现串行数据到并行数据的转化,</NOBR></DIV>
<DIV
style="LEFT: 135px; POSITION: absolute; TOP: 571px"><NOBR>并探讨如何将其应用到键盘扫描和显示之中。
</NOBR></DIV>
<DIV style="LEFT: 135px; POSITION: absolute; TOP: 622px"><NOBR>一、</NOBR></DIV>
<DIV style="LEFT: 189px; POSITION: absolute; TOP: 622px"><NOBR>串并行数据的转换
</NOBR></DIV>
<DIV style="LEFT: 135px; POSITION: absolute; TOP: 683px"><NOBR>1.
用两个端口实现所有按键的扫描</NOBR></DIV>
<DIV
style="LEFT: 135px; POSITION: absolute; TOP: 734px"><NOBR>由于单片机的端口有限,且每个端口都有特定的应用,对于单片机的按键事件处理来说,如</NOBR></DIV>
<DIV
style="LEFT: 135px; POSITION: absolute; TOP: 757px"><NOBR>果把所有的端口都使用上肯定是不经济的,所以在电磁炉单片机电路的设计过程中,通常都</NOBR></DIV>
<DIV
style="LEFT: 135px; POSITION: absolute; TOP: 781px"><NOBR>只用一个端口来输出按键扫描的数据信号,因为只有一个端口,所以
8 比特的数据要从这一</NOBR></DIV>
<DIV
style="LEFT: 135px; POSITION: absolute; TOP: 804px"><NOBR>端口输出,只能按顺序串行输出了,这就涉及到一个串行数据到并行数据的转换问题,在电</NOBR></DIV>
<DIV style="LEFT: 135px; POSITION: absolute; TOP: 828px"><NOBR>磁炉电路中,比较广泛使用 <B
style="COLOR: black; BACKGROUND-COLOR: #ffff66">74HC164</B> 来实现这种转换。
</NOBR></DIV>
<DIV style="LEFT: 135px; POSITION: absolute; TOP: 874px"><NOBR><B
style="COLOR: black; BACKGROUND-COLOR: #ffff66">74HC164</B>
是比较典型的移位寄存器,该移位寄存器有一个数据输入端口、一个时钟信号端口</NOBR></DIV>
<DIV style="LEFT: 135px; POSITION: absolute; TOP: 898px"><NOBR>和八个输出端口。如图 1 所示。
</NOBR></DIV></SPAN></FONT><FONT face=Times size=3><SPAN
style="FONT-SIZE: 11px; FONT-FAMILY: Times">
<DIV style="LEFT: 347px; POSITION: absolute; TOP: 939px"><NOBR>D0 D1 D2 D3 D4 D5
D6 D7</NOBR></DIV>
<DIV style="LEFT: 434px; POSITION: absolute; TOP: 1009px"><NOBR><B
style="COLOR: black; BACKGROUND-COLOR: #ffff66">74HC164</B> </NOBR></DIV>
<DIV
style="LEFT: 352px; POSITION: absolute; TOP: 1103px"><NOBR>串行数据输入</NOBR></DIV>
<DIV
style="LEFT: 500px; POSITION: absolute; TOP: 1103px"><NOBR>时钟输入</NOBR></DIV></SPAN></FONT><FONT
face=Times size=3><SPAN style="FONT-SIZE: 13px; FONT-FAMILY: Times">
<DIV style="LEFT: 389px; POSITION: absolute; TOP: 1155px"><NOBR>图 1 <B
style="COLOR: black; BACKGROUND-COLOR: #ffff66">74HC164</B> 个引脚 </NOBR></DIV>
<DIV
style="LEFT: 135px; POSITION: absolute; TOP: 1202px"><NOBR>当时钟信号从低电平变为高电平的时候将输出一个数据到输出端
D0,当时钟第二次由低电</NOBR></DIV>
<DIV
style="LEFT: 135px; POSITION: absolute; TOP: 1225px"><NOBR>平变为高电平的时候将输出第二个数据到
D0,而第一个数据将转移到 D1 端口。依此类推,</NOBR></DIV>
<DIV
style="LEFT: 135px; POSITION: absolute; TOP: 1249px"><NOBR>每一个时钟周期中都有一个串行数据输出到
D0,而其他的数据则不断往高位移动直到所有</NOBR></DIV>
<DIV
style="LEFT: 135px; POSITION: absolute; TOP: 1272px"><NOBR>数据传输结束。如果不再有时钟周期输入,则这些数据将暂存在输出端。
</NOBR></DIV></SPAN></FONT><FONT face=Times size=3><SPAN
style="FONT-SIZE: 11px; FONT-FAMILY: Times">
<DIV
style="LEFT: 751px; POSITION: absolute; TOP: 1348px"><NOBR>1</NOBR></DIV></SPAN></FONT>
<DIV style="LEFT: 0px; POSITION: absolute; TOP: 1438px">
<HR>
<TABLE width="100%" border=0>
<TBODY>
<TR>
<TD align=right bgColor=#eeeeee><FONT face=arial,sans-serif><A
name=2><B>Page 2</B></A></FONT></TD></TR></TBODY></TABLE></DIV><FONT face=Times
size=3><SPAN style="FONT-SIZE: 13px; FONT-FAMILY: Times">
<DIV
style="LEFT: 135px; POSITION: absolute; TOP: 1550px"><NOBR>如果需要有更多的输出端口,可以把多个 <B
style="COLOR: black; BACKGROUND-COLOR: #ffff66">74HC164</B> 串联起来用。串联的方法如图 2 所示。
</NOBR></DIV></SPAN></FONT><FONT face=Times size=3><SPAN
style="FONT-SIZE: 11px; FONT-FAMILY: Times">
<DIV style="LEFT: 272px; POSITION: absolute; TOP: 1684px"><NOBR><B
style="COLOR: black; BACKGROUND-COLOR: #ffff66">74HC164</B> </NOBR></DIV>
<DIV style="LEFT: 185px; POSITION: absolute; TOP: 1614px"><NOBR>D0 D1 D2 D3 D4
D5 D6 D7</NOBR></DIV>
<DIV style="LEFT: 569px; POSITION: absolute; TOP: 1684px"><NOBR><B
style="COLOR: black; BACKGROUND-COLOR: #ffff66">74HC164</B> </NOBR></DIV>
<DIV style="LEFT: 482px; POSITION: absolute; TOP: 1614px"><NOBR>D0 D1 D2 D3 D4
D5 D6 D7 </NOBR></DIV>
<DIV
style="LEFT: 190px; POSITION: absolute; TOP: 1802px"><NOBR>串行数据输入</NOBR></DIV>
<DIV
style="LEFT: 338px; POSITION: absolute; TOP: 1802px"><NOBR>时钟输入</NOBR></DIV></SPAN></FONT><FONT
face=Times size=3><SPAN style="FONT-SIZE: 13px; FONT-FAMILY: Times">
<DIV style="LEFT: 374px; POSITION: absolute; TOP: 1854px"><NOBR>图 2 两个锁存器串联
</NOBR></DIV>
<DIV style="LEFT: 135px; POSITION: absolute; TOP: 1901px"><NOBR>在上图的串联电路中,左边的锁存器
D7 与右边锁存器的串行数据输入端连接,当左边的锁</NOBR></DIV>
<DIV style="LEFT: 135px; POSITION: absolute; TOP: 1924px"><NOBR>存器 D0D7
数据全部输出以后,再输入一个串行信号,左边锁存器 D7 数据将作为右边锁存</NOBR></DIV>
<DIV style="LEFT: 135px; POSITION: absolute; TOP: 1948px"><NOBR>器的输入数据并从右边锁存器 D0
端输出,从而实现了多个字节数据的移位锁存。这样利用</NOBR></DIV>
<DIV style="LEFT: 135px; POSITION: absolute; TOP: 1971px"><NOBR><B
style="COLOR: black; BACKGROUND-COLOR: #ffff66">74HC164</B> 就实现了串行数据到并行数据的转换。
</NOBR></DIV>
<DIV
style="LEFT: 135px; POSITION: absolute; TOP: 2018px"><NOBR>注意到在上面的两个图中,无论输出什么长度的数据,所需要的输入信号都只有两个,一个</NOBR></DIV>
<DIV
style="LEFT: 135px; POSITION: absolute; TOP: 2041px"><NOBR>是串行数据输入,另一个是锁存器的时钟信号输入。如果我们把这两个输入端口连接到单片</NOBR></DIV>
<DIV
style="LEFT: 135px; POSITION: absolute; TOP: 2065px"><NOBR>机的两个输出端口上,其中单片机的一个端口串行输出数据,另一个端口输出时钟信号以便</NOBR></DIV>
<DIV
style="LEFT: 135px; POSITION: absolute; TOP: 2088px"><NOBR>控制串行数据的锁存方式,那么我们就只需要两个单片机端口几乎实现任意数量按键的扫</NOBR></DIV>
<DIV style="LEFT: 135px; POSITION: absolute; TOP: 2111px"><NOBR>描。 </NOBR></DIV>
<DIV style="LEFT: 135px; POSITION: absolute; TOP: 2163px"><NOBR>2.串行数据到并行数据的转换程序
</NOBR></DIV>
<DIV style="LEFT: 135px; POSITION: absolute; TOP: 2214px"><NOBR>Holtek 系列的单片机具有
C 语言编程开发的功能,所以在编写相关程序的时候可以很方便</NOBR></DIV>
<DIV style="LEFT: 135px; POSITION: absolute; TOP: 2238px"><NOBR>地使用 C
语言来进行编程。下面的程序就能够实现将串行数据变成并行数据。 </NOBR></DIV>
<DIV style="LEFT: 135px; POSITION: absolute; TOP: 2285px"><NOBR>程序 1:
</NOBR></DIV>
<DIV style="LEFT: 189px; POSITION: absolute; TOP: 2331px"><NOBR>void
serial_output(){ </NOBR></DIV>
<DIV style="LEFT: 418px; POSITION: absolute; TOP: 2331px"><NOBR>//串行输出子程序
</NOBR></DIV>
<DIV style="LEFT: 213px; POSITION: absolute; TOP: 2355px"><NOBR>int i;
</NOBR></DIV>
<DIV style="LEFT: 387px; POSITION: absolute; TOP: 2355px"><NOBR>//局部变量 i
</NOBR></DIV>
<DIV
style="LEFT: 213px; POSITION: absolute; TOP: 2378px"><NOBR>for(i=0;i<8;i++){
</NOBR></DIV>
<DIV style="LEFT: 418px; POSITION: absolute; TOP: 2378px"><NOBR>//循环 8 次
</NOBR></DIV>
<DIV
style="LEFT: 236px; POSITION: absolute; TOP: 2402px"><NOBR>serial_data=hc164_data7;
//将 hc164_data 变量的第 7 位(最高位)传</NOBR></DIV>
<DIV style="LEFT: 135px; POSITION: absolute; TOP: 2425px"><NOBR>送到串行数据输入端
</NOBR></DIV>
<DIV style="LEFT: 237px; POSITION: absolute; TOP: 2448px"><NOBR>serial_clock=0;
</NOBR></DIV>
<DIV style="LEFT: 418px; POSITION: absolute; TOP: 2448px"><NOBR>//将时钟信号设为低电平
</NOBR></DIV>
<DIV style="LEFT: 237px; POSITION: absolute; TOP: 2472px"><NOBR>serial_clock=1;
</NOBR></DIV>
<DIV
style="LEFT: 418px; POSITION: absolute; TOP: 2472px"><NOBR>//再将时钟信号设置为高电平,将输出一个时钟信</NOBR></DIV>
<DIV style="LEFT: 135px; POSITION: absolute; TOP: 2495px"><NOBR>号的上升沿
</NOBR></DIV>
<DIV style="LEFT: 236px; POSITION: absolute; TOP: 2519px"><NOBR>hc164_data
<<= 1; </NOBR></DIV>
<DIV style="LEFT: 418px; POSITION: absolute; TOP: 2519px"><NOBR>//hc164_data
变量左移一位 </NOBR></DIV>
<DIV style="LEFT: 213px; POSITION: absolute; TOP: 2542px"><NOBR>} </NOBR></DIV>
<DIV style="LEFT: 387px; POSITION: absolute; TOP: 2542px"><NOBR>//循环结束
</NOBR></DIV>
<DIV style="LEFT: 189px; POSITION: absolute; TOP: 2565px"><NOBR>} </NOBR></DIV>
<DIV style="LEFT: 387px; POSITION: absolute; TOP: 2565px"><NOBR>//子程序结束
</NOBR></DIV></SPAN></FONT><FONT face=Times size=3><SPAN
style="FONT-SIZE: 11px; FONT-FAMILY: Times">
<DIV
style="LEFT: 751px; POSITION: absolute; TOP: 2611px"><NOBR>2</NOBR></DIV></SPAN></FONT>
<DIV style="LEFT: 0px; POSITION: absolute; TOP: 2701px">
<HR>
<TABLE width="100%" border=0>
<TBODY>
<TR>
<TD align=right bgColor=#eeeeee><FONT face=arial,sans-serif><A
name=3><B>Page 3</B></A></FONT></TD></TR></TBODY></TABLE></DIV><FONT face=Times
size=3><SPAN style="FONT-SIZE: 13px; FONT-FAMILY: Times">
<DIV
style="LEFT: 135px; POSITION: absolute; TOP: 2836px"><NOBR>在上面的程序中,首先设置了一个临时存放数据的无符号变量
hc164_data,该变量用来存</NOBR></DIV>
<DIV style="LEFT: 135px; POSITION: absolute; TOP: 2860px"><NOBR>放将要从单片机 PA.1
端口串行输出的数据。另外还有两个变量 serial_data 和</NOBR></DIV>
<DIV
style="LEFT: 135px; POSITION: absolute; TOP: 2883px"><NOBR>serial_clock,这两个变量分别对应端口
PA.1 和 PA.2。变量具体的定义方法如下: </NOBR></DIV>
<DIV style="LEFT: 135px; POSITION: absolute; TOP: 2930px"><NOBR>程序 2:
</NOBR></DIV>
<DIV style="LEFT: 189px; POSITION: absolute; TOP: 2977px"><NOBR>#define
serial_data _12_1 </NOBR></DIV>
<DIV style="LEFT: 450px; POSITION: absolute; TOP: 2977px"><NOBR>//定义变量为地址 12H 的第
1 位,即 H46R47</NOBR></DIV>
<DIV style="LEFT: 135px; POSITION: absolute; TOP: 3000px"><NOBR>单片机中的 PA.1
</NOBR></DIV>
<DIV style="LEFT: 189px; POSITION: absolute; TOP: 3023px"><NOBR>#define
serial_clock _12_2 </NOBR></DIV>
<DIV style="LEFT: 450px; POSITION: absolute; TOP: 3023px"><NOBR>//定义变量为地址 12H 的第
2 位,即 PA.2 </NOBR></DIV>
<DIV style="LEFT: 189px; POSITION: absolute; TOP: 3047px"><NOBR>#define
hc164_data7 _45_7 </NOBR></DIV>
<DIV style="LEFT: 450px; POSITION: absolute; TOP: 3047px"><NOBR>// 定义变量为地址 45H
的第 7 位,即</NOBR></DIV>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -